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.

[参考译文] 编译器/CC1310:链接器在 CC1310上浪费 SYSBIOS 空间

Guru**** 2613065 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/579464/compiler-cc1310-linker-wasting-space-for-sysbios-on-cc1310

器件型号:CC1310
Thread 中讨论的其他器件:SYSBIOS

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

这可能属于不同的论坛、但下面是我看到的内容:

我已为存储器映射中的应用程序预留了前两页:(压缩的 cmd 文件)

#define FLASH_base 0x0
#define FLASH_SIZE 0x6000

#define APPFLASH_LENGTH0x2000
#define APP_FLASH_base0x6000

//系统存储器映射*/

存储
器{
/*存储在内部闪存中并从内部闪存执行的应用程序*/
闪存(RX):origin = flash_BASE,length = flash_size
/*应用程序闪存*/
AppFlash (RW):origin = APP_FLASH_base,length = APPFLASH_length

我的程序会编译、并且小于24k (使用 CC1310F32RHB)、 但我收到一条错误消息、表示.text 段不适合可用闪存。  当我查看我的分配映射时、链接器似乎在浪费几乎一整页的闪存空间来为系统 BIOS 保留空间。

段分配映射

运行 origin load origin length init length atts members
------ ------ ------ ------ ---- ----
00000000 00000000 0000003c 0000003c r--
00000000 00000000 0000003c 0000003c r-.Vecresets
00000000 00000000 00004c48 00004c48 r-x
00000000 00000000 00004c48 00004c48 r-x .text
0000003c 0000003c 00000164 00000164 r--
0000003c 0000003c 00000164 00000164 r-.const
000001a0 000001a0 0000020c 0000020c r--
000001a0 000001a0 0000020c 0000020c  r-.cinit
00001000 00001000 000004f0 000004f0 r--
00001000 00001000 0000003c 0000003c r-.const:ti_sysbios_KNL_Task_Object_Params__C
0000103c 0000103c 00000034 00000034 r-.const:ti_sysbios_KNL_Mailbox_Object_Params__C

是否可以移动 ti 对象或在20C 到1000之间放置其他对象?

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

    从0x1000开始的"ti_SysBIOS_xxx"对象正被 ROM 代码引用、因此无法移动。 我不明白为什么链接器不能在0x20c 和0x1000之间放置数据。 映射文件指示.text 段从0x0开始、长度为0x4c48字节。 您是否在0x20c 和0x1000之间没有代码段? 映射文件底部是按符号值顺序排列的符号列表。 请查看此处。

    您可能需要将此问题提交到不同的论坛。

    Alan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的反馈。 我将尝试创建一个单独的区域、并在其中移动一些函数。

    如果我手动调整闪存大小以使编译器成功、则映射文件的外观(仍然存在巨大的差距)如下所示:
    段分配映射

    运行 origin load origin length init length atts members
    ------ ------ ------ ------ ---- ----
    00000000 00000000 000004e4 000004e4 r--
    00000000 00000000 0000003c 0000003c r-.Vecresets
    0000003c 0000003c 00000164 00000164 r-.const
    000001a0 000001a0 00000344 00000344 r-.cinit
    00001000 00001000 00005138 00005138 r-x
    00001000 00001000 0000003c 0000003c r-.const:ti_sysbios_KNL_Task_Object_Params__C
    0000103c 0000103c 00000034 00000034 r-.const:ti_sysbios_KNL_Mailbox_Object_Params__C
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这解决了我的空间浪费问题、但是手动修复:

    基本上、我只是计算了 Const 结束和 SYSBIOS 调用开始之间浪费的空间、并在.text 段中找到了大多数会填充该空间的对象。


    部分

    .intvecs :> flash_base
    .cinit:>闪存
    .const:> FLASH
    text:fsmActiveState :> FLASH
    text:NOROM_SysCtrlSetRechargeBeforePowerDown :> FLASH
    text:Power_sleep :> FLASH
    text:calibrateRcoscHF1 :> FLASH
    text:RF_postCmd :>闪存
    text:Power_init :> FLASH

    .text:> FLASH

    以上各节产生了以下映射文件:

    段分配映射

    运行 origin load origin length init length atts members
    ------ ------ ------ ------ ---- ----
    00000000 00000000 00000edc 00000edc r-x
    00000000 00000000 0000003c 0000003c r-.Vecresets
    0000003c 0000003c 000003d8 000003d8 r-x .text:fsmActiveState
    00000414 00000414 00000228 00000228 r-x .text:NOROM_SysCtrlSetargeRechebePowerDown
    0000063c 0000063c 00000248 00000248 r-x .text:Power_sleep
    00000884 00000884 000001ec 000001ec r-x .text:calibrateRcoscHF1
    00000a70 00000a70 000001fc 000001fc r-x .text:RF_postCmd
    00000c6c 00000c6c 0000014c 0000014c r-x .text:Power_init
    00000db8 00000db8 00000124 00000124 r-.const
    00001000 00001000 0000453c 0000453c r-x
    00001000 00001000 0000003c 0000003c r-.const:ti_sysbios_KNL_Task_Object_Params__C
    0000103c 0000103c 00000034 00000034 r-.const:ti_sysbios_KNL_Mailbox_Object_Params__C

    仍在浪费几个字节、但优于3.5k

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    快速更新。 CC13xx 中的链接器命令文件使用单个>生成其映射。 这可防止段拆分。 从链接器文档中:
    www.ti.com/.../spru186w.pdf
    "您也可以使用>>运算符来指示输出段可以在单个存储器中拆分
    范围。"

    如果我从>切换到>>、则不再需要手动从.text 段中断开对象。 另一个好处(请参阅下面的段映射)是填充了 SYSBIOS 部分、从而实现了完全的闪存利用率。 一个缺点是我注意到更多的 trampoline。 对于我的应用、节省的空间高于开销成本。

    //内存中的段分配

    部分

    .intvecs:>flash_base
    .cinit:>闪存
    .const:>>FLASH
    .text:>>FLASH
    .constdata:>>FLASH
    .rodata:>>FLASH
    binit:>FLASH
    .pinit:>>FLASH
    init_array:>>FLASH
    .EMB_text:>>FLASH
    ccfg:>闪存(高电平)

    结果为:
    段分配映射

    运行 origin load origin length init length atts members
    ------ ------ ------ ------ ---- ----
    00000000 00000000 00005b60 00005b60 r-x
    00000000 00000000 0000003c 0000003c r-.Vecresets
    0000003c 0000003c 00000fc4 00000fc4 r-x .text.1
    00001000 00001000 0000003c 0000003c r-.const:ti_sysbios_KNL_Task_Object_Params__C
    0000103c 0000103c 00000034 00000034 r-.const:ti_sysbios_KNL_Mailbox_Object_Params__C
    00001070 00001070 00000030 00000030 r-.const:ti_sysbios_family_arm_m3/Hwi_Object_Params__C
    000010a0 000010a0 0000002c 0000002c r-.const:ti_sysbios_hal_hwi_Object_Params__C
    000010cc 000010cc 00000028 00000028 r-.const:ti_sysbios_b堆_HeapMem_Module_Fxns__C
    000010f4 000010f4 00000028 00000028 r-.const:ti_SysBIOS_KNL_Swi_Object_Params__C
    0000111c 0000111c 00000024 00000024 r-.const:ti_sysbios_gates_GateHwi_Module_Fxns__C
    00001140 00001140 00000024 00000024 r-.const:ti_sysbios_gates_GateMutex_Module_Fxns__C
    00001164 00001164 00000024 00000024 r-.const:ti_sysbios_b堆_HeapMem_Object_Params__C
    00001188 00001188 00000024 00000024 r-.const:ti_SysBIOS_KNL_Clock_Object_Params__C
    000011ac 000011ac 00000024 00000024 r-.const:ti_sysbios_KNL_Semaphore_Object_Params__C
    000011d0 000011d0 00000020 00000020 r-.const:ti_sysbios_family_arm_m3/Hwi_Object_DESC_C
    000011f0 000011f0 00000020 00000020 r-.const:ti_sysbios_gates_GateHwi_Object_Desc_C
    00001210 00001210 00000020 00000020 r-.const:ti_sysbios_gates_GateMutex_Object__Desc_C
    00001230 00001230 00000020 00000020 r-.const:ti_sysbios_hal_hwi_Object_Desc__C
    00001250 00001250 00000020 00000020 r-.const:ti_sysbios_bst_HeapMem_Object_Desc__C
    00001270 00001270 00000020 00000020 r-.const:ti_SysBIOS_KNL_Clock_Object_Desc__C
    00001290 00001290 00000020 00000020 r-.const:ti_sysbios_KNL_Mailbox_Object__Desc_C
    000012b0 000012b0 00000020 00000020 r-.const:ti_SysBIOS_KNL_Queue_Object_Desc__C
    000012d0 000012d0 00000020 00000020 r-.const:ti_SysBIOS_KNL_Semaphore_Object_DESC_C
    000012f0 000012f0 00000020 00000020 r-.const:ti_SysBIOS_KNL_Swi_Object_Desc__C
    00001310 00001310 00001310 00000020 00000020 r-.const:ti_sysbios_KNL_Task_Object__Desc__C
    00001330 00001330 00000018 00000018 r-.const:ti_sysbios_gates_GateHwi_Object_Params__C
    00001348 00001348 00000018 00000018 r-.const:ti_sysbios_gates_GateMutex_Object_Params__C
    00001360 00001360 00000018 00000018 r-.const:ti_SysBIOS_KNL_Queue_Object_Params__C
    00001378 00001378 00000008 00000008 r-.const:ti_SysBIOS_KNL_Idle_funclist___C
    00001380 00001380 00000004 00000004 r-x .text.2
    00001384 00001384 00000004 00000004 r-.const:ti_sysbios_family_arm_cc26xx_Timer_startupNeed__C
    00001388 00001388 00000004 00000004 r-.const:ti_sysbios_family_arm_m3/Hwi_E_alreadyDefined___C
    0000138c 0000138c 0000138c 00000004 00000004 r-.const:ti_sysbios_family_arm_m3/hwi_E_hwiLimitExceled__C
    00001390 00001390 00000004 00000004 r-.const:ti_sysbios_family_arm_m3/Hwi_NUM_interrupts__C
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道 CCS 附带的链接器命令文件为什么不这样做。 我建议我们在 TI-RTOS 示例随附的.cmd 文件中转到这个。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可以看到两侧。 trampoline 的额外空间以及跳跃所消耗的时间会影响性能、因此我认为它的应用/用例是特定的。 不过、对于不熟悉链接器和编译器的用户、可能需要在命令文件中添加一点注意事项。 如下所示:

    //现有默认设置,并说明优缺点。
    .intvecs:>flash_base
    .cinit:>闪存
    .const:>闪存
    .text:>FLASH
    .constdata:>FLASH
    .rodata:>FLASH
    binit:>FLASH
    .pinit:>闪存
    init_array:>FLASH
    .EMB_text:>FLASH
    ccfg:>闪存(高电平)
    //对何时选择分段进行注释
    /*
    .intvecs:>flash_base
    .cinit:>闪存
    .const:>>FLASH
    .text:>>FLASH
    .constdata:>>FLASH
    .rodata:>>FLASH
    binit:>FLASH
    .pinit:>>FLASH
    init_array:>>FLASH
    .EMB_text:>>FLASH
    ccfg:>闪存(高电平)
    *
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的。 优点。 我们将在内部进行讨论。