最大化使用51的RAM空间
目录
- 初衷
- 使用bit定义变量,或“降级”变量的类型
- 减小缓存的大小
- 将大型的数组放在外部RAM
真正能用于产品的代码为非阻塞代码,需要做分层和隔离,为此使用了队列结构,另外为了标志各个状态,使用大量的变量,这些都增加了RAM存储器的消耗,由于51的资源很有限,如何才能最大化的发挥RAM空间呢?本文来探讨这个问题。
初衷
笔者最近设计了一款键盘矩阵的模块,使用51单片机作为编码器,检测哪一个按键被按下,是长按,还是短按,并通过串口输出其键值,这样在其他的复杂的工程中,只需要直接用主处理器的串口读取键值并做相应的操作即可。这样就避免每次都根据不同的项目在主处理器上做大量的程序改动了,更换键盘也不会引起很大的改动。
而主处理器只需要预留一个串口即可,硬件平台变化后,不会影响IO口的规划,而如果直接使用主处理器,比如STM32,来控制键盘需要占用9个IO引脚,在不同的项目中切换时都需要重新规划IO口。
图1:键盘矩阵实物图 [1]
代码采用了非阻塞代码,并做了分层和隔离,为此使用了队列结构,另外为了标志各个状态,使用了大量的变量,这些都增加了RAM存储器的消耗,由于51的资源很有限,如果不做调整就会报错:
那么如何最大化发挥51单片机RAM的空间呢?
使用bit定义变量,或“降级”变量的类型
51提供bit定义,对于原来使用char、int的变量,如果其值只是0或者1,那么将其改为bit类型。
//满洲里国峰电子科技 guofengdianzi.com
//微信:GuoFengDianZi
//已下代码基于STC89C52
#define KEY_NOT_PRESSED 0
//之前做好的库函数中的变量定义
char Key11_Value=KEY_NOT_PRESSED;
//修改为bit类型
bit Key11_Value=KEY_NOT_PRESSED;
同样的如果变量的范围不需要那么大,将其降级,比如从int型修改为char型。
//满洲里国峰电子科技 guofengdianzi.com
//微信:GuoFengDianZi
//已下代码基于STC89C52//之前做好的库函数中的变量定义
static unsigned int Key11TimerS,Key11TimerL;
//"降级“变量的类型
static unsigned char Key11TimerS,Key11TimerL;
减小缓存的大小
在非阻塞代码的结构中经常会用到队列、堆栈这样的结构,用作缓存,具体表现为一个数组,在RAM大小有限的情况下,应根据实际需要适当剪裁缓存区的大小,例如本案例中,键盘为慢速输入设备,而设备功能单一只是对按键键值传输,因此,可以将按键缓存区和串口缓存区的大小减小。
//满洲里国峰电子科技 guofengdianzi.com
//微信:GuoFengDianZi
//已下代码基于STC89C52
#define TXBUF_SIZE 64
//例如串口发送缓存
unsigned char TX_BUFF[TXBUF_SIZE];
//可考虑将TXBUF_SIZE的大小改小
//#define TXBUF_SIZE 8
然而修改了发送缓存的大小后,使用printf需要注意,例如:
//满洲里国峰电子科技 guofengdianzi.com
//微信:GuoFengDianZi
//已下代码基于STC89C52
#define TXBUF_SIZE 4
//例如串口发送缓存
unsigned char TX_BUFF[TXBUF_SIZE];
printf("------"):
使用串口助手打印:
图2:缓存不够,打印不完整
从图2中可以看出值只打印出了5个横线,说明缓存太小,后面几个横线打印不出来,这种情况在打印汉字的时候会出现乱码,需要注意。
将大型的数组放在外部RAM
STC89C52提供256字节的外部RAM,可以将大型的数组,缓存区放入其中,使用xdata关键字,例如上面的串口缓存区:
//满洲里国峰电子科技 guofengdianzi.com
//微信:GuoFengDianZi
//已下代码基于STC89C52
#define TXBUF_SIZE 64
//例如串口发送缓存
unsigned char xdata TX_BUFF[TXBUF_SIZE];
//可考虑将TXBUF_SIZE的大小改小
//#define TXBUF_SIZE 8
作者:潇洒的电磁波(专业:射频芯片设计、雷达系统、嵌入式。欢迎大家项目合作交流。)
微信:GuoFengDianZi
引用:
[1]:https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.25911debCla5U3&ft=t&id=613868992343
最大化使用51的RAM空间相关推荐
- FreeRTOS记录(六、FreeRTOS消息队列—Enocean模块串口通讯、RAM空间不足问题分析)
本篇文章记录FreeRTOS消息队列的使用,我不从理论开始介绍,直接用起来,然后从发现的问题分析记录解决. ..补充RAM空间不足问题内容,增加FreeRTOS任务占用的RAM空间说明 2021/11 ...
- PPU连接RAM 与 51扩展RAM/ROM的对比研究
(1)PPU连接RAM 2)51扩展RAM (3)51扩展ROM 共同点: 都是用低位地址与数据复用的.所以都有ALE端,连接到锁存器(74xx373)的LE PPU/51 RAM ROM /RD / ...
- html5如何划分区域,10.4 51单片机 RAM 区域的划分
前边介绍单片机资源的时候,我们提到过 STC89C52 共有512字节的 RAM,是用来保存数据的,比如我们定义的变量都是直接存在 RAM 里边的.但是单片机的这512字节的 RAM 在地位上并不都是 ...
- 更新xcode 12.51时提示空间不足,以及macos的空间清理
这几天给macos的xcode升级时提示空间不足,我很奇怪,看了一下系统信息,显示剩余空间大概25个G左右,想了半天,于是把原来的xcode删了,然后下载新的xcode,但app store还是提示空 ...
- android 模拟器 ROM RAM 空间设置
指定ROM.RAM大小 示例: emulator -memory 512 -partition-size 512 -avd handroid2.3 注释:1:-memroy 5 ...
- 完全PIN对PIN SN2711B系列 存储器配置 OTP ROM 空间:1K * 16 位。 RAM 空间:64 字节。
完全兼容SN8P2711B,直接烧,FS2711是一颗采用高速低功耗CMOS工艺设计开发的8位高性能精简指令单片机,内部有1K×16位一次性编程ROM(OTP-ROM),128×8位的数据寄存器(RA ...
- 51单片机ROM和RAM
文章目录 @[TOC](文章目录) 一.51单片机的程序存储器结构 1.内部结构 2.程序存储器的7个特殊地址 二.51单片机的数据存储器 1.片内数据存储器 2.片外数据存储器 提示:以下是本篇文章 ...
- C51存储器类型与51单片机的物理区域
1. data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值. 2. data区内最好放局部变量. 因为局部变量的空间是可以覆盖的(某个函数的局部 ...
- uCOS-II在51单片机上的移植
uCOS-II在51单片机上的移植 约定:文中所写的硬件堆栈或系统堆栈是指51单片机SP指针所指向的堆栈空间,而用户堆栈或任务堆栈是指用来保存任务状态为每个任务分配的堆栈空间. 前一段时间一直在学习U ...
最新文章
- 为什么说一知半解的人生最可怕?
- java学习笔记16--I/O流和文件
- html制作手机预览效果,新移动端Html5方式预览报表插件
- mysql udf limit_锁定服务UDF接口
- boost::gil::detail::convolve_2d用法的测试程序
- java如何造假数据_JAVA时间数据造假
- x什么意思c语言新闻app啊我et,C语言笔试题目
- 『飞秋』在ASP.NET服务器端过程中使用WebBrowser的注意事项
- Cadence 16 ( Allegro PCB ) 使用 Shape Symbol 制作不规则焊盘
- CentOS 7 忘记root密码的解决之道
- iATKOS v7硬盘安装教程(硬盘助手+变色龙安装版)
- ITIL 4和DevOps的关系?
- QT实现多语言动态切换
- html/css椭圆运动
- docker学习总结X - 碰到的问题
- 机器学习 | 台大林轩田机器学习基石课程笔记5 --- Training versus Testing
- 空调老大易主后,格力能否下定决心多元化?
- uvm_objection/uvm_objection_events/test_done_objection/callbacks_objection/objection_callback
- MySQL数据库基础学习小终结:连接查询、表结构的修改、约束条件、MySQL与python交互
- 安卓中的hander