您的位置:首页 > 其它

沙海拾贝(一):201409

2015-09-18 15:56 183 查看
鉴于有很多零碎的知识,写在笔记本里面容易搞忘了,所以单独开一篇文章来记录。

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】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: