
有关51单片机学习的相关教训
有关51单片机学习的相关教训
为什么要写这个显得十分智障的教程,其实就是因为Intel8051这个架构的古老。其相关的东西也几乎都是老玩意了。Keil的C51版本更新已经是2022年的事了,
但这不是最严重的,严重的是20年过去了,KeilC51默认还是使用ANSI C (即C89)标准,事实上,他们用的还不是标准的C89,而是C51——51单片机特供版。而且其的编译器也与现代IDE的逻辑存在很多区别。且受制于51单片机少的可怜的RAM,其实其的实现逻辑也不会太过于贴合常见的计算机系统平台的开发(比如windows,linux)。那下面就来提一下我学习51两个月来踩的坑吧——
C语言标准相关
for(int i = 0;i < 8;i++)
{
temp[i] = data[i];
}
这上面在C99中是十分常见的一个循环赋值语句。但是这在Keil上跑不通。
问题就在于C89不支持在代码开始执行时进行初始化,这在C89中是不合法的!
而且C51是C89的简化与面向8051的特制版本,所以隐形问题更多。
资源限制
众所周知,单片机之所以还有用武之地。与其价格低廉的特点摆不开关系,但是——这是在其CPU,RAM,flash都少的可怜的基础上才成立的。所以这就会产生以下问题:
-
内存管理十分严苛,其管理机制甚至与C89都不一样,它的内存管理是基于8位寄存器的。所以这就是为什么我们一般用unsigned char来储存数据(毕竟资源实在是太少了)。
-
不支持递归(虽然也用不上)
-
sprintf这些常用的函数可能无法使用,因为它们相对于for还是太占内存了。而且可能会导致不可预测的栈溢出。
-
由于CPU主频太低,所以计算之间的延时比较大。可能一次赋值就得设置10us的延时,否则就会出现无法灵敏执行的问题。
-
不支持计算机式的多线程,要通过中断系统才能实现比较简单的多线程。
-
IO资源有限,而且CPU电压也不高,对某个接口赋值还得借助各种扩展芯片。
可能问题还不止这些,但是我也无法一一列出了。
但是对于这些一些细节我还要展开说说
sprintf函数
虽然可能这个显的有点抽象了,毕竟51单片机其实用不上标准输入输出库。但是我想写一个lcd1602能够显示多个数字的函数。那么这个函数是需要调用显示单个数字的,单个数字显示正确,但是就是无法通过sprintf运行。显示出来的总是错误的数字。目前认为是栈溢出导致的