米斯拉说要禁止所有工会。我也知道,只要彻底讨论和记录偏差是允许的。
我们有一个微控制器和一个外部 eeprom 来存储统计数据(事件/错误记录、参数设置等等)。
事件日志由大约 80 多个事件计数器组成,其中一些是 8、16 和 32 位(全部无符号)。参数存储由大约 200 个参数组成,还混合有 8、16 和 32 位值(无符号)。
我们正在重写所有代码以符合 MISRA,并且这些值之前定义如下:
typedef struct
{
U16BIT eventLogVar1;
U32BIT eventLogVar2;
U8BIT eventLogVar3;
U8BIT eventLogVar4;
U32BIT eventLogVar5;
} EVENT_LOG;
typedef union
{
EVENT_LOG log;
U8BIT array[sizeof(EVENT_LOG)];
} ELOG;
ELOG log;
现在这并不真正符合 MISRA。参数日志也是如此。然而,这是从 eeprom 读取和写入的最简单方法,因为我只需通过数组读取/写入即可从 eeprom 读取/写入。
我们还有一些其他规则是不允许我们违反的。没有全局(外部)变量(通过头文件)。如果需要,所有局部变量只能通过 get/set 函数访问。
这意味着,如果我们需要完全写出所有这些参数,那么这些参数都应该有自己的 get/set 函数,以便在整个应用程序中更改它们。
我考虑过的解决方案如下:
#ifdef EITHER
enum
{
eventLogVar1 = 0; /* 00 */
pad01; /* 01 */
eventLogVar2; /* 02 */
pad03; /* 03 */
pad04; /* 04 */
pad05; /* 05 */
eventLogVar3; /* 06 */
eventLogVar4; /* 07 */
eventLogVar5; /* 08 */
pad09; /* 09 */
pad10; /* 10 */
pad11; /* 11 */
}
#else /* OR */
#define eventLogVar1 0 /* 2 bytes */
#define eventLogVar2 2 /* 4 bytes */
#define eventLogVar3 6 /* 1 byte */
#define eventLogVar4 7 /* 1 byte */
#define eventLogVar5 8 /* 4 bytes */
#endif
#define eventLogLastLength 4
U8BIT eventLog[eventLogVar5 + eventLogLastLength];
U8BIT getU8BIT(U8BIT index){}
U16BIT getU16BIT(U8BIT index){}
U32BIT getU32BIT(U8BIT index){}
void setU8BIT(U8BIT index, U8BIT val){}
void setU16BIT(U8BIT index, U16BIT val){}
void setU32BIT(U8BIT index, U32BIT val){}
但是,如果添加或删除值,这会带来繁琐的重构。这也意味着不能使用数组类型的值(并且有一些),如果使用或多或少的某种类型(例如传感器),可以通过定义长度来改变这些值。
你对这个具体问题有什么看法。在这种特定情况下,我/我们是否会更好地记录我们与 MISRA 标准的偏差,并且只在这个特定的地方使用这种偏差,还是有更好的解决方案来解决这个问题?