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.

[参考译文] MSP430F5529:从汇编器#17003-D 调用 C 函数

Guru**** 2796765 points

Other Parts Discussed in Thread: MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1023938/msp430f5529-calling-c-function-from-assembler-17003-d

器件型号:MSP430F5529

我正在尝试将 FunkOS 从 F2xx 系列移植到 F5xx 系列、我收到了警告#17003-D 代码大小约为1.5kB、RAM 用量为547B。 警告消息为:
"../port/MSP430_CC/F2xx/taskportasm.asm、第69行:警告#17003-D:从汇编代码范围"$./port/MSP430_CC/F2xx/taskportasm.asm:68:84$"重新定位到符号"Task_SetScheduler"溢出;17位重定位地址0x1057c 太大、无法在16位字段中编码(类型='R_MSP430X_ABS16'(15)、文件= 0x00000004、偏移量=/port/MSP430_CC/F2xx/taskportasm.obj)、文件=".0004"
我无法理解17位地址0x1057c 来自何处、因为代码仅为1.5kB。 您能帮我处理这个代码吗?请给我一个提示:我如何通过汇编器调用 C 函数、而不会产生这个警告?

我搜索了论坛、发现其中一个问题是将处理器选项-near_data 更改为 none。 这没用

这是我的项目:

e2e.ti.com/.../spFunkOS_2800_1_2900_.zip

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

    好的、我想我知道这里发生了什么。 MSP430F5529有两个程序部分。 一个是闪存:origin = 0x4400,length = 0xBB80,另一个是 FLASH2:origin = 0x10000,length = 0x143F8。 如何强制链接器将我的所有代码放入闪存中、以便可以容纳16个字节?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="494433" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1023938/msp430f5529-calling-c-function-from-assembler-17003-d ]我无法理解17位地址0x1057c 来自何处、因为代码仅为1.5kB。

    MSP430F5529具有一个具有20位寄存器和128K 闪存的 CPUXV2、其中一些具有>= 64KB 的地址。

    lnk_msp430f5529.cmd 链接器命令文件允许在代码内存模型设置为 large 时、在 FLASH2内存区域中的地址>=64KB 处放置代码。

    Unknown 说:
    您能不能帮助我处理此代码吗?您还能告诉我如何通过汇编器调用 C 函数、而不会产生此警告?

    将代码和数据模型都设置为小值意味着仅使用低64KB 中的闪存:

    由于 FunkOS taskportasm.asm 是为 MSP (16位)而不是 mspx (20位) CPU 编写的、因此汇编器只保存16位寄存器。 为了安全起见、认为 C 编译器还应将器件版本设置为 MSP。

    更长期的修复方法是更改 FunkOS 以支持 mspx CPU。

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

    谢谢切斯特! 这正是我需要的。 我不是很熟悉汇编语言-是否有保存 20位寄存器的技巧?

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

    您使用的代码似乎使用了每个指令保存的旧寄存器。 因此、您的第一步是使用 CPUx 扩展名、使您能够使用单条指令移动多个寄存器。 节省空间和时间。 推图默认为移动字数据、除非您使用 pushm.a.另有说明 当然、保存寄存器需要两倍的时间、因此除非您必须保存、否则请勿执行此操作。

    文档中对此进行了详细介绍。