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.

[参考译文] GCC-AM263PX:将 MCU-PLUS-SDK 与 AM263PX SDK 配合使用会导致混合 C/汇编代码出现"未定义的地址"

Guru**** 2526700 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1409753/mcu-plus-sdk-am263px-using-gcc-with-am263px-sdk-causes-undefined-address-with-mixed-c-assembly-code

器件型号:MCU-PLUS-SDK - AM263PX
主题中讨论的其他器件: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?

感谢您的支持

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

    我无法回答太多问题。  但我可以在这个问题上提供一些说明...

    Unknown 说:
    TI 的工具链如何处理这个问题?

    这是什么 tiarmclang 链接。  对于拇指函数,编译器发出指令...

    .thumb_func

    这会使相关函数符号位于奇数地址。  即、1与地址的最低有效位(LSB)进行"或"运算。  通过这种方法链接器知道函数是处于 Thumb 状态还是 ARM 状态。  编译器始终使用 BL 调用函数的指令。  链接器看到该 A 时的响应 BL 指令会导致状态改变(从拇指到 ARM 或反之)、它会更改 BL 指令的目标 BLX .  用于返回的指令( BX LR 或恢复保存的弹出窗口 lr 从堆栈加载到中 PC )依靠返回地址的 LSB 来了解要返回的函数是处于拇指状态(LSB = 1)还是处于 ARM 状态(LSB = 0)。   

    关于剩下的问题、我已将此线程的责任更改为为您器件的 SDK 提供支持的团队。

    谢谢。此致、

    -George.

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

    感谢您的解释。  

    为了清楚起见、当从 C 函数生成汇编代码时、tiarmclang 会添加.thumb_func 是很有意义的。  但它是否也会为汇编函数执行此操作?   

    是否有文档说明 tiarmclang 如何实现这一点、以便我们在使用 GNU gcc 时可以复制它?  

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

    在此处发布更多信息、以帮助进行讨论、并让其他人认识到这个问题:

    汇编器生成的 mutex_unlock ARM 模式指令

    CCS 工具链使用 blx 指令调用生成正确的汇编代码 .

    GNU 工具链使用 BL 指令进行调用时生成不正确的汇编

    GNU 工具链仅使用 blx 指令调用生成正确的汇编代码 仅在修改 SDK 时。

    kernel/nortos/DPL/R5/Mutex_arm7r_asm.S、从而添加.type 指令。

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

    你(们)好、Huey

    有关 armclang 的所有文档、请参阅 software-dl.ti.com/.../。

    我们目前尚不支持 AM263x 器件的 GCC、建议使用 ti-arm-clang。

    此致、
    Akshit