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.

[参考译文] CCS/MSP430FR5739:20位函数指针

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/585420/ccs-msp430fr5739-20-bit-function-pointers

部件号:MSP430FR5739

工具/软件:Code Composer Studio

您好,

我将MSPBoot UART引导加载程序移植到MSP430FR5739。 bootloader正在使用声明为void指针的回调函数。

typedef结构 {
   void (*RxCallback)(uint8_t);           // RX标志回调
   void (* TxCallback)(uint8_t *);         // TX标志回调
   void (*ErrorCallback)(uint8_t);//        错误回调
}t_CI_Callback;

当代码使用mspx (大代码,大数据标志)编译时,编译器似乎认为回调指针是20位地址,并加载了错误的地址。

内存内容:

0x001C04 FF56
0x001C06 RxPacket
0x001C0.6001万C 0000 0000 1C00 7CE6 7CE6 7CE6 7CE6 7CE6 00E6

为获取回调函数地址而执行的汇编指令为:

Mova   &0x01c04,R15

R15寄存器中加载的是0x0CFF56,它是0x001C06的4个LSB和0x001C04的16位回调指针。

我可以告诉编译器使用20位回调指针吗? 或者,在使用函数指针时是否应该只使用小代码标志?

谢谢!

Jocelyn Harvey

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

    由于FR5739 FRAM空间不超过16位(全部< 0xFFFF),因此应使用小型数据模型。 使用20位回调指针有何用途? 您的应用程序是否打算使用共享回调?

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有任何使用20位指针的目的,所以我将使用小数据模型来使其工作,但我发现奇怪的是,当选择大内存模型时,指针(例如:void*用于回调函数)仍然是16位。 它会导致函数调用到未定义的内存。 《编译器用户指南》的表5-2提到,当选择大数据模型时,数据指针应该是存储在32中的20位。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我发现了问题... MSPBoot引导加载程序中的回调指针强制位于链接程序脚本文件的特定位置,因此编译器不知道它是指针,应存储为20位值。

    CI_Callback_PTR = 0x1C04;  /*指向通信回调结构的指针*/

    谢谢!