目录
例如预留结构体空间256,结构体定义少于该字节或者多余该字节都应该报错提示,不够的字节使用预留变量,应用于modbus或者其他全局变量空间划分
- /* 检测结构体的大小是否等于特定值 */
-
- #define SIZE_OF_TYPE_EQUAL_TO(type, size) \
- static inline char size_of_##type##_equal_to_##size() \
- { \
-
- char __dummy1[sizeof(type) - size]; \
-
- char __dummy2[size - sizeof(type)]; \
-
- return __dummy1[-1] + __dummy2[-1]; \
-
- }
作用:结构体默认自动对齐,例如3个char,四字节对齐就会补齐一个,为了防止该偏移出现而浪费空间,计算偏移来防止对齐问题
-
- /* 获取变量在结构体的位置*/
-
- #define get_variable_index(TYPE, member,ITYPE,index)\
- { \
-
- *index = (ITYPE)(&(((TYPE*)0)->member));\
-
- }while(0)
形式:类型说明符 位域名:位域长度
作用:节省内存
说明:
- struct bit_text_{
- uint8_t bit_test0 : 1;
- uint8_t bit_test1 : 1;
- uint8_t bit_test2 : 1;
- uint8_t bit_test3 : 1;
-
- uint8_t bit_test4 : 1;
- uint8_t bit_test5 : 1;
- uint8_t bit_test6 : 1;
- uint8_t bit_test7 : 1;
- };
公用一个内存,可以将部分数据的字节按照CHAR类型提取出来,非常好用
- typedef union tagGlobal
- {
- struct A;
- char acCharBuf[sizeof(A)];
- }GLOBAL_S;
例如预留128空间参数,给状态参数
其中120为状态参数,4字节用于CRC校验,4字节用于校验大小
CRC结构体成员作用:
1.当变量发生变化的时候检测出,然后存储的flash中,或者进行其他响应
2.系统启动的时候,先检测flash读出的变量有没有错误,否则重新读取,还有恢复默认使用