搜索
bottom↓
回复: 16

求助 keil c51 8051 位定义的用法

[复制链接]

出0入0汤圆

发表于 2017-7-22 09:00:48 | 显示全部楼层 |阅读模式
8051 0x20~0x2f可实现位寻址

uint8_t bdata SysFlag;

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

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入4汤圆

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

出0入93汤圆

发表于 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绝对定位。这样写的代码少。

出0入0汤圆

发表于 2017-7-22 10:12:02 | 显示全部楼层
最不济做成函数还不行吗

出0入0汤圆

发表于 2017-7-22 10:13:07 | 显示全部楼层
真巧啊,我这两天也在头疼整个问题。考虑到不同芯片的移植问题,楼主的方法应该是不行的。有没有其它更通用的方法呢?请高手出手!

出0入4汤圆

发表于 2017-7-22 10:13:09 | 显示全部楼层
takashiki 发表于 2017-7-22 10:04
这样必须是不行的,Keil的扩展语法就是这么特立独行!

两种解决方案:

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

出0入0汤圆

 楼主| 发表于 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[0] ^ 7;     /* bit 7 of bary[0] */
sbit Ary37 = bary[3] ^ 7;     /* bit 7 of bary[3] */

extern bit mybit0;      /* bit 0 of ibase */
extern bit mybit15;     /* bit 15 of ibase */

extern bit Ary07;       /* bit 7 of bary[0] */
extern bit Ary37;       /* bit 7 of bary[3] */
再次感谢!

出870入263汤圆

发表于 2017-7-22 11:06:25 | 显示全部楼层
把sbit定义放进头文件就行了。安装目录下的各厂商芯片头文件都是这么做的。

出0入0汤圆

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

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

出0入93汤圆

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

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

  1. uint8_t bdata SysFlag _at_ 0x20;       //绝对定位到0x20
  2. sbit ok_flag = SysFlag^0;
复制代码

出0入0汤圆

发表于 2017-7-22 15:49:29 来自手机 | 显示全部楼层
放到头文件里

出0入0汤圆

发表于 2017-7-22 16:28:03 | 显示全部楼层
位域不知道编译出来跟KEIL的位扩展语法效率一样不,按道理KEIL没这么SB,应该会将位域优先安排到可位寻址的RAM,用位域就比较通用了。

出0入0汤圆

发表于 2017-7-22 16:29:10 | 显示全部楼层
或者如果不死扣运行效率的话,以通用和可读性优先,不用它的扩展,用位域。

出0入0汤圆

 楼主| 发表于 2017-7-22 18:05:00 | 显示全部楼层
huangqi412 发表于 2017-7-22 16:29
或者如果不死扣运行效率的话,以通用和可读性优先,不用它的扩展,用位域。 ...

关键是代码量!

出0入0汤圆

发表于 2017-7-22 20:03:46 | 显示全部楼层
多几个字节的代码量很重要吗?关键是算法的改进。
我曾经把一个int变量的加减乘除改为两个char变量(120以内)的加减运算。核心代码量由2.2k降至1.1k。

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2017-7-23 16:40:50 | 显示全部楼层
要具体问题,具体分析 ……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 07:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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