我的代码(代码的某些部分)低于警告:
# define MN2DIV 0x14
# define PLL_BASE_ADDRESS 0x481C5000
# define ISS_PLL_BASE (PLL_BASE_ADDRESS+0x140)
# define M_PLL (volatile Uint32*)(ISS_PLL_BASE+MN2DIV)
uint16 getfreqmhz(void)
{
uint16 M;
M= *M_PLL;
}
- 注释 923:从 int 转换为指针 [MISRA 2004 规则 11.3]
- 信息 734:精度损失(赋值)(32 位到 16 位)
我试过像这样转换:M= (uint16)*M_PLL ;
上述更改的原因是警告 734 已被删除,但我认为这是不正确的想法。
谁能告诉我这样做的正确方法......
最佳答案
这里的关键是您正在与您(大概)具有严格规范的硬件交互。
如果 MISRA 是通用静态分析器,它不会识别微 Controller 环境中的独特保证。你正在做 C++ 不太喜欢作为标准的事情,因为它们在(比如说)PC 上没有意义。但是,如果有关于硬件及其接口(interface)的足够信息,您的代码在实践中可以是绝对安全的;如果是这样,您可以忽略/禁止这些诊断。
注释告诉您关于您的
(volatile Uint32*)(ISS_PLL_BASE+MN2DIV)
(在宏内),您在其中从一个整数形成一个指针。在任何任意 C++ 程序中,我都会同意 MISRA 并说这是错误的形式,但由于您指定的是您知道的实际 PLL 位置,所以对我来说似乎没问题。我自己做。
因此,您可以安全地忽略该注释。
“信息”是不言自明的:宏建议您将每个寄存器位置视为一个 32 位字,但随后您试图将该值塞入 16 位。
一些可能性:
- 这是错误的,每个寄存器实际上是 16 位;
getfreqmhz
应该返回一个uint32
;或- 或根据对值范围的一些了解,您确定自己所做的事情是有效的,然后您的转换方法就可以了。
关于c++ - 精度损失(赋值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21191492/