日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
聊聊預(yù)編譯#Error的使用,你學(xué)會了嗎?

?引言

創(chuàng)新互聯(lián)是一家專業(yè)提供玉田企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)HTML5建站、小程序制作等業(yè)務(wù)。10年已為玉田眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進行中。

說到預(yù)編譯,大家立刻就能想到#define、#if、#ifdef和#ifndef等熟悉的預(yù)編譯命令。其實#include,我們通常放在源文件用來包含頭文件,它也是預(yù)編譯命令。當(dāng)然這不是這篇文章的重點。

這篇文章主要講解下#error預(yù)編譯命令,對于什么是預(yù)編譯,預(yù)編譯的作用等基礎(chǔ)知識點不再講解,不懂的同學(xué)請自行百度。

在MCU的開發(fā)中,我們經(jīng)常需要用到Flash存儲一些參數(shù),且通常情況下有很多參數(shù)需要存儲。

一般采用一個扇區(qū)存儲一種類型的參數(shù)(可能造成Flash空間浪費),但對于一些內(nèi)部Flash容量很大的MCU,這樣做也是可行的。

示例demo如下:

#define PARA_BATTERY_ADDR   0x08019000  //存儲電池參數(shù)#define PARA_ETH_ADDR    0x0801B800  //存儲網(wǎng)絡(luò)參數(shù)..........#define PARA_USER_CONFIG_ADDR 0x0801C400 //存儲用戶參數(shù)

很多開發(fā)工程師喜歡這樣做,如果參數(shù)少時還好,當(dāng)有很多參數(shù)時,這將是一個噩夢。如果這些參數(shù)分散在各個文件中,閱讀這份源碼將是惡心他媽給惡心開門,惡心到家了。

當(dāng)想增加一個參數(shù)存儲時,如果不很熟悉代碼,根本不知道哪個扇區(qū)是空閑的。

優(yōu)化版本如下,將這這些宏定義統(tǒng)一定義在flashmap.h中。

#define PARA_STARADDR (0x08000+(100*1024))  //前100K用于存儲固件,參數(shù)存儲開始地址。#define FLASH_SECTOR_SIZE (2*1024)  //Flash每個扇區(qū)的大小
#define PARA_BATTERY_ADDR PARA_STARADDR //存儲電池參數(shù)#define PARA_BATTERY_SIZE (1*FLASH_SECTOR_SIZE) //電池參數(shù)所占空間大小
#define PARA_ETH_ADDR (PARA_BATTERY_ADDR+PARA_BATTERY_SIZE) //存儲網(wǎng)絡(luò)參數(shù)#define PARA_ETH_SIZE (2*FLASH_SECTOR_SIZE) //網(wǎng)絡(luò)參數(shù)所占空間大小

相信大家也看出來了,這樣管理參數(shù)地址,就顯得很合理,不會想增加一個參數(shù)時,不知道哪個扇區(qū)是空閑的,找到了一個扇區(qū),還是擔(dān)心受怕,害怕和別的參數(shù)存儲地址沖突將其覆蓋。

當(dāng)然它也有弊端,如果問你PARA_ETH_ADDR存儲地址,并不能立刻從代碼中看出,這個問題,我一般使用printf打印出來。

還有個問題,如果加了很多參數(shù),最后一個參數(shù)地址大于Flash空間怎么辦,或者軟件設(shè)計一段Flash空間作為參數(shù)區(qū),不被允許超過這個地址。

在這個代碼結(jié)構(gòu)中,無法從代碼中直接獲取,有不行使用printf肉眼判斷,那么可以使用#error 解決這個問題。

#error

#error 是一種預(yù)編譯器指示字,用于生成一個編譯錯誤消息 。

用法:#error [message] //message為用戶自定義的錯誤提示信息,可缺省。

#error 可用于提示編譯條件是否滿足。編譯過程中的任何錯誤意味著無法生成最終的可執(zhí)行程序。

上面的程序優(yōu)化為

#define PARA_STARADDR (0x08000+(100*1024))  //前100K用于存儲固件,參數(shù)存儲開始地址。#define FLASH_SECTOR_SIZE (2*1024)  //Flash每個扇區(qū)的大小
#define PARA_BATTERY_ADDR PARA_STARADDR //存儲電池參數(shù)#define PARA_BATTERY_SIZE (1*FLASH_SECTOR_SIZE) //電池參數(shù)所占空間大小
#define PARA_ETH_ADDR (PARA_BATTERY_ADDR+PARA_BATTERY_SIZE) //存儲網(wǎng)絡(luò)參數(shù)#define PARA_ETH_SIZE (2*FLASH_SECTOR_SIZE) //網(wǎng)絡(luò)參數(shù)所占空間大小
#define PARA_END_ADDR (PARA_ETH_ADDR+PARA_ETH_SIZE)// 參數(shù)的結(jié)束地址#if #error#endif

這樣當(dāng)你的參數(shù)最后地址大于0x0801E000,編譯器機會報錯,根本編譯不過,如下圖

類似的,#warning 用于生成編譯警告消息。warning可用來提示一些非致命錯誤。

其他用法

限定宏定義的數(shù)值范圍,下面SIZE被限制在0到100內(nèi)。

#define#if SIZE < 0 || SIZE > 100#error#endifuint8_t buffer[SIZE];

指定使用VS編譯器

#ifndef#error#endif

判斷是否定義了某個宏,比如FreeRTOS源碼中

#ifndef configMINIMAL_STACK_SIZE    #error Missing definition:  configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h.  configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task.  Refer to the demo project provided for your port for a suitable value.#endif


文章標(biāo)題:聊聊預(yù)編譯#Error的使用,你學(xué)會了嗎?
URL網(wǎng)址:http://www.5511xx.com/article/cdesigc.html