成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊預編譯#Error的使用,你學會了嗎?

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

?引言

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

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

在MCU的開發中,我們經常需要用到Flash存儲一些參數,且通常情況下有很多參數需要存儲。

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

示例demo如下:

#define PARA_BATTERY_ADDR   0x08019000  //存儲電池參數#define PARA_ETH_ADDR    0x0801B800  //存儲網絡參數..........#define PARA_USER_CONFIG_ADDR 0x0801C400 //存儲用戶參數

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

當想增加一個參數存儲時,如果不很熟悉代碼,根本不知道哪個扇區是空閑的。

優化版本如下,將這這些宏定義統一定義在flashmap.h中。

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

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

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

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

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

#error

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

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

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

上面的程序優化為

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

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

圖片

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

其他用法

限定宏定義的數值范圍,下面SIZE被限制在0到100內。

#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

責任編輯:武曉燕 來源: 知曉編程
相關推薦

2024-08-19 10:24:14

2024-06-12 08:36:25

2024-03-05 10:09:16

restfulHTTPAPI

2022-12-26 07:48:04

敏捷項目

2022-03-05 23:29:18

LibuvwatchdogNode.js

2022-09-26 08:49:11

Java架構CPU

2022-04-13 09:01:45

SASSCSS處理器

2022-12-08 10:49:43

2022-07-11 09:00:37

依賴配置文件Mybati

2024-03-04 07:41:18

SpringAOPOOP?

2022-12-27 08:45:00

繪制菜單符號

2023-01-29 08:08:34

并發庫conc通用庫

2023-07-10 08:36:21

工具pptword

2022-10-11 08:48:08

HTTP狀態碼瀏覽器

2023-12-05 17:57:13

nginx參數

2024-02-02 11:03:11

React數據Ref

2024-04-29 06:55:34

RustMIDI應用程序

2022-11-08 08:45:30

Prettier代碼格式化工具

2023-06-05 08:36:04

SQL函數RANK()

2023-03-07 07:50:15

Transactio事務代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人在线视频 | 亚洲成人免费 | 国产精品久久久久久久久动漫 | 国产午夜精品久久久 | 国产日韩一区二区 | 黄色精品 | 国产成人精品久久二区二区91 | 国产最新视频在线 | 精品视频在线观看 | 久久久久国产一级毛片 | 精品免费在线 | 亚洲免费一 | 操久久| 亚洲免费人成在线视频观看 | 亚洲一区二区在线视频 | 毛片网站在线观看 | a级大毛片| 九九热精品视频在线观看 | 日本精品一区二区 | 国产福利二区 | 久久久久久网站 | 黄网站免费在线看 | 久久国产精品首页 | 国产精品永久久久久久久www | 欧美国产亚洲一区二区 | 国产精品一区二区av | 在线视频一区二区 | 97在线播放 | 国产美女久久 | 男人天堂网址 | 91.com在线观看| 99热精品在线观看 | 中文字幕在线观看视频一区 | 日韩在线一区二区三区 | 成人在线一区二区三区 | 毛片国产 | 午夜久久久久久久久久一区二区 | 91精品国产91久久久久久三级 | 精品免费视频 | 国产伊人精品 | 中文字幕高清免费日韩视频在线 |