我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 15|回复: 1

[PDF格式] 单片机下载

[复制链接]

该用户从未签到

4

主题

7

回帖

17

积分

一级逆天

积分
17

终身成就奖

发表于 2024-11-28 14:58:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Keil C是非常优秀C51编译器,可能是最好的C51编译器,提供各种优化模式,对变量的优化和地址安排做得非常好。这是用C语言写代码的好处之一,如果用汇编写,得费一大番功夫给各个变量安排内存物理地址,还得时刻记住哪些地址的内存单元是已经分配了,新增加的变量就不能占用那些已经分配了的单元,以免产生内存交叠冲突和溢出。我一直非常信赖Keil
C51的编译结果,在我的印象里,它对内存的分配是完美的,只要代码用它编译时没有报告任何warningerror,代码运行时不可能内存冲突或溢出的现象。
但,今天发生的事情证明我错了。
手头上有个产品的代码,代码量很大。程序跑起来的效果不大好,因此打算把代码优化一下。代码量越大,通常可优化的地方也越。对8051来说,访问芯片内部的data区(0~7FH)内存速度是最快的,直接访问,一条指令就能读写,而idata区(80H~FFH)虽然还是内存区,但由于地址分配上跟特殊寄存器SFR重合,只能间接地址访问,两条指令才能读写,速度稍慢点,而外存xdata区(0~7FFFH)必须使用DPTR指针才能访问,速度是最慢的。很明显,优化的原则就是尽量把频繁读写的变量优先安排在data区,然后是idata区,最后才是xdata区。
当我做完变量手工优化工作后,把编译模式设为SMALL,这样C51编译器会自动把那些我没手工指定存放区的变量优先安排进data区,如果超出有效地址范围,它会报错,因此我大可以放心。按下rebuild
all按钮后,编译器提示:
Program Size: data=236.2 xdata=19321
code=43372
"ipphone_main" - 0 Error(s),
0Warning(s).
编译器提示的data区包括了idata在内,按以往的经验来看,data区有256byte,程序才使用了236.2个,还剩下19个,没有溢出,而xdata32k,现在才使用了19k,远没有溢出,编译结果一切很正常。
把代码烧录进芯片跑起来后,结果出人意料,从现象来看,上电约1秒后就自动重启,重启后过1秒又重启,非常有规律的重启。
我没有怀疑是编译器的原因,当时第一念头是怀疑是看门狗,代码里上电后就打开了看门狗,可能某些子程序代码执行时间过长,看门狗复位了,于是在有

回复

使用道具 举报

  • TA的每日心情
    擦汗
    昨天 20:30
  • 签到天数: 99 天

    [LV.6]常住居民II

    0

    主题

    108

    回帖

    486

    积分

    二级逆天

    积分
    486

    终身成就奖

    发表于 2024-11-28 21:34:21 | 显示全部楼层
    Keil C是非常优秀的C51编译器
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    每日签到,有金币领取。


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

    平平安安
    TOP
    快速回复 返回顶部 返回列表