当前位置:文档之家› 嵌入式实时操作系统之我见

嵌入式实时操作系统之我见

嵌入式实时操作系统之我见
-ARM7TDMI-S
王士莹
-----从基本概念、基本原理、基本常识、基本思维入手阐述嵌入式实时操作系统在单片机开发中,嵌入式实时操作系统的使用近几年比较流行,在具体应用中也有比较好的表现。

那么对于一个应用来讲,应该选择那种操作系统呢?目前,可供选择的有uLinux、VxWorks、uCOS-II等。

我们当然可以选择其中的一个根据需要移植到自己的设计中。

但对于一个工程师来说,能够在设计中使用自己编写的嵌入式实时操作系统岂不是一件“很酷”的事情吗?而且,我认为,若要较好的理解一个嵌入式实时操作系统,首先要能够自己编写,哪怕是一个最简单的。

否则,不知道核心原理是怎么回事,仅仅依样画葫芦做做移植,只是隔靴搔痒,只会是门外汉。

这篇文章就是根据我所理解的嵌入式操作系统,就几个问题做一个阐述,以期抛砖引玉。

1、为什么要用嵌入式实时操作系统,嵌入式实时操作系统较前后台结构有什么优势
单片机程序结构发展
任务的驱动方式有两种:时间和事件,所以对一个单片机程序来说它要等待的量也是只有两个:延迟时间到或事件发生。

故操作系统只要安排任务等待着这两个标志就好。

那么如何产生这两个标志呢,标志产生在中断中,然后在中断中发给需要的任务。

多功能块任务:在一个任务中有等待的时间或事件,等到后再执行后面程序的任务。

在任务等待的时候单片机可以离开该任务去执行其他任务,该任务等待
完成后再回来继续运行。

这样使用操作系统就提高了系统整体的运行效率。

单片机执行全局的东西,操作系统通过把全局的资源赋值成局部的任务让单片机执行了看似全局的实则是局部的东西,这样就实现了任务的调度和切换对于单功能块任务,即一个任务中没有需要等待的时间或事件,程序连续地从头执行到尾,对于这样的任务操作系统的作用不大。

2、单片机编程有哪些特点、会有哪些问题和需求、操作系统如何根据特点解决问题满足需求
一般单片机系统中不会只运行一个单一的任务,往往有多个方面的工作要做,如对一个仪器仪表来讲,它要做的工作有:测量、显示、存储、通讯、控制等。

这些工作需要同一个单片机来完成,那如何对他们进行安排才能使一个单片机执行多个任务呢?
打个比方:单片机就像一支建筑队,在这个建筑队里面有管理、财务、技术、工人、后勤等,他们各司其职、共同协作完成一个建筑工程。

正常情况下,一支建筑队在一个时间段只能做一个工程,若再有工程要做,只能等这次的工程完成后才能去。

现在的情况是:建筑市场异常火爆,有大量的工程要做,而该地区的建筑队数量只有这1支。

那怎么办呢?一般的做法是:给每个工程排好顺序定好工期,做完第一个再做第二个再做第三个及其他。

如果这样安排,顺利还好,如果不顺利就会发生这样的事:第三个工程所有的东西都已准备好,而且这个工程的建筑物急等着用,但建筑队却由于第二个工程的资金短缺或其它原因耽误了工期而迟迟不能到来。

出现这样的事情是不应该的,那怎样安排工作才能避免这样的事情呢?我们可以这样做:1支建筑队同时承包多个工程,并同建筑单位定好协议:当一个工程由于资金或其他原因不能继续时,建筑队可以暂时离开去其他工地。

这样当2号工程资金不到位时,建筑队把该工程的必要信息记录下来并保存起来,然后离开2号工程的工地去3号工程的工地;如果3号工程已经开始了,则建筑队把之前保存的信息取出来按照信息上的说明继续下面的工作,若3号工程也有其他事情需要等待了,则建筑队保存好记录后再去其他工地。

这样,建筑队就总是在做工程而不会出现空闲,实现了效率的最大化!这种安排工作的方法就是建筑队版的“嵌入式实时操作系统”!
3、哪些是单片机最基本的元素、操作系统是如何利用这些最基本的元素之上实现对系统的管理的
所谓最基本的元素就是单片机运行时必须的、不可或缺的元素。

单片机最基本的元素有:PC、工作寄存器、堆栈和堆栈指针。

一般单片机还有ROM、RAM、中断、计数器等基本资源。

他们的关系为:
PC:我是老大!
工作寄存器:我是老二!
堆栈:你们都得存到我这里!
堆栈指针:哈哈,小样!我不指你,谁会认识你!
对一个任务来说,操作系统与其关联的有三个方面:任务列表、任务控制块、任务堆栈。

单片机的基本元素只有一套,而任务却有多个,因此需要建立单片机基本元素的映像,并保存在任务堆栈中,即任务堆栈中保存的内容有:该任务在ROM 中的入口地址、该任务工作时的工作寄存器内容。

指向任务堆栈的任务指针存放在任务控制块中。

任务列表和任务控制块是给操作系统用的,任务堆栈是给自己用的。

当任务进入运行状态时,操作系统把任务控制块中的堆栈指针读出,并放到单片机的堆栈指针中,那么当切换程序返回后,单片机就会把堆栈指针指向的任务堆栈当成自己的堆栈,并把任务堆栈中的内容弹出到自己的PC和工作寄存器,然后单片机就会运行该任务。

当任务退出运行状态时,单片机将PC和工作寄存器内容压入堆栈指针指向的任务堆栈,并将堆栈指针保存到任务的任务控制块中。

以上讲的是在任务切换时的事,至于当前任务是否要退出运行及哪个任务进入运行则是任务调度的事了!
4、操作系统需要为任务准备什么资源、操作系统自己需要什么资源、
任务列表:
任务控制块:任务优先级、任务堆栈指针、任务状态、任务延时计时器、该
任务需要的信号量、任务邮箱。

任务堆栈:
任务调度:
任务切换:
系统延时:
信号量:
邮箱:
在创建一个任务时,操作系统需要做的是:为任务开辟堆栈区并初始化必要的部分、为任务的控制块里的变量赋值。

4、任务如何延迟、如何得到和释放一个资源的信号量、如何等待发送获得一个邮箱(消息)
资源型信号量、事件型信号量
资源性信号量是用来表征一个资源是否可用的带符号整型变量。

系统里一般有多个信号量,因此为了方便管理总是把信号量写成数组的形式,所以我们也可以说信号量其实就是一个带符号整型数组。

在信号量创建中,要给所创建的信号量一个初值,表征这个信号量对应的资源可以同时被几个任务所使用,有几个任务这个信号量的初值就是几。

获得一个信号量就是先检查这个信号量的值是否大于0,如果大于0就减1,并可以使用这个信号量对应的资源;如果不是,则等待,直到某个正在使用这个资源的任务使用完毕,即释放掉这个信号量,再取走。

释放一个信号量就是使用完信号量对应的资源后,将该信号量的值加1。

5、如何实现任务切换、在什么地方执行任务切换(人为或周期性地)
嵌入式实时操作系统任务调度和切换的本质是利用单片机压栈、出栈的机会进行“偷梁换柱”。

所谓“梁”即是处于就绪状态中的优先级最高的任务;所谓“柱”即是当前时运行着的任务;所谓“偷”即是查找目前处于就绪态的优先级最高的任务;所谓“换”即是将当前任务换成就绪状态的优先级最高的任务;而
压栈、出栈的发生机会即是程序调用和中断发生。

那么“偷梁换柱”即可解释为:操作系统在程序调用和中断发生的时候,查找出处于就绪态任务中优先级最高的一个,保存当前任务的堆栈指针,并把单片机的堆栈指针指向这个优先级最高的任务的堆栈,这样当程序调用返回或中断结束后弹出的堆栈的内容即是这个优先级最高的任务的寄存器数据和返回地址,这样就把当前运行的任务“换”了优先级最高的任务,即把当前运行的任务从CPU内核“拉出”并把就绪态的优先级最高的任务“送进”CPU的内核运行,即实现了任务的“切换”。

那么这个程序调用和中断是指什么程序和什么中断呢?执行这个任务切换功能的程序一般叫做任务切换函数(OS_TaskSw()),中断一般是定时器时钟的中断函数(TimerISR()或SysTick())。

这样,当需要人为任务切换的时候就调用OS_TaskSwitch()函数,同时系统每隔一定时间间隔(如1ms)自动执行一次TimerISR()或SysTick()函数。

6、如何使用操作系统编写应用程序
对应用程序来说,可以完全按流程进行编程,方便地实现时间与信号量的等待,降低了任务间的耦合,简化了程序设计。

7、如何编写一个基于特定内核的嵌入式实时操作系统
1、确定内核和所使用的编译环境、熟悉内核和编译器的使用
2、如何在C中访问汇编的寄存器(SP)调用汇编的函数
3、如何编写汇编函数(返回)、如何在汇编中使用C的变量调用C的函数
4、如何编写中断函数
5、如何实现使用软中断等资源
1、该单片机的堆栈结构是怎样的,堆栈是如何操作的?
堆栈结构即程序在进入特权模式后要保存的环境。

堆栈的操作有:满加、满减、空加、空减。

与之相关的是任务切换中的寄存器保护和任务创建中的任务堆栈初始化。

2、该单片机的SP、PC等内部资源是如何访问的?
在用户模式下就可以访问还是要在特权模式下才行?
若可直接访问,如51单片机,可直接编写操作系统启动函数、任务切换函数。

若只能在特权模式下访问,则需要用到堆栈指针等特殊功能寄存器的操作系统启动函数、任务切换函数是要放在该特权模式中的。

一般是使用软中断,根据不同的功能号实现操作系统启动或任务切换。

3、使用的编译器是否允许在C语言中使用SP、PC等特殊功能寄存器的?
若可以使用,则可以用C语言按访问格式来编写系统启动和任务切换的函数;若不能,则只能用汇编语言编写了。

4、其他操作系统函数都可以在用户模式下用C语言编写。

最底层的操作系统函数有两个,一个是操作系统启动函数,一个是任务切换函数。

其中还涉及到堆栈的现场保护的部分内容。

操作系统最底层的东西是堆栈和堆栈指针,其他都好说
调试就是一点一点地抠,由一个台阶登上另一个台阶、由一个确定到达另一个确定,最终大功告成。

相关主题