打印

2个关于keil的小问题,请大家指教

[复制链接]
1654|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lency|  楼主 | 2008-8-3 19:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、我有一个扩展的输入IO口,地址0xef,我这样定义:
        #define ADDR_INPUT PBYTE[0xef]
   在程序中:
        unsigned char a;
        a = ADDR_INPUT;
   软件彷真的时候,不管把XDATA 中0xef改成什么值,执行后a都为0,但是如果把宏定义该为:
        #define ADDR_INPUT XBYTE[0xef]
   执行后a的值就是我设置的值,对于地址0xef来说PDATA和XDATA应该是一样的啊,为什么会出现这样的情况呢?这是在软件彷真中出现的。

2、我做了一个不模块文件,有不少通用功能的函数,不是每个工程都会用到所有的函数,这样在编译的时候很出现很多未调用函数的警告,这种情况大家是怎么处理的呢。有没有办法象keil自己带的库一样,用到的就调进来,没用的就忽略呢,这样就省心了。

本人刚开始用c51,请大家多多指教。谢谢

相关帖子

沙发
wxj1952| | 2008-8-3 20:31 | 只看该作者

不一样!

1、PBYTE[],P要有页说明,说明是第几页。keil下有选项。或者程序中P2=0;或者1、2、3...第几页。

2、很简单。把自己的函数造库,例如:MYFOUNC.LIB,加入项目一起连接即可。

使用特权

评论回复
板凳
lency|  楼主 | 2008-8-3 20:36 | 只看该作者

谢谢

第一点我明天验证一下。
第二点好象不行的,生成自己的函数库后加入工程后,没用到的函数一样会出现未调用函数的警告,我试过

使用特权

评论回复
地板
wxj1952| | 2008-8-3 20:57 | 只看该作者

再试。

1、把X.LIB放到缺省库目录下;

2、自己库内的文件必须是多模块而不是一个模块!一个OBJ文件对应一个.C模块,L51连接程序从库中提取最小单元是一个.OBJ。如果你这个OBJ中包含了很多用不到的函数,当然就要有警告。
keil自己是一个函数一个.OBJ。所以它的最小提取单元是函数而不是模块。

使用特权

评论回复
5
lency|  楼主 | 2008-8-3 22:07 | 只看该作者

哦,有点明白了

一个C文件只放一个函数,然后在弄成OBJ,应该可以。

谢谢wxj1952,这问题我弄好久了。
谢谢了

使用特权

评论回复
6
wxj1952| | 2008-8-4 11:04 | 只看该作者

成功了告诉我。

“应该可以。”?

还没试过?我也没有。只是那么想过。所以你实验论证一下,也是帮我省了时间。我先谢你才对。

还有关于PDATA,我昨晚做过试验了。结论:
PDATA只能说明MOVX @R0...,理论上应该不关心高8位地址,但是keil C51很严格,必须设置一个稳定P2页地址才行。
很简单,那就P2=0;(0页地址,要是硬件没接,0~255都行。)

使用特权

评论回复
7
lency|  楼主 | 2008-8-5 16:36 | 只看该作者

有结果了

这2天画PCB太忙了,刚才抽时间试了一下.

PDATA的问题,上电时P2=0xff,所以a = ADDR_INPUT;读到的是0xffef的值而不是0xef的值. 不过这样一来实际应用会不会出问题呢,因为我的P2口是做了IO口的,过几天有时间才能试试硬件连机情况.


第2个问题和wxj1952的想法完全一致,keil最小提取单位是OBJ, 一个OBJ如果有不用的函数就会告警.一个函数一个C文件在生成库完全没问题.

使用特权

评论回复
8
wxj1952| | 2008-8-5 19:32 | 只看该作者

谢谢lency.我一直没碰到这样的机会。

每个函数一个.C模块听起来好像不合理,其实是一堆关联的函数一个.c模块,比如被调函数A又调用了函数B,那么函数A、B肯定是在一个.c模块里,也就是一个OBJ文件里有可以有A、B等多个“互相关联”的函数。连接时当然是需要一起连接进来的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

15

帖子

0

粉丝