沙海拾贝(一):201409

鉴于有很多零碎的知识,写在笔记本里面容易搞忘了,所以单独开一篇文章来记录。

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】








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值