打印

请教一个keil问题

[复制链接]
1531|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tanybin|  楼主 | 2011-3-11 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
keil, CAN, AN, se, tc
最近在使用keil编译ST的upsd3234的单片机时,遇到一个怪事。描述如下:
我的代码中有一段是这样的:


//检测CAN总线发送数据
  if(!CanHaveSendOver){ReadyToSend();}
  //检测CAN总线付初始数据
  else{InPutCanData();}

其中在ReadyToSend();中将CanHaveSendOver变为1,InPutCanData();函数中将
CanHaveSendOver变为0。这一段主要作用是发送CAN数据。此时代码编译正常。现在我不需要发送CAN数据了,故我将这段注释掉,结果编译通过,但是连接时出现异常,报告说数据溢出。我感到很纳闷,按理来讲注释掉后,所占用的资源更少了啊。怎么会编译不成功呢?我后来把代码改写成如下:
//检测CAN总线发送数据
  if(!CanHaveSendOver){/*ReadyToSend();*/}
  //检测CAN总线付初始数据
  else{InPutCanData();}
此时,编译可以通过。但是把下面的InPutCanData()函数注掉,又不通过了。必须要调用InPutCanData()函数才能通过。不知道是什么原因。有哪位高手能否指点一下。

相关帖子

沙发
airwill| | 2011-3-11 15:37 | 只看该作者
呵呵, 这时 Keil 编译器的特殊问题.
鉴于 C51 系列的特点, Keil C51 将局部变量分配在 ram 中, 而不是堆栈中. 以提高任务的处理速度.
另外为了优化 RAM 的使用. Keil C51 的局部变量进行动态分配, 按照其 覆盖分析, 来分配局部变量的 RAM 地址.
现在你注释掉了部分代码, 而没有注释掉函数的实现. Keil   就不知道 这两个函数和主函数的调用关系. 他们的局部变量只能不分配到可覆盖区域. 于是使用的 RAM 反而变大了.
不知道我说明白了没有, 如果还不清楚的话, 可以去看一下 Keil 关于动态分配的介绍资料.

使用特权

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

本版积分规则

6

主题

60

帖子

1

粉丝