首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

怎样声明位变量?

怎样声明位变量?

请教,在cw中,怎样定义一个位变量啊?例如定义一个位变量i,在51系列中好象是sbit i;
那么在cw中是如何实现的呢?
屏蔽中断吗? SEI啊 要是对指定的位置1就用 bset n,opr指令啊,opr位地址n为第几位
如果是汇编,就按照楼上所说的用bset指令
如果是C,可以参照CW中Wizard生成的结构
typedef union {
  byte Byte;
  struct {
    byte PTA0    :1;           /* Port A Data Bit 0, Keyboard Input */
    byte PTA1    :1;           /* Port A Data Bit 1, Keyboard Input */
    byte PTA2    :1;           /* Port A Data Bit 2, Keyboard Input */
    byte PTA3    :1;           /* Port A Data Bit 3, Keyboard Input */
    byte PTA4    :1;           /* Port A Data Bit 4, Keyboard Input */
    byte PTA5    :1;           /* Port A Data Bit 5, Keyboard Input */
    byte PTA6    :1;           /* Port A Data Bit 6, Keyboard Input */
    byte PTA7    :1;           /* Port A Data Bit 7, Keyboard Input */
  } Bits;
  struct {
    byte PTA     :8;
  } MergedBits;
} PTASTR;
extern volatile PTASTR _PTA @0x00000000;
#define PTA _PTA.Byte
#define PTA_PTA0 _PTA.Bits.PTA0
#define PTA_PTA1 _PTA.Bits.PTA1
#define PTA_PTA2 _PTA.Bits.PTA2
#define PTA_PTA3 _PTA.Bits.PTA3
#define PTA_PTA4 _PTA.Bits.PTA4
#define PTA_PTA5 _PTA.Bits.PTA5
#define PTA_PTA6 _PTA.Bits.PTA6
#define PTA_PTA7 _PTA.Bits.PTA7
#define PTA_PTA _PTA.MergedBits.PTA
这种c声明,应该是是参考于CW自带的对寄存器声明,以前我也是这么用声明的,但这样做有一个问题:
如果ram是0x0080~0x00ff,
自己在这里对一个变量进行绝对地址定义后,假如按照这方式定义flag @0x0080,如果主函数中有全局变量的话,CW编译的时候会从ram开始地址0x0080优先放置全局变量,这样的话就和flag地址重叠,引起程序混乱。

请问有其他的方式吗?
楼上的可以在PRM文件中把RAM分成两块,后面那一块用来放绝对地址的变量,前面一块用来放全局变量和堆栈
哦,看了下PRM,好象是这样理解的,在CW中堆栈的生长方向是向上的,开始地址紧跟全局变量后,且size默认是48字节,这样的话自己要定义的变量地址放在堆栈后就可以了。以前用的汇编编译环境堆栈是向下生长的,size也不定。有这样的不同。
返回列表