電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 52|回復(fù): 0
收起左側(cè)

預(yù)編譯#error的使用

[復(fù)制鏈接]

485

主題

485

帖子

1623

積分

三級會(huì)員

Rank: 3Rank: 3

積分
1623
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-12-14 08:30:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
引言
9 R: k8 j) Z! Y; U1 _: ~# V  D+ V說到預(yù)編譯,大家立刻就能想到#define、#if、#ifdef和#ifndef等熟悉的預(yù)編譯命令。其實(shí)#include,我們通常放在源文件用來包含頭文件,它也是預(yù)編譯命令。當(dāng)然這不是這篇文章的重點(diǎn)。這篇文章主要講解下#error預(yù)編譯命令,對于什么是預(yù)編譯,預(yù)編譯的作用等基礎(chǔ)知識點(diǎn)不再講解,不懂的同學(xué)請自行百度。在MCU的開發(fā)中,我們經(jīng)常需要用到Flash存儲一些參數(shù),且通常情況下有很多參數(shù)需要存儲。一般采用一個(gè)扇區(qū)存儲一種類型的參數(shù)(可能造成Flash空間浪費(fèi)),但對于一些內(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ù)少時(shí)還好,當(dāng)有很多參數(shù)時(shí),這將是一個(gè)噩夢。如果這些參數(shù)分散在各個(gè)文件中,閱讀這份源碼將是惡心他媽給惡心開門,惡心到家了。
    , V& @  |1 Y! t$ g& E當(dāng)想增加一個(gè)參數(shù)存儲時(shí),如果不很熟悉代碼,根本不知道哪個(gè)扇區(qū)是空閑的。% n& Q- g& `1 W4 |
    優(yōu)化版本如下,將這這些宏定義統(tǒng)一定義在flashmap.h中
  • #define PARA_STARADDR (0x08000+(100*1024))  //前100K用于存儲固件,參數(shù)存儲開始地址。#define FLASH_SECTOR_SIZE (2*1024)  //Flash每個(gè)扇區(qū)的大小8 f# w$ ^; r7 }$ z
    #define PARA_BATTERY_ADDR   PARA_STARADDR //存儲電池參數(shù)#define PARA_BATTERY_SIZE   (1*FLASH_SECTOR_SIZE) //電池參數(shù)所占空間大小
    & o: v6 D- H/ W) j' U- |; Z#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ù)地址,就顯得很合理,不會(huì)想增加一個(gè)參數(shù)時(shí),不知道哪個(gè)扇區(qū)是空閑的,找到了一個(gè)扇區(qū),還是擔(dān)心受怕,害怕和別的參數(shù)存儲地址沖突將其覆蓋。當(dāng)然它也有弊端,如果問你PARA_ETH_ADDR存儲地址,并不能立刻從代碼中看出,這個(gè)問題,我一般使用printf打印出來。還有個(gè)問題,如果加了很多參數(shù),最后一個(gè)參數(shù)地址大于Flash空間怎么辦,或者軟件設(shè)計(jì)一段Flash空間作為參數(shù)區(qū),不被允許超過這個(gè)地址。在這個(gè)代碼結(jié)構(gòu)中,無法從代碼中直接獲取,有不行使用printf肉眼判斷,那么可以使用#error 解決這個(gè)問題。
    5 `2 A1 [. j, g+ j* M#error
    1 A  [; a2 [: p) b9 {6 n#error 是一種預(yù)編譯器指示字,用于生成一個(gè)編譯錯(cuò)誤消息 。用法:#error [message] //message為用戶自定義的錯(cuò)誤提示信息,可缺省。#error 可用于提示編譯條件是否滿足。編譯過程中的任何錯(cuò)誤意味著無法生成最終的可執(zhí)行程序。上面的程序優(yōu)化為
  • #define PARA_STARADDR (0x08000+(100*1024))  //前100K用于存儲固件,參數(shù)存儲開始地址。#define FLASH_SECTOR_SIZE (2*1024)  //Flash每個(gè)扇區(qū)的大小
    + d; L2 u, h, T- j+ N+ S# G#define PARA_BATTERY_ADDR   PARA_STARADDR //存儲電池參數(shù)#define PARA_BATTERY_SIZE   (1*FLASH_SECTOR_SIZE) //電池參數(shù)所占空間大小/ A; @" S1 ]7 ]# w3 q
    #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ù)所占空間大小
    ' R$ N5 I# l% P, G, `& `/ P#define PARA_END_ADDR  (PARA_ETH_ADDR+PARA_ETH_SIZE)// 參數(shù)的結(jié)束地址#if (PARA_END_ADDR > 0x0801E000)    #error Flash Map Error#endif這樣當(dāng)你的參數(shù)最后地址大于0x0801E000,編譯器機(jī)會(huì)報(bào)錯(cuò),根本編譯不過,如下圖
    & P4 _7 r" \) p  T
    1 T9 w$ a( q! f2 ?" C, Y類似的,#warning 用于生成編譯警告消息。warning可用來提示一些非致命錯(cuò)誤。
    3 l8 R4 i8 B3 a; k" t/ n& _  }/ [6 q其他用法+ l: ]9 Z( j- ?8 J
    限定宏定義的數(shù)值范圍,下面SIZE被限制在0到100內(nèi)。
    ; m% D+ ^3 m/ F& o. S
  • #define SIZE 10#if SIZE  100#error SIZE must be between 1 and 100.#endifuint8_t buffer[SIZE];指定使用VS編譯器3 k' S+ s* M# G+ i' E
  • #ifndef _MSC_VER#error require visual studio compiler#endif判斷是否定義了某個(gè)宏,比如FreeRTOS源碼中1 P1 r. J" Y6 x* ~# u" B
  • #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.#endifEND6 P. Y6 S" H+ G6 O; j

    6 g5 E  [' p, v8 }( ~ - a0 g  k+ m" V. L
    ?指針與函數(shù)
    6 y- i. u1 I# i( o9 V5 L?聊聊數(shù)據(jù)溢出的事
    & r+ b9 |$ T0 G0 i2 K?MCU為什么內(nèi)部不集成晶振 必讀/ l, q' x( Q5 B8 @
    ?表驅(qū)動(dòng)法在STM32中的應(yīng)用7 `/ y9 ^1 ~# O5 S0 k# c
    ?設(shè)計(jì)一款兼容ST207和GD207的開發(fā)板 必讀
  • 發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表