本文介绍了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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!