当前位置: 首页 > 科技观察

说说预编译#Error的使用,你学会了吗?

时间:2023-03-21 20:51:00 科技观察

简介一提到预编译,大家马上就能想到#define、#if、#ifdef、#ifndef等熟悉的预编译命令。其实#include,我们通常会把它放在源文件中用来包含头文件,它也是一个预编译命令。当然这不是本文的重点。本文主要讲解#error预编译命令。什么是预编译、预编译的作用等基础知识点我就不解释了。不懂的请自行百度。在单片机的开发中,我们经常需要用到Flash来存储一些参数,而且通常需要存储的参数很多。一般一个扇区用来存放一类参数(可能会造成Flash空间的浪费),但对于一些内部Flash容量较大的MCU来说也是可行的。示例demo如下:#definePARA_BATTERY_ADDR0x08019000//存储电池参数#definePARA_ETH_ADDR0x0801B800//存储网络参数.......#definePARA_USER_CONFIG_ADDR0x0801C400//存储用户参数很多开发工程师喜欢这样做,如果theparameters参数少的时候还好,参数多的时候简直就是噩梦。如果这些参数散落在各个文件中,读这个源码会很恶心,打开恶心、恶心的家门。当你要添加一个参数存储时,如果你对代码不是很熟悉,你不知道哪个扇区是空闲的。优化后的版本如下,这些宏定义统一定义在flashmap.h中。#definePARA_STARADDR(0x08000+(100*1024))//前100K用于存放固件,参数存放的起始地址。#defineFLASH_SECTOR_SIZE(2*1024)//Flash每个扇区的大小#definePARA_BATTERY_ADDRPARA_STARADDR//存储电池参数#definePARA_BATTERY_SIZE(1*FLASH_SECTOR_SIZE)//电池参数占用的空间大小#definePARA_ETH_ADDR(PARA_BATTERY_ADDR+PARASI_ZEBATTERY)//存储网络参数#definePARA_ETH_SIZE(2*FLASH_SECTOR_SIZE)//网络参数占用的空间相信你也能看出来,所以管理参数地址是很合理的,不想加一个参数不知道哪个扇区是空闲的,如果找到一个扇区,它还是会害怕,怕和其他参数存储地址冲突而覆盖掉。当然,它也有缺点。如果你问你PARA_ETH_ADDR的存储地址,从代码上是不能立马看出来的。我通常使用printf打印出这个问题。还有一个问题,如果加了很多参数,最后一个参数的地址比Flash空间大怎么办,或者软件设计了一段Flash空间作为参数区,是不允许的超过这个地址。在这种代码结构中,不能直接从代码中获取。如果不能用printf用肉眼判断,那么可以用#error来解决这个问题。#error#error是生成编译错误消息的预编译器指令。Usage:#error[message]//message是用户自定义的错误信息,可以默认。#error可以用来提示是否满足编译条件。编译过程中的任何错误都意味着无法生成最终的可执行程序。上面的程序优化为#definePARA_STARADDR(0x08000+(100*1024))//前100K用于存放固件,参数存放的起始地址。#defineFLASH_SECTOR_SIZE(2*1024)//Flash每个扇区的大小#definePARA_BATTERY_ADDRPARA_STARADDR//存储电池参数#definePARA_BATTERY_SIZE(1*FLASH_SECTOR_SIZE)//电池参数占用的空间大小#definePARA_ETH_ADDR(PARA_BATTERY_ADDR+PARASI_ZEBATTERY)//存储网络参数#definePARA_ETH_SIZE(2*FLASH_SECTOR_SIZE)//网络参数占用空间大小#definePARA_END_ADDR(PARA_ETH_ADDR+PARA_ETH_SIZE)//参数结束地址#if#error#endif所以当你的参数的lastaddress大于0x0801E000,编译器可能会报错,但根本无法编译,如下图,#warning用于产生编译警告信息。warning可以用来提示一些非致命错误。其他用法限制了宏定义的数值范围,下面的SIZE限制为0到100。#define#ifSIZE<0||SIZE>100#error#endifuint8_t缓冲区[SIZE];指定使用VS编译器#ifndef#error#endif来判断是否定义了宏,如#ifndefconfigMINIMAL_STACK_SIZE#errorMissingintheFreeRTOSsourcecodedefinition:configMINIMAL_STACK_SIZEmustbedefinedinFreeRTOSConfig.h。configMINIMAL_STACK_SIZE定义分配给空闲任务的堆栈大小(以字为单位)。请参阅为您的端口提供的演示项目以获得合适的值。#万一