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/MSP430F5529:中断例程并创建无限循环后,未正确恢复易失常量函数

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/572128/ccs-msp430f5529-volatile-constant-function-being-not-being-restored-properly-after-interrupt-routine-and-creating-endless-loop

部件号:MSP430F5529

工具/软件:Code Composer Studio

我正在为一个LCD屏幕编写一个驱动程序,它将函数指针作为基于所使用的总线的写入或读取机制的参数。

但是,在I2C写入函数中,指针在第一次传输后损坏, 我可以看到它所在的寄存器在第一次调用之前是0x1.0698万,然后在传输之后是0x0.0698万,它只是跳回到具有函数指针的函数的起始位置。


以下是声明和函数调用

volatile const ptR_fxn_write writes_8
volatile const ptR_fxn_write命令
volatile const ptR_fxn_write writeI2C =& write_i2c_4bit;
volatile const pt_fxn_write commands_i2cs =&write_4bit_command_i2c;

init_lcd (命令);
init_lcd_i2c 



这是功能

void init_lcd_i2c (ptR_fxn_write func)//init lcd
{
func (0x33);
func (0x32);
func (0x28);
func (0x0E);
func (0x01);
func(0x06);
func(0x80);

} 



对不起,我有点困惑,我真的不知道如何纠正这一点,我尝试了使指针全局常量,但在中断后,它们仍然被切掉为16位
我是否可以硬声明内存中的函数指针地址在16字节位置,这样它们就不会被切掉?

现在,我只是将函数开头的函数指针重新声明为易失常量,似乎工作正常。

只是想知道为什么会发生这种情况


谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否使用相同的编译器选项编译了所有.c文件? 您是否正在使用任何库?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我没有使用任何库,我从另一个项目导入了一些源文件和头文件,但不会重新编译?

    我可以通过在传递函数的函数中再次声明函数指针来解决该问题。

    我只是想知道这是编译器错误还是什么? 当函数指针长度为20位时,它会将函数指针推送到堆栈。 这是我第二次遇到数据在进入和退出中断时被损坏的情况。  

    谢谢


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此问题的一个明显原因是某些代码是以16位模式编译的,这不会保存寄存器的前四位。 但没有足够的信息来确定您的程序是否属于这种情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    I只是想知道这是编译器错误还是某些错误?[/QUOT]您能否发布一个完整的CCS项目来演示问题?

    这样就可以检查潜在的编译器错误。