单片机底层思考的程序执行与封装思想

单片机底层思考的程序执行与封装思想

单片机底层思考的程序执行与封装思想_第1张图片

\\\插播一条:

自己在今年整理一套单片机单片机相关论文800余篇

论文制作思维导图

原理图+源代码+开题报告+正文+外文资料

想要的同学私信找我。

单片机底层思考的程序执行与封装思想_第2张图片

笔者希望催促自己一周写一篇类似的文章,分享自己的思考.

若是对读者有益,那是极好,若是没益,权当催促自己思考进修!

这周思考的主题是,分享一下我对“单片机是如何执行程序的”以及“封装”的了解。

1、单片机如何执行程序?

我原先对计算机是如何执行程序的非常的痴迷,希望能够明白最底层的道理,我在单片机这个设备上找到了一点影子。

对单片机执行程序的了解,我读了王爽教师写的《汇编语言》这本书,然后联合自己的思考。

我认为

程序执行 =不停的写不同的寄存器。

上一篇文章写道,嵌入式软件开发最一般的操作就是控制类似P0OUT这样与实际底层相关的寄存器。写嵌入式软件代码,实际上就是写一系列操作底层寄存器的语句。

一般会将P0OUT这样的寄存器映射到某一个地址上,这个地址是实际的寄存器物理地址。

在单片机通用的.h文件会给出他的物理地址定义。

单片机底层思考的程序执行与封装思想_第3张图片单片机底层思考的程序执行与封装思想_第4张图片单片机底层思考的程序执行与封装思想_第5张图片

【文章福利】:小编整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!~点击绿色通讯软件搜索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);

此时函数完全与硬件无关,完全到了抽象层,使用此函数这,根本不知道其底层电路原理。实际上当做项目的时候,就算代码是你自己写的,你往往也会忘记底层电路原理的,封装之后,就不用记这些了!

作者思考

笔者理解的嵌入式计算机工作原理,就是不停的写各种功能的寄存器。于是想写好这么多名目繁多的寄存器,一定要挨个封装起来,用更加简明的函数名来标记,这样才能抛开底层电路原理对自己的束缚,完全的放飞自己的想象。

就好比,拿着电脑写作,我不需要知道电脑的工作原理,我只需要放飞自己的想象,使用键盘输入自己想说的!

你可能感兴趣的:(硬件工程师,自动化,智能,单片机,单元测试,单例模式,单一职责原则)