我有一个关于如何解决MISRA 2004 11.3违规的问题。
代码如下:
tm_uint8 read( tm_uint8* data)
{
data[0] = *((tm_uint8*)0x00003DD2);
data[1] = *((tm_uint8*)0x00003DD3);
data[2] = *((tm_uint8*)0x00003DD4);
}
我想写出存储在物理地址的值。它编译但我有11.3的MISRA违规。我想解决它。任何人都可以帮我吗?
答案 0 :(得分:2)
此规则背后的基本原理是MISRA担心从整数转换为指针时的访问错位。在您的情况下,我假设tm_uint8_t
是1个字节,因此对齐不应该是一个问题。在这种情况下,警告只是误报,您可以忽略它。这是一条建议规则,因此您无需提出偏差。
除了从不使用绝对地址外,没有其他解决办法。这很可能不是一个选择。正如您所知,在编写与硬件相关的代码时,此规则非常麻烦,此类代码无法遵循该规则。
答案 1 :(得分:1)
注:MISRA-C:2004规则11.3相当于MISRA C:2012规则11.4
在需要使用该方法的情况下,一些MISRA C / C ++规则可能会导致违规行为被接受。
正因为如此,MISRA C提供了一种偏离规则的机制 - 这将是您遵循的合适途径......请不要尝试使用"聪明的&#34找到解决规则的方法;代码!
正如此问题所强调的那样,访问特定内存(和/或I / O设备)是一种特殊情况。事实上,MISRA C:2012中包含的一个示例显示这个确切的用例不符合规则。
2016年,MISRA C工作组发布了有关合规性的附加指南,包括增强偏差流程......这可以帮助确定合理的偏差 - 并且访问硬件就是其中之一!
在适当的时候,计划提供更多"分层"指导......但这不会立竿见影。
[请注意免责声明简介]