chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式代碼之編寫規(guī)范

GReq_mcu168 ? 來源:工程師李察 ? 2019-04-26 15:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式代碼編碼規(guī)范,用于規(guī)范自己的代碼,增強(qiáng)可讀性,非標(biāo)準(zhǔn)規(guī)范。最好能強(qiáng)制自己形成良好的編碼風(fēng)格,有利于開發(fā)大規(guī)模程序而不顯得雜亂。參考STM32固件庫(kù)編碼風(fēng)格和FreeRTOS編碼風(fēng)格。

一、工程文件組織結(jié)構(gòu)

新建工程文件應(yīng)包含以下全部或部分文件夾:

usrSrc:用戶源文件,用來存放.c文件和其他的源文件。main.c應(yīng)放在這里。

usrInc:用戶頭文件,用來存放.h文件。

usrDoc:用戶說明文檔,用來存放用戶在開發(fā)過程中書寫的文檔,一般為.txt格式。例如Readme.txt,指令說明等。

Src:引用庫(kù)的源文件。

Inc:應(yīng)用庫(kù)的頭文件。

Lib:引用的庫(kù)文件。

一個(gè)工程一定要包含一個(gè)main.c文件,只用來存放main函數(shù)。其余函數(shù)的定義應(yīng)在相應(yīng)的.c文件中,聲明在相應(yīng)的.h文件中。

So can you help to prepare our suggest contents display in the page (e.g. tools intro, feature, which videos, which documents etc) to us first? We will then further discuss with Infineon if anything need to change / add.

二、源文件

文件頭,文件的簡(jiǎn)介

/************************************************************************* * Copyright (c) 2018, Xiaodan * All rights reserved. * * File name : USB_Ctrl.c * Brief : USB API source code. * Introduce the main function or content of this document briefly. * Revision : 1.01 * Author : Xiaodan * Date : 2018.11.06 * Update : Introduce the difference from previous version.*************************************************************************/

必要的注釋和說明

源文件應(yīng)該只包含它自己的頭文件,其他的頭文件在他自己的頭文件中包含。

源文件中只聲明局部函數(shù),全局函數(shù)在頭文件中聲明。

全局變量在相應(yīng)的源文件中定義,在頭文件中用extern聲明。

類型定義在頭文件中定義。

/* Includes -----------------------------------------------------------*//*only include it's own header file, the others header file included by USB_Ctrl.h*/#include "USB_Ctrl.h"/* Declaration --------------------------------------------------------*//*here are the local function declare, global fuction declare in header file.*/void delay( uint32_t n);/* Global variable ----------------------------------------------------*/

函數(shù)頭

/****************************************************** * Brief : Delay n ms * Parameter : * n: the number of delay microsecond. * Return : None.*******************************************************/void delay( uint32_t n){for( i=0; i<110; i++) ;}

三、頭文件

文件頭,文件的簡(jiǎn)介

/************************************************************************* - Copyright (c) 2018, Xiaodan - All rights reserved. - - File name : USB_Ctrl.h - Brief : The header file of USB_Ctrl.c. - Revision : 1.01 - Author : Xiaodan - Date : 2018.11.06 - Update : Introduce the difference from previous version.*************************************************************************/

必要的注釋和聲明

/* Includes -----------------------------------------------------------*//* Define -------------------------------------------------------------*//* Typedef ------------------------------------------------------------*/typedef unsigned int apiStatus; //api return code/* Enume --------------------------------------------------------------*//* Extern -------------------------------------------------------------*//* Declaration --------------------------------------------------------*/

四、命名規(guī)則

參考FreeRTOS命名規(guī)則,MISRA C規(guī)范。

定義變量時(shí)盡量使用uint8_t 、uint16_t 、uint32_t等。頭文件為stdint.h。

typedef signed char int8_t;typedef short int16_t;typedef int int32_t;typedef long long int64_t;typedef unsigned char uint8_t;typedef unsigned short uint16_t;typedef unsigned int uint32_t;typedef unsigned long long uint64_t;

uint32_t類型的變量使用前綴ul,這里’u’表示’unsigned’,’l’表示’long’

uint16_t類型的變量使用前綴us,這里’u’表示’unsigned’,’s’表示’short’

uint8_t類型的變量使用前綴uc,這里’u’表示’unsigned’,’c’表示’char’

枚舉類型變量使用前綴e

指針類型變量在類型基礎(chǔ)上附加前綴p,比如指向uint16_t的指針變量前綴為pus

與MISRA指南一致,char類型變量?jī)H被允許保存ASCII字符,前綴為c

與MISRA指南一致,char *類型變量?jī)H允許指向ASCII字符串,前綴為pc

宏定義全部使用大寫,兩個(gè)單詞之間用下劃線隔開。

具有文件作用域的對(duì)象盡量聲名為static的。

全局變量加前綴’g_’。整個(gè)工程都可以用的變量,不局限于文件作用域。

五、代碼風(fēng)格

縮進(jìn):縮進(jìn)使用制表符,一個(gè)制表符等于4個(gè)空格。

注釋:注釋單行不超過80列,特殊情況除外。

布局:源代碼應(yīng)被設(shè)計(jì)成盡可能的易于查看和閱讀。

下面的代碼片中,第一部分展示文件布局,第二部分展示C代碼設(shè)計(jì)格式。

/* #defines, 在合理的位置添加括號(hào). */#define A_DEFINITION ( 1 )/* * 隨后是Static (文件內(nèi)部的)函數(shù)原型, * 如果注釋有多行,參照本條注釋風(fēng)格---每一行都以’*’起始. */static void prvAFunction( uint32_t ulParameter );/* 文件作用域變量(本文件內(nèi)部使用),要在函數(shù)體定義之前. */static BaseType_t xMyVariable./* 每一個(gè)函數(shù)的結(jié)束都有一行破折號(hào),破折號(hào)與下面的第一個(gè)函數(shù)之間留一行空白。*//*-----------------------------------------------------------*/void vAFunction( void ){/* 函數(shù)體在此定義,注意要用大括號(hào)括住 */}/*-----------------------------------------------------------*/static UBaseType_t prvNextFunction( void ){/* 函數(shù)體在此定義. */}/*-----------------------------------------------------------*//* * 函數(shù)名字總是占一行,包括返回類型。左括號(hào)之前沒有空格左括號(hào)之后有一個(gè)空格, * 每個(gè)參數(shù)后面有一個(gè)空格,參數(shù)的命名應(yīng)該具有一定的描述性. */void vAnExampleFunction( long lParameter1, unsigned short usParameter2 ){/* 變量聲明沒有縮進(jìn). */uint8_t ucByte;/* 代碼要對(duì)齊. 大括號(hào)占獨(dú)自一行. */for( ucByte = 0U; ucByte < fileBUFFER_LENGTH; ucByte++ ) {/* 這里再次縮進(jìn). */ }}/* * for、while、do、if結(jié)構(gòu)具有相似的模式。這些關(guān)鍵字和左括號(hào)之間沒有空格。 * 左括號(hào)之后有一個(gè)空格,右括號(hào)前面也有一個(gè)空格,每個(gè)分號(hào)后面有一個(gè)空格。 * 每個(gè)運(yùn)算符的前后各一個(gè)空格。使用圓括號(hào)明確運(yùn)算符的優(yōu)先級(jí)。不允許有0 * 以外的數(shù)字(魔鬼數(shù))出現(xiàn),必要時(shí)將這些數(shù)字換成能表示出數(shù)字含義的常量或 * 宏定義。 */for( ucByte = 0U; ucByte < fileBUFFER_LENGTH; ucByte++ ){}while( ucByte < fileBUFFER_LENGTH ){}/* * 由于運(yùn)算符優(yōu)先級(jí)的復(fù)雜性,我們不能相信自己對(duì)運(yùn)算符優(yōu)先級(jí)時(shí)刻保持警惕 * 并能正確的使用,因此對(duì)于多個(gè)表達(dá)式運(yùn)算時(shí),使用括號(hào)明確優(yōu)先級(jí)順序 */if( ( ucByte < fileBUFFER_LENGTH ) && ( ucByte != 0U ) ){ ulResult = ( ( ulValue1 + ulValue2 ) - ulValue3 ) * ulValue4;}/* 條件表達(dá)式也要像其它代碼那樣對(duì)齊。*/#if( configUSE_TRACE_FACILITY == 1 ){/* 向TCB增加一個(gè)用于跟蹤的計(jì)數(shù)器. */ pxNewTCB->uxTCBNumber = uxTaskNumber;}#endif/*方括號(hào)前后各留一個(gè)空格*/ucBuffer[ 0 ] = 0U;ucBuffer[ fileBUFFER_LENGTH - 1U ] = 0U;

六、編程思想

將特定功能的代碼封裝成函數(shù)。

七、C語(yǔ)言編程規(guī)則

參考MISRA

Rule1:不得使用三元操作符(? : )。

Rule2:不得殘留被注釋掉的廢代碼。

Rule3:所有標(biāo)識(shí)符不超過31字符。

Rule4:不同名空間中的變量名不得相同。

例如:

typedef struct MyStruct {... } MyStruct; (違規(guī)) struct Person { char* name; ...};char name[32]; (違規(guī))

Rule5: 不得使用char, int, float, double, long等基本類型,應(yīng)該用stdint.h中定義的類型顯示表示類型的大小,如uint16_t、int32_t等。

Rule6:禁止使用八進(jìn)制數(shù)。(因?yàn)?86U這樣的常數(shù)很容易引起誤解)。

Rule7:不得定義與外部作用域中某個(gè)標(biāo)識(shí)符同名的對(duì)象,以避免遮蓋外部作用域中的標(biāo)識(shí)符。

Rule8:具有文件作用域的對(duì)象盡量聲名為static的。

Rule9:自動(dòng)對(duì)象(棧對(duì)象)使用前必須賦初值。

Rule10:操作符&&和||的右側(cè)表達(dá)式不得具有副作用(side-effect)。

也就是說,象 if (x == 20 && ++y == 19)這樣的表達(dá)式被禁止。

Rule11:不得對(duì)有符號(hào)數(shù)施加位操作,例如 1 << 4 將被禁止,必須寫 1UL << 4。

Rule12:不得對(duì)有副作用的表達(dá)式施加sizeof操作符。

Rule13:除了循環(huán)控制語(yǔ)句,不得使用逗號(hào)表達(dá)式。

Rule14:不得顯式判斷浮點(diǎn)數(shù)的相等性和不等性。

Rule15:不得遺留“永遠(yuǎn)不會(huì)用到”的代碼。

Rule16:除了switch語(yǔ)句,不得使用標(biāo)號(hào)(label)。

Rule17:不得使用goto。

Rule18:不得使用continue。

Rule19:除了switch語(yǔ)句,不得使用break

Rule20:if, else if, else, while, do..while, for語(yǔ)句塊必須使用{}括起。

Rule21:循環(huán)計(jì)數(shù)器的值不得在循環(huán)體內(nèi)修改。

Rule22:禁止任何直接和間接的遞歸函數(shù)調(diào)用。

Rule23:不應(yīng)該使用#undef。

Rule24:不得將宏作為參數(shù)傳給宏函數(shù)。

Rule25:在一個(gè)宏定義中,#或##符號(hào)只能出現(xiàn)一次。

Rule26:禁止指針運(yùn)算(代之以數(shù)組下標(biāo)運(yùn)算)。

Rule27:禁止超過兩級(jí)的指針。

Rule28:禁止使用指向函數(shù)的非常量指針。

Rule29:禁止使用setjmp, longjmp。

Rule30:禁止使用atoi, atof, atol。(這個(gè)我很贊成,建議使用strtol, strtod等函數(shù))

Rule31:禁止使用abort, exit, getenv。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5208

    文章

    20620

    瀏覽量

    336695
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4421

    瀏覽量

    67815
  • 工程
    +關(guān)注

    關(guān)注

    0

    文章

    170

    瀏覽量

    29830

原文標(biāo)題:如何增強(qiáng)代碼的可讀性?嵌入式代碼之編寫規(guī)范

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    深度剖析CEC1702:嵌入式控制器的卓越

    深度剖析CEC1702:嵌入式控制器的卓越選 在當(dāng)今的物聯(lián)網(wǎng)時(shí)代,嵌入式控制器的性能和安全性至關(guān)重要。CEC1702作為一款具備強(qiáng)大加密支持的嵌入式控制器,為物聯(lián)網(wǎng)平臺(tái)提供了高度可配
    的頭像 發(fā)表于 04-07 17:15 ?444次閱讀

    MAX32558:嵌入式安全的卓越

    MAX32558:嵌入式安全的卓越選 在當(dāng)今數(shù)字化時(shí)代,數(shù)據(jù)安全至關(guān)重要。嵌入式設(shè)備需要強(qiáng)大的安全解決方案來保護(hù)敏感數(shù)據(jù),而 Maxim Integrated 的 MAX32558 正是這樣一款
    的頭像 發(fā)表于 03-26 16:40 ?118次閱讀

    代碼可視化,破解嵌入式開發(fā)高門檻難題

    。PPECWorkbench以低代碼可視化為核心,打造一站嵌入式開發(fā)解決方案,精準(zhǔn)破解行業(yè)痛點(diǎn),為嵌入式開發(fā)行業(yè)注入新活力。一、嵌入式開發(fā)
    的頭像 發(fā)表于 03-25 14:13 ?172次閱讀
    低<b class='flag-5'>代碼</b>可視化,破解<b class='flag-5'>嵌入式</b>開發(fā)高門檻難題

    嵌入式單片機(jī)開發(fā)學(xué)習(xí)路徑

    編程、任務(wù)調(diào)度、同步與通信等概念。 4.2 高級(jí)編程技巧 掌握嵌入式系統(tǒng)中的高級(jí)編程技巧,如低功耗設(shè)計(jì)、實(shí)時(shí)控制、硬件驅(qū)動(dòng)編寫等。 5. 項(xiàng)目實(shí)戰(zhàn) 通過參與實(shí)際項(xiàng)目來提升自己的綜合能力。可以
    發(fā)表于 02-09 15:42

    什么是嵌入式應(yīng)用開發(fā)?

    。 · ?醫(yī)療設(shè)備?:如心電圖儀、血壓計(jì)等。 開發(fā)工具和技術(shù) 嵌入式開發(fā)過程中常用的工具包括: · ?集成開發(fā)環(huán)境(IDE)?:用于編寫、編譯和調(diào)試代碼。 · ?編譯器?:將高級(jí)語(yǔ)言代碼
    發(fā)表于 01-12 16:13

    分析嵌入式軟件代碼的漏洞-代碼注入

    隨著互聯(lián)網(wǎng)的發(fā)展,嵌入式設(shè)備正分布在一個(gè)充滿可以被攻擊者利用的源代碼級(jí)安全漏洞的環(huán)境中。 因此,嵌入式軟件開發(fā)人員應(yīng)該了解不同類型的安全漏洞——特別是代碼注入。 術(shù)語(yǔ)“
    發(fā)表于 12-22 12:53

    從小白到大牛:Linux嵌入式系統(tǒng)開發(fā)的完整指南

    與 Linux 混合編程)。例如,在嵌入式設(shè)備上部署圖像識(shí)別模型,需掌握交叉編譯 AI 框架、優(yōu)化模型體積與運(yùn)行速度。? 工程化能力提升:實(shí)際項(xiàng)目中需關(guān)注代碼規(guī)范、版本控制(Git)、自動(dòng)化構(gòu)建(CMake
    發(fā)表于 12-16 10:42

    CW32嵌入式軟件開發(fā)的必備知識(shí)

    嵌入式系統(tǒng)中最常用的編程語(yǔ)言,因?yàn)樗鼈兲峁┝酥苯釉L問硬件的能力,并且代碼執(zhí)行效率高。 了解匯編語(yǔ)言,用于編寫底層驅(qū)動(dòng)、中斷處理程序以及性能要求極高的代碼段。 對(duì)其他編程語(yǔ)言如Pytho
    發(fā)表于 11-28 07:48

    嵌入式開發(fā)的關(guān)鍵點(diǎn)介紹

    嵌入式開發(fā)的關(guān)鍵點(diǎn): 1. 硬件限制: 嵌入式系統(tǒng)通常具有嚴(yán)格的硬件限制,例如處理器速度、內(nèi)存和存儲(chǔ)容量等。因此,嵌入式開發(fā)需要考慮這些限制,并編寫高效的
    發(fā)表于 11-13 08:12

    嵌入式達(dá)到什么水平才能就業(yè)?

    工具定位問題具備嵌入式軟件模塊化設(shè)計(jì)能力:能按功能劃分代碼模塊,編寫規(guī)范的頭文件與源文件,實(shí)現(xiàn)模塊間低耦合調(diào)用會(huì)使用Git 進(jìn)行版本管理:能提交代碼
    發(fā)表于 09-15 10:20

    嵌入式工程師為什么要學(xué)QT?

    受限的環(huán)境。 Qt的實(shí)現(xiàn)主要是采用p-impl手法,實(shí)現(xiàn)接口與實(shí)現(xiàn)分離,它有很好的消息循環(huán)機(jī)制,有助于在資源受限的嵌入式設(shè)備上運(yùn)行。 提升代碼質(zhì)量 Qt的設(shè)計(jì)理念和架構(gòu)可以幫助嵌入式工程師
    發(fā)表于 08-14 15:15

    入行嵌入式應(yīng)該怎么準(zhǔn)備?

    知識(shí): 一、C/C++編程C/C++是嵌入式系統(tǒng)開發(fā)中最常用的編程語(yǔ)言。熟練掌握C/C++語(yǔ)言將使你能夠理解和編寫底層驅(qū)動(dòng)程序、操作系統(tǒng)以及與硬件交互的代碼。對(duì)于嵌入式系統(tǒng)來說,效率
    發(fā)表于 08-06 10:34

    嵌入式軟件開發(fā)常用的軟件有哪些?

    文檔等非常方便,因?yàn)樗檎遥ㄎ?,彩色顯示等功能非常強(qiáng)大。開發(fā)人員會(huì)當(dāng)成源代碼閱讀工具使用。 4. Keil uVision5 Keil 5 軟件是一款功能強(qiáng)大的嵌入式系統(tǒng)開發(fā)工具,主要用于編寫
    發(fā)表于 07-03 17:06

    Linux嵌入式和單片機(jī)嵌入式的區(qū)別?

    Linux嵌入式與單片機(jī)嵌入式在多個(gè)方面存在顯著的區(qū)別,以下是詳細(xì)的比較和歸納: 一、基本概念 1. Linux嵌入式: 定義:將Linux操作系統(tǒng)運(yùn)行在嵌入式設(shè)備上的一種配置。
    發(fā)表于 06-20 09:46

    飛凌嵌入式2025嵌入式及邊緣AI技術(shù)論壇圓滿結(jié)束

    飛凌嵌入式「2025嵌入式及邊緣AI技術(shù)論壇」在深圳深鐵皇冠假日酒店盛大舉行,此次活動(dòng)邀請(qǐng)到了200余位嵌入式技術(shù)領(lǐng)域的技術(shù)專家、企業(yè)代表和工程師用戶,共享嵌入式及邊緣AI技術(shù)的盛宴!
    的頭像 發(fā)表于 04-28 13:57 ?4320次閱讀
    飛凌<b class='flag-5'>嵌入式</b>2025<b class='flag-5'>嵌入式</b>及邊緣AI技術(shù)論壇圓滿結(jié)束