您好!
似乎没有正确编译简单的内联函数。 以下是清除寄存器位的内联函数:
static inline void
CAN_disableMailbox(uint32_t base, uint16_t mbx)
{
(*((volatile uint32_t *)((uintptr_t)(base + 0U + 0x0U)))) &= ~(((uint32_t) 1U) << (mbx-1U));
}
让我们假设被修改的寄存器的初始值为0。 当上述函数被执行为"内联"时、函数后的寄存器为0xFFFFFF0000、当它被执行为常规静态函数时、寄存器为0x00000000。
我仍在尝试从 ASM 中找出导致此问题的根本原因。
您是否认为上述实施存在问题?
如果我按以下方式展开函数行、它将按预期工作:
uintptr_t ptr = (uintptr_t) (priv->base + 0U + 0x0U); volatile uint32_t *pptr = (volatile uint32_t *) ptr; uint32_t reg = *pptr & ~(((uint32_t) 1U) << (mbx - 1U)); *pptr = reg;
但是、它不能以缩写形式工作:
*pptr &= ~(((uint32_t) 1U) << (mbx - 1U));