发布日期:2023-10-30 03:14 点击次数:142
volatile修饰默示变量是易变的,编译器中的优化器在用到这个变量时必须每次都注意肠从内存中重新读取这个变量的值,而不是使用保存在寄存器里的备份,有用的防患编译器自动优化,从而与软件蓄意投合适。
中断就业与主次序分享变量:
//volatile uint8_t flag=1; uint8_t flag=1; void test(void) { while(flag) { //do something } } //interrupt service routine void isr_test(void) { flag=0; }
若是没使用volatile界说flag,可能在优化后test堕入死轮回,因为test里使用的flag并没修改它,开启优化后,编译器可能会固定从某个内存取值。例如:
for(int i=0; i<100000; i++); //对比 for(volatile int i=0; i<100000; i++);
前者可能被优化掉,天然编码本意是需要实行操作延时,但编译器认为代码无道理。
总的来说,volatile是讲述编译器,不论代码怎样,必须保留,何况使用时需要重新从内存读取更新,不可使用先前读取的缓存,一般在驱动代码中使用较多。
2、constconst是恒定不变的真谛,其修饰的多样数据相同只读终结。
1)修饰变量
遴选const修饰变量,即变量声明为只读,保护变量值以防被修改。例如
const int i = 1;
上头这个例子标明,变量i具有只读特点,不八成被转变;若想对i重新赋值,如i = 10;属于不实操作。
极端诠释,界说变量的同期进走运摇荡,写成int const i=1,是正确的。
2)修饰数组
C话语中const还不错修饰数组,例如如下:
const int array[5] = {1,2,3,4,5}; array[0] = array[0]+1; //不实,array是只读的,胁制修改
数组元素与变量相同,具有只读属性,不可被转变;一朝转变,编译时就会报错。
使用大数组存储固定的信息,例如查表(表驱动法的键值表),不错使用const从简ram。编译器并不给普通const只读变量分派空间,而是将它们保存到标记表中,无需读写内存操作,次序实行服从也会普及。
3)修饰指针
C话语中const修饰指针要极端把稳,共有两种花样,一种是用来限制指向空间的值不可修改;另一种是限制指针不可转变。例如如下:
int i = 1; int j = 2; const int *p1 = &i; int* const p2 = &j;
上头界说了两个指针p1和p2,离别是const背面是指针自己一经指向的内容。
博彩平台排名在界说1中const限制的是* p1,即其指向空间的值不可改变,若改变其指向空间的值如* p1=10,则次序会报错;但p1的值是不错改变的,对p1重新赋值如p1=&k是莫得任何问题的。
在界说2中const限制的是指针p2,若改变p2的值如p2=&k,次序将会报错;但* p2,即其所指向空间的值不错改变,如* p2=20是莫得问题的,次序夙昔实行。
4)修饰函数参数
const关节字修饰函数参数,对参数起限制作用,防患其在函数里面被修改。所限制的函数参数不错是普通变量,也不错是指针变量。例如:
void fun(const int i) { …… i++; //对i的值进行了修改,次序报错 }
常用的函数如strlen
size_t strlen(const char *string);
const在库函数中使用很是巨额,是一种自我保护的安全编码念念维。
3、struct与union关于struct 结构体和union共联体在镶嵌式界限是使用得很是鄙俗的,一些可编程芯片提供的寄存器库都是遴选结构体和共联体结合的模样来提供给软件东说念主员进行缔造,同期在平时的编码经过中这两个数据类型的天真诈欺也八成终局代码更好的封装与简化。
如底下的简短示例,就不错很是天真实探访Val中的bit位。
typedef union { BYTE Val; struct __packed { BYTE b0:1; BYTE b1:1; BYTE b2:1; BYTE b3:1; BYTE b4:1; BYTE b5:1; BYTE b6:1; BYTE b7:1; } bits; }BYTE_VAL, BYTE_BITS;
其中:1默示按位操作。不仅仅位-字节不错,单字节与多字节也不错简化拼接。
骁龙 8 Gen 3 的跑分数据,其运行于即将发布的 Galaxy S24 Plus 之上,欧博体育代理后者配备 8GB 内存,运行的是 Android 14 系统。
皇冠客服飞机:@seo3687vivo 新机与 vivo Y78 + 的外观非常接近,后者发布于 2023 年 4 月,可以作为新机配置的参考。
在线博彩网站注册#include "stdio.h" typedef struct { union { struct { unsigned char low; unsigned char high; }; unsigned short result; }; }test_t; int main(int argc, char *argv[]) { test_t hello; hello.high=0x12; hello.low=0x34; printf("result=X\r\n",hello.result);//输出 result=1234 return 0; }
运行输出 result=1234 (win7系统下QT缔造环境),底本需要 (high<<8)|low 运算,不错简化为共用体类型自动完成,但必须把稳平台的字节规则,属于大端一经小端模式。
皇冠客服电话在诈欺层面,若是明确某个数据可能存在两种可能,何况两种终结不会同期存在,也不错使用结构体与共用体组合的模样,确保模块对外接口和谐。
例如挪动通讯模块,使用数据结构保存其基站信息,因为制式不同,模块可能责任在2G-GSM,也可能在4G-Cat1,为保证表层读取基站信息接口唯独,使用共用体就很是合适,不然需界说两套接口。若是以为著作不错,可关切微信公众号【镶嵌式系统】获得更多信息。
4、预界说标志符一般编译器都扶助预界说标志符,这些标志符结合printf等打印信息匡助次序员调试次序丧祭常有用的,一般编译器会自动把柄用户指定完成替换和料理。
部分标志:
__FILE__ //默示编译的源文献名 __LINE__ //默示刻下文献的行号 __FUNCTION__ //默示函数名 __DATE__ //默示编译日历 __TIME__ //默示编译时辰
使用程序:
printf("file:%s,line:%d,date:%s,time:%s",__FILE__,__LINE__,__DATE__,__TIME__);
这些比拟常见,主要用于日记分析、版块记载,便于调试。
5、#与###:是一种运算符,用于带参宏的文本替换,将跟在背面的参数转成一个字符串常量。
##:是一种运算符,是将两个运算对象团结在一皆,也只可出当今带参宏界说的文本替换中。
#include "stdio.h" #define TO_STR(s) #s #define COMB(str1,str2) str1##str2 int main(int argc, char *argv[]) { int UART0= 115200; printf("UART0=%d\n", COMB(UART, 0));//字符串合并为变量UART0 printf("%s\n", TO_STR(3.14));//将数字酿成字符串 return 0; }6、void 与 void*
void默示的是无类型,不可声明变量或常量,然则不错把指针界说为void类型,如void* ptr。void* 指针不错指向轻易类型的数据,在C话语指针操作中,轻易类型的数据地址都可转为void* 指针。因为指针试验上都是unsigned int。
常用的内存块操作库函数:
void * memcpy( void *dest, const void *src, size_t len ); void * memset( void *buffer, int c, size_t num);
数据指针为void* 类型,对传入轻易类型数据的指针都不错操作。另外其中memcpy第二个参数,const当今也如前文所述,拷贝时对传入的原数据内容胁制修改。
ag官网期权皇冠体育博彩网站一直是体育迷们的首选,因为他们提供了最好的赔率和最好的体验。罕见诠释,指针是不可使用sizeof求内容大小的,在ARM系统固定为int 4字节。关于函数无输入参数的,也尽量加上void,如
void fun(void);7、weak
一般简化界说
#define _WEAK __attribute__((weak))
函数称号前边加上__WEAK属性修饰符称为“弱函数”,相同C++的虚函数。集结时优先集结为非weak界说的函数,若是找不到则再集结带weak函数。
_WEAK void fun(void) { //do this } //不在解除个.c,两同名函数不可在解除个文献 void fun(void) { //do that }
这种自动汲取的机制,在代码移植和多模块协调责任的场景下诈欺较多。例如前期移植代码,需要调用某个接口fun,但刻下该接口不存在或者未移植齐备使用,不错使用weak关节字界说为空函数先保证编译夙昔。后续移植完成终局了fun,即软件中有2个fun函数莫得任何不实,编译器自动会识别使用后者。天然也奸诈的#if 0屏蔽对fun的调用,但要确保后续谨记放开。
8、雅致存在即合理,C话语里面的关节字,每个都有其罕见的道理,仅仅一般使用较少,比方作文,使用常用的汉字不错;但旁征博引,使用罕见的修设词采更能显出水平。后续对section 进行详确诠释,它和动态加载(OTA)、接口自启动关系。
本文转载自微信公众号「镶嵌式系统」,不错通过以下二维码关切。转载本文请考虑镶嵌式系统公众号。
皇冠博彩