花了兩周時(shí)間姚淆,細(xì)讀某總給我的《軟件設(shè)計(jì)準(zhǔn)則》一文于样,收獲滿滿!讀的過(guò)程中有若干不明之處掩驱,查找資料補(bǔ)充如下芒划。
1、標(biāo)準(zhǔn)庫(kù)函數(shù)pow()的參數(shù)強(qiáng)制轉(zhuǎn)換
C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù)pow()的兩個(gè)參數(shù)都是double型欧穴,如果傳的是int型民逼,windows編譯器不會(huì)自動(dòng)強(qiáng)制轉(zhuǎn)換,于是結(jié)果不可控涮帘;gcc會(huì)強(qiáng)制將參數(shù)由int型轉(zhuǎn)換為double型拼苍,結(jié)果是確定的。
2调缨、volatile聲明變量避免編譯器優(yōu)化
對(duì)于那些直接讀取硬件數(shù)據(jù)的變量映屋,要用volatile聲明苟鸯,確保本條指令不會(huì)因編譯器的優(yōu)化而省略。在程序中棚点,當(dāng)讀取一個(gè)變量時(shí),為提高存取速度湾蔓,編譯器優(yōu)化時(shí)會(huì)先把變量讀取到一個(gè)寄存器中瘫析;以后再取變量值時(shí),就直接從寄存器中取值默责。而用volatile聲明變量后贬循,要求每次都重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份桃序。
使用volatile變量的幾個(gè)例子:
1)并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)杖虾。
2)一個(gè)中斷服務(wù)子程序中會(huì)訪問(wèn)到的非自動(dòng)變量(Non-automatic variables)。
3)多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量媒熊。
3奇适、高水位中斷
由于CPU處理速度比外設(shè)要快很多,應(yīng)避免頻繁產(chǎn)生中斷浪費(fèi)CPU處理資源芦鳍,例如串口芯片應(yīng)配備fifo嚷往,盡量多積攢一些消息再出發(fā)一次中斷處理以提高效率,不宜每收到一個(gè)字節(jié)就發(fā)出一次中斷柠衅。
4皮仁、具有EDAC功能的處理器
空間設(shè)備中,單粒子翻轉(zhuǎn)引發(fā)SRAM型FPGA的錯(cuò)誤很常見(jiàn)菲宴。單粒子翻轉(zhuǎn)是指高能粒子射入集成電路的PN結(jié)贷祈,會(huì)發(fā)生PN結(jié)電離、電荷積累喝峦、能量轉(zhuǎn)移等势誊。存儲(chǔ)器件某一位數(shù)據(jù)會(huì)從一個(gè)穩(wěn)態(tài)轉(zhuǎn)變?yōu)榱硗庖粋€(gè)穩(wěn)態(tài),是引發(fā)航天器故障的主要因數(shù)愈犹。
為了最大限度地減少單粒子效應(yīng)對(duì)FPGA的影響键科,通常采用三模冗余的加固結(jié)構(gòu),盡管三模冗余結(jié)構(gòu)可以將錯(cuò)誤暫時(shí)隔離漩怎,但是在長(zhǎng)期工作的情況下冗余單元也可能繼續(xù)發(fā)生錯(cuò)誤勋颖。近年來(lái)國(guó)內(nèi)外經(jīng)常采用EDAC電路來(lái)減少或避免錯(cuò)誤的發(fā)生。
EDAC模塊基于海明碼勋锤,在CPU與RAM之間饭玲,保護(hù)RAM中的數(shù)據(jù),CPU對(duì)RAM操作時(shí)叁执,EDAC模塊已經(jīng)對(duì)RAM中的數(shù)據(jù)進(jìn)行了預(yù)處理茄厘,同時(shí)EDAC模塊中也加入了使能信號(hào)矮冬。
應(yīng)用軟件中,要確保EDAC功能確實(shí)得到了使能次哈。
5胎署、電平式中斷信號(hào)
盡量采用脈沖式中斷信號(hào),避免采用電平式中斷信號(hào)窑滞,電平式中斷信號(hào)有可能因錯(cuò)誤的中斷清除時(shí)序?qū)е码娖綗o(wú)法被拉回琼牧,進(jìn)而導(dǎo)致無(wú)法再次產(chǎn)生中斷。電平觸發(fā)方式適合于外部中斷為低電平輸入和中斷服務(wù)程序能清除外部中斷源的情況哀卫,通常做法在中斷退出前關(guān)閉中斷巨坊,等后面恰當(dāng)時(shí)機(jī)再打開(kāi)。
6此改、vxworks內(nèi)置的各種狀態(tài)檢測(cè)工具
Vxworks自帶的各種命令趾撵,列出來(lái)如下:
i 顯示系統(tǒng)信息
taskShow 顯示任務(wù)TCB信息
taskCreateHookShow 顯示任務(wù)創(chuàng)建調(diào)用例程列表
w 顯示所有或者一個(gè)掛起任務(wù)的信息
CheckStack 顯示一個(gè)任務(wù)的使用堆棧的情況,沒(méi)有定義任務(wù)時(shí)顯示所有
tt 顯示一個(gè)任務(wù)的調(diào)用狀況共啃,解析堆棧
d 顯示目標(biāo)機(jī)內(nèi)存, 可以替代內(nèi)存觀察;
m 修改內(nèi)存
lkup 顯示指定符號(hào)信息
devs 列出目標(biāo)機(jī)系統(tǒng)上的所有設(shè)備
iosFdShow 顯示系統(tǒng)中的文件標(biāo)識(shí)符
msgQShow 顯示隊(duì)列的使用狀況
SemShow 顯示信號(hào)量的信息
wdShow 顯示看門(mén)狗的信息
mqPxShow 顯示POSIX消息隊(duì)列的信息
memPartShow 顯示分區(qū)塊及統(tǒng)計(jì)信息
memShow 顯示系統(tǒng)分區(qū)上空閑和已分配空間的總數(shù)等等
arpShow 顯示arp列表
ifShow 顯示網(wǎng)口信息
tcpstatShow 顯示tcp信息
udpstatShow 顯示udp信息
inetstatShow 顯示連接信息