Other Parts Discussed in Thread: SYSBIOS
工具与 Env:
- CCS 7.4
- SYSBIOS 6.52
- XDCTOOLS 3.50.4.
- GCC (CCS 附带的版本)
- PROCESSOR-SDK-RTOS-AM57xx 4.02
问题简介:
为了构建一个 Cortex-A15 SYSBIOS 项目、在这个项目中、至少调用一次到由模块"ti.drv.uart"实现的运行时接口、链接器抱怨对已包含其库的模块"ti.osal"中定义的函数的未定义引用。
问题详细信息:
VAR CSL = xdc.useModule('ti.csl.Settings');
CSl.deviceType ="am572x";
VAR UART = xdc.useModule('ti.drv.uart.Settings');
UART.socType ="am572x";
VAR OSAL = xdc.useModule('ti.osal.Settings');
OSAL.socType ="am572x";
OSAL.osType ="tirtos";
- debug/linker.cmd:在生成的链接器脚本中、我可以看到包含了正确的 osal 和 UART 库、并且 osal 库出现在语句'input()'中的 UART 库之前。
- 在 CCS 工程的链接阶段、链接器抱怨"未定义对 OSAL_getThreadType 的引用"、"未定义对 SemaphoreP_pend 的引用"和"未定义对 SemaphoreP_post 的引用"。
问题解决方法:
权变措施1:
手动添加一些函数调用、并使 main.c 如下所示:
在向"未定义"等式接口添加一些调用后、链接问题消失了。 请注意、添加的代码没有任何运行时逻辑、只是提供了一种方法来证明问题确实是链接问题。
权变措施2:
在第一个有问题的链接阶段完成并出现未定义的引用错误后、打开文件'linker.cmd'、将'input'更改为'Group'、问题将消失。
在 binutils LD 文档中,Group 的解释是“GROUP该命令类似于INPUT,但命名的文件都应该是归档文件,并且会重复搜索,直到没有创建新的未定义引用”。 因此、在链接库时、该组比输入更适合。
权变措施3:
修改 app.cfg 以使代码"var OSAL = xdc.useModule('ti.osal.Settings');"出现在"xdc.useModule('ti.csl.Settings');"和 "xdc.useModule('ti.drv.uart.Settings');"之前。 然后、在生成的 linker.cmd 中、osal 的库将出现在 CSL 和 UART LLD 的库之后。 链接阶段运行良好、因为链接器会在加载 osal 库时解析引用。
我个人的结论:
"Workaround2 (解决方法2)"是最好的。 但我想它需要对 xdctools 进行一些改进。
我想这个问题可以被视为 RTSC 开发工具的错误。 我希望 xdctools 可以通过在链接器脚本中使用 input()和 Group()命令来区分目标文件和存档。

