什么Tasking编译器中的farrom及nearrom?

原创 汽车电子嵌入式 2025-03-17 07:20

前言

最近想在Tasking编译器的.lsl链接文件中定义一个ROM Section用做标定段,发现修改了.lsl链接文件后使用#pragma section farrom xxx修饰const常量,总是不能将常量放到我们指定的Memory Section中,测试了很多办法,最后才成功,通过本文将改过程记录下来,同时也总结了Tasking编译器关于内存分配的一些规则,希望对大家有帮忙。

AUTOSAR BSW ToolVector

AUTOSAR MCAL ToolEB

Hardware Platform: Infineon Tricore TC387

Build ToolTasking

Debug Tool: UDE

关于Tasking编译器链接脚本的基本用法,可以参考:AURIX™ TC3xx MCAL中Link文件解析以及代码变量定位方法详解 (qq.com)



注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!

正文

1.需求及问题描述

我们在Tasking的链接脚本中定义了一个CAL_ROM Section段(注意:后文的测试过程中链接脚本没有再修改过)。

 


通过# pragma试图让我们的const常量CAL_ROM_TestData分配到CAL_ROM内存中去(期望CAL_ROM_TestData的内存地址为0x80003000)。

编译后查看Map文件,发现CAL_ROM_TestData并没有分配到CAL_ROM指定的起始地址处,_cal_rom_start的地址是0.



2.尝试的办法

尝试办法1CAL_ROM_TestData改为CAL_ROM_TestData[2]

结果1失败CAL_ROM_TestData并没有分配到CAL_ROM指定的起始地址处,_cal_rom_start的地址是0.



尝试办法2CAL_ROM_TestData改为CAL_ROM_TestData[3]

结果2成功CAL_ROM_TestData分配到CAL_ROM指定的起始地址处(0x80003000),_cal_rom_start的地址也是0x80003000.



后面继续尝试了CAL_ROM_TestData[4], CAL_ROM_TestData[8], 也都达到目的了。


也就说,CAL_ROM_TestData能否分配到CAL_ROM指定的起始地址处和CAL_ROM_TestData的数据大小有关(8  bytes是个临界点,大于等于8 bytes就成功),至于为什么,我们后面再解释。


我们就是要定义一个小于等于8 bytes的数据,且要放到CAL_ROM地址处,那又该怎么办了?


尝试办法3farrom改成nearrom.

结果3:失败,CAL_ROM_TestData并没有分配到CAL_ROM指定的起始地址处,_cal_rom_start的地址是0.



尝试办法4:变量前添加__far的修饰符。

结果4成功CAL_ROM_TestData分配到CAL_ROM指定的起始地址处(0x80003000),_cal_rom_start的地址也是0x80003000.


尝试办法5:类似办法4,变量前添加__near的修饰符。

结果5:失败。


尝试办法6:不用#pragma,改用__attribute__((section("CAL_ROM")))定义CAL_ROM_TestData.

结果6成功CAL_ROM_TestData分配到CAL_ROM指定的起始地址处(0x80003000),_cal_rom_start的地址也是0x80003000.



注意1__attribute__((section(".rodata.CAL_ROM")))如果改为__attribute__((section("CAL_ROM")))也会失败。


办法6起始已经比较好了,任意字节的变量/常量都可以分配到我们指定的内存起始地址处了。但是,写代码很少人会使用__attribute__((section(".rodata.CAL_ROM")))这种方式定义变量,指定变量内存区域都是使用#pragma的方式。


继续想办法!!


尝试办法7:添加--default-near-size=0的编译选项。


使用#pragma进行内存分配,也就说回到我们最初的代码定义方式。


结果7成功CAL_ROM_TestData分配到CAL_ROM指定的起始地址处(0x80003000),_cal_rom_start的地址也是0x80003000.



小结:方法2467都能让变量/常量分配到指定的内存地址处,但是,

方法2需要限定变量的大小,大于等于8字节的变量才能指定到特定内存地址处。

方法4,变量需要添加额外的__far修饰符。

方法6,不能使用常见的#pragma.

方法7,最符合我们常见的代码写法,也就说办法7是最优的办法


到这里,我们找到了Tasking中指定变量内存地址的最优办法,但是大家一定会有很多的问题,比如:


问题1:什么nearromfarrom?

问题2__far__near是什么?

问题3--default-near-size=0是什么编译选项?

问题4:使用.rodata.zrodata内存段存放了什么数据?

问题5:使用--default-near-size=0编译选项就没有任何弊端吗?


带着这些问题,我们继续下文的精彩分析。


注意:上面这些实验内容,写出来看着很容易,实际我是耗费大量的时间才找到上面的规律的(网上的内容参差不齐,关键的细节没有说明白的),看到这里,还不点个赞加个关注么!!!


3.Tking编译器中的farromnearrom

1.__far修饰的const变量会被分配在farrom中,__near修饰的const变量会被分配在nearrom中。


2.farrom可以是内存的任何地方(Anywhere,nearrom分配在一个256 MBblock的头16 KB位置(注意:这个256 MB的头16 KB理解不了,尝试了各种办法也没有找到这个nearrom在哪里)。


3.farrom是通过CPU间接寻址的方式访问,速度较慢,near是通过CPU直接寻址的方式访问,速度较快。


4.nearrom的数据最大长度是16Kb.

5.一个const变量没有添加__far或者__near的修饰符,那么编译器会根据default near size(默认是8 bytes)来自动分配const变量到nearrom还是farrom

const变量大小 <= default near size(比如8 bytes) --> 编译会分配到nearrom

const变量大小 > default near size(比如8 bytes) --> 编译会分配到farrom


6.可以通过--default-near-size=xxx(或者-N=xxx)来指定default near size. 我们在上文中通过指定--default-near-size=0使得编译将没有添加__far或者__near修饰的const常量都分配到farrom.


7.尝试过很多办法,都没办法找到nearrom到底在哪里,也就是所,我们无法在链接文件中定义一块内存是nearrom。也就说无法通过#pragma section nearrom或者__near的修饰符让const变量放置到指定内存中,所以我们只能通过--default-near-size=0编译选项使得编译将器没有添加__far或者__near修饰的const常量都分配到farrom(因为farrom可以在任意内存位置,我们可以通过链接脚本指定)。



8..rodata中存放的是farrom数据,也就是const __far修饰的变量;.zrodata中存放的是nearrom数据,也就是const __near修饰的变量(.rodata中的数据访问慢些,.zrodata中的数据访问快些)。



4.GHS编译器中的sda编译选项

使用GHS编译器是,如果我们想通过#pragma指定任意数据的内存地址,最好添加-sda = 0的编译选项,具体细节各位读者可以去深入研究。


5.总结

问题1:什么nearromfarrom?

nearrom是被CPU直接访问(快速)的rom内存,存在于一个256 KB block的头16 KB处,具体在哪,不清楚,尝试了各种办法,没办法通过链接文件定义nearrom内存(编译器特殊指定?)。farrom是被CPU间接访问(较慢)的ROM内存,可以存在与ROM的任何位置,可以在链接文件中自定义。


问题2__far__near是什么?

__far__near用来修饰const变量或者变量,__far修饰的const常量分配在farrom, __near修饰的const常量分配在nearrom. 如果一个const常量没有被__far或者__near修饰,那么编译器会根据default near size的大小来自动分配const常量到nearrom还是farrom.具体规则如下:

const变量大小 <= default near size(比如8 bytes) --> 编译会分配到nearrom

const变量大小 > default near size(比如8 bytes) --> 编译会分配到farrom


问题3--default-near-size=0是什么编译选项?

--default-near-size=0指定default near size0,这样设置后,没有添加__far或者__near的变量都会分配到farrom/fardata/farbss中。


问题4:使用.rodata.zrodata内存段存放了什么数据?

.rodata中存放的是farrom数据,也就是const __far修饰的变量;.zrodata中存放的是nearrom数据,也就是const __near修饰的变量(.rodata中的数据访问慢些,.zrodata中的数据访问快些)。


问题5:使用--default-near-size=0编译选项就没有任何弊端吗?

:有。所有未添加__far/__near的数据都会放到farrom/fardata/farbss内存段中,访问速度会变慢。



End

「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。 目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」


点击文章最后左下角的阅读原文可以获取更多信息


或者复制如下链接到浏览器获取更多信息

https://blog.csdn.net/qq_36056498/article/details/132125693


文末福利




1
.如需汽车电子嵌入式收集的学习文档,
后台回复“

资料

即可免费下载;

2.为便于技术交流,创建了汽车电子嵌入式技术交流群,可尽情探讨AP,CP,DDS,SOME/IP等前沿热点话题,后台回复“加群”即可加入;



注:本文引用了一些第三方工具和文档,若有侵权,请联系作者删除!

推荐阅读

汽车电子嵌入式精彩文章汇总第一期:20210530-20230703

汽车电子嵌入式精彩文章汇总第2期

汽车电子嵌入式精彩文章汇总第3期

【OS】AUTOSAR OS Event实现原理

【OS】AUTOSAR OS Spinlock实现原理(下篇)

【OS】AUTOSAR OS Spinlock实现原理(上篇)

CanNm处于PBS状态下接收到一帧诊断报文DCM会响应吗

TC3xx芯片CAN模块详解

AUTOSAR OS Alarm实现原理

AUTOSAR OsTask切换原理

TC3xx 芯片SPI模块详解

AUTSOAR ComStack如何实现PDU只收不发的

AUTOSAR OsStack监控原理

AUTOSAR架构下ICU唤醒详解

CanNm报文的触发发送详解

Can报文能发不能收问题分析

TC3xx芯片PFlash的ECC校验问题补充

AUTOSAR架构下唤醒源检测函数EcuM_CheckWakeup详解

什么是Copy Table及如何使用Copy Table

AUTOSAR架构下EcuM_StartupTwo函数功能详解

符合AUTOSAR标准的RTAOS-Schedule Tables详解(上篇)

AUTOSAR OS Schedule Table实现原理

符合AUTOSAR标准的RTAOS-Schedule Tables详解(下篇)

TJA1145收发器重要功能介绍

AUTOSAR架构下基于TJA1145收发器通信丢失问题分析

AUTOSAR架构下LIN报文发送失败问题分析

AUTOSAR项目实战(1)-数据地址访问对齐问题分析

AUTOSAR项目实战(2)-内存访问异常问题分析

AUTOSAR项目实战(4)-系统总线及外设错误问题分析

AUTOSAR项目实战(3)-OsCounter访问权限问题分析

AUTOSAR项目实战(4)-MCU模块配置实践

AUTOSAR架构下的Interrupt详解(上篇)

AUTOSAR架构下的Interrupt详解(下篇)

AUTOSAR项目实战(6)-Port及Dio模块配置实践

TJA1145异常设置唤醒源导致ECU休眠失败问题分析



End


欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!

汽车电子嵌入式

微信扫描二维码,关注我的公众号

评论 (0)
  • 概念在GNSS测量和地理信息系统(GIS)中,基线(Baseline)是指两个或多个接收机之间的直线距离,通常用于描述RTK(实时动态定位)或其他差分GPS技术中的相对位置关系。基线通常由三个分量表示:东向(East)、北向(North)和垂直向(Up),分别表示两个测点之间的东西方向、南北方向和垂直方向的距离差。RTK(Real-Time Kinematic,实时动态)基线是指在RTK GPS测量技术中,两个测站(通常是一个固定的基准站和一个移动的接收站)之间的向量差。这个向量差包括了两个测站
    德思特测试测量 2025-03-19 11:23 86浏览
  • 在电子领域,高品质线路板是众多电子产品稳定运行的基石。那么,究竟达到怎样的标准,才能被称为高品质线路板呢?​捷多邦小编整理了关于高品质线路板的标准解析​,一起看看吧。 从电气性能角度出发,高品质线路板首当其冲要确保线路导通性良好。这意味着电流能顺畅地在铜箔线路中流动,电阻、电容等关键参数必须严格符合设计要求。无论是在初始运行,还是经过长时间的使​用后,都能维持稳定的电气性能,不出现参数漂移等问题。同时,面对复杂的电磁环境,它要有极强的抗干扰能力,有效减少信号传输时的失真与干扰,保证信号
    捷多邦 2025-03-19 09:33 79浏览
  • 全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,推出两款全新传感器模块,再次彰显其在计算机断层扫描(CT)技术领域的深耕发展。这两款模块作为先进诊断成像技术的核心组件,将为肿瘤学、心血管疾病治疗等多种临床应用提供更精准的诊疗支持,助力实现疾病的早期诊断。新产品将助力CT市场各细分领域医学影像技术升级。针对高端CT市场,艾迈斯欧司朗特别推出专为光子计数探测器设计的新型系统级封装传感器模块,该模块可显著降低辐射剂量,同时提升诊断价值。艾迈斯欧司朗还推出面向价格敏感型CT市场的新型
    艾迈斯欧司朗 2025-03-18 23:20 48浏览
  • PCB层数越多质量就越好吗?多层板制造中的质量控制要点随着电子产品对性能和功能要求的不断提高,多层PCB(多层印刷电路板)已经成为众多高端应用领域的标准配置。很多人存在一个误区:层数越多的PCB质量就一定越好。实际上,层数与质量并不是直接的正比关系,正确的设计和精确的质量控制才是决定PCB质量的关键。1. 层数并非质量的唯一标准多层PCB的质量并不仅仅取决于层数的多少,而是与其设计、制造精度和材料的选择密切相关。增加层数的目的通常是为了提高电路密度和实现复杂的布线结构。如果设计不合理或制造不精确
    捷多邦 2025-03-19 10:14 119浏览
  • ​ 一、公司及产品概述作为国内领先的语音芯片研发企业,深耕语音技术领域25年,其产品以高稳定性、低功耗和多场景适应性著称。公司推出的语音识别芯片系列(如WTK6900系列)融合了语音识别、自然语言处理、音频编解码等核心技术,广泛应用于智能家居、工业设备、医疗电子及消费类产品中。二、核心技术特点语音识别与处理技术 厂家语音识别芯片采用先进的信号处理算法(如MFCC特征提取)和机器学习模型(如DNN、HMM),支持多语言、方言及复杂环境下的高精度识别。芯片内置噪声抑制和回声消除功能,即使在
    广州唯创电子 2025-03-19 08:48 42浏览
  • 在现代电子行业,PCB(印刷电路板)的质量直接影响到产品的稳定性与性能。作为全球领先的PCB制造商,捷多邦始终将质量放在第一位,致力于为客户提供高可靠性、高精度的PCB产品。为了确保每一块成品PCB都符合最高的质量标准,捷多邦在从设计到生产的每个环节都严格把控,确保质量无可挑剔。1. 精准设计:从需求到规格PCB的质量首先体现在设计阶段。捷多邦的设计团队根据客户需求,使用最新的EDA软件进行电路板布局设计。通过设计规则检查(DRC),确保电路板设计满足行业标准和客户的特殊需求。无论是单面板、双面
    捷多邦 2025-03-19 10:09 63浏览
  • 在电子制造业中,PCB(印制电路板)作为电子设备的核心组件,其质量直接决定了产品的性能和可靠性。尤其是高端PCB,广泛应用于航空航天、医疗设备、通信设备等领域,对质量的要求近乎苛刻。捷多邦作为PCB行业的领先品牌,深知严格的质量管理体系是确保高端PCB制造成功的关键。1. ​原材料质量控制高端PCB的制造始于原材料的严格筛选。捷多邦采用符合IPC标准的基材,如FR-4、PTFE等,确保材料的电气性能、机械性能和耐热性满足高端应用需求。通过严格的入库检验,包括铜箔附着力、表面平整度等测试。2. ​
    捷多邦 2025-03-19 10:13 79浏览
  • 这是一个很有意思的话题,在职场人士之间争论不休。证书到底有没有用?有人支持,也有人反对。不过,在正式聊这个话题之前,我想先分享一个我亲身经历的真实故事。那时,我和同学们正在读管理学的研究生课程。有一次,我们的教授要求大家穿正装上课。这时,有个同学问了个很有趣的问题:“教授,某某的董事长可以穿得五颜六色,我们这些职场新人为什么非得穿正装?”教授听后,停顿了一下,然后淡定地回了句:“你当然也可以穿得五颜六色,但前提是——先成为某某的董事长那样的人。”这句话点出了一个事实:同一套规则,并不适用于所有人
    优思学院 2025-03-19 12:02 73浏览
  • 近期,据全球物联网市场调研机构IoT Analytics公布数据显示,2025年全球物联网设备连接数预计将突破200亿,同比增长约14%,物联网技术正以稳定上升态势向工业自动化、智慧城市、智慧农业与智慧家居等领域纵深推进。在多样化的应用场景和复杂环境需求的驱动下,物联网无线通信技术的运行功耗、传输距离和频段兼容性正受到前所未有的关注。为增加物联网通信模块的配置灵活度,消除物联网设备的“连接焦虑”,华普微重磅推出了一款自主研发的超低功耗、可兼容Sub-GHz与2.4GHz 双频段的高性能LoRa
    华普微HOPERF 2025-03-18 15:43 107浏览
  • 贞光科技作为三星电机MLCC的授权代理商,专注于电子元器件领域,代理产品包括车规电容MLCC和电感等。 现代汽车音视频导航(AVN)系统正迅速发展,集成了导航、多媒体和通信等功能。显示技术的进步和连接性的增强,提升了驾驶体验。在这些系统中,MLCC作为关键元件,确保了高性能IC的稳定供电,发挥着电源稳定、噪声抑制和小型化等重要作用。三星电机提供高可靠性、小型化、高容量的MLCC产品,专为汽车AVN应用设计,满足行业严苛要求。现代驾驶体验正在迅速转型,它不再仅仅是交通工具,而是变成了一个互联、沉浸
    贞光科技 2025-03-18 16:54 32浏览
  • 在PCB制造过程中,表面处理工艺的选择直接影响到电路板的性能、可靠性和成本。捷多邦作为行业领先的PCB制造商,致力于为客户提供高质量、高可靠性的PCB产品。本文将深入探讨沉金、镀金和HASL(热风整平)三种常见表面处理工艺的特点及其对PCB质量的影响,帮助您做出最佳选择。 1. 沉金(ENIG)沉金工艺通过化学沉积在PCB表面形成一层镍金合金,具有以下优势: ​平整度高:适合高密度、细间距的PCB设计,尤其适用于BGA和QFN封装。​抗氧化性强:金层能有效防止铜氧化,延长PC
    捷多邦 2025-03-19 10:11 88浏览
  • 在电子产品制造中,选择合适的PCB至关重要。虽然廉价PCB节省成本,但长期使用下来,它们可能会带来更多的风险和隐患。作为工程师,我们需要权衡PCB的质量与成本,尤其是在高要求的应用中。论文将以捷多邦为例,分析廉价PCB与高质量PCB的差异。 1.材料与性能廉价PCB通常采用低质量材料,这可能会影响其电气和机械性能。相比之下,捷多邦的高质量PCB采用符合行业标准的优质材料(如FR4、PTFE等),确保更高的热稳定性和抗湿性,提升产品的可靠性。 2.准确性与可靠性廉价的PCB工艺
    捷多邦 2025-03-19 09:36 80浏览
  • 在制药行业中,生产工艺的精准控制与产品质量安全密切相关。随着制药工业4.0的发展,传感器作为生产流程的"感知器官",在确保合规性、提升效率、降低风险方面发挥着不可替代的作用。本文将以晨穹电子科技(以下简称"晨穹")的压力、温度、流量及液位传感器为例,解析制药厂关键工艺流程中的传感器应用场景及技术要求。一、制药核心工艺流程中的传感器需求1. 原料处理与配液系统液位监测:储罐内原料液位实时监控需使用卫生型液位计。晨穹磁翻板液位计采用316L不锈钢材质,具备CIP/SIP(在线清洗/灭菌)耐受性,符合
    传感器晨穹 2025-03-18 15:51 117浏览
  • 在PCB(印刷电路板)的制造过程中,材料选择对最终产品的性能、稳定性和可靠性有着直接的影响。作为行业领先的PCB制造商,捷多邦始终坚持在材料选择上精益求精,确保每一款PCB产品都能够满足客户对高质量的需求。今天,我们将重点分析FR4、Rogers和铝基板三种常见材料,它们如何影响PCB的质量与性能,以及捷多邦如何通过优化材料选择为客户提供更具竞争力的产品。1. FR4:高性价比的通用材料FR4是最常见的PCB基材,广泛应用于消费电子、通信、计算机等领域。它由玻璃纤维和环氧树脂复合而成,具有良好的
    捷多邦 2025-03-19 10:09 66浏览
  • ​ 在智能设备普及的今天,语音识别已成为人机交互的核心入口。然而,环境噪声、口音差异、硬件设计限制等因素常导致识别率下降,影响用户体验。广州唯创电子凭借25年技术积累,推出 WTK6900系列语音识别芯片,通过“芯片性能+算法优化+场景适配”三位一体的解决方案,将标准方案识别率提升至 97%,为行业树立技术标杆。一、WTK6900系列:破解语音识别难题的核心利器1. 高性能芯片架构,奠定识别基础WTK6900系列采用 32位高性能处理器 与 深度神经网络(DNN)算法,支持实时语音信号
    广州唯创电子 2025-03-19 09:11 30浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦