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.

[参考译文] CC1352P:链接器在映射文件中创建了大型读写存储器

Guru**** 2392275 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1319598/cc1352p-linker-created-large-read-write-memory-in-map-file

器件型号:CC1352P
  1. 我编译了工程并生成了映射文件。
    我不明白为什么链接器创建了~ 180KB 的大型读写存储器、即使 RAM 大小仅为80KB?

    链接器已创建32156'672
    -------------------------------------------------------
    总计:97'266 21'085 187'307

    总内存:
    97'266字节的只读代码内存
    21'085字节只读数据存储器
    187'307字节读写数据存储器

  2. 当我编译较大的代码时、即使 CC1352闪存大小为352KB、链接器也会发生故障  

    106'150字节的只读 代码存储器
    29'936字节只读 数据存储器
    187字节、可读写数据存储器

    我试图插入我的 ICF 文件,但我无法上传它,所以这是它的一些代码

     
    //Options of Start Code Address 
    define symbol MAIN_APP_START_ADDRESS     = 0x00002000; // PARTITION_A
    define symbol MAIN_APP_END_ADDRESS       = 0x00027FFF; 
    define symbol SECOND_APP_START_ADDRESS   = 0x00028000; // PARTITION_B
    define symbol SECOND_APP_END_ADDRESS     = 0x0004DFFF; 
    define symbol OTA_CONFIG_START_ADDRESS   = 0x0004E000; // OTA CONFIG and SPARE segments
    define symbol OTA_CONFIG_END_ADDRESS     = 0x00055FFF;
    define symbol TI_CONFIG_START_ADDRESS    = 0x00056000;
    define symbol FLASH_ROM_END_ADDRESS      = 0x00057FFF;
    define symbol OTA_SIGNATURE_SIZE         = 8;
    
    define symbol __intvec_start__ =  MAIN_APP_START_ADDRESS;
    //------------------------------------------------------------------------------
    
    /*-Memory Regions-*/
    define symbol ROM_end__   = 0x00057FFF;
    define symbol RAM_start__ = (0x20000000 + 0x000012C + 0x0000EB3); // Reserve RAM space for ROM functions usage
    define symbol RAM_end__   = 0x20013BFF;  // was  0x20013FFF;         check!
    define symbol GPRAM_start__ = 0x11000000;
    define symbol GPRAM_end__   = 0x11001FFF;
    //allocate the SW(Ota) Partitions 
    if (__intvec_start__ == SECOND_APP_START_ADDRESS) 
    {
    define symbol ROM_start__ = SECOND_APP_START_ADDRESS;
    define symbol ROM_const_config_start__    =   (0x00016000 + SECOND_APP_START_ADDRESS - MAIN_APP_START_ADDRESS);
    define symbol ROM_const_config_end__      =   (0x00017FFF + SECOND_APP_START_ADDRESS - MAIN_APP_START_ADDRESS);
    define symbol ROM_factory_config_start__  =   (0x00018000 + SECOND_APP_START_ADDRESS - MAIN_APP_START_ADDRESS);
    define symbol ROM_factory_config_end__    =   (0x00019FFF + SECOND_APP_START_ADDRESS - MAIN_APP_START_ADDRESS);
    define symbol __Ota_signature_start__     =   (SECOND_APP_END_ADDRESS - OTA_SIGNATURE_SIZE + 1);
    
    define symbol OTA_storage_start__  =   MAIN_APP_START_ADDRESS;
    define symbol OTA_storage_end__    =   MAIN_APP_END_ADDRESS;
    }




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

    尊敬的 Kobi:

    您的问题的背景理解起来有点困难。 您能否提供更多详细信息、例如示例所基于的示例应用?

    如果我们讨论 RAM、请记住在大多数示例项目中、堆是通过查找所有可用 RAM 来创建的。  

    您可以在此处阅读有关链接器命令文件的信息:

    https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_Linker-Command-File-Primer.html

    谢谢、

    M·H

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

    尊敬的 Marie:

    我的同事遇到了类似的问题。
    链接器创建读写块的原因是、我们在 ROM 中有一个区域保留用于固件升级。
    由于该块是空的、并且链接器本身不知道 ROM 和 RAM 等物理区域。 这就是它将其视为读写的原因。
    导致此结果的块:
    使用 size = OTA_STORAGE_SIZE、alignment = 8{}定义块 OTA_IMAGE_BLOCK;
    此块的大小为0x26000 (155648字节)
    添加1K 的 CSTACK:155648+1024 = 156672字节。 这正是在映射文件中创建的链接器块。

    我们为 TI 提供了建议和建议:

    您可以强制链接器将块分类为 只读

    *创建一个名为的汇编器文件,例如:  填充剂 s.s

    *内容是:

      计划  填充剂

        部分  填充剂 您的位置:首页(2)

        结束

     "填充"这个名称只是一个建议。
      该段是空的、因此不会产生任何成本。

    *将空段填充物放在块中:
     

    使用 size = OTA_STORAGE_SIZE、alignment = 8{section filler object filler.o }定义块 OTA_IMAGE_BLOCK;

    这使得链接器将块分类为  ro 数据


    我遵循了这些指示、但它不起作用。

    在映射文件中:
    定义块 OTA_IMAGE_BLOCK
    当 size =152K 时,对齐=8 { ro object fuffer.o section fuffer };

    没有任何段与以下模式匹配:

    块 OTA_IMAGE_BLOCK 中的 ro object fulfill.o 段填充
    ".log_data"中的 ro 段.log_data
    块 log_data 中的 ro 段.log_data
    块 log_ptr 中的 ro 段.log_ptr*
    CSTACK 块中的.stack 段


    此解决方案未解决问题:
    已创建链接器                      32 156'672


    BTW、您能解释如何从我的 PC 附加文件吗?

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

    尊敬的 Kobi:

    您可以通过单击 Insert (插入)-> Image/Video/file (图像/视频/文件)附加文件。

    我不明白您的意思:"我们在 ROM 中有一个区域保留用于固件升级。" ROM 是只读的、尝试将其用于 ROM 中已编程的固件以外的任何其他用途都没有意义。

    谢谢、

    M·H

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

    尊敬的 Marie:

    我发现该界面很难继续。  
    是否可以通过电子邮件联系?

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

    我们使用两个区域:152K 用于主应用程序、152K 用于第二个应用程序。 固件升级后、会将其复制到第二个应用程序块。 通过更改 __intvec_start__地址,我们可以将应用程序从一个块切换到辅助块。

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

    尊敬的 Marie:


    请忽略我的第一个问题、我们使用我之前解释的填充剂解决了它。
    现在我有第二个问题、在只读区域中有一个很大的未使用范围:

    未使用的范围:

    从到尺寸
    ----------------
    0x1'1634 0x1'5fff 0x49cc
    0x2'37bb 0x2'7ff7 0x483d

    总大小:0x49cc+0x483d = 0x9209 = 37385字节~ 36KB!

    您能帮助我们避免这些未使用的区域吗?

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

    尊敬的 Kobi:

    您可以发布完整的链接器命令文件吗?

    还是.map 文件?

    谢谢、

    玛丽

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

    很遗憾、无法在界面上上传文件

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

    是否可以接收任何支持电子邮件?

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

    尊敬的 Marie:

    嗯...未使用的范围没有问题。 它确实没有使用。
    我遇到了一个包含4个函数的链接器错误、并且我不明白链接器为什么在没有足够空间时不分配空间。
    实际上、定义了函数的模块并未编译、因为它被开关禁用。 这些函数仅在头文件中声明。 这些函数被调用但未定义、这就是出现链接器错误的原因。
    当我用 IAR 7.50编译相同模块的时候,甚至没有定义函数也没有问题。
    我将优化从"仿真"更改为"无"、所有内容都成功编译。 然后、我了解到编译器版本之间存在差异。
    我通过添加空函数定义而不更改优化来修复了这个问题。

    感谢您的帮助。