参考答案:
【问题1】 【问题2】
1) 不允许。违背(建议)规则6.3。
2) 不允许。 违背(建议)规则6.3、(强制)规则15.3和(强制)规则15.5。
3) 不允许。违背(建议)规则6.3。
4) 不允许。违背(建议)规则6.3 和强制规则8.1。
5) 不允许。违背(建议)规则6.3和强制规则12.2. x=exp_1(&y)+exp_2(&)应修改为:x=exp_1(&y);x+=exp_2(&y)。
6) 不允许。违背(建议)规则6.3 和强制规则10.3;(unsigned int *)s是危险的类型转换。
图3-1可能存在大小缓冲不匹配、时钟不准和422总线缓冲丢字节等三方面丢数据包现象。
(1)大小缓冲不匹配。由于CCDL任务在每100ms将大缓冲的数据拷贝到小缓冲后,进行协议包解析。当两缓冲存在大量接收数据包时,如果CCDL任务处理机制设计不合理,有可能解析时间过长而引起丢包现象。
(2)100ms时钟不准。由于大小环形缓冲数据交换采用100ms时钟周期处理,而100ms时钟周期依赖于10ms计时器,如果10ms计时器受到系统干扰可能丢失中断,则
引起100ms时钟周期增加10ms。导致CCDL任务定时时间不准,不能按100ms周期解析协议包,过早解析协议包,而当前周期的协议包还未到达,可能导致丢包。
(3)422总线缓冲丢字节。422总线有8字节输入缓冲,如果将422总线设置为全满中断时,在数据输入流量大的情况下,8字节FIFO字节输入缓冲容易溢出,导致字节丢失,一旦协议包校验和失败,会丢弃此包,这样会导致丢包。
【问题3】
(1)512B和4096B两个缓冲区合并,以减少缓冲区拷贝不同步而产生的丢包问题。
(2)精简10ms时钟中断处理程序,避免10ms中断的丢失,所引发100ms任务不能准时启动。
(3)充分利用422芯片的缓冲区的满、半满和空中断机制,避免422缓冲区内字节数据未及时读出而丢失,使100ms任务找不到包头或校验码错。
(4)采用新型校验码,降低传输中的数据错误。
(5)缩短100ms任务的循环周期,以及时处理CCDL任务。
详细解析:
本题问题1考查MISAR-C标准,该标准中约定:
强制规则是对程序员的强制要求,编译会报错;
建议规则要求程序员在通常情况下都要遵守,编译会报警,应该遵守。
本题相关规则如下:
(建议)规则6.3:必须用typedef显式标识出各数据类型的长度和符号特性,避免直接使用标准数据类型。如: typedef unsigned int uint32_t。
(强制)规则8.1:函数应当有原型说明,且原型在函数的定义和调用范围内都是可见的。
(强制)规则12.2:表达式的值在标准所允许的任何次序下应该都是相同的。
(强制)规则10.3:危险的类型转换。
(强制)规则15.3:switch语句的最后子句应当是default子句。
(强制)规则15.5:switch语句至少应有一个case子句。