单片机底层思考的程序执行与封装思想
\\\插播一条:
自己在今年整理一套单片机单片机相关论文800余篇
论文制作思维导图
原理图+源代码+开题报告+正文+外文资料
想要的同学私信找我。
笔者希望催促自己一周写一篇类似的文章,分享自己的思考.
若是对读者有益,那是极好,若是没益,权当催促自己思考进修!
这周思考的主题是,分享一下我对“单片机是如何执行程序的”以及“封装”的了解。
1、单片机如何执行程序?
我原先对计算机是如何执行程序的非常的痴迷,希望能够明白最底层的道理,我在单片机这个设备上找到了一点影子。
对单片机执行程序的了解,我读了王爽教师写的《汇编语言》这本书,然后联合自己的思考。
我认为
程序执行 =不停的写不同的寄存器。
上一篇文章写道,嵌入式软件开发最一般的操作就是控制类似P0OUT这样与实际底层相关的寄存器。写嵌入式软件代码,实际上就是写一系列操作底层寄存器的语句。
一般会将P0OUT这样的寄存器映射到某一个地址上,这个地址是实际的寄存器物理地址。
在单片机通用的.h文件会给出他的物理地址定义。
【文章福利】:小编整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!~点击绿色通讯软件搜索wujidanpianji加入(需要自取)
例如,笔者使用的MSP430系列单片机,他在<>>中就定义了各个寄存器的物理地址,此类文件一般由厂家提供。
#define P1OUT_ (0x0021u) /* Port 1 Output */
DEFC( P1OUT , P1OUT_)
此段代码,定义了P11OUT关键词与0x0021u地址的联结。
那么,希望P1口输出全是高电平的C代码则为
P1OUT=0XFF;
那么汇编如何写呢?
# mov 00 ff 00 21
//把00ff数据移动到0021物理地址上
于是此时的底层硬件会将00 ff放入00 21为地址的寄存器中,此时三极管动作,切换底层硬件电路,实现需求功能。
(嵌入式开发实际理解到汇编这一层代码即可。再往下,那就是非常深奥的电路原理,即电路是如何做到把 ff移动到0021地址寄存器的,以及寄存器是如何工作的,等等这样的问题)
嵌入式软件开发还有一个最一般的操作--------数值的数学运算
那么数值的数学运算是不是也是对底层寄存器的配置呢
通过数字电路的学习,我学习到了加法器等逻辑电路,其底层的运算原理已经能和寄存器的知识联结了。
在计算机中有一个叫“算术逻辑单元”的概念
算术逻辑单元_百度百科
这个单元算是把很多算术电路整合在一起了。我们可以通过操作寄存器来使用它。
例如加法操作,a+b以及返回结果 c
定义 a的物理地址为 0x0000
b的物理地址为 0x0001
C的物理地址为 0x0002
那么
#mov a 0000 //把数据a放入 0000
#mov b 0001//把数据b放入0001
#read c 0002 //读取0002寄存器的数据放入c中,这里的read指令是我瞎写的,汇编一定有这样的指令
于是c就是加法器的结果输出,得到输出,完成了计算。
嵌入式软件开发还有一个最一般的操作--------数值比较,参考数字比较器的逻辑电路原理
对应程序中的if操作,比较a与b的大小。
例如,if(a>b)语句,或者 if(a)语句,实际都是把a和b放入数字比较器的两端,获得比较器的输出!
数字比较器
于是嵌入式软件最基础的三个操作(算术运算、硬件电路切换、数值比较
)都是对寄存器的操作。
所以我得出结论,计算机的程序执行,就是不停的写入寄存器数据,并且取出寄存器值得过程。
2、封装思想
我在理解了程序运行就是对寄存器的操作之后,紧接着我就想到,如何建立一个抽象的层面,让我不需要考虑,我这样的寄存器操作是实现怎样硬件操作,而直接达成自己的目的?
于是我想到了封装,工作两年多,持续增长的技能实际上就是封装的技巧。以后的分享中大多数就是对封装的思考。
这篇文章中仅举一个例子,来说明封装的意义。
上一篇文章中提到,跑马灯电路,当P0OUT的低四位为0时,灯会灭,当P0OUT的低四位为1时,灯会亮。
那么寄存器与实际效果的对应关系,我不想时刻记住,该如何去做呢?
于是想到使用函数封装。写下如下代码
typedef enum{
Off = 0,
On,
}led_status_t;
void open_led(led_status_t led_0 ,led_status_t led_1 ,led_status_t led_2,led_status_t led_3){
uint8_t led_p=0;
led_p |= led_0;
led_p |= led_1 << 1;
led_p |= led_2 << 2;
led_p |= led_3 << 3;
P0OUT = led_p;
}
在任意时刻,我想点亮0号和3号灯则写
open_led(On,Off,On,Off);
此时函数完全与硬件无关,完全到了抽象层,使用此函数这,根本不知道其底层电路原理。实际上当做项目的时候,就算代码是你自己写的,你往往也会忘记底层电路原理的,封装之后,就不用记这些了!
作者思考
笔者理解的嵌入式计算机工作原理,就是不停的写各种功能的寄存器。于是想写好这么多名目繁多的寄存器,一定要挨个封装起来,用更加简明的函数名来标记,这样才能抛开底层电路原理对自己的束缚,完全的放飞自己的想象。
就好比,拿着电脑写作,我不需要知道电脑的工作原理,我只需要放飞自己的想象,使用键盘输入自己想说的!