當前位置:首頁 > 公眾號精選 > strongerHuang
[導讀]之前給大家分享過?MISRA C 相關的內容,今天給大家分享一份汽車電子行業(yè)的MISRA C標準。


排版整理 | 嵌入式大雜燴

之前給大家分享過 MISRA C 相關的內容,今天給大家分享一份汽車電子行業(yè)的MISRA C標準。

什么是MISRA?

MISRA (The Motor Industry Software Reliability Association),中文名稱為汽車工業(yè)軟件可靠性聯(lián)會,是英國的一個跨國汽車工業(yè)協(xié)會,其成員包括了大部分歐美汽車生產商。

其核心使命是為汽車工業(yè)提供服務和協(xié)助,幫助廠方開發(fā)安全的、高可靠性的嵌入式軟件。MISRA C則是由MISRA提出的針對嵌入式C語言開發(fā)標準,目的是提高嵌入式系統(tǒng)的安全性、可讀性和可移植性。

MISRA C一開始主要是針對汽車產業(yè),后面他產業(yè)也逐漸開始使用MISRA C,包括航天、電信、國防、醫(yī)療設備、鐵路等領域中都已有廠商使用MISRA C。通常認為,如果能夠完全遵守這些標準,則該嵌入式C代碼就是易讀、可靠、可移植和易于維護的。

因此,很多嵌入式開發(fā)者都以MISRA C來衡量自己的編碼風格,比如著名的uC/OS就稱自己99%的代碼遵循MISRA C編碼規(guī)范標準。

因此,作為嵌入式開發(fā)者,不論哪個行業(yè),都應以產品安全性為前提,保證可靠性、可讀性、可移植性,也就是保證自身代碼盡可能符合MISRA C。

MISRA C應用在越來越多領域,作為嵌入式開發(fā)者,編碼過程規(guī)范應該盡可能遵循MISRA C規(guī)則,但也分特殊情況,有的時候為了嚴格按規(guī)范做可能會嚴重提高工作量或者降低系統(tǒng)性能,此時需要衡量一個平衡點。

關于MISRA C,本人的幾點體會。

1)編碼過程盡可能遵循MISRA C規(guī)范,提高代碼可靠性、可讀性、可移植??煽啃裕ǚ€(wěn)定性)是前提,可讀性、可移植是衡量一個程序員編碼水平的因素之一。

特別是對于嵌入式程序員,與硬件相關的編程,考慮到成本、供應鏈等問題,硬件可能會經常變動或者需要兼容多種硬件,此時,可移植性就體現(xiàn)出優(yōu)勢了,大大減少重復的編碼工作。

2)特殊情況下,是可以打破規(guī)則的。比如,其中禁止使用goto語句,也是相關標準要求禁止的。有些時候是可以使用的,而且使用其他會使得程序邏輯更清晰。但,如果“特殊情況”出現(xiàn)非常頻繁,那就得考慮自身的程序架構是否合理了。

3)可以借助一些工具進行MISRA C檢查。如IAR中,就有支持MISRA C規(guī)則檢查。以下為MISRA C 2004規(guī)范標準。

環(huán)境

規(guī)則1.1(強制):所有的代碼應該遵守 ISO 9899:1990“Programming Language C”

規(guī)則1.2(強制):只有當具備統(tǒng)一接口的目標代碼的時候才可以采用多種編譯器和語言。

規(guī)則1.4(強制):檢查編譯器 / 連接器以確保支持 31 一個有效字符,支持大小寫敏感。

語言擴展

Rule 2.1(強制):匯編語言應該封裝起來并且隔離。

例如:#define NOP asm( “NOP”)

規(guī)則2.2(強制):源代碼只能采用 /* …  * /風格的注釋。

規(guī)則2.3(強制):字符序列 /* 不能在注釋中使用。

注: C 語言不支持注釋的嵌套即使一些編譯器支持這個語言擴展。

規(guī)則2.4(建議):代碼段不能注釋掉。

注:應采用 #if 或者#ifdef 來構成一個注釋,否則代碼里如果有注釋會改變代碼的作用。

文檔化

規(guī)則3.3(建議):編譯器對于整數(shù)除法運算的實施應該寫入文檔。

例:

-5/3 = -1-2 有些編譯器結果是 -2 于+1。 

字符集

規(guī)則4.1(強制):只能使用 ISO 標準定義的字符集。

標識符

規(guī)則6.5 (強制):在內部范圍的標識符不能和外部的標識符用同樣的名字,因為會隱藏那個標識符。例:

int16_t i: void f() { int16_t i; 
    i=3 ;
} 

規(guī)則5.2(強制):typedef 名稱只能唯一,不能重復定義。

規(guī)則5.4(強制):標記名應該是唯一的標識符。

規(guī)則5.7(建議):標識符不能重復使用。

類型

規(guī)則6.1(強制):char 類型只能用來存儲使用字符。

規(guī)則6.2(強制):signed 和 unsigned char 只能用來存儲和使用數(shù)據(jù)值.

規(guī)則6.3(建議):對于基本數(shù)據(jù)類型,必須使用typedef顯式標識出數(shù)據(jù)長度。

例:

typedef signed char int8_t; typedef unsigned int uint16_t; 

約束

規(guī)則7.1(強制):禁止使用八進制數(shù)(0除外)或者八進制轉義字符。

注:整型常數(shù)以 0開始會被認為是八進制。例:

code[1]=109 code[2]=100 code[3]=052 

如果是對總線消息初始化,會有危險。

聲明和定義

規(guī)則8.1(強制):函數(shù)都應該有原型聲明,且相對函數(shù)定義和調用可見。

規(guī)則8.2(強制):無論何時一個對象和函數(shù)聲明或者定義,它的類型應該明確聲明 。

規(guī)則8.3(強制):函數(shù)聲明中的參數(shù)類型應該和定義中的類型一致。

規(guī)則8.4(強制):如果對象或函數(shù)被聲明了多次,那么它們的類型應該是兼容的。

規(guī)則8.5(強制):頭文件中不應定義對象或者函數(shù)。

規(guī)則8.6(強制):函數(shù)應該聲明為具有文件作用域。

規(guī)則8.7(強制):如果對象的訪問只是在單一的函數(shù)中,那么對象應該在塊范圍內聲明。

規(guī)則8.8(強制):外部變量或者函數(shù)只能聲明在一個文件中。

規(guī)則8.9(強制):具有外部鏈接的標識符應該具有準確的外部定義。

規(guī)則8.10(強制):在文件范圍內聲明和定義的所有對象或函數(shù)具有內部鏈接,除非是在需要外部鏈接的情況下。

規(guī)則8.11(強制):static存儲類標識符應該用于具有內部鏈接對象和函數(shù)的定義和聲明。

規(guī)則8.12(強制):數(shù)組聲明為外部,應該明確聲明大小或者直接初始化確定。

初始化

規(guī)則9.1(強制):所有變量在使用之前都應該賦值。

規(guī)則9.2(強制):應該使用大括號一指示和匹配數(shù)組和結構的非零初始化構造。

規(guī)則9.3(強制):在枚舉列表中,”=“不能顯式用于除首元素之外的元素上,除非所有的元素都是顯式初始化的。

數(shù)學類型轉換(隱式)

規(guī)則10.1(強制):整型表達式不要隱式轉換為其他類型。

1)轉換到更大的整型。

2)表達式太復雜。

3)表達式不是常數(shù)是一個函數(shù)。

4)表達式不是一個常數(shù)是一個返回表達式。

規(guī)則10.2(強制):浮點數(shù)表達式不要隱式轉換為其他類型。

1)轉換到更大的浮點數(shù)。

2)表達式太復雜。

3)表達式是一個函數(shù)。

4)表達式是一個返回表達式。

數(shù)學類型轉換(明確)

規(guī)則10.3(強制):整型表達式的值只能轉換到更窄小且是同樣符號類型的表達式。

規(guī)則10.4(強制):浮點表達式的值只能轉換到更窄小的浮點表達式。

規(guī)則10.5(強制):如果位運算~和<<應用在基本類型為unsigned char 或unsigned short的操作數(shù),結果應該立即強制轉換為預期操作數(shù)的基本類型。例:

uint8_t a = 0x5a; uint8_t b;
b = ((uint8_t)(~a))>>4; 

數(shù)學類型轉換

規(guī)則10.6(強制):所有的 unsigned 類型都應該有后綴“U”。

規(guī)則11.1(強制):指針不能轉換為函數(shù)或者整型以外的其他類型。

表達式

規(guī)則12.2(強制):表達式的值應和標準允許的評估順序一致。例:

x=b[i] + i++; 

不同的編譯器給出的結果不一樣,b[i] 是否先執(zhí)行?應:x=b[i]; i++; 比如:

x=func(i++,i); 

規(guī)則12.3(強制):sizeof 操作符不能用在包含邊界作用(side effect) 的表達式上。例:

int32_t=i; int32_t=j; 
j=sizeof(i=1234); 

表達式并沒有執(zhí)行,只是得到表達式類型int的size。

規(guī)則12.4(強制):邏輯操作符 && 或者||右邊不能包含邊界作用 (side effect)。

例:

if(ishight) && (x== i++)) 

如果 ishight =0 那么 i++不會評估

規(guī)則12.5(建議):++和- - 不能和其他表達式用在一個表達式中。

例:

u8a=++u8b + u8c–; 

控制語句表達式

規(guī)則13.1(強制):賦值語句不能用在一個產生布爾值的表達式中。

例:

if((x=y)!=0) … if (x=y) … 

規(guī)則13.3(強制):浮點表達式不應該測試其是否相等或者不相等。

規(guī)則13.4(強制):for控制表達式中不要包含任何浮點類型。

規(guī)則13.6(強制):數(shù)字變量作為for循環(huán)的循環(huán)計數(shù)不要在循環(huán)體內部被修改。

例:

flag=1; for(i=0;(i<5)&&(flag==1);i++) 
{ 
    flag=0; 
    i=i+3; 
} 

控制流

規(guī)則14.1(強制):不要有執(zhí)行不到的代碼。

例:

swich(event) 
{ case 0;  
    do_wakeup(); break; 
    do_more(); 
… 
} 

規(guī)則14.4(強制) :goto 語句不能使用。

規(guī)則14.5(強制):continue 不能使用。

規(guī)則14.6(強制):函數(shù)應在函數(shù)結束有一個出口。

規(guī)則14.7(強制):witch、while do 、while for 語句體應是一個混合語句。

規(guī)則14.10(強制):所有if else if 結構都應該由 else 結束。

switch(x) 
{ uint8_t var; /* 違反*/ case 0:  
… 
} 

函數(shù)

規(guī)則16.2(強制):函數(shù)不能直接或者間接的調用自己。

例:系統(tǒng)不能用遞歸,超出堆??臻g很危險。

規(guī)則16.8(強制):non-void 類型函數(shù)的所有出口路徑都應該有一個明確的return 語句表達式。

指針和數(shù)組

規(guī)則17.1(強制):指針的數(shù)學運算只能用在指向數(shù)組的地址上。

規(guī)則17.3(強制):>,>=,<,<= 不能用在指針類型,除非指向同一個數(shù)組。

規(guī)則17.5(建議):禁止使用 2 級以上指針。

結構和聯(lián)合

規(guī)則18.4(強制):禁止使用union(共用體)。

預處理指令

規(guī)則19.1(建議):#include 語句的前面只能有其他預處理指令和注釋。

規(guī)則19.2(建議):#include 指令中的頭文件名稱不能包含非標準的字符。

規(guī)則19.5(強制):宏不能在函數(shù)體內定義。

規(guī)則19.8(強制):類函數(shù)宏調用時不能沒有它的參數(shù)。

標準庫

規(guī)則20.1(強制):標準庫中的保留標識符,宏和函數(shù)不能定義,重定義和undefined。

規(guī)則20.4(強制):動態(tài)內存分配不能使用。

例:不能使用malloc、calloc、free、realloc。

規(guī)則20.9(強制):輸入輸出庫 (stdio.h) 不能用在產生嵌入式系統(tǒng)中。

規(guī)則20.12(強制):時間處理函數(shù) time.h不能使用。

運行時故障

規(guī)則21.1(強制):通過使用以下手段確保把運行時故障最小化。

1)靜態(tài)分析工具/技術。

2)動態(tài)分析工具/技術。

3)編寫明確的代碼避免運行時錯誤。

免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉