c++ - 一旦触发中断,对象的成员值就会改变
问题描述
我有一个 UART 类,其中包含Fifo
. 我注意到,一旦 UART IRQ 处理程序被触发,Fifo
实例的成员变量就会发生变化。我想不出任何进一步的断点,因为里面的东西看起来非常好Uart::init()
……接下来发生的事情是 IRQ 处理程序。
// uart.hpp
class Uart
{
Fifo rx;
Fifo tx;
public:
void init();
void irqHandler();
};
// uart.cpp
static Uart *pUart;
void Uart::init()
{
pUart = this;
// verified Uart::rx's members are as expected
// ...
}
void IRQ_Handler(void)
{
pUart->irqHandler();
}
void Uart::irqHandler()
{
// Uart::rx members seem to have changed here...
}
int main(void)
{
Uart uart;
uart.init();
while(1);
}
解决方案
- 将共享对象声明为 volatile:
static volatile Uart *pUart;
- 如果代码已经用优化开关编译,不要期望调试器会话很容易理解。代码和数据可以省略或重新排序,使其不再反映源代码所暗示的顺序或状态。
推荐阅读
- homebrew - 错误:google-backup-and-sync:似乎已经有一个应用程序
- node.js - 节点找不到自定义类的模块
- python - 调试python代码以检索rest api访问令牌
- excel - 需要修复一个excel单元格,但是当我复制并粘贴下面的行时,固定单元格应该改变
- python - 使用 .loc 不一致地切片列
- smtp - BizTalk SMTP 消息“msg_Email”的“PartAttachment”部分在构造块的末尾包含空值
- mysql - 如何使用特定规则将 TOP 3 值选择到 3 列?
- json - JSON 模式不验证缺少的属性
- java - 为什么 Eclipse 中的 Codota 插件不起作用?
- c - fopen 读取无效的参数 C