楼主: outman

[原创]奥特曼Zigbee读书日记(二)--OSAL系统框架专题

[复制链接]
c87812369 发表于 2011-4-13 22:54:59 | 显示全部楼层
回复 31# dxf520


    #define XREG(addr)       ((unsigned char volatile __xdata *) 0)[addr]  用起来就是这样的:
    XREG(0XFFFF)=0X12;
    作用:把0X12这个值写进地址为0xFFFF的八位存储空间(寄存器,不过对于Xdata而言,应该只是SRAM而不是register)里面。

    分析:
    (unsigned char volatitle __xdata*),(unsigned char *)  ()是什么意思知道吧?用来把括号里的内容转化成指向八位char型变量的指针(类型)。
    加上volatitle意味着叫编译器不要优化对该存储变量的读取代码,即每次读取都要到内存空间中读取,而不是只读一次并放到寄存器中keep住,以后要读的时候直接从寄
    存器中读取(寄存器操作速度快)。为什么?因为这意味着该存储区可能被非CPU逻辑机构所修改,好比如DMA等。
    而加上__xdata的意识是告诉编译器,这指针所指向的区域位于xdata存储区,不要用针对8051的IO总线(0X00~0XFF)访问指令来访问,而用外部总线访问指令来访
    问。
    (unsigned char volatitle __xdata*)的意思明白了,那么((unsigned char volatitle __xdata*)0)的意思就是把0强制转换成unsigned char volatitle
    __xdata*类型的指针咯,最后加上[]形成((unsigned char volatitle __xdata*)0)[]时,则把0变成了一维数组的首地址了,括号里面的值就是该数据的偏移地址。而又因为这个数组是char*指针,一个字节,故对该“数组”的访问可完全等效成对xdata的某个地址的访问。

    有错请指正。
zpsky 发表于 2011-4-24 22:16:07 | 显示全部楼层
最近看的头都晕了 唉 还是不得法吧
halolzx 发表于 2011-4-26 10:22:26 | 显示全部楼层
认真学习中//////////
smsl120 发表于 2011-5-4 10:10:18 | 显示全部楼层
我是初学者,看懂了一些,顶!
eeiylx 发表于 2011-5-4 15:41:19 | 显示全部楼层
谢谢楼主,继续学习中
Razor 发表于 2011-5-7 17:29:02 | 显示全部楼层
受用了,从main函数开始,一步步。。。
homphie 发表于 2011-5-9 20:30:22 | 显示全部楼层
很强啊,真不愧为高手
李晓千 发表于 2011-5-10 15:43:18 | 显示全部楼层
谢谢  。 。 正在看操作系统这一块。 。
nauxgig 发表于 2011-5-15 15:22:42 | 显示全部楼层
好贴,我顶我关注~~
chenenzhi 发表于 2011-5-19 16:24:03 | 显示全部楼层
好贴,我顶我关注~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表