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.

[参考译文] 编译器/TMS320F2.8075万:"ramfuncs"链接器行为

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/576424/compiler-tms320f28075-ramfuncs-linker-behavior

部件号:TMS320F2.8075万

工具/软件:TI C/C++编译器

我已经实施了CRC32来在开机时执行ROM检查,它计算闪存扇区A到G的CRC。这些闪存扇区包括.cmd文件的以下部分:.cinit,.Pinit,.text,.econst和.switch。 CRC按预期工作;我还要确保跳过存储预期CRC值的闪存地址,以便更新预期CRC定义不会影响CRC计算。 CRC不通过闪存扇区H运行,我在这里存储"ramfuncs"功能。 但是,修改"ramfuns"函数似乎会影响计算的CRC值。 在分析.map文件时,对完全包含"ramfuncs"的模块的引用仅在扇区H和各种RAM地址中。 由于CRC不检查这些部分,为什么在修改"ramfuncs"函数后计算的CRC会发生变化? 这些函数的某些部分似乎存在于我正在检查的闪存扇区中,尽管在.map文件中并不明显。

我附上了.cmd和.map文件,其中模块"test"只包含一个功能"test_1",它是"ramfuncs"的一部分。 如果您在.map文件中搜索此文件,您将看到它不会出现在闪存扇区A到G的任何地址中,但当我修改该文件中的操作(例如,将乘法更改为加法)时,CRC将发生变化。

e2e.ti.com/.../4540.map.txt

e2e.ti.com/.../7457.cmd.txt

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

    大声思考,当您更改ramfuncs函数时,存储器映射可能会移动并更改各种ramfuncs函数的地址。  您可以从常规的.text代码调用这些函数。  因此,呼叫地址在.text闪存中更改。

    此外,您还可以将ramfuncts从flash复制到ram。  文本部分中嵌入复印功能的开始,结束和长度参数会发生变化,对吗?

    只有两个想法...

    David

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    答案很好。 我通过将ROM检查的结束地址更改为memcpy之前和之后来验证这一点;CRC在memcpy之前不受影响,并且在其后受到影响(我修改运算符时修改的"ramfuncs"函数的长度也会改变)。 我有一个后续问题:

    当我调整ROM检查的结束地址以包括闪存扇区H (其中存储"ramfuncs")时,计算的CRC会随着我修改预期CRC值而变化,从而阻止我定义预期CRC。 这大概是因为我修改了预期的校验和(即 ROM_checksum)存在于程序数据中以初始化该值,因此修改后的预期CRC会影响后续的CRC计算。 我想这与其说是TI问题,更像是C问题,但有没有一种简单的方法可以让此函数跳过存在“ROM_checksum”的内存位置,而不必使用函数指针和.map文件中的特定地址?



    #pragma code_section (ROM_check,"ramfuncs");

    void rom_check(framework *framewer)

    静态const UINT32 Expected校验和= ROM_checksum;
    UINT32 * ROM_ADDRESS =((UINT32 *)(Bzero_sectora_start));
    //初始化ROM校验和
    framework ->rom_checksum = 0;
    //通过ROM地址循环到端点
    while (ROM_address <((UINT32 *)(Bzero_SectorH_end))){
    //确保跳过存储的校验和地址
    IF (ROM_ADDRESS!=&PESTED_CHECKSUM){
    //更新当前校验和
    framework ->rom_checksum = CRC32_single (framework ->rom_checksum,(*rom_address));
    }
    //增加ROM地址
    ROM_address++;
    }
    //设置校验和不匹配标志
    framework -> status.bit.rom_fault =(framework ->rom_checksum!= Expected _checksum);
    }