主题中讨论的其他器件:MCU-PLUS-SDK
工具与软件:
我们在将 TI 示例"UART echo interrupt LLD no RTOS"移植到我们的环境时发现了一个问题。
-使用 MCU-PLUS-SDK AM263X SDK(9.2.0.56 )。 编译源代码。 未在库中链接。
-编译器标记相同:
-使用 arm-none-eabi-gcc 和 ld 作为工具链
-编译器标志:-mcpu=cortex-r5 -mfloat-abi=hard -mfpu=vfpv3-d16 -mlittle-endian -mthumb -DSOC_AM263PX -D_debug_=1 -g
-链接器标志:-mcpu=cortex-r5 -mfloat-abi=hard -mfpu=vfpv3-d16 -mlittle-endian -mthumb -DSOC_AM263PX -D_debug_=1 -g
此示例在 CCS 和 AM263P-CC 评估板上成功运行。 但在移植到我们的环境中时、未修改会导致 SoC 跳转到意外的地址、并最终生成"未定义的地址"中断。
相关代码是 uart_echo_interrupt_lld.c ln 161。
void UART_LLD_writeCompleteCallback (void * args)
{
unlock_mutex (gUartObject[CONFIG_UART_CONSOLE].writeTransferMutex);
返回;
}
mutex_armv7r_asm.S ln 94
// unlock_mutex
unlock_mutex:
MOV R1、#0
dMB //释放受保护资源之前需要
STR R1、[R0]//解锁互斥体
SIGNAL_UPDATE
Bx LR
在 UART 中断期间、UART_LLD_writeCompleteCallback 调用 UNLOCK_mutex。 当单步进入 unlock_mutex 时、内核在 DMB 指令期间跳转到意外的地址。
我们的开发人员发现了这个问题并使用.type 指令修复了这个问题。 这是他的评论。
==================================================================
将汇编代码与 C 代码混合时存在一个问题。通常、汇编代码是在 ARM 模式下编译的、但其余 C 代码是在 Thumb 模式下编译的。 它的要点是使用了错误的指令从 C 代码调用 ARM 模式。 例如、调用"unlock_mutex"的 C 函数(在 mcu_plus_sdk_am263x_09_02_00_56\source\kernel_nortos\DPL\R5\Mutex_armv7r_asm.S 中)会被编译为"BL. "、这是错误的;处理器会一直处于 Thumb 模式、并开始将 ARM 代码误解为 Thumb。
但是、我们奇怪地发现、此文件中的函数没有".type %function"指令将它们声明为函数、而其他汇编文件(例如:pmuP_armv7r_asm.S)将这些函数正确应用于函数。 如果我们将这些指令添加到 mutex_armv7r_asm.S 中的函数(例如:".type unlock_mutex、%function")、生成的代码就很好(函数调用被编译为"blx" ")且代码工作正常。
使用的编译器:arm-none-eabi-gcc (xPack GNU Arm Embedded GCC x86_64) 11.2.1 20220111、带链接器 arm-none-eabi-ld (xPack GNU Arm Embedded GCC x86_64) 2.37.20220122、但它似乎与所使用的版本无关;我们在 arm-none-eabi-gcc (xPack GNU Embedded GCC x86_64) 14.1.0和 linker (binr)上观察到了相同的问题。
==================================================================
请就下列问题提供帮助:
1. TI/CCS 设法正确构建/连接它。 TI 的工具链如何处理此问题? 它使用与我们的 GCC 环境相同的代码和标志?
2. TI 有何建议在我们的环境中采取相应的缓解措施? 编辑 SDK 并将.type 指令添加到所有汇编函数?
3. TI 能否更新 SDK 以支持 GCC?
感谢您的支持





