锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-09-19 15:07:02 三极管9012的封装

单片机底层思维的程序执行和包装思想

91a9b0dea736912661bfb495079b0e53.png

\\\插播一条:

今年整理了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 在地址寄存器中,三极管动作,切换底部硬件电路,实现需求功能。

(嵌入式开发实际上可以理解这层代码的汇编。再往下看,这是一个非常深刻的电路原理,即如何实现电路 ff移动到0021地址寄存器,寄存器是如何工作的,等等)

嵌入式软件开发还有一个最一般的操作——数值数学运算

那么数值的数学运算也是底层寄存器的配置吗?

通过对数字电路的研究,我学习了加法器等逻辑电路,其底层的操作原理已经与寄存器的知识联系系。

计算机中有一个概念叫做算术逻辑单元

算术逻辑单元_百度百科

该单元集成了许多算术电路。我们可以通过操作寄存器来使用它。

例如,加法操作,a b返回结果 c

定义 a物理地址为 0x0000

b物理地址为 0x0001

C物理地址为 0x0002

那么

#mov a 0000 ///放入数据a 0000
#mov b 0001//将数据b放入0001
#read c 0002 ///在c中读取0002寄存器的数据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);

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

作者思考

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

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章