c++ - 精度损失(赋值)

标签 c++ c lint

我的代码(代码的某些部分)低于警告:

# 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/

相关文章:

android - NoSuchMethod :org. jetbrains.kotlin.resolve.diagnostics.DiagnosticSuppressor$Companion.getEP_NAME()Lcom/intellij/openapi/extensions/ExtensionPointName;

c - 如何在c中将char数组设置为字符串

C 内存泄漏,在 while 循环中连接

c - 共享库中的全局变量

c++ - 在 Armadillo 立方体中添加一列 1 的有效方法

ios - 使用自定义 linter 规则的 Objective C 静态分析?

node.js - 如何重命名 `await` 中的导入变量,使其不会隐藏其他变量?

c++ - 如果模板从未在未评估的上下文之外被调用,是否返回 declval UB?

c++ - 如何使 C++ cout 不使用科学计数法

使用模板定义多个函数的 C++ 通用方法