简述msOS嵌入式微型框架及系统如何运行
前段时间我们河池学院msOS重点实验有幸邀请到msOS嵌入式微型系统创始人“凤舞天—王绍伟”过来授课。之前我从没接触过STM32,只是听说过。但是经过凤舞天两个多星期的讲解我们实验室的同学基本上掌握了这套系统,并且可以单独在上面运行一些自己想要的功能,这么短的时间零基础的我们如何可以快速掌握并应用这个系统?原因是这个系统简单、易用,那么如何简单、易用会在往后的文章用代码对其各个功能具体说明。这篇文章我主要想简单介绍这个系统的框架和系统如何运行。
首先msOS系统是实时性的系统,用C语言来书写但是采用类似C#的编写风格,代码看起来很规范把面向过程写成类似面向对象这个是很大的亮点,还有把uC/OS-II很多的功能用不上都精简这也是很大的亮点,还有在数据处理和存储方面的也有很大的创新在这就不一一讲解。
msOS系统是有严格的分成结构,那么msOS系统大致分为两层,一层是App应用层,一层是System系统层。应用层是主函数的入口,也是系统启动的入口,在应用层这里初始化各类驱动、数据,创建两个任务即逻辑任务和界面任务。系统层主要是封装各类设备等的接口和封装中间件如GUI、OS,还有底层的东西。
上面只是讲应用层和系统的大概,那么应用层和系统层具体包含哪些东西呢?
App层:包含6个文件,分为三组:app、logic、menu。
Logic是一个逻辑任务,功能是处理文件和存储参数,处理各类如:按键消息、各类传感器和存储参数如存储所有用到的参数和一些文本控件的数值等等。Menu是一个界面任务,功能是界面的设计、解析如:对窗体、控件和背景等的设计及解析。app.h里面包含有一个大的结构体AppSturct,这个大的结构体包含了数据库Data和Menu菜单页面,这个数据库和菜单页面封装了App层中所有的数据和窗口控件,也就是我们显示屏上所需要处理和显示的数据和控口。
System层:包含6个文件,分为三组: GUI、OS,Device,system.h。GUI是中间件,包含GUI.C和GUI.H两个文件。GUI.C功能是图形库文件,它把我们的界面Menu分成多个不同的窗体和对数据的处理,比如对窗体的处理:商标窗体LogoForm、刷机窗体CheckForm、工作窗体WorkForm、设置窗体SetupForm等;窗体又分有多个不同的控件比如:图表控件Chart、标签控件Label、文本控件TexBox等。比如对个各类数据的处理:GuiDataTypeDec就是对我们控件中数据位的处理,GuiDataTypeUintDec是对整形数据的处理等等。OS也是中间件,它的功能是启动我们的系统开始工作、创建任务、栈、表等并实现其切换还有对其任务的挂起、等待、消息、节拍等相关处理。Device是设备层,基于 ST 公司提供的硬件驱动 Drive 层设计。Device.c初始化个各设备,如初始化按键设备InitKye()等使之与系统关联起来;Device.h以结构体封装各个设备相关的宏定义。System.h是系统头文件。功能是系统库全局的头文件,对各类数据类型定义,对一些宏定义及函数的声明,以大结构体封装系统层所有的接口,如:设备层、中间件的接口,使之与它们进行关联。
以上是对应用层和系统层整体框架简单的介绍,那么两个框架组成像人的躯壳一样,那么如何让躯壳正常动起来,如何让系统运行起来呢,接下来我再继续讲解。
我们先来讲解一下系统运行中大致需要一些程序段即它们的作用:有任务、栈、表、任务标记、队列、消息、节拍、中断函数、注册机制。任务:就是我们需要反复执行的函数,里面加有一个大循环;栈:是用来装任务处理的数据和任务的入口;表:表的首地址装栈的栈顶;任务标记:是用来标记执行到那个任务;队列:是用来装消息;消息:是设备采集到的数据;节拍:是固定相隔一段时间进行中断处理的一种形式或者可以说成一种模式;中断函数:是用来实现任务的真正切换;注册机制:是应用层把函数或者变量注册到底层下去,底层采集数据再返还回来的方法。
msOS系统运行工作主要是进行任务的切换以及对相应数据的处理,msOS系统属于前后台架构,前台是中断,后台是两个任务即—两个大循环。其中一个任务是逻辑,一个是界面。逻辑任务处于最高优先级,界面任务处于最低优先级。有了这个了解就可以进行到真正讲解系统运行这一步了。
(1)主函数进来先初始化数据和系统。(2)创建两个任务,一个是逻辑任务,一个是界面菜单任务,(创建任务和任务切换是在OS进行的)创建任务过程是:把相对应任务的入口放进相对应的栈里面,并把其栈顶赋给相对应表的首地址,所以栈就包含任务入口,栈顶就是表的首地址,这样就创建完任务了。(3)创建完任务就可以启动系统,启动系统先注册系统节拍,目的是为了在没有消息、其它中断等情况下系统可以例行检查是否有消息或其它事务是否需要处理。(4)再把逻辑任务和逻辑任务表的首地址分别赋给当前任务和当前任务指针,这样做的目的是系统启动完就先进行处理优先级最高的逻辑任务。(5)把任务赋值完就进入中断函数,而中断函数就干这样的活,如果是第一次进中断函数来,也就是第一次开机进入系统启动时:一是关闭中断,目的是为了防止在处理中断函数中有其它外部中断进来干扰,二是判断是不是第一次进来,是的话就执行第一次相应操作,三是获取新任务(逻辑任务)的标记并保存、四是获取新任务(逻辑任务)的栈顶并保存、五是手动把栈(逻辑栈)里面的一些东西加载到CPU中的寄存器里面,六是把栈顶调整到相应位置,七是中断函数执行完毕,打开中断。如果是第二次进这中断来就是切换任务了,一是关闭中断,二是先保存逻辑任务的数据到栈里面、三是把获取逻辑任务的栈顶并送到相应表的首地址保存,四是把逻辑任务的标记切换成界面任务的标记、五是把逻辑栈顶切换成界面栈顶,六是手动把界面栈里面的一些东西加载到CPU中的寄存器里面,七是把栈顶调整到相应位置,八是中断函数执行完毕,打开中断。这就是我们任务切换中断干的活了。中断函数执行完毕系统已经开始工作了,那我们继续往下讲(6)系统启动完进行逻辑任务,逻辑任务把相应的窗体等拿到页面显示,然后进入大循环等待消息。如果设备没有采集到数据或需要处理的数据或需要处理的动作(这些数据或动作都是消息),那么消息队列为空,等不到消息逻辑任务就挂起,并把逻辑任务的数据保存到逻辑栈里面去,然后去执行任务的切换,任务切换到界面去执行界面任务。如果设备采集到消息,就把消息抛到消息队列里面去,(因为我们系统只有逻辑任务采用消息,界面任务是没有消的),当检查到消息系统先把界面任务相应的数据保存到界面栈里面去,再把界面任务切换成逻辑任务去执行,执行完逻辑任务没有消息了再切换到界面任务,并把逻辑函数处理的数据拿到界面来显示。而这个采集到的数据进行处理(数据处理和图形处理,控件处理等是在中间件GUI进行的)。以上就我们整个系统大致运行的状态,简单的说:msOS这个系统有两个任务,主要的的工作就是两个任务间的切换,一个任务的作用是实时的检测文件等并处理,一个是拿来解析检查到的数据等并显示。
以上有哪些讲得不清楚或不对的地方,请大家指出来我们一起学习一起进步,最后再次感谢凤舞天俩个多星期来的授课。
文章评论(0条评论)
登录后参与讨论