Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象';s成员';一旦触发中断,值就会改变_C++_Embedded - Fatal编程技术网

C++ 对象';s成员';一旦触发中断,值就会改变

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

我有一个UART类,它有
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;