求助 keil c51 8051 位定义的用法
8051 0x20~0x2f可实现位寻址uint8_t bdata SysFlag;
sbit ok_flag = SysFlag^0;
但这样定义,只能在一个文件内使用,不知道有何方法,让多个C文件,同时调用的方法?
哪位大侠知道,请告知,谢谢! 让多个c文使用,应该使用外部声明吧
试下声明一下 extern sbit ok_flag;
laujc 发表于 2017-7-22 09:01
让多个c文使用,应该使用外部声明吧
试下声明一下 extern sbit ok_flag;
这样必须是不行的,Keil的扩展语法就是这么特立独行!
两种解决方案:
1、头文件中声明extern bit ok_flag; 不是sbit,不能使用sbit,否则报错重复定义!
2、干脆全部搞到头文件,SysFlag绝对定位。这样写的代码少。 最不济做成函数还不行吗 真巧啊,我这两天也在头疼整个问题。考虑到不同芯片的移植问题,楼主的方法应该是不行的。有没有其它更通用的方法呢?请高手出手! takashiki 发表于 2017-7-22 10:04
这样必须是不行的,Keil的扩展语法就是这么特立独行!
两种解决方案:
确定很久没有用过keil C51了。不过如果RAM够的话,直接用字节作为标志位,也未偿不可。
takashiki 发表于 2017-7-22 10:04
这样必须是不行的,Keil的扩展语法就是这么特立独行!
两种解决方案:
第一种,方法可行,谢谢
第二种,方法具体咋实现 ?能详细说说吗?
KEIL C51的编译太坑了,代码占的空间具大,不然也不会用位寻址了。
其实,我发现,在KEIL的帮助文档里面就有写的没注意看。
sbit mybit0 = ibase ^ 0; /* bit 0 of ibase */
sbit mybit15 = ibase ^ 15; /* bit 15 of ibase */
sbit Ary07 = bary ^ 7; /* bit 7 of bary */
sbit Ary37 = bary ^ 7; /* bit 7 of bary */
extern bit mybit0; /* bit 0 of ibase */
extern bit mybit15; /* bit 15 of ibase */
extern bit Ary07; /* bit 7 of bary */
extern bit Ary37; /* bit 7 of bary */
再次感谢!
把sbit定义放进头文件就行了。安装目录下的各厂商芯片头文件都是这么做的。 armstrong 发表于 2017-7-22 11:06
把sbit定义放进头文件就行了。安装目录下的各厂商芯片头文件都是这么做的。 ...
不行哦
他是SFR定义的才可以,
我试过了。 dreamboy 发表于 2017-7-22 11:05
第一种,方法可行,谢谢
第二种,方法具体咋实现 ?能详细说说吗?
KEIL C51的编译太坑了,代码占的空间 ...
以下代码直接放到头文件,不用extern声明了。但是绝对定位并不推荐使用,万一啥时候Keil发神经了很难查到错误。
uint8_t bdata SysFlag _at_ 0x20; //绝对定位到0x20
sbit ok_flag = SysFlag^0;
放到头文件里 位域不知道编译出来跟KEIL的位扩展语法效率一样不,按道理KEIL没这么SB,应该会将位域优先安排到可位寻址的RAM,用位域就比较通用了。 或者如果不死扣运行效率的话,以通用和可读性优先,不用它的扩展,用位域。 huangqi412 发表于 2017-7-22 16:29
或者如果不死扣运行效率的话,以通用和可读性优先,不用它的扩展,用位域。 ...
关键是代码量!
多几个字节的代码量很重要吗?关键是算法的改进。
我曾经把一个int变量的加减乘除改为两个char变量(120以内)的加减运算。核心代码量由2.2k降至1.1k。 su33691 发表于 2017-7-22 20:03
多几个字节的代码量很重要吗?关键是算法的改进。
我曾经把一个int变量的加减乘除改为两个char变量(120以 ...
如果不考虑代码量的话,谁用位寻址呀? 要具体问题,具体分析 ……
页:
[1]