女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

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

GReq_mcu168 ? 來(lái)源:工程師李察 ? 2019-04-26 15:21 ? 次閱讀

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

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

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

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

usrInc:用戶(hù)頭文件,用來(lái)存放.h文件。

usrDoc:用戶(hù)說(shuō)明文檔,用來(lái)存放用戶(hù)在開(kāi)發(fā)過(guò)程中書(shū)寫(xiě)的文檔,一般為.txt格式。例如Readme.txt,指令說(shuō)明等。

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

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

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

一個(gè)工程一定要包含一個(gè)main.c文件,只用來(lái)存放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.*************************************************************************/

必要的注釋和說(shuō)明

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

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

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

類(lèi)型定義在頭文件中定義。

/* 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類(lèi)型的變量使用前綴ul,這里’u’表示’unsigned’,’l’表示’long’

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

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

枚舉類(lèi)型變量使用前綴e

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

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

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

宏定義全部使用大寫(xiě),兩個(gè)單詞之間用下劃線(xiàn)隔開(kāi)。

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

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

五、代碼風(fēng)格

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

注釋?zhuān)鹤⑨寙涡胁怀^(guò)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ù)名字總是占一行,包括返回類(lèi)型。左括號(hào)之前沒(méi)有空格左括號(hào)之后有一個(gè)空格, * 每個(gè)參數(shù)后面有一個(gè)空格,參數(shù)的命名應(yīng)該具有一定的描述性. */void vAnExampleFunction( long lParameter1, unsigned short usParameter2 ){/* 變量聲明沒(méi)有縮進(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)之間沒(méi)有空格。 * 左括號(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í)符不超過(guò)31字符。

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

例如:

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

Rule5: 不得使用char, int, float, double, long等基本類(lèi)型,應(yīng)該用stdint.h中定義的類(lèi)型顯示表示類(lèi)型的大小,如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)。

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

Rule11:不得對(duì)有符號(hào)數(shù)施加位操作,例如 1 << 4 將被禁止,必須寫(xiě) 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:禁止超過(guò)兩級(jí)的指針。

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

Rule29:禁止使用setjmp, longjmp。

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

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

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

    關(guān)注

    5141

    文章

    19542

    瀏覽量

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

    關(guān)注

    3

    文章

    4371

    瀏覽量

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

    關(guān)注

    0

    文章

    166

    瀏覽量

    28294

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

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

收藏 人收藏

    評(píng)論

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

    想在嵌入式領(lǐng)域高薪就業(yè)?先邁過(guò)這些人才門(mén)檻!

    嵌入式開(kāi)發(fā)的世界,如今正經(jīng)歷著一場(chǎng)變革,同時(shí)也暴露出諸多問(wèn)題?,F(xiàn)在,會(huì)編寫(xiě)嵌入式程序的人隨處可見(jiàn),樹(shù)莓派、Arduino 等開(kāi)發(fā)板的出現(xiàn),讓嵌入式編程變得輕而易舉,就連軟件工程師也能輕
    的頭像 發(fā)表于 03-20 10:42 ?399次閱讀
    想在<b class='flag-5'>嵌入式</b>領(lǐng)域高薪就業(yè)?先邁過(guò)這些人才門(mén)檻!

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

    在現(xiàn)代科技領(lǐng)域,嵌入式系統(tǒng)接口作為信息交互的核心載體,發(fā)揮著至關(guān)重要的作用,各類(lèi)接口通過(guò)預(yù)定義的通信協(xié)議與標(biāo)準(zhǔn)化規(guī)范,可以實(shí)現(xiàn)設(shè)備間的精準(zhǔn)數(shù)據(jù)傳輸與智能控制。 作為嵌入式開(kāi)發(fā)的技術(shù)基礎(chǔ),接口
    的頭像 發(fā)表于 03-05 11:11 ?1647次閱讀
    <b class='flag-5'>嵌入式</b>教育科普|GPIO接口全面解析

    嵌入式系統(tǒng)中的代碼優(yōu)化與壓縮技術(shù)

    。開(kāi)發(fā)人員在編寫(xiě)代碼時(shí),應(yīng)注重代碼的模塊化和復(fù)用性,避免不必要的重復(fù)代碼編寫(xiě)。 嵌入式系統(tǒng)中的
    發(fā)表于 02-26 15:00

    如何提高嵌入式代碼質(zhì)量?

    的情況下也必須保持穩(wěn)定的性能。 3. 硬件依賴(lài):嵌入式軟件緊密依賴(lài)硬件平臺(tái),需要充分理解硬件特性才能編寫(xiě)高效且穩(wěn)定的代碼。 了解這些特點(diǎn)有助于開(kāi)發(fā)人員在編寫(xiě)
    發(fā)表于 01-15 10:48

    嵌入式主板的概述與發(fā)展

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

    新手怎么學(xué)嵌入式?

    的基礎(chǔ)上增加了面向?qū)ο缶幊痰奶匦?,有助?b class='flag-5'>編寫(xiě)更復(fù)雜的嵌入式程序。 3. 學(xué)習(xí)硬件知識(shí) 嵌入式技術(shù)與硬件緊密相關(guān),因此你需要了解一些基本的硬件知識(shí)。比如微控制器(MCU)、微處理器(MPU)的工作原理,了解
    發(fā)表于 12-12 10:51

    HAL庫(kù)在嵌入式系統(tǒng)中的應(yīng)用

    HAL庫(kù)是一種在嵌入式開(kāi)發(fā)中用于屏蔽底層硬件細(xì)節(jié)、提供統(tǒng)一接口的軟件層。它允許開(kāi)發(fā)者在編寫(xiě)應(yīng)用程序時(shí)無(wú)需關(guān)心具體的硬件實(shí)現(xiàn),從而提高了代碼的可移植性和復(fù)用性。HAL庫(kù)的主要目的是將硬件相關(guān)的
    的頭像 發(fā)表于 12-02 11:32 ?1870次閱讀

    一文了解嵌入式軟件開(kāi)發(fā)的對(duì)象

    以前應(yīng)用場(chǎng)景很單一,嵌入式開(kāi)發(fā)可能談不上面向?qū)ο箝_(kāi)發(fā)。但現(xiàn)在,做嵌入式開(kāi)發(fā),沒(méi)有面向?qū)ο箝_(kāi)發(fā),你就有點(diǎn)落伍了。 本文結(jié)合個(gè)人經(jīng)驗(yàn)和周立功《抽象接口技術(shù)和組件開(kāi)發(fā)規(guī)范及其思想》,循序漸進(jìn)的用
    的頭像 發(fā)表于 11-15 10:31 ?755次閱讀
    一文了解<b class='flag-5'>嵌入式</b>軟件開(kāi)發(fā)的對(duì)象

    嵌入式學(xué)習(xí)建議

    動(dòng)手做一個(gè)實(shí)際的小系統(tǒng),底層硬件基礎(chǔ)就有了。各個(gè)硬件模塊驅(qū)動(dòng)程序的編寫(xiě)嵌入式系統(tǒng)的必備基礎(chǔ)。學(xué)習(xí)嵌入式系統(tǒng)的初期,這個(gè)過(guò)程是必須的。 ④至于嵌入式實(shí)時(shí)操作系統(tǒng)RTOS,一定不要一開(kāi)
    發(fā)表于 10-22 11:41

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

    在現(xiàn)代科技浪潮中,嵌入式技術(shù)已成為支撐各種智能設(shè)備和系統(tǒng)運(yùn)行的核心力量。那么,究竟什么是嵌入式?嵌入式系統(tǒng),顧名思義,是將計(jì)算機(jī)的硬件和軟件嵌入到某種設(shè)備或系統(tǒng)中,以實(shí)現(xiàn)特定功能的計(jì)算
    的頭像 發(fā)表于 10-16 10:14 ?2466次閱讀

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

    嵌入式主板,通常被稱(chēng)為嵌入式系統(tǒng)的核心組件,是一種用于控制和數(shù)據(jù)處理的計(jì)算機(jī)硬件,其設(shè)計(jì)旨在嵌入特定設(shè)備中執(zhí)行專(zhuān)門(mén)任務(wù)。嵌入式主板如同是設(shè)備的“大腦”,主要功能是根據(jù)需要管理和控制設(shè)備
    的頭像 發(fā)表于 09-30 10:05 ?1510次閱讀

    北京迅為RK3568開(kāi)發(fā)板嵌入式學(xué)習(xí)Linux驅(qū)動(dòng)全新更新-CAN+

    北京迅為RK3568開(kāi)發(fā)板嵌入式學(xué)習(xí)Linux驅(qū)動(dòng)全新更新-CAN+
    的頭像 發(fā)表于 09-04 15:29 ?917次閱讀
    北京迅為RK3568開(kāi)發(fā)板<b class='flag-5'>嵌入式</b>學(xué)習(xí)<b class='flag-5'>之</b>Linux驅(qū)動(dòng)全新更新-CAN+

    一種常用嵌入式開(kāi)發(fā)代碼庫(kù)

    使用開(kāi)源協(xié)議:GPL-2.0varch簡(jiǎn)介varch(we-architecture,意為我們的框架庫(kù))是嵌入式C語(yǔ)言常用代碼模塊庫(kù),包含了嵌入式中常用的算法庫(kù),數(shù)據(jù)結(jié)構(gòu)(容器)庫(kù),解析器庫(kù),獨(dú)立C
    的頭像 發(fā)表于 09-04 08:06 ?794次閱讀
    一種常用<b class='flag-5'>嵌入式</b>開(kāi)發(fā)<b class='flag-5'>代碼</b>庫(kù)

    七大嵌入式GUI盤(pán)點(diǎn)

    LCD設(shè)計(jì)提供高級(jí)支持,極大簡(jiǎn)化了LCD設(shè)計(jì)。它是使用比較廣泛的一款GUI,配合GUI Builder或App Wizard上位機(jī)軟件,用起來(lái)也比較方便。emWin以C語(yǔ)言源代碼提供,使其成為嵌入式
    發(fā)表于 09-02 10:58

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

    :掌握嵌入式系統(tǒng)的基本原理,包括中斷、并發(fā)、實(shí)時(shí)操作、低功耗設(shè)計(jì)等。 3. 實(shí)踐編程:通過(guò)實(shí)際編寫(xiě)和測(cè)試代碼來(lái)提高技能。從簡(jiǎn)單的LED閃爍程序開(kāi)始,逐步過(guò)渡到更復(fù)雜的項(xiàng)目,如定時(shí)器PWM應(yīng)用、串口、IIC
    發(fā)表于 06-21 10:01