单片机程序做到一定年限,基本就没有什么新意,只是耗时间

473 篇文章 2 订阅
452 篇文章 9 订阅

虽然所以单片机原理类似,但是不同的单片机其实硬件都不相同,偏硬件势必要把所有的单片机硬件都要深入的了解(当然也可以深究原理,针对不同的单片机加以运用,但是很少有人能达到这种程度),而偏软件的话,很多单片机一发售,一般都会有配套的库函数,这样只要只要掌握了软件的逻辑,即使对底层不怎么精通,也可以写出很多高质量的代码。

但其实只要入了单片机这一行,硬件和软件多少都要了解些,不然很多时候除了问题都不知道问题出在哪,所以即使是偏软件,硬件这一块也是绕不过去的,只是说不需要那么精通。

当然,如果想要在单片机这一块深入发展,最后还是要全部精通的,这样才能编写出高质量精简有效的代码,但这都是后话了。

195c396c622c58690830dab1fcce2939.png

作为一个单片机设计20年的人跟你说。

70%硬件,30%的软件。

我是做C语言的,不存在什么更高效的代码。

单片机程序做到一定年限,基本就没有什么新义,只是耗时间。硬件是一直更新换代的。

文章相对比较长,字数比较多,码字不容易,大家可以先打开头像关注我,点赞之后慢慢看,谢谢各位屏幕前的你!!!///插播一条:我自己在今年年初录制了一套还算比较系统的入门单片机教程,想要的同学找我拿就可以了免費的,私信我就可以哦~点我头像左下角黑色字体加我也能领取哦。输入暗号“林老师”,最近比较闲,带做毕设,带学生参加省级或以上比赛///

硬件通常在服务程序开始前保存当前信息。对于不同的 CPU来说,哪些信息需要保存以及保存在哪里差别很大。不管其他的信息是否保存,程序计数器必须要被保存,这对所有的 CPU来说都是相同的,以此来恢复中断的进程。所有可见寄存器和大量内部寄存器也应该被保存。

b48adb03ec3a58e6f2f4d14db9c890b3.png

上面说到硬件应该保存当前信息,那么保存在哪里是个问题,一种选择是将其放入到内部寄存器中,在需要时操作系统可以读出这些内部寄存器。这种方法会造成的问题是:一段时间内设备无法响应,直到所有的内部寄存器中存储的信息被读出后,才能恢复运行,以免第二个内部寄存器重写内部寄存器的状态。

第二种方式是在堆栈中保存信息,这也是大部分 CPU所使用的方式。但是,这种方法也存在问题,因为使用的堆栈不确定,如果使用的是当前堆栈,则它很可能是用户进程的堆栈。堆栈指针甚至不合法,这样当硬件试图在它所指的地址处写入时,将会导致致命错误。如果使用的是内核堆栈,堆栈指针是合法的并且指向一个固定的页面,这样的机会可能会更大。然而,切换到内核态需要切换 MMU上下文,并且可能使高速缓存或者 TLB失效。静态或动态重新装载这些东西将增加中断处理的时间,浪费 CPU时间。

a1fe8c8406429841a10836f35b3c7228.png

现代 CPU大量的采用流水线并且有时还采用超标量(内部并行)。在一些老的系统中,每条指令执行完毕后,微程序或硬件将检查是否存在未完成的中断。如果存在,那么程序计数器和 PSW将被压入堆栈中开始中断序列。在中断程序运行之后,旧的 PSW和程序计数器将从堆栈中弹出恢复先前的进程。

在流水线满的时候出现一个中断会发生什么情况?许多指令正处于不同的执行阶段,中断出现时,程序计数器的值可能无法正确地反应已经执行过的指令和尚未执行的指令的边界。事实上,许多指令可能部分执行力,不同的指令完成的程度或多或少。在这种情况下,a程序计数器更有可能反应的是将要被取出并压入流水线的下一条指令的地址,而不是刚刚被执行单元处理过的指令的地址。

每个指令都可以分解成为微操作,微操作有可能乱序执行,这取决于内部资源(如功能单元和寄存器)的可用性。当中断发生时,某些很久以前启动的指令可能还没开始执行,而最近执行的指令可能将要马上完成。在中断信号出现时,可能存在许多指令处于不同的完成状态,它们与程序计数器之间没有什么关系。

88c3bd3faabf8f33927f8dc4b6292f03.png

使机器处于良好状态的中断称为精确中断(precise interrupt)。这样的中断具有四个属性:

·PC(程序计数器)保存在一个已知的地方

·PC所指向的指令之前所有的指令已经完全执行

·PC所指向的指令之后所有的指令都没有执行

·PC所指向的指令的执行状态是已知的

不满足以上要求的中断称为不精确中断

实操上,有很多办法解决你的问题,只是需要把问题描述为:如何有效记录外部事件?

使用中断方式记录外部事件相对来说是非常低效率的一种方法。比如一个外部事件计数器(随便一个简单的MCU都有这个功能)就可以按处理器时钟周期的精度来记录外部事件。这比中断方式至少快10倍以上。

ceab3b19db187dced62ec445c7a97f19.png

硬中断的处理流程如下:

·1、外设将中断请求发送给中断控制器;

·2、中断控制器根据中断优先级,有序地将中断传递给 CPU;

·3、CPU终止执行当前程序流,将 CPU所有寄存器的数值保存到栈中;

·4、CPU根据中断向量,从中断向量表中查找中断处理程序的入口地址,执行中断处理程序;

·5、CPU恢复寄存器中的数值,返回原程序流停止位置继续执行。

对单片机感兴趣的朋友可以找我,我录制了一些关于单片机的入门教程,有需要的童鞋找我拿就行,免费的,私信我“林老师”就可以拿~点击打开我的头像就能领取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值