软件设计准则若干补充资料
花了两周时间,细读某总给我的《软件设计准则》一文,收获满满!读的过程中有若干不明之处,查找资料补充如下。
1、标准库函数pow()的参数强制转换
C语言标准库函数pow()的两个参数都是double型,如果传的是int型,windows编译器不会自动强制转换,于是结果不可控;gcc会强制将参数由int型转换为double型,结果是确定的。
2、volatile声明变量避免编译器优化
对于那些直接读取硬件数据的变量,要用volatile声明,确保本条指令不会因编译器的优化而省略。在程序中,当读取一个变量时,为提高存取速度,编译器优化时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值。而用volatile声明变量后,要求每次都重新读取这个变量的值,而不是使用保存在寄存器里的备份。
使用volatile变量的几个例子:
1)并行设备的硬件寄存器(如:状态寄存器)。
2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)。
3)多线程应用中被几个任务共享的变量。
3、高水位中断
由于CPU处理速度比外设要快很多,应避免频繁产生中断浪费CPU处理资源,例如串口芯片应配备fifo,尽量多积攒一些消息再出发一次中断处理以提高效率,不宜每收到一个字节就发出一次中断。
4、具有EDAC功能的处理器
空间设备中,单粒子翻转引发SRAM型FPGA的错误很常见。单粒子翻转是指高能粒子射入集成电路的PN结,会发生PN结电离、电荷积累、能量转移等。存储器件某一位数据会从一个稳态转变为另外一个稳态,是引发航天器故障的主要因数。
为了最大限度地减少单粒子效应对FPGA的影响,通常采用三模冗余的加固结构,尽管三模冗余结构可以将错误暂时隔离,但是在长期工作的情况下冗余单元也可能继续发生错误。近年来国内外经常采用EDAC电路来减少或避免错误的发生。
EDAC模块基于海明码,在CPU与RAM之间,保护RAM中的数据,CPU对RAM操作时,EDAC模块已经对RAM中的数据进行了预处理,同时EDAC模块中也加入了使能信号。
应用软件中,要确保EDAC功能确实得到了使能。
5、电平式中断信号
尽量采用脉冲式中断信号,避免采用电平式中断信号,电平式中断信号有可能因错误的中断清除时序导致电平无法被拉回,进而导致无法再次产生中断。电平触发方式适合于外部中断为低电平输入和中断服务程序能清除外部中断源的情况,通常做法在中断退出前关闭中断,等后面恰当时机再打开。
6、vxworks内置的各种状态检测工具
Vxworks自带的各种命令,列出来如下:
i 显示系统信息
taskShow 显示任务TCB信息
taskCreateHookShow 显示任务创建调用例程列表
w 显示所有或者一个挂起任务的信息
CheckStack 显示一个任务的使用堆栈的情况,没有定义任务时显示所有
tt 显示一个任务的调用状况,解析堆栈
d 显示目标机内存, 可以替代内存观察;
m 修改内存
lkup 显示指定符号信息
devs 列出目标机系统上的所有设备
iosFdShow 显示系统中的文件标识符
msgQShow 显示队列的使用状况
SemShow 显示信号量的信息
wdShow 显示看门狗的信息
mqPxShow 显示POSIX消息队列的信息
memPartShow 显示分区块及统计信息
memShow 显示系统分区上空闲和已分配空间的总数等等
arpShow 显示arp列表
ifShow 显示网口信息
tcpstatShow 显示tcp信息
udpstatShow 显示udp信息
inetstatShow 显示连接信息
