gpt4 book ai didi

c - 如何使用 CMSIS API 将无符号整数转换为枚举

转载 作者:行者123 更新时间:2023-12-04 03:56:37 25 4
gpt4 key购买 nike

我正在使用 CMSIS API在我的 ARM Cortex-M CPU 的 C 程序中。
CMSIS 将 NVIC_DisableIRQ 函数定义为

__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn);

IRQn_Type 是一个typedef 枚举,比如

typedef enum IRQn
{

NonMaskableInt_IRQn = -14, /* 2 Non Maskable Interrupt */
HardFault_IRQn = -13, /* 3 HardFault Interrupt */
.....
Interrupt0_IRQn = 0,
Interrupt1_IRQn = 1,
Interrupt2_IRQn = 2,
} IRQn_Type;

所以,鉴于我想调用 NVIC_DisableIRQ,因为

NVIC_DisableIRQ( (IRQn_Type )(SCB->ICSR -16);

这未通过 MISRA 检查

note 9034: cannot assign 'unsigned32' to different essential type'enum (IRQn)' [MISRA 2012 Rule 10.3, required]

我理解 MISRA 提示的原因,但这是一个实用的解决方案吗?我发现是为了创建巨大的 switch/case ,还有其他解决方案/hacks 可用吗?

最佳答案

假设 SCB->ICSR -16 产生了 uint32_t 结果,那么您不能将其分配给 enum 变量( 10.3) 也不允许将其转换为 enum (10.5)。这是因为枚举具有实现定义的大小和符号。

我想可能有各种肮脏的技巧来躲避 MISRA,但这违背了这些规则的相当合理的理由,归结为:不要在代码中到处使用带符号的操作数,以使其在各种微妙和困惑的情况下失控严厉的方式。例如更改默认编译器枚举类型导致所有中断改变行为 - 这不好 - 可能很危险。

问题的根源在于 enum 类型和 CMSIS 函数 __NVIC_DisableIRQ 需要 enum。如果那个写法不同,我们就可以使用无符号类型。奇怪的是,草率的不符合 MISRA 标准的库仍在 2020 年推出。

我建议您放弃该函数并编写自定义函数。这些函数中的大多数只是简单的单行汇编程序指令或寄存器写入的包装器,因此如果您可以访问函数实现,则可能不需要太多努力。

请注意,MISRA-C (10.5) 允许从枚举类型转换为无符号类型,因此如果您基于 uint32_t 创建 API,您仍然可以通过类型转换传递枚举值。

关于c - 如何使用 CMSIS API 将无符号整数转换为枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63775356/

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