This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4AL-Q1:如何确保.cinit 段在编译器链接器之后具有相同的加载地址

Guru**** 2436280 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1542757/tda4al-q1-how-to-make-sure-cinit-section-has-the-same-load-address-after-compiler-linker

器件型号:TDA4AL-Q1


工具/软件:

尊敬的专家

该主题是对该主题的延伸讨论。

 J721S2XSOMXEVM:如何生成 freertos_mcu1_0_release.xer5f.map 的.cinit? 

我不确定这是一个正确的问题、因为我不了解编译器链接器用例。

据我所知、编译器 .cinit 为每个“静态“初始化变量创建记录、其中包含“变量的位置“和“初始值“ 、然后链接器将这些记录收集到最终 .cinit 段中

例如、我们在代码中定义了一些常量“static variable“、并尝试使用“fardata.appdataconst"部分“部分进行对齐

我们是否应该期望 app_data_const 在每次编译时在代码编译器和链接后具有相同的存储器加载地址?  

器件代码如下所示。

#include "app_data_const.h"
#define APP_DATA_CONST __attribute__((section(".fardata.appdataconst")))

APP_DATA_CONST volatile boolean_T KACC_ACCAdvCornrDecFcn_flg = 1U;
APP_DATA_CONST volatile real32_T KACC_ACCAdvCornrDecThrld_mps2 = 1.5F;
APP_DATA_CONST volatile real32_T KACC_ACCAdvCornrMeetLmtOfst_mps = 1.5F;
APP_DATA_CONST volatile real32_T KACC_ACCAdvCornrMeetLmtThrld_mps = 0.0F;
APP_DATA_CONST volatile real32_T KACC_ACCAdvCornrRadFlt_s = 0.3F;
APP_DATA_CONST volatile boolean_T KACC_ACCCalFllwDistOfst_flg = 0U;
APP_DATA_CONST volatile boolean_T KACC_ACCCaliNoLmtSW_flg = 0U;
APP_DATA_CONST volatile real32_T KACC_ACCClrnceAlrtThld_m = 3.0F;
APP_DATA_CONST volatile boolean_T KACC_ACCClrnceAlrtUseCust_flg = 0U;
APP_DATA_CONST volatile boolean_T KACC_ACCCstUseVehInfo_flg = 0U;
APP_DATA_CONST volatile real32_T KACC_ACCCtrlEffrtTrns_s = 0.1F;
APP_DATA_CONST volatile real32_T KACC_ACCDecAlrtOfst_mps2 = -0.1F;
APP_DATA_CONST volatile real32_T KACC_ACCDecPerfrmAlrThrld_mps2 = -2.0F;

例如、我们知道  fardata.appdataconst.load 地址 = a08bc6a8

.cinit     0    a08a5300    00026300     
                  a08a5300    00000008     (__TI_handler_table)
                  a08a5308    00000030     (__TI_cinit_table)
                  a08a5338    00000008     (.cinit..bss.load) [load image, compression = zero_init]
                  a08a5340    00017356     (.cinit..data.load) [load image]
                  a08bc696    00000002     --HOLE-- [fill = 00000000]
                  a08bc698    00000008     (.cinit..bss.devgroup.load) [load image, compression = zero_init]
                  a08bc6a0    00000008     (.cinit..tracebuf.load) [load image, compression = zero_init]
                  a08bc6a8    0000ee58     (.cinit..fardata.appdataconst.load) [load image]
                  a08cb500    00000008     (.cinit..bss.appdatavar.load) [load image, compression = zero_init]
                  a08cb508    000000f8     --HOLE-- [fill = 00000000]

然后是 Link Generated、

.fardata.appdataconst:load addr=a08bc6a8

LINKER GENERATED COPY TABLES

__TI_cinit_table @ a08a5308 records: 6, size/record: 8, table size: 48
	.bss: load addr=a08a5338, load size=00000008 bytes, run addr=a0728000, run size=0013ad26 bytes, compression=zero_init
	.data: load addr=a08a5340, load size=00017356 bytes, run addr=a0880700, run size=00017380 bytes, compression=copy
	.bss.devgroup: load addr=a08bc698, load size=00000008 bytes, run addr=a0726c30, run size=000013c5 bytes, compression=zero_init
	.tracebuf: load addr=a08bc6a0, load size=00000008 bytes, run addr=a0100400, run size=00080004 bytes, compression=zero_init
	.fardata.appdataconst: load addr=a08bc6a8, load size=0000ee58 bytes, run addr=a0fa0000, run size=0000ee50 bytes, compression=copy
	.bss.appdatavar: load addr=a08cb500, load size=00000008 bytes, run addr=a0f90000, run size=00009be4 bytes, compression=zero_init

我们是否可以让“fardata.appdataconst"部分“部分始终保留相同的地址,例如  a08bc6a8 ?

由于客户反馈、此地址有时可能会针对每个代码构建而更改。

是否可以修复此地址位置?

非常感谢

Gibbs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    我已经在机票中提到过这一点  

     J721S2XSOMXEVM:如何使 freertos_mcu1_0_release.xer5f.map 的“.fardata.appdataconst: load addr=xxxxx“处于固定位置? 

    客户可以获得相同的起始地址、但提到其为 1024 对齐、则将为其提供可被整除/对齐为 1024 的地址。

    如果你可以修复这个位置,而不使用其他空间,那么它是可能的。 但这背后的想法是什么?

    此致

    Tarun Mukesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、 Tarun Mukesh

    回复如下:

    (1) 这是答案吗?

    (2)  但背后的想法是什么?

    这是 XCP 映射 A2L。

    XCP 支持在运行时对变量和存储器内容进行 R/W 访问。 因此我想必须修复存储器位置。

    参考

    https://www.mathworks.com/help/vnt/ug/get-started-with-a2l-files.html

    谢谢你

    Gibbs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    如果在位置需要单个变量、则“ __attribute__((location(address)))" attribute 可与 tiarmclang 编译器一起使用。

    示例:

    int my_variable ___attribute__(location (0x12345678));

    (1) 这是答案吗?

    是、如果部分中有多个变量。 如果您再次使用“palign() 或 align()、则可能无法找到确切的位置  

    此致

    Tarun Mukesh