51单片机避坑指南

51单片机避坑指南

内存的使用

  • 和stm32不同,51往往内存资源非常紧张,所以建立工程之时要列出资源使用统计表。

  • 规则: 要给所有使用到的内存变量都指定好存放位置。

  • 51单片机的存储器资源使用情况如下图所示:
    在这里插入图片描述

  • 各区域使用场合如下:

    • 1、data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。

    • 2、data区内最好放局部变量。因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;

    • 4、程序中遇到的逻辑标志变量可以定义到bdata中,可以大大降低内存占用空间。在51系列芯片中有16个字节位寻址区bdata,其中可以定义8*16=128个逻辑变量。定义方法是:bdatabit ledstate;但位类型不能用在数组和结构体中。

    • 5、其他不频繁用到和对运算速度要求不高的变量都放到xdata区。

    • 7、当使用到指针时,要指定指针指向的内存类型。在c51中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应定义为:char data *p;。还可指定指针本身的存放内存类型,如:char data * xdata p;。其含义是指针p指向data区变量,而其本身存放在xdata区。

    • 6、如果想节省data空间就必须用large模式,将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。

keil c编译器的智障操作

  • 确保你的程序中没有未调用的函数。

    • 在keil c里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点keil c做得很愚蠢,但也没办法。
      • 带来常见现象:
      • main函数中屏蔽掉某一个函数,会导致内存出现容量不够的现象,原因就是从应用层到驱动层一连串的未调用函数都被当成中断函数,内部定义的所有的局部变量作为全局变量使用,反而会导致内存不足。

局变量使用,反而会导致内存不足。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值