GCC变量映射与MISRA-C [英] GCC variable mapping and MISRA-C

查看:20
本文介绍了GCC变量映射与MISRA-C的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我主要知道两种方法(有许多变体,使用双字段,每个外围设备的数据结构,等等)使用GCC声明内存映射寄存器:

  • 使用以右地址开头的指针,如volatile uint32_t *pMyRegister = (uint32_t *)0xDEADBEEFUL;
  • 或定义一个变量并手动映射它,如volatile uint32_t MyRegister __attribute((section(".register_section")));,然后映射LD文件中的节。

遗憾的是,这些方法似乎都不符合MISRA-C编码规则,第一种是因为存在未经授权的(由MISRA)从整型转换到指针的转换,第二种是由于关键字ATTRIBUTE。

我的问题是:有没有一种方法(使用第二种解决方案)在不影响代码的ANSIness的情况下映射部分中的变量(即。无编译器特定的关键字)。

谢谢

推荐答案

首先,两者都不正确,因为缺少volatile。请参阅How to access a hardware register from firmware?,其中还简要介绍了Misra-C。

为了回答这个问题,这条MISRA-C:2012 11.4规则是建议性的,其基本原理是(末尾的注释由我附加):

...但在寻址内存映射寄存器或其他硬件特定功能时可能是必需的。如果在整数和指针之间使用强制转换,则应小心...[以免导致未定义的行为未对齐]

因此,您可以安全地在您的寄存器声明中忽略此规则,如果需要,请参考规则11.4的基本原理。因为它是建议性的,所以不需要偏离(但最好是您应该记录您仍然忽略该规则)。

值得注意的是,从MISRA-C的角度来看,两个版本中的前一个版本更可取,因为它不包含记录如何使用它们所需的非标准扩展,而其他MISRA规则则要求使用非标准扩展。

这篇关于GCC变量映射与MISRA-C的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆