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.
大家好!
我想将 Code Composer 9.3.0下运行 cl430版本(v18.12.4.LTS)的旧版 MSP430 (FR4133)工程转移到最新可用的 TI MSP 430 GCC 和 Linux Ubuntu 下的 CMAKE 设置。
如果您问为什么:拥有基于 GCC、相对面向未来且独立于 IDE 的解决方案,可以方便地使用和集成诸如 clang-format 和 clang-tid.
但是、我仍然有一个问题、那就是内置的 hex 文件似乎有问题、我必须进行一些我无法100%确定的调整。 我想通过 MSPFlasher 刷写十六进制、以证明它像以前一样工作。
代码基于用于 MSP430的 TI RTOS、不再进行维护: downloads.ti.com/.../tirtos_msp43x_setuplinux_2_20_00_06.bin
为了获得编译和链接的代码、我必须将我从 TI 网站下载的 MSP430_driverlib 替换/更新为2.91.13.01。
我还使用了可以从 TI 网站获得的最新 MSP430 gcc 编译器:msp430-gcc 9.3.1.11
此外、我必须将 POP.A 汇编器指令替换为 POPX.A、以再次提取 prep_stack_for_RETI 函数汇编中的20位地址。 如这里所示: Diapositivo 1 (roboticsclub.org)。 我在这里的理解是否正确?
我已经为 GCC 设置了以下编译器标志
-mload (对20位指针、20位 size_t 使用大型模型寻址)
-O2 -ffunction-sections -Fdata-sections -mhwmult=none -g
mlarge-flag 似乎与 cl430的--code_model=large 等效
代码需要根据#ifndef 检查是否设置了__large_code_model__,但在 gcc-msp430中,mcro 不可用,我必须手动设置定义。
调整代码和数据区域参数也没有任何帮助。
GCC 链接器标志
-mmcu=${msp_mcu}
-t/usr/bin/msp430-gcc/include/msp430fr4133.ld
-nostdlib
-WL、-Map=${EXE_flowmeter}.map
-WL,--GC 部分
我没有看到以下内容直接等效的其他 cl430编译器标志:
--- heap_size=160–转换为 ihex 时它与 objcopy 参数有何关系?
--- stack_size=160–它和 objcopy 参数有什么关系?
--- silicon_version=mspx -根据文档也需要 cl430 20位指针。
是否有人提示可以这么做、以及有关代码模型的设置是否足够? 我已检查代码、并确信不会遗漏包括 CMAKE 设置中的部分代码。
TI 编译器文档: MSP430优化 C/C++编译器 v18.1.0.LTS 用户指南(修订版 R)
GCC 编译器文档: MSP430 GCC 用户指南(修订版 F)(TI.com)
使用"-nostdlib"链接肯定会导致问题、因为将不会有 C 启动代码。 初始化变量然后调用 main ()的所有东西。
堆和堆栈大小无论如何用处不大、因此不会有太大的损耗。 堆在 BSS 结束时启动并增长。 堆栈从内存末尾开始并向下增长。 如果他们见面,就会有麻烦。 但在嵌入式应用中使用动态分配通常不是一件好事情。
其他事项:
hwmult -编译器知道在给定 MCU 的情况下该怎么办。
包含"-Wall"、用于对代码执行类似的无绒布操作。
链接器脚本-在给定 MCU 的情况下、编译器知道要使用哪一个脚本
不清楚为什么你混乱的 popx ,除非这是在 RTOS 状态保存/恢复代码。 在这种情况下,popm 是更好的选择。
你好,大卫,非常感谢! 我你所有的积分都是有效的,并按照描述的工作。 我从另一个 CMAKE 编译器设置中获取-nostdlib 标志、但该设置应用了自定义链接器。 我的错误是认为、由于 ltoa 等函数不可用、 它会解决 TI 库和编译器库之间的差异、而事实上、非 C 标准函数只需用代码中的 GCC newlib 签名替换。
汇编器代码位于 RTOS 代码中、以准备从中断返回的栈。 它与我上面提到的已停产 RTOS 库中的 RTOS 代码、下面的代码非常一致。 如果我将 POP.A (或 POPX.A)替换为 POPM.A #4、它也能正常工作。 POPM 更好吗、因为它更显式? 我认为它应该涵盖全部20个位?
POP.A R14 PUSH.W R14 RRAM.A #4, R14 ; merge upper 4 bits of RA into AND.W #0xf000, R14 ; upper 4 bits of SR BIS.W SR, R14 PUSH.W R14 PUSHM.A #7, R10 MOV.W SP, 0(OLD) ; small data pointer MOV.W 0(NEW), SP POPM.A #7, R10 RETI
popm (和 pushm)可移动多个寄存器、以便节省空间。
这是奇怪的代码。 我只使用过 FreeRTOS、因此不知道 TI RTOS 正在做什么。