发新帖我要提问
12
返回列表
打印

关于51中的全局变量

[复制链接]
楼主: 箫笑
手机看帖
扫描二维码
随时随地手机跟帖
21
刘前辈| | 2008-9-12 18:33 | 只看该作者 回帖奖励 |倒序浏览

不同看法。

局部变量太多可能会导致问题?
*********************************************************************

局部变量是用户任务属性的。它们存储在用户管理的全局变量区域(共享/覆盖区域),和OS管理的堆栈无关。

局部或者全局变量的增长造成用户RAM区增长,确实会造成OS任务堆栈区等等减少。后果就是使能够并发设计的任务数减少,因为每任务分配20字节堆栈,正常情况下最多17字节(相对系统切换来说)。
    
     不过这在系统设计阶段——程序开始运行前就能够仔细分析了。

    这段堆栈checkstack代码是系统设计异常检测程序,属于可靠性措施。即检测:有些用户并不进行设计前分析。只盲目地添加任务。然后加电运行。这段程序只在这段时间检测用户设计缺陷。如果用户设计任务过多造成异常,及时停机,不至造成太大损失,或者提醒用户改进设计。

   如果能通过这段初始检测——例如系统已正常运行了10分钟,所有任务都正常运行了至少一次,那么以后这段检测程序完全冗余。应该重新编译,且设置配置参数FREE_STACK=0, 将这段代码裁剪掉。

   所以,这段代码是为了检测用户设计缺陷而设的。完成检测后,就应该裁剪掉。


裁剪代码:

   IF(FREE_STACK<>0)
.
.
.

  ENDIF

使用特权

评论回复
22
AIRWILL| | 2008-9-13 17:19 | 只看该作者

我觉得应该是这个原因

  KEIL C 编译器对局部变量的分配是在数据区(DATA),而不是在堆栈区,
  局部变量的分配有个覆盖问题, 即不同的局部变量可以使用相同的存储地址. 这本来是好事情, 可以减少 DATA 区的消耗.
  然而, 编译器的这个覆盖算法是假定单任务的方式的, 在有 OS 的系统里会引起错误的覆盖. 当然, 有办法告诉编译器的, 但是为了省去麻烦, 直接定义全局变量来让编译器不要进行覆盖分析, 也是个办法.

使用特权

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

本版积分规则