鉴于有很多零碎的知识,写在笔记本里面容易搞忘了,所以单独开一篇文章来记录。
1 IAR编程环境中的两个小问题
1.1、__no_init 是一个SEGMENT(段),是给LINKER用的,定义到不初始化的块中去。
常用来保存一些敏感信息,特殊应用场合下的不能被复位的数据或者做复位判断标志等数据(详细使用方法见:)
1.2、@就是指定地址(大部分编译器都是这么用的)。
在定义全局变量的时候,比如 int char; 即使你没有赋值给他,编译器还是会给他一个初始化值0,编译的时候编译器把他分配到初始化为零的那个SEGMENT中去了。
编译器默认的有几个块
a.初始化为零的块
b.初始化不为零的块
c.不初始化的块
我们可以定义自己的块,代码如下:
extern volatile BYTE sppRxStatus;
extern volatile BYTE sppTxStatus;
__no_init SPP_RX_STRUCT rxData @ "PM0_XDATA";
__no_init SPP_TX_STRUCT txData @ "PM0_XDATA";
如上面的PM0_XDATA就是自己定义的一个块,那么这个块是个什么属性呢?是__no_init 属性,有了这个属性,编译器只给你分配空间,不给你初始化。
参考来源:点击打开链接
2 将汉字放入数组
我们知道,一个汉字占两个字节,而单引号只能放一个字节,所以我们使用双引号(放字符串),形式如下:
const char* name = "例子";
SendDataBuf[9] = *name;
SendDataBuf[10] = *(name + 1);
SendDataBuf[11] = *(name + 2);
SendDataBuf[12] = *(name + 3);
或者
const char* name = "例子";
SendDataBuf[9] = name[0];
SendDataBuf[10] = name[1];
SendDataBuf[11] = name[2];
SendDataBuf[12] = name[3];
【END/2015-09-23】
3 宏定义和重命名
今天看uCOS-II的内核代码,突然分不清楚一个很简单的小问题,因此做一个小记录,代码如下:
#define HONG_DING_YI 10 //宏定义 前面代替后面
typedef unsigned char u8; //重命名 后面代替前面
3.1 define
作用:将后面的字符串用一个清晰易记的名字来替代,编译时后面的内容将取代前面的宏名
优点:方便程序修改、提高程序运行效率
装逼说法:被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。
3.2 typedef
作用:重命名,便于理解和记忆
优点:方便不一混淆
装逼说法:自己看百度百科吧,^_^。
【END/2015-12-04】