C 语言中 if 或 while 语句中带有宏的 HardFault

问题描述

我有以下宏用于读取 STM32F091 寄存器中的单个位:

#define GET_BIT(reg,pos)          (((reg)>>(pos))&0x00000001u)

我必须使用带有这两个参数的宏:

#define FLASH_KEYR                 (*((u32_t *)(0x40022004u)))
#define BSY_FLASH_SR_POS           (0u)

使用此宏来评估单个变量时没有任何问题,例如:

uint32_t value = GET_BIT(FLASH_SR,BSY_FLASH_SR_POS);

但是,在这样的条件语句上使用这个宏:

    while (GET_BIT(FLASH_SR,BSY_FLASH_SR_POS) == 1u);

微型进入硬故障的 ISR。

...为什么?

解决方法

问题是你在重新发明轮子,结果是错误的。

这里不是帮助您重新发明另一个新轮子,而是 ST 已经为您制作的现有轮子:

#include "stm32f0xx.h"

...

while ((FLASH->SR & FLASH_SR_BSY) != 0);
,

如果你坚持要重新发明轮子,那么它在循环中不起作用的原因是你错过了指针转换中的 volatile。

我的另一个答案仍然是正确的专业答案(尤其是在安全关键的环境中),但从评论中可以看出这是您更愿意接受的答案。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...