找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5978|回复: 17
收起左侧

51单片机会不会因为定义太多变量导致无法运行呢

  [复制链接]
ID:479896 发表于 2019-3-18 00:43 来自手机 | 显示全部楼层 |阅读模式
51单片机会不会因为  定义太多东西  而导致无法运行呢??             如果有。这么办???         
回复

使用道具 举报

ID:401564 发表于 2019-3-18 23:37 | 显示全部楼层
就看你是什么变量了
如果是全局变量,这肯定是有上限的,就看单片机的RAM
但如果是局部变量,只要函数不要嵌套太多,那几乎是没有上限的
局部变量只在调用函数时用到当前地址,返回之后,这个地址就会空出来了
比如你有两个延时函数,A和B
A函数里面用到变量  i
B函数里面也用到  i
当调用完A之后,再调用B,那么,实际上 i 只占用了一个地址

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:362076 发表于 2019-3-18 07:41 | 显示全部楼层
不严格的说,只要你的变量总数不超过单片机的RAM范围,就没有什么影响。否则只能换用较大RAM的型号或者优化代码。

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:277550 发表于 2019-3-18 07:44 | 显示全部楼层
肯定会的,,,精简程序、精简逻辑
回复

使用道具 举报

ID:164602 发表于 2019-3-18 07:54 | 显示全部楼层
如果定义变量太多而无法运行的话,程序在编译时就会提示、报错了,不会让程序在执行过程中出问题。如果 报错了,可以增加内存(外挂)的方法修改,或者选用RAM大的芯片。
回复

使用道具 举报

ID:492922 发表于 2019-3-18 08:33 | 显示全部楼层
可以在变量或者数组前加一个code标志位,将变量存储位置由ram转为flash中。
回复

使用道具 举报

ID:94031 发表于 2019-3-18 08:42 | 显示全部楼层
如果定义太多东西,超过了内存容量,就会导致无法运行,那就要优化,不要定义太多东西。要不就换内存大的单片机。
回复

使用道具 举报

ID:492935 发表于 2019-3-18 09:24 | 显示全部楼层
不会哦
回复

使用道具 举报

ID:458411 发表于 2019-3-18 09:53 | 显示全部楼层
精炼是比较好的
回复

使用道具 举报

ID:491577 发表于 2019-3-18 11:21 | 显示全部楼层
如果变量多要加关键字xdata,如:u8 xdata cs[512]; 不加编译会报错,如果编译能够通过一般没有问题,我的程序有2千个变量都没有问题,STC8单片机,4k内存。
回复

使用道具 举报

ID:493158 发表于 2019-3-18 13:58 | 显示全部楼层
变量数量要小于单片机的RAM最大值,除此外还必须留有一定空闲的RAM空间给堆栈使用,否则可能造成堆栈溢出,程序跑飞。
回复

使用道具 举报

ID:493158 发表于 2019-3-18 14:11 | 显示全部楼层
seasonLin 发表于 2019-3-18 13:58
变量数量要小于单片机的RAM最大值,除此外还必须留有一定空闲的RAM空间给堆栈使用,否则可能造成堆栈溢出, ...

如果RAM空间内存不够,可以尝试以下方法:
1. 能用局部变量,就不用全局变量。
2. 函数嵌套不要过多(嵌套过多会浪费部分RAM)
3. 能用const类型的常量,就不用全局变量或者局部变量
4. 用部分flash替代RAM使用,仅适用于变量修改频率超低的情况下,想想flash写寿命,就知道当前产品合不合适使用该方式了。
回复

使用道具 举报

ID:492967 发表于 2019-3-18 14:25 | 显示全部楼层
单片机也是有一定内存的  如果超出内存范围  肯定是不行的
回复

使用道具 举报

ID:339010 发表于 2019-3-18 14:30 | 显示全部楼层
我之前也遇到过这样的问题,解决办法有两种:一是优化代码,减少全局变量的定义,可以用指针替代;另外一种就是增加辅助存储器,这样也是可以解决的。
回复

使用道具 举报

ID:492576 发表于 2019-3-18 17:49 | 显示全部楼层
1  单片机一个引脚有多个功能是不会引起混乱的     因为它们是分时使用的
    或使用了这个功能   就不允许使用另一种功能了。
2  例如:   
    单片机的P0口的8 个引脚 即作为低8位地址总线   又作为8位数据总线
    它们不会发生冲突     在ALE为低电平时,P0口的8 个引脚作为低8位地址总线
    当ALE为高电平时,P0口的8 个引脚作为8位数据总线使用。
    是分时使用的  即不同的时间做为不同的引脚使用   所以在使用上是不会发生冲突

    还有 当P3.0和P3.1作为串口的数据输入输出线使用时,就不能作为一般I/O口使用了。
    也不会发生冲突的。
回复

使用道具 举报

ID:275449 发表于 2019-3-18 18:02 | 显示全部楼层
不会   但是变量太多会导致编译器无法编译通过  可以尝试修改优化等级和大小模式
回复

使用道具 举报

ID:493415 发表于 2019-3-18 18:42 | 显示全部楼层
一般是不会的,大多数编写的程序远小于其上限的大小
回复

使用道具 举报

ID:98526 发表于 2019-3-19 09:42 | 显示全部楼层
如果idata变量用得过多,而且中断或者函数嵌套严重的话,会造成堆栈溢出。然后产生怀疑人生的不可预知的程序错误。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表