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.

[参考译文] MSP430FR4133:将项目从 cl430传输到 gcc430-elf-gcc

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1284688/msp430fr4133-transfer-project-from-cl430-to-gcc430-elf-gcc

器件型号:MSP430FR4133

大家好!

我想将 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 正在做什么。