gpt4 book ai didi

c++ - 为什么回调标志在没有明显原因的情况下被清除和/或损坏?

转载 作者:太空宇宙 更新时间:2023-11-04 11:55:42 24 4
gpt4 key购买 nike

我正在为处理器编写 SD 卡 SPI 驱动程序。我知道 SPI 驱动程序很好,因为我也将它用于 LCD,并且直到现在,一直在愉快地向卡发送命令。我在处理一项特定交易时遇到了问题,在我看来,这与其他任何交易都没有什么不同。

在 SPI 总线上写出数据后,我等待中断回调通知接收和传输已完成。有两个回调,它们将 struct 中的以下 bool 标志设置为 true:

m_transaction_status.sdts_rx_complete

m_transaction_status.sdts_tx_complete

在正常的程序流程中,我会等待这些标志被设置后再继续:

while ((m_transaction_status.sdts_rx_complete == false) //
|| (m_transaction_status.sdts_tx_complete == false))
{
// Check whether we've had an error.
if (m_transaction_status.sdts_error == true)
{
LOG_ERROR(SD::MODULE,
"transfer_data: Transaction error.");
transfer_status = false;
break;
}
}

对于问题交易,我在回调中设置了一个断点,可以看到两个标志都被设置了,但是当我返回正常流程时,变量突然不可用并且看似 false 因为然后我永远陷入循环。此循环用于所有其他交易,没有问题。

我是否有任何理由可以调查为什么这些变量被设置但随后(显然)被清除或释放或其他不愉快的事情?

编辑:

中断确实是微型中断(准确地说是 Renesas RL78)。

结构声明是:

/**
* The state of an SD SPI transaction.
*/
struct SDTransactionStatus
{
/** Transaction error flag. */
bool sdts_error;
/** Transmission completion flag. */
bool sdts_tx_complete;
/** Reception completion flag. */
bool sdts_rx_complete;
};

struct 是作为我的 SD 类的私有(private)成员实现的。这些标志是通过回调中的简单设置函数设置的。

最佳答案

我不知道你的特定微 Controller ,也不知道你必须使用它的 C++ 编译器,但这不应该改变我要说的任何内容。

我相信问题是,在你的循环中你永远不会改变你的标志的值,你只是读取它们,所以编译器可以自由地优化东西并在循环外读取你的变量一次(即缓存它们)因为它不知道它们可以改变。类似的东西:

const bool complete = !m_transaction_status.sdts_rx_complete
|| !m_transaction_status.sdts_tx_complete;
const bool error = m_transaction_status.sdts_error;
while (complete) {
if (error) {
//...
}
}

你明白为什么这不能给出好的结果。解决方法是告诉编译器您的变量可以“在其背后”更改,并且它实际上需要重新读取它们每次您在代码中访问它们 .

由于您不是多线程或其他任何东西,您只需在 struct 的声明中向变量添加一个 volatile 限定符即可:

struct SDTransactionStatus
{
volatile bool sdts_error;
volatile bool sdts_tx_complete;
volatile bool sdts_rx_complete;
};

现在,为什么你没有早点发现这个问题有点神秘,但你必须记住“编译器可以自由优化”并不意味着它总是必须。作为一个疯狂的猜测,我会说您使用该循环的其他地方不适合这种优化,而您遇到问题的地方却适合。

当然,我可能对整件事都是错误的,但由于信息太少,很难判断,而且无论如何,这个优化/ volatile 问题仍然存在于您的代码中,即使它不是您当前问题的原因,所以您仍然必须修复它,因为即使您当前的问题无关紧要,我所描述的情况也可能随时发生。

编辑:哦,您可能应该检查您的整个代码库以确保这种情况不会在其他地方发生。

关于c++ - 为什么回调标志在没有明显原因的情况下被清除和/或损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16236334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com