C++ 对象';s成员';一旦触发中断,值就会改变
我有一个UART类,它有C++ 对象';s成员';一旦触发中断,值就会改变,c++,embedded,C++,Embedded,我有一个UART类,它有Fifo的实例。我注意到的是,一旦UART IRQ处理程序被触发,Fifo实例的成员变量就会发生变化。我不能再考虑设置断点了,因为Uart::init()…中的事情看起来非常好,接下来要做的就是IRQ处理程序 //uart.hpp 类Uart { 先进先出接收; 先进先出技术; 公众: void init(); void irqHandler(); }; //uart.cpp 静态Uart*pUart; void Uart::init() { 普亚特=这个; //已验证U
Fifo
的实例。我注意到的是,一旦UART IRQ处理程序被触发,Fifo
实例的成员变量就会发生变化。我不能再考虑设置断点了,因为Uart::init()
…中的事情看起来非常好,接下来要做的就是IRQ处理程序
//uart.hpp
类Uart
{
先进先出接收;
先进先出技术;
公众:
void init();
void irqHandler();
};
//uart.cpp
静态Uart*pUart;
void Uart::init()
{
普亚特=这个;
//已验证Uart::rx的成员与预期一致
// ...
}
无效IRQ_处理程序(无效)
{
pUart->irqHandler();
}
void Uart::irqHandler()
{
//Uart::rx成员似乎在这里发生了变化。。。
}
内部主(空)
{
通用异步收发器;
uart.init();
而(1),;
}
当我在
IRQ\u处理程序
中添加了两行额外的代码(inta;a++
)时,我没有看到Uart::rx
成员的问题发生变化。您可能正在试着调试优化的代码吗?您所说的优化代码是什么意思?您在构建此代码时使用了编译器优化开关吗?通常,在使用符号调试器时最好不要使用编译器优化。pUart
在任何情况下都应该是静态易失性Uart*
。“如何使用C的Volatile关键字”,所以您怀疑uart实例的成员在ISR执行期间得到了优化?什么会导致成员改变他们的价值观volatile
用于强制编译器从register@Jazzy优化发生在静态编译期间,而不是执行期间。成员不需要更改值,可能是指针没有加载,只是引用了不同的内存。我不想猜测乐观主义者或试图弄清楚它是如何工作的。你跟踪链接了吗?Volatile不仅仅适用于寄存器。它也用于线程上下文之间共享的内存。编译器可以假设没有使用ISR,因为主线程中没有调用它,这可能会导致您需要防止的各种错误优化。但ISR不是被调用了吗?说到ISR,我指的是IRQ\u处理器
。您可能暗示了pUart->irqHandler()
,这可能不会被调用,因为编译器可能会优化pUart
?@爵士线程和中断不是C语言的一部分。编译器不知道中断,也不知道在没有显式调用的情况下如何、何时甚至是否调用中断。这是一个硬件功能。你可以猜测这个答案,也可以试试。如果它不能解决问题,那么还有一些问题需要进一步调查。如果您需要知道它为什么工作,最好在一个新问题中解决。另一个问题可能是IRQ\u处理程序
甚至不被编译器视为ISR。然后编译器注意到它没有被调用。即使您成功地在向量表中注册了函数。大多数编译器需要一些非标准的东西,比如中断
或\uuu属性(blahblah)\uuuu
或一些杂注。
static volatile Uart *pUart;