1. 程式人生 > >痞子衡嵌入式:知名半導體MCU大廠軟體開發C程式碼規範

痞子衡嵌入式:知名半導體MCU大廠軟體開發C程式碼規範


  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家講的是飛思卡爾軟體開發C語言編碼規範。

  2020鼠年春節是個漫長的假期,痞子衡在家百無聊賴,翻出了2016年10月1日(這個時間是痞子衡正式開始用markdown+github寫技術文章並發表到部落格園上的紀念日)之前寫的技術文件,不翻不知道,一翻嚇一跳,從2007年上大學開始到2016年這十年間,我真的寫了非常多的技術類文章,但都不夠完整,沒有成系統,排版上也不優雅,底下有時間我會慢慢整理出來,不能讓以前的辛苦都被埋沒了。
  痞子衡2016年之前所寫的那些技術文章除了原創外,也有一些是翻譯的,比如今天要分享的這篇就是2013年痞子衡剛入職飛思卡爾半導體MCU軟體團隊時為了學習C編碼規範所翻譯的(外企嘛,各種資料都是洋文),當時飛思卡爾剛成立MCU軟體團隊不久,那時候Kinetis SDK也還沒有正式推出,整個團隊必須要有一個統一且良好的編碼風格,這樣寫出來的SDK才符合大廠身份。廢話不多說,下面是編碼規範原文:

1.引言

  制定此編碼風格指導手冊的目的是為了使按此規範編寫出的C/C++程式碼極易被閱讀和理解。

2.與其他編碼風格對比

3.基本排版格式

  • 需要以4個空格為單位的縮排.
  • 堅決不用Tab鍵,要用空格鍵.
  • 所有檔案結尾必須空一行.
  • 文字檔案必須用UTF-8編碼.
  • 每一行不能超過100個字元.

4.文件與註釋

  • 恰當地進行程式碼註釋.
  • 關於註釋長度沒有具體限制,只要能提供幫助,就儘可能地註釋.
  • 註釋應該解釋程式碼為什麼要這麼做,而不是如何去做(程式碼本身已經表明瞭如何去做).
  • 選擇Doxygen文件系統來完成註釋,除了在函式中的註釋之外(因為Doxygen不適用於個別程式碼行的註釋),Doxygen也不適用於彙編.

5.標準資料型別

  • 僅使用C99標準給出的整型(定義見stdint.h檔案),如uint32_t,int16_t等,不要typedef自己的整型型別,如u8,int_32,WORD等.
  • 使用char 或wchar_t來表示字串,但二進位制快取仍應使用uint8_t
  • 僅使用C99標準給出的bool型(定義見stdbool.h檔案)來表示布林變數,true和false表示其值. (ps: windows平臺下編譯時需自行定義,因為windows下不包含stdbool.h檔案)

6.識別符號的命名

  以下是C/C++下變數、函式、typedef、巨集命名的基本規則,命名規則可以接受細微改動,但要保證在同一模組中的一致性:

  • 全域性函式名:全小寫,單詞用下劃線隔開
    如:i2c_receive_data()
  • 普通變數名:Camel命名法
    如:thisIsMyVariable
  • 結構體名和類名:Pascal命名法
    如:BigBoxOfTools
  • 類成員函式名:Camel命名法
    如:initialLongProcess()
  • 用typedef重新命名:全小寫,單詞用下劃線隔開,加_t字尾
    如:big_box_of_tools_t
  • 用巨集命名:單詞全大寫(僅在巨集中使用,且必須使用)

  描述性強的,可讀性強的變數名非常重要:

  • 大部分單詞都不應該縮寫,比如應用block而不是blk,應用count而不是cnt.
    一些流行的縮寫還是允許的,如init或config
  • 完全可以接受較長的,描述性的變數名
  • 布林型變數可以使用”is”,”did”等字首,這會清晰地表明其是一個布林型
  • 變數名應該可以表達其目的,但堅決反對匈牙利命名(加資料型別字首)
    正確: temporaryParameters, startBlock, nodeKey, isAlarmEnabled
    錯誤:u32BlkNum, bEnabled

  有時候為了表明範圍和目的,有些變數命名是可以加字首和字尾的:

  • 區域性變數:無需字首
  • 全域性變數:加g_字首
  • 靜態變數:加s_字首
  • 類成員變數:加m_字首
  • 常量:加k字首
    1):如kUnconstrained, kFirstPage, kMaxBufferBytes
    2):k字首使常量很容易被識別
  • typedef型變數:加_t字尾

  備註:切記不要用匈牙利命名法,因為其會導致變數名難於閱讀,且型別字首常常會與變數真正型別不同步,微軟曾是此命名法的擁躉,但其已意識到此命名法的缺陷,目前正在逐漸脫離此方法。

7.可除錯性

  • 一系列的整型常量應該用列舉來表示,而不是用巨集來定義
    1):在除錯時,常量被顯示為真實的標識,而不是數字
    2):便於常量的邏輯分組
  • 大部分情況下,使用行內函數來代替巨集功能
    1):在除錯中,行內函數可以被禁用,故可以跳過
    2):行內函數引數有型別,而巨集中引數不可以有型別
    3):這個規則僅適用於當用巨集來表示一段程式碼時,不適用於在表示式中表示某部分的巨集

8. C99標準

  • 需要使用C99
    C99被允許使能C++或C89語義內聯
  • 在儘量靠近變數被使用的地方來宣告變數,而不是一律在函式頂部宣告
    1):這可以很容易地找到變數的定義
    2):可以方便編譯器進行優化
  • 單行註釋應使用//而不是/* …*/
    1):大部分人認為//式註釋方便閱讀
    2):免去註釋巢狀的煩惱
  • 多行註釋/* …*/可以被用作大段確定的內容註釋,就像Doxygen註釋頭一樣,以使得被註釋的內容突出。

9.內聯功能

  標頭檔案中,內聯功能啟用應用static inline來完成

10. C/C++通用性

  標頭檔案中的公用函式原型必須包含在下列語句中

#if defined(__cplusplus)
extern "C" {
#endif // __cplusplus

// 此處放函式原型

#if defined(__cplusplus)
}
#endif // __cplusplus

  C中一般都用typedef來重新命名結構體和列舉資料型別,不要提及原始的結構體或列舉型名
  C++中,則不需用typedef來重新命名,直接用原始的結構體或列舉型名;但是如果程式碼被C/C++共享,則應遵從C風格
  對於被用在C++中的函式(比如類成員)而言,如果函式不帶任何引數,則不需要一個專門的void引數來表明,而在C中這是需要的

11.花括號的使用

  花括號的使用雖重要性不高,但經常起爭議

  • 通常情況下,花括號應該單獨起一行,不需要額外的縮排
  • 有時為了保持可讀性,可以不遵守上一規則
  • 花括號使用的關鍵點在於不要將程式碼湊在一起,從而使得程式碼比較難閱讀;也不要因為具體格式的限定,從而打破視覺流程

  使用規則可以接受細微改動,但要保證在同一模組中的一致性,以及易於閱讀

結構體和類示例:
struct Monkey
{
    int x;
};

typedef struct MonkeyTwo {
    int y;
} monkey_two_t;

class Cube
{
public:
    Cube(int theSize);

private:
    int m_size;
};
列舉示例:
enum _my_enum
{
    kValueOne = 1,
    kValueTwo = 2
};

typedef enum _another {
    kAnotherOne = 10,
    kAnotherTwo = 20
} another_t;
函式示例:
void foo()
{
    printf("hi\n");
}
If語句示例:
if (baz >= kMaximumBaz)
{
    baz = kMaximumBaz;
}
else if (!ready)
{
    makeItReady();
}
else
{
    abort();
}
For語句示例:
for (i=0; i < 10; ++i)
{
    printf("%d", i);
}
While語句示例:
while (!done)
{
    doSomething();
}
Do-while語句示例:
do {
    doSomething();
} while (!done);
Switch語句示例:
switch (value)
{
    case 0:
        x += 1;
        break;

    case 1:
    {
        int y;
        calculateIt(&y);
        break;
    }

    default:
        return;
}
名稱空間示例:
namespace fsl
{
// Don't indent namespace contents!
}
Try-catch語句示例:
try
{
}
catch (std::exception & e)
{
}
catch (...)
{
}

12. 關於MISRA-C規範

  程式碼風格基本遵照MISRA-C:20xx規範,但除了以下例外(這些例外是基於MISRA-C:2004規範的)

  至此,飛思卡爾軟體開發C語言編碼規範痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

文章會同時釋出到我的 部落格園主頁、微信公眾號 平臺上。

微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

相關推薦

痞子嵌入式知名半導體MCU大廠軟體開發C程式碼規範

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家講的是飛思卡爾軟體開發C語言編碼規範。   2020鼠年春節是個漫長的假期,痞子衡在家百無聊賴,翻出了2016年10月1日(這個時間是痞子衡正式開始用markdown+github寫技術文章並發表到部落格園上的紀念日)之前寫的技術文件,不翻不知道,

痞子嵌入式盤點國內MCU級RISC-V核心IP廠商

----   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是**國內MCU級RISC-V核心IP廠商**。   自RISC-V指令集2010年誕生以來,業界普遍認為,RISC-V將會改變現有的由Arm和Intel X86主導的處理器架構競爭格局,尤其將會對Arm在消費類、IoT等嵌入式

痞子嵌入式飛思卡爾Kinetis開發板OpenSDA偵錯程式那些事(上)- 背景與架構

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾Kinetis MCU開發闆闆載OpenSDA偵錯程式(上篇)。   眾所周知,嵌入式軟體開發幾乎離不開偵錯程式,因為寫一個稍有程式碼規模(5K行以上)的嵌入式應用程式一般不可能一次性搞定,沒有任何bug,出了bug並不可怕,只要我

痞子嵌入式超級下載演算法(RT-UFL)開發筆記(2) - 識別當前i.MXRT型號

----   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是**超級下載演算法開發筆記(2)之識別當前i.MXRT型號**。   文接上篇 [《超級下載演算法(RT-UFL)開發筆記(1) - 執行在不同CM核心下》](https://www.cnblogs.com/henjay724

痞子嵌入式超級下載演算法(RT-UFL)開發筆記(3) - 統一FlexSPI驅動訪問

----   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是**超級下載演算法開發筆記(3)之統一FlexSPI驅動訪問**。   文接上篇 [《超級下載演算法(RT-UFL)開發筆記(2) - 識別當前i.MXRT型號》](https://www.cnblogs.com/henjay

痞子嵌入式超級下載演算法(RT-UFL)開發筆記(4) - 輪詢Flash配置引數

----   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是**超級下載演算法開發筆記(4)之輪詢Flash配置引數**。   文接上篇 [《超級下載演算法(RT-UFL)開發筆記(3) - 統一FlexSPI驅動訪問》](https://www.cnblogs.com/henjay7

痞子嵌入式恩智浦MCU安全加密啟動一站式工具nxpSecBoot使用者指南

nxpSecBoot 1 軟體概覽 1.1 介紹   nxpSecBoot是一個專為NXP MCU安全加密啟動而設計的工具,其特性與NXP MCU裡BootROM功能相對應,目前主要支援i.MXRT系列MCU晶片,與NXP官方提供的標準安全加密配套工具集(OpenSSL, CST, sdphost, b

痞子嵌入式飛思卡爾i.MX RTxxx系列MCU開發那些事 - 索引

持續更新 技術 紀元 dsp cad rtx 相關 面向 tro   大家好,我是痞子衡,是正經搞技術的痞子。本系列痞子衡給大家介紹的是恩智浦i.MX RTxxx系列微控制器相關知識。   恩智浦半導體於2018年10月發布的i.MX RTxxx系列開啟了ML/AI MC

痞子嵌入式恩智浦i.MX RTxxx系列MCU特性介紹(2)- RT685EVKA效能實測(Dhrystone)

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RTxxx系列MCU的效能。   在前面的文章 i.MXRTxxx微控制器概覽 裡,痞子衡給大家簡介過恩智浦半導體在2018年推出的全新跨界微控制器i.MX RTxxx系列,該系列第一款晶片i.MXRT600搭載一顆Cort

痞子嵌入式飛思卡爾i.MX RTyyyy系列MCU硬體那些事(2.1)- 玩轉板載OpenSDA,Freelink偵錯程式

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RTyyyy系列EVK上板載偵錯程式的用法。   本文是i.MXRT硬體那些事系列第二篇,第一篇痞子衡給大家整體介紹了i.MXRT官方EVK,從本文開始痞子衡將細聊EVK上的元件,今天要講的是一個非常經典而且常用的元件 -

痞子嵌入式飛思卡爾i.MX RTyyyy系列MCU硬體那些事(2.2)- 在序列NOR Flash XIP除錯原理

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RTyyyy系列EVK在序列NOR Flash除錯的原理。   本文是i.MXRT硬體那些事系列第二篇的續集,在第二篇首集中痞子衡給大家詳細介紹了EVK板載偵錯程式用法,有了偵錯程式在手,從此除錯不用愁。從除錯程式碼所在目

痞子嵌入式恩智浦i.MX RTxxx系列MCU啟動那些事(2)- Boot配置(ISP_Pin/OTP)

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RTxxx系列MCU的Boot配置。   在上一篇文章 Boot簡介 裡痞子衡為大家介紹了Boot基本原理以及i.MXRTxxx Boot方式簡介。今天痞子衡就來重點聊一聊i.MXRTxxx Boot方式具體由哪些配置決定的

痞子嵌入式恩智浦i.MX RTxxx系列MCU啟動那些事(3)- Serial ISP模式(blhost)

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RTxxx系列MCU的Serial ISP模式。   在上一篇文章 Boot配置(ISP Pin, OTP) 裡痞子衡為大家介紹了i.MXRTxxx Boot的行為配置,其中第1.2節裡講了Boot有三類行為模式:Seria

痞子嵌入式恩智浦i.MX RTxxx系列MCU啟動那些事(4)- OTP及其燒寫方法

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RTxxx系列MCU的OTP。   在i.MXRTxxx啟動系列第二篇文章 Boot配置(ISP Pin, OTP) 裡痞子衡提到了OTP,部分Boot配置都儲存在OTP memory裡,但是對OTP的介紹僅僅淺嘗輒止,沒有

痞子嵌入式恩智浦i.MX RTxxx系列MCU啟動那些事(8)- 從Serial(1-bit SPI) NOR恢復啟動

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RTxxx系列MCU的1-bit SPI NOR恢復啟動。   在前幾篇裡痞子衡介紹的Boot Device都屬於主動啟動的Master Boot Device(Serial(Multi-IO) NOR, SD/eMMC),

痞子嵌入式飛思卡爾i.MX RTyyyy系列MCU外設那些事(2)- 善變的FlexRAM

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RTyyyy系列MCU的FlexRAM外設。   本文是外設系列第二篇,上一篇講的是離核心最近的快取記憶體L1 Cache,今天咱們聊離核心第二近的靜態記憶體SRAM。眾所周知,i.MXRT系列內部沒有非易失性儲存器,但內

痞子嵌入式恩智浦i.MX RT1xxx系列MCU啟動那些事(11.1)- FlexSPI NOR連線方式大全(RT1015/1020/1050)

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RT1015/1020/1050三款MCU的FlexSPI NOR啟動的連線方式。   由於i.MXRT內部沒有非易失性儲存器,因此在系統設計時為i.MXRT搭配一塊存放應用程式程式碼的儲存器是頭等大事。i.MXRT支援啟動

痞子嵌入式恩智浦i.MX RT1xxx系列MCU啟動那些事(11.2)- FlexSPI NOR連線方式大全(RT1060/1064(SIP))

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RT1060/1064(SIP)兩款MCU的FlexSPI NOR啟動的連線方式。   上一篇文章《FlexSPI NOR啟動連線方式(RT1015/1020/1050)》 寫完之後,痞子衡發給了做線上客戶支援的同事們審閱,

痞子嵌入式恩智浦i.MX RT1xxx系列MCU啟動那些事(11.3)- FlexSPI NOR連線方式大全(RT1010)

----   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是**恩智浦i.MX RT1010的FlexSPI NOR啟動的連線方式**。   在寫完 [《FlexSPI NOR啟動連線方式(RT1015/1020/1050)》](https://www.cnblogs.com/henj

痞子嵌入式恩智浦i.MX RTxxx系列MCU啟動那些事(6.1)- FlexSPI NOR連線方式大全(RT600)

----   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是**恩智浦i.MX RT600的FlexSPI NOR啟動的連線方式**。   痞子衡前段時間一鼓作氣寫完了三篇關於i.MXRT1xxx系列FlexSPI NOR啟動連線的文章,算是把目前已供貨的i.MXRT1xxx型號全部都