在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式代碼之編寫規范

GReq_mcu168 ? 來源:工程師李察 ? 2019-04-26 15:21 ? 次閱讀

嵌入式代碼編碼規范,用于規范自己的代碼,增強可讀性,非標準規范。最好能強制自己形成良好的編碼風格,有利于開發大規模程序而不顯得雜亂。參考STM32固件庫編碼風格和FreeRTOS編碼風格。

一、工程文件組織結構

新建工程文件應包含以下全部或部分文件夾:

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

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

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

Src:引用庫的源文件。

Inc:應用庫的頭文件。

Lib:引用的庫文件。

一個工程一定要包含一個main.c文件,只用來存放main函數。其余函數的定義應在相應的.c文件中,聲明在相應的.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.

二、源文件

文件頭,文件的簡介

/************************************************************************* * 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.*************************************************************************/

必要的注釋和說明

源文件應該只包含它自己的頭文件,其他的頭文件在他自己的頭文件中包含。

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

全局變量在相應的源文件中定義,在頭文件中用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 ----------------------------------------------------*/

函數頭

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

三、頭文件

文件頭,文件的簡介

/************************************************************************* - 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 --------------------------------------------------------*/

四、命名規則

參考FreeRTOS命名規則,MISRA C規范。

定義變量時盡量使用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

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

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

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

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

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

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

五、代碼風格

縮進:縮進使用制表符,一個制表符等于4個空格。

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

布局:源代碼應被設計成盡可能的易于查看和閱讀。

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

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

六、編程思想

將特定功能的代碼封裝成函數。

七、C語言編程規則

參考MISRA

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

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

Rule3:所有標識符不超過31字符。

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

例如:

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

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

Rule6:禁止使用八進制數。(因為086U這樣的常數很容易引起誤解)。

Rule7:不得定義與外部作用域中某個標識符同名的對象,以避免遮蓋外部作用域中的標識符。

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

Rule9:自動對象(棧對象)使用前必須賦初值。

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

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

Rule11:不得對有符號數施加位操作,例如 1 << 4 將被禁止,必須寫 1UL << 4。

Rule12:不得對有副作用的表達式施加sizeof操作符。

Rule13:除了循環控制語句,不得使用逗號表達式。

Rule14:不得顯式判斷浮點數的相等性和不等性。

Rule15:不得遺留“永遠不會用到”的代碼。

Rule16:除了switch語句,不得使用標號(label)。

Rule17:不得使用goto。

Rule18:不得使用continue。

Rule19:除了switch語句,不得使用break

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

Rule21:循環計數器的值不得在循環體內修改。

Rule22:禁止任何直接和間接的遞歸函數調用。

Rule23:不應該使用#undef。

Rule24:不得將宏作為參數傳給宏函數。

Rule25:在一個宏定義中,#或##符號只能出現一次。

Rule26:禁止指針運算(代之以數組下標運算)。

Rule27:禁止超過兩級的指針。

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

Rule29:禁止使用setjmp, longjmp。

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5144

    文章

    19575

    瀏覽量

    315801
  • 函數
    +關注

    關注

    3

    文章

    4374

    瀏覽量

    64410
  • 工程
    +關注

    關注

    0

    文章

    167

    瀏覽量

    28324

原文標題:如何增強代碼的可讀性?嵌入式代碼之編寫規范

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    嵌入式教育科普|GPIO接口全面解析

    在現代科技領域,嵌入式系統接口作為信息交互的核心載體,發揮著至關重要的作用,各類接口通過預定義的通信協議與標準化規范,可以實現設備間的精準數據傳輸與智能控制。 作為嵌入式開發的技術基礎,接口
    的頭像 發表于 03-05 11:11 ?1724次閱讀
    <b class='flag-5'>嵌入式</b>教育科普|GPIO接口全面解析

    嵌入式系統中的代碼優化與壓縮技術

    。開發人員在編寫代碼時,應注重代碼的模塊化和復用性,避免不必要的重復代碼編寫嵌入式系統中的
    發表于 02-26 15:00

    如何提高嵌入式代碼質量?

    的情況下也必須保持穩定的性能。 3. 硬件依賴:嵌入式軟件緊密依賴硬件平臺,需要充分理解硬件特性才能編寫高效且穩定的代碼。 了解這些特點有助于開發人員在編寫
    發表于 01-15 10:48

    嵌入式主板的概述與發展

    隨著科技的迅猛發展,嵌入式系統在現代電子產品中扮演著越來越重要的角色。嵌入式主板作為嵌入式系統的核心組件之一,承擔著控制、處理和通訊等多種功能。本文將對嵌入式主板的基本概念、構成部分、
    的頭像 發表于 01-13 16:30 ?726次閱讀
    <b class='flag-5'>嵌入式</b>主板的概述與發展

    新手怎么學嵌入式?

    的基礎上增加了面向對象編程的特性,有助于編寫更復雜的嵌入式程序。 3. 學習硬件知識 嵌入式技術與硬件緊密相關,因此你需要了解一些基本的硬件知識。比如微控制器(MCU)、微處理器(MPU)的工作原理,了解
    發表于 12-12 10:51

    HAL庫在嵌入式系統中的應用

    HAL庫是一種在嵌入式開發中用于屏蔽底層硬件細節、提供統一接口的軟件層。它允許開發者在編寫應用程序時無需關心具體的硬件實現,從而提高了代碼的可移植性和復用性。HAL庫的主要目的是將硬件相關的
    的頭像 發表于 12-02 11:32 ?1959次閱讀

    一文了解嵌入式軟件開發的對象

    以前應用場景很單一,嵌入式開發可能談不上面向對象開發。但現在,做嵌入式開發,沒有面向對象開發,你就有點落伍了。 本文結合個人經驗和周立功《抽象接口技術和組件開發規范及其思想》,循序漸進的用
    的頭像 發表于 11-15 10:31 ?782次閱讀
    一文了解<b class='flag-5'>嵌入式</b>軟件開發的對象

    嵌入式學習建議

    動手做一個實際的小系統,底層硬件基礎就有了。各個硬件模塊驅動程序的編寫嵌入式系統的必備基礎。學習嵌入式系統的初期,這個過程是必須的。 ④至于嵌入式實時操作系統RTOS,一定不要一開
    發表于 10-22 11:41

    什么是嵌入式?一文讀懂嵌入式主板

    在現代科技浪潮中,嵌入式技術已成為支撐各種智能設備和系統運行的核心力量。那么,究竟什么是嵌入式?嵌入式系統,顧名思義,是將計算機的硬件和軟件嵌入到某種設備或系統中,以實現特定功能的計算
    的頭像 發表于 10-16 10:14 ?2492次閱讀

    嵌入式主板是什么意思?嵌入式主板全面解析

    嵌入式主板,通常被稱為嵌入式系統的核心組件,是一種用于控制和數據處理的計算機硬件,其設計旨在嵌入特定設備中執行專門任務。嵌入式主板如同是設備的“大腦”,主要功能是根據需要管理和控制設備
    的頭像 發表于 09-30 10:05 ?1544次閱讀

    北京迅為RK3568開發板嵌入式學習Linux驅動全新更新-CAN+

    北京迅為RK3568開發板嵌入式學習Linux驅動全新更新-CAN+
    的頭像 發表于 09-04 15:29 ?959次閱讀
    北京迅為RK3568開發板<b class='flag-5'>嵌入式</b>學習<b class='flag-5'>之</b>Linux驅動全新更新-CAN+

    一種常用嵌入式開發代碼

    使用開源協議:GPL-2.0varch簡介varch(we-architecture,意為我們的框架庫)是嵌入式C語言常用代碼模塊庫,包含了嵌入式中常用的算法庫,數據結構(容器)庫,解析器庫,獨立C
    的頭像 發表于 09-04 08:06 ?819次閱讀
    一種常用<b class='flag-5'>嵌入式</b>開發<b class='flag-5'>代碼</b>庫

    七大嵌入式GUI盤點

    LCD設計提供高級支持,極大簡化了LCD設計。它是使用比較廣泛的一款GUI,配合GUI Builder或App Wizard上位機軟件,用起來也比較方便。emWin以C語言源代碼提供,使其成為嵌入式
    發表于 09-02 10:58

    嵌入式QT常見開發方式有哪些?

    嵌入式QT常見開發方式有哪些? 嵌入式工程師在學習和使用Qt進行開發時,常見的幾種開發方式包括: 1.Qt Widgets編程: 通過C++代碼直接編寫GUI應用程序,利用QtWi
    發表于 08-12 10:05

    如何提升嵌入式編程能力?

    :掌握嵌入式系統的基本原理,包括中斷、并發、實時操作、低功耗設計等。 3. 實踐編程:通過實際編寫和測試代碼來提高技能。從簡單的LED閃爍程序開始,逐步過渡到更復雜的項目,如定時器PWM應用、串口、IIC
    發表于 06-21 10:01
    主站蜘蛛池模板: 一区二区在线免费观看 | 日韩一级在线观看 | 天天干天天射天天 | tube44在线观看 | 中国一级特黄真人毛片免费看 | 亚洲www美色 | 欧美激欧美啪啪片免费看 | 欧美精品二区 | 亚洲一区欧美二区 | 欧美极品第1页专区 | 99精品国产第一福利网站 | 成人高清毛片a | 亚洲1234区乱码 | 美女视频一区二区三区 | 欧美伊人久久综合网 | 成人国产三级精品 | 天天爽夜夜爽天天做夜夜做 | aaaa在线观看| 视频一区二区在线观看 | 天堂电影免费在线观看 | 欧美性videofree精品 | 国产精品好好热在线观看 | 九九午夜 | 视频一区 中文字幕 | 国产高清色视频免费看的网址 | 五月欧美激激激综合网色播 | 免费看一级片 | 亚洲伊人久久大香线蕉啊 | 狼狼狼色精品视频在线播放 | 77788色淫免费网站视频 | 国产在线视频你懂得 | 免费观看a毛片一区二区不卡 | 欧美色图中文字幕 | 日本在线不卡免费 | 日夜夜操| 亚洲qingse中文久久网 | 狂野欧美激情性xxxx | 啊用力太猛了啊好深视频免费 | 狠狠曹 | 色香蕉网站 | 在线视频毛片 |