基于裸机(前后台系统,一个main函数、一个while循环)与基于实时操作系统的编程思想分析

1

单片机进行开发的一个重要的特点就是裸机编程。也就是说内核跑的完完全全是你的代码。但是在操作系统上编程就完全不一样,因为你的程序大部分都在调用操作系统的接口函数,从而间接的管理硬件。操作系统搭好了框架,实现硬件抽象,文件存储管理,进程管理,本质上就是对cpu,i/o和存储器搭了一个管理框架,这种间接的管理方式使我刚接触ROS开发时产生了极大的不适应,我不知道我应该写什么,不知道函数和硬件之间的关系。就是当时很难理解接口的概念,总是在纠结底层。
基于操作系统编程理解的第二个难点我觉得是进程,像我们写的应用程序,以windows举例,exe文件并非直接读取执行,而是有一个映射到进程管理空间的过程,windows是由PE装载器完成。
整个过程我觉得可以分为五步,第一步是通过屏幕鼠标网络,u盘等I/O口将源码写入硬盘,第二部是进行编译,第三步是创建进程,第四步是进行映射,也就是映射到进程空间,第五步调用链接库时进行链接

2

实时系统

概念:
指那些对处理结果的正确性和处理过程的及时性都有严格要求的系统。

实时系统有两种实现方式,一种是前后台系统,也就是我们常说的裸机系统。另一种就是具有实时内核的操作系统

前后台系统(裸机系统)

简单的小系统通常设计成前后台结构。

这个结构包含一个死循环和若干中断服务程序:
应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,属于后台结构。
中断服务程序用于处理系统的异步事件(异步事件就是在大循环中无法用顺序结构描述或预测的行为,例如串口后者网口接收到数据,接收时间是随机的非计划性的,为了处理这种异步事件所以引入中断概念。)中断服务程序属于前台结构。

1.为了保证有实时性要求的任务得到及时处理,本该在大循环里(任务级)执行的关键代码必须放在中断里执行,这导致中断程序运行时间变长。
2.中断时间过长就会影响系统的响应速度。所以我们为了降低这种情况,通过在中断程序中立刻生成特定数据(置标志位),使后台程序查询相关标志位,根据标志位的变化情况,调用不同的函数中进行处理。从某一异步信号触发中断开始,到这一信号指示的事件得到处理这段时间称为任务级响应延迟。
3.最长的任务级响应延迟取决与后台大循环的运行时间,因此特定模块的运行时间间隔是不确定的并且后台循环的任何更改都会使所有功能模块的运行时间间隔受到影响。进而整个系统的实时性就会受到挑战。
4.随着系统越复杂,功能模块越多,任务级响应延迟就越长也越不稳定。裸机系统中,各模块之间的信息交换,一般通过大循环轮询无锁的全局变量来进行,任务级响应延迟越长,模块间信息交换效率就会下降,单个模块执行时间成本增加必然导致系统响应缓慢,运行效率下降。

综合上述分析可以发现:

  • 前后台系统的优点在于结构简单,资源占用较少,在实现较为简单的小系统时是最佳的选择。
  • 但面对较为复杂的实时系统时,前后台结构会出现运行效率降低,后期维护和再开发困难等问题,不适合实现复杂的实时应用。

那么如何使实时系统在运行时更高效地调动硬件资源呢?

我们先来看一下使用前后台结构实现实时系统时出现了哪些问题。
首先是后台的大循环在轮询的过程中以低运算量长时间占用了CPU,导致CPU资源被大大的浪费。当紧急的中断事件还在等待被处理的时候,CPU却不得不把时间浪费在写死的轮询流程中,不能被及时处理。
为了解决这一问题,嵌入式操作系统受主机操作系统的启发,提出了一种通过实时内核来调度硬件资源的思想。
设计实时系统时,可以把系统功能划分成多个任务,每个任务仅负责实现某一功能。每一个任务都是一个死循环。实时内核负责管理这些任务,决定任务的运行和切换,CPU在多个顺序执行的任务之间切换,以实现CPU资源的最大化利用。
在这里插入图片描述

我们来看一下这个例子:

低优先级任务正在运行。
1.此时产生中断请求,CPU跳转到该中断源对应的中断服务程序ISR处开始执行。
2.中断服务程序ISR处理中断请求,它的处理过程非常精简。ISR通常只是发出一个信号或者一则消息,而由一个高优先级的任务响应这个信号或消息(消息响应时间可达到1ms),并完成该中断请求的大部分处理工作。例如,假设中断是由网口控制器产生的,那么ISR只需要向一个任务发出一个信号,然后由该任务来处理接收到的数据包。
3.当ISR执行结束后,uC/OS发现ISR发出的信号或者消息使得某个优先级更高的任务具备了运行条件,在这种情况下,uC/OS不会返回到原来被中断的任务,而是切换到这个更重要的任务运行。
4.高优先级任务开始运行,对中断事件进行处理。
5.高优先级任务处理完后,返回到任务起始点,并通过调用uC/OS的功能函数,等待新的外部中断事件。
6.原先被中断请求打断的低优先级任务继续运行。对这个任务来说,刚才的任务切换就像
完全没有发生过一样。

像uC/OS这样的多任务内核还会负责管理任务间通信和系统资源(内存以及I/O设备)。

使用uC/OS操作系统的理由:

1.可剥夺性实时内核的特点使得它的实时性很好,处理异步事件时效率高。

  • 相比于裸机结构,系统越是复杂,功能指令越多,这一优势就越发明显。

2.增强系统的可靠性。
这一点体现在两个方面:

  • 一方面,任务的调度与切换时间是固定的且可设置的。系统的结构设计使得任务模块化程度高,即使一个任务运行时出现了异常,到达最长切换时间后也会自动切换,以防止程序假死或者跑飞。
  • 另一方面,操作系统内核源码是通过严格测试和验证过的,通常来说要比裸机系统更强壮更稳定,能适应更复杂的工作环境。尤其涉及堆栈操作、I/O操作等一些芯片内部资源的使用时,uC/OS能给出更可靠更高效的处理函数。稳定,能适应更复杂的工作环境。尤其涉及堆栈操作、I/O操作等一些芯片内部资源的使用时,uC/OS能给出更可靠更高效的处理函数。

3.开发周期短,便于代码维护以及扩展新的功能。

  • uC/OS提供了许多系统级的函数,可以使开发人员把关注点集中在任务的具体实现上,减少一些重复性工作。一些重复性工作。
  • 一些裸机实现的实时系统中出现了大量全局变量,用来标识系统的运行状态;这对后期的调试维护造成极大的困难。uC/OS中为任务间的通信提供了完善的消息机制,比查询全局变量的信息交换方式更高效。而且同样使用模块化的设计,调试维护很方便;试维护造成极大的困难。uC/OS中为任务间的通信提供了完善的消息机制,比查询全局变量的信息交换方式更高效。而且同样使用模块化的设计,调试维护很方便;
  • uC/OS是一个支持多任务的操作系统。一个完整的程序可以划分成几个任务,不同的任务执行不同的功能。增加新功能时,只需要增加新任务或者在任务中添加代码,只要不涉及共享资源就不必担心互相之间有影响。行不同的功能。增加新功能时,只需要增加新任务或者在任务中添加代码,只要不涉及共享资源就不必担心互相之间有影响。

使用uC/OS操作系统的缺点:

  • 代码量会增加,因此要求控制器提供更大的存储空间。FLASH空间要大于24K。
  • 运行时将增加系统的开销具体的增加量取决于功能函数被调用的频率。因此需要更大的内存。RAM空间需要大于8K。

结论:

uC/OS适合中断比较多的多任务系统。尤其是控制命令较多的,且对实时性要求较高的系统。

3

早期嵌入式开发没有嵌入式操作系统的概念 ,直接操作裸机,在裸机上写程序,比如用51单片机基本就没有操作系统的概念。通常把程序分为两部分:前台系统和后台系统。 简单的小系统通常是前后台系统,这样的程序包括一个死循环和若干个中断服务程序:应用程序是一个无限循环,循环中调用API函数完成所需的操作,这个大循环就叫做后台系统。中断服务程序用于处理系统的异步事件,也就是前台系统。前台是中断级,后台是任务级。
在这里插入图片描述
这里就是平时我们裸机的运行结果,现在比如我在运行task3,突然又想马上运行task1,这怎么办?前后台程序就会让后面的任务执行之后,再去执行task1,这样实时性受到影响。如果是裸机,要实现也可以,用中断,可是这样会让程序结构变得复杂,因为我想什么时候跳过就跳过,想什么时候执行就执行,所以固定的中断触发方式虽然也可以实现一些简单的跳转功能,但是当程序复杂之后,这样的裸机程序难以阅读和维护。这样在有操作系统的任务调度之后,就会让系统响应更具有实时性。

RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。实时操作系统又分为硬实时和软实时。硬实时要求在规定的时间内必须完成操作 ,硬实时系统不允许超时,在软实时里面处理过程超时的后果就没有那么严格。 在实时操作系统中,我们可以把要实现的功能划分为多个任务,每个任务负责实现其中的一部分,每个任务都是一个很简单的程序,通常是一个死循环。 RTOS操作系统:FreeRTOS,UCOS,RTX,RT-Thread,DJYOS等。 RTOS操作系统的核心内容在于:实时内核。

  • 可剥夺型内核:
    RTOS的内核负责管理所有的任务,内核决定了运行哪个任务,何时停止当前任务切换到其他任务,这个是内核的多任务管理能力。多任务管理给人的感觉就好像芯片有多个CPU,多任务管理实现了CPU资源的最大化利用,多任务管理有助于实现程序的模块化开发,能够实现复杂的实时应用。可剥夺内核顾名思义就是可以剥夺其他任务的CPU使用权,它总是运行就绪任务中的优先级最高的那个任务。
    在这里插入图片描述
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值