dreamboy 发表于 2017-7-22 09:00:48

求助 keil c51 8051 位定义的用法

8051 0x20~0x2f可实现位寻址

uint8_t bdata SysFlag;

sbit ok_flag = SysFlag^0;
但这样定义,只能在一个文件内使用,不知道有何方法,让多个C文件,同时调用的方法?

哪位大侠知道,请告知,谢谢!

laujc 发表于 2017-7-22 09:01:58

让多个c文使用,应该使用外部声明吧
试下声明一下 extern sbit ok_flag;

takashiki 发表于 2017-7-22 10:04:36

laujc 发表于 2017-7-22 09:01
让多个c文使用,应该使用外部声明吧
试下声明一下 extern sbit ok_flag;

这样必须是不行的,Keil的扩展语法就是这么特立独行!

两种解决方案:
1、头文件中声明extern bit ok_flag; 不是sbit,不能使用sbit,否则报错重复定义!
2、干脆全部搞到头文件,SysFlag绝对定位。这样写的代码少。

dzymushi 发表于 2017-7-22 10:12:02

最不济做成函数还不行吗

sgnohyang 发表于 2017-7-22 10:13:07

真巧啊,我这两天也在头疼整个问题。考虑到不同芯片的移植问题,楼主的方法应该是不行的。有没有其它更通用的方法呢?请高手出手!

laujc 发表于 2017-7-22 10:13:09

takashiki 发表于 2017-7-22 10:04
这样必须是不行的,Keil的扩展语法就是这么特立独行!

两种解决方案:


确定很久没有用过keil C51了。不过如果RAM够的话,直接用字节作为标志位,也未偿不可。

dreamboy 发表于 2017-7-22 11:05:10

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 */
再次感谢!

armstrong 发表于 2017-7-22 11:06:25

把sbit定义放进头文件就行了。安装目录下的各厂商芯片头文件都是这么做的。

dreamboy 发表于 2017-7-22 11:39:11

armstrong 发表于 2017-7-22 11:06
把sbit定义放进头文件就行了。安装目录下的各厂商芯片头文件都是这么做的。 ...

不行哦
他是SFR定义的才可以,
我试过了。

takashiki 发表于 2017-7-22 12:34:33

dreamboy 发表于 2017-7-22 11:05
第一种,方法可行,谢谢
第二种,方法具体咋实现 ?能详细说说吗?
KEIL C51的编译太坑了,代码占的空间 ...

以下代码直接放到头文件,不用extern声明了。但是绝对定位并不推荐使用,万一啥时候Keil发神经了很难查到错误。

uint8_t bdata SysFlag _at_ 0x20;       //绝对定位到0x20
sbit ok_flag = SysFlag^0;

hnzbding 发表于 2017-7-22 15:49:29

放到头文件里

huangqi412 发表于 2017-7-22 16:28:03

位域不知道编译出来跟KEIL的位扩展语法效率一样不,按道理KEIL没这么SB,应该会将位域优先安排到可位寻址的RAM,用位域就比较通用了。

huangqi412 发表于 2017-7-22 16:29:10

或者如果不死扣运行效率的话,以通用和可读性优先,不用它的扩展,用位域。

dreamboy 发表于 2017-7-22 18:05:00

huangqi412 发表于 2017-7-22 16:29
或者如果不死扣运行效率的话,以通用和可读性优先,不用它的扩展,用位域。 ...

关键是代码量!

su33691 发表于 2017-7-22 20:03:46

多几个字节的代码量很重要吗?关键是算法的改进。
我曾经把一个int变量的加减乘除改为两个char变量(120以内)的加减运算。核心代码量由2.2k降至1.1k。

dreamboy 发表于 2017-7-23 16:28:36

su33691 发表于 2017-7-22 20:03
多几个字节的代码量很重要吗?关键是算法的改进。
我曾经把一个int变量的加减乘除改为两个char变量(120以 ...

如果不考虑代码量的话,谁用位寻址呀?

dreamboy 发表于 2017-7-23 16:40:50

要具体问题,具体分析 ……
页: [1]
查看完整版本: 求助 keil c51 8051 位定义的用法