《实用单片机系统MS3分析.ppt》由会员分享,可在线阅读,更多相关《实用单片机系统MS3分析.ppt(32页珍藏版)》请在三一办公上搜索。
1、实用单片机系统MS3,程序分析作者:闫瑶,目录:1.MS3简介 2.MS3程序架构分析3.思想总结,MS3简介,1.平台化 MS3是一个注重于基础与实用,为使用者提供必要和通用的各种函数,软件架构清晰,完全开源的软件平台。这个平台让开发者基于一定的基础上进行开发,便于使用者快速且高效的完成各种不同的项目。,2.资源概况 MS3致力于简洁、实用的软件架构。数据封装格式上普遍采用枚举与结构体,清晰明了,便于阅读;采用动态灵活的指针结构,节省系统空间,简化程序;采用16进制的消息处理机制;独特的软件定时器设计;具有统一和标准化的按键处理机制。,3.进版说明 相比前两个版本,MS3在消息机制上有改进,
2、采用16位结构;软件定时器上有了比较大的改进,采用回调函数形式,并且支持中断内回调和中断外回调;去掉了很多具体的应用,留下一个内核可以适用于一个最小系统。,MS3程序架构分析,MS3这个平台的核心在于“消息机制”。从主程序Main()的结构可以看出,初始化init_process()之后程序即进入大循环,在这个循环体中进行的是两种操作:取消息和根据消息类型选择待执行的程序分支。MS3平台架构的核心内容是其“消息机制”的处理,但其特色不仅仅于此。介绍完消息机制后,我们会介绍“软件虚拟定时器”的原理及使用。,主程序main()结构:,目前程序中通过枚举方式定义了如下消息类型:MSG_NULL-/*
3、have no message*/MSG_KEY-/*key message*/MSG_UART-/*uart message*/MSG_RTC-/*real time counter message*/MSG_MSTIMER-/*timer message*/MSG_TEST-/*special for test message*/程序进入循环体后,首先通过MSG_GET_MSG(&Msg)读取消息,然后根据消息类型选择程序分支。可以看出MS3消息机制的结构很清晰,程序的执行即通过该消息机制。,MS3中定义队列 u16MsgArrayMSG_ARRAY_SIZE 来存放消息,消息被定义为U1
4、6数据类型,高8位存放消息类型,低8位存放消息值。入消息和取消息 从主程序段中看出,针对消息队列的操作主要是取消息动作,那下面看一下MS3中对入消息和取消息分别是怎么操作的。整体来说,入消息时将消息类型及消息值分别入队列;取消息则取出数据类型为16位的消息。,入消息:,首先判断消息队列是否已满。若满则返回;未满则保存当前中断使能状态,同时关中断。将消息类型(MsgType)、消息值(Val)分别入队列。开中断。,取消息#define MSG_GET_MSG(pU16)msg_get_out(pU16),从宏定义可以看出,主程序中取消息动作即是通过左边的函数执行的。取消息时首先判断队列是否为空。
5、为空则返回0 x0000;不为空则保存中断使能状态,并且关中断。取出数据类型为pU16的消息。恢复中断使能状态,返回。,消息机制的执行 结合入消息和取消息,我们可以这样理解Main()内循环体的执行状况。首先,向u16MsgArray内取消息,分支选择语句switch(MSG_TYPE(Msg)则提取出消息的消息类型,根据不同类型执行相应程序分支,其中也包括队列中无消息时对应的消息类型MSG_NULL。因为当队列中消息时的返回值为0 x0000,故执行MSG_NULL分支。,时钟节拍的引入 以上了解到消息机制的执行状况,但在程序初始化之后,消息队列是默认为空的。这样,虽然循环体内一直会取消息并
6、判断消息类型,但将始终执行MSG_NULL程序段。那么MS3是如何执行我们需要执行的任务的呢?那就是前面提到的入消息。现在我们来看看哪些地方,我们进行入消息的操作了。在这之前我们要介绍一下MS3的系统时钟节拍。,时钟节拍 MS3以T2为硬件定时器,具有较高的优先级,整个系统必须依赖它来运行。按键检测,软件虚拟定时器,例行任务程序都要靠它来实现。T2作为系统时钟,20ms进入一次中断,中断内调用timer2_process(),因此系统时钟节拍为20ms。这样每次系统时钟节拍到了之后,程序进入timer2_process()。此进程中,首先检测是否有软件虚拟定时器(后续将详细介绍)在工作,若有则
7、进入软件定时器服务程序;若无则运行例行任务程序。,例行任务程序,例行任务程序中包括:key_check()键盘例行程序和rtc_soft_routine()实时时钟例行程序。在这两个例行程序中均有:MSG_SEND_MSG()这个函数,这就是前面提到的入消息操作。既然有入消息操作了,那么主程序循环体中的取消息操作就将取到当前消息队列中的消息。并按需求执行相对应的程序段。,消息机制小结 前面针对消息机制,分析了程序的执行过程。在这里将前面提到的内容做个归纳。程序开始运行后,首先执行初始化操作,包括:端口初始化、中断初始化、FLASH初始化、实时时钟初始化等等,其中包括最重要的系统时钟初始化tim
8、er0_init()。初始化完毕后,MS3进入消息机制管理阶段,此阶段程序循环向u16MsgArray 内取消息,将取出的消息通过MSG_TYPE()得到消息类型,在分支选择语句中根据消息类型执行相应程序段。以上消息机制一直循环贯穿于整个系统的运行中。,除了不断循环的消息机制管理外,那就是例行任务程序以系统节拍为周期,根据需要向消息队列中送人待执行的消息。这样,MS3在程序前后台两方面的配合下,通过消息机制正常运转。,软件虚拟定时器 本文档开始的时候,我们提到过“软件虚拟定时器”这个名词,那么它有什么作用,并且如何使用呢?下面这部分就将详细介绍-软件虚拟定时器。*在初读MS3,还没有完全理解软
9、件虚拟定时器作用的时候,感觉它没什么特别的地方,但一旦后来理解其含义时,才感觉它是很有意思的一个东西。,软件虚拟定时器的引入 现在理解“软件虚拟定时器”之后,感觉作者在MS2程序分析中举的“闹钟”的例子是很恰当的,并且利于初学者对其概念进行理解。首先我想说说平时我们使用闹钟的目的。假设一个电子表有闹钟的功能,我们使用闹钟就是想在我们定的一段时间之后得到提醒,在定好时间之后,我们就不愿意时时刻刻的去查看定时的时间是否要到了,希望电子表能自动提醒我们。同时在这段时间之内我们还想让电子表正常提供显示时间的功用。,在MS3中使用软件虚拟定时器也是一样的目的,我们想要一个任务在一定时间之后被执行,在我们
10、定好时间之后我们又不愿去管理它,那么虚拟时钟管理程序就会在定时时间到了的时候,自动将待执行的程序加入的MS3的消息机制执行。这就是MS3的另一特色。以上是从思想和概念上向大家介绍“软件虚拟定时器”,接下来我们看看MS3中软件虚拟定时器是如何具体操作的。,软件虚拟定时器的建立,现在分析一下 U8 MSTimerStart()这个函数。一旦有类似于前文提到的”闹钟”程序要执行,则要通过该函数建立一个软件虚拟定时器。程序开始首先要检查MSTimerID这个参数,以便确认当前有几个虚拟定时器正在被使用。一旦查找到尚空闲的虚拟定时器,则在对应位置上向MSTimerArrayi.delay和MSTimer
11、Arrayi.pCallBack中存入所需延时的时间和待执行函数的函数指针。,找到这个空闲的位置,并且存入相应参数后,通过SETBIT(MSTimerID,i)将当前空闲位置1,表明此处已使用虚拟定时器,并通过return(i)返回。*MS3中允许用户最多建立八个软件虚拟定时器。,软件虚拟定时器服务程序 一旦建立软件虚拟定时器后,参数MSTimerID将为非零,表明当前有虚拟定时器工作。那么如下timer2_process()中 if 语句将满足“MSTimerID0”的条件,这样MSTimerService()将会被调用。,当有软件虚拟定时器工作时,一旦系统时钟节拍到时,则调用MSTimer
12、Service()服务程序。程序中对定时器参数MSTimerID从低位开始检测,若判定当前位有虚拟定时器工作,并且定时时间未到,则将定时时间减1,然后循环检测下一位,直到当前位无虚拟定时工作为止。在检测过程中,当某个虚拟定时器定时时间到了之后,则根据该虚拟定时器被建立时MSTimerMode的设定值,为1则将消息类型MSG_MSTIMER及待执行函数的函数地址均入消息队列;为0则在中断中执行对应的函数。然后清除该虚拟定时器对应的参数MSTimerID。,以上为一个系统时钟节拍所执行的操作。达到的效果是每个虚拟定时器的定时时间都减1。在若干个时钟节拍之后,若无新的虚拟定时器被建立,则所有虚拟定时
13、都将执行完毕。,通过以上介绍,应该可以知道虚拟定时器服务程序的目的。它是将建立的需要延时一定时间之后再执行的程序,在定时时间到达后将其加入到消息队列中。由主程序的消息机制来管理,以达到执行相应程序的目的。这就是MS3中消息机制和软件虚拟定时器的关系。另外,软件虚拟定时器可以实现嵌套,即软件定时器里可以嵌套新的软件定时器。,按键处理机制 MS3中包含统一和标准化的按键处理机制。按键处理程序包含在例行任务中,每个系统节拍 到时都会进行按键检查。由于以20ms的系统时钟为执 行周期,故我们常遇到的“20ms按键去抖”处理可以在 MS3中有较好的处理。MS3有两种按键处理风格,一种针对PC机制,另一种
14、针对MCU机制,在预处理阶段用户可对这两种风格进行选择。下面以PC风格的具体例程看一下MS3的按键处理机制。,每个MS3系统时钟节拍内都会执行key_check()。首先,检查按键使能是否打开,未开则返回;然后,读取按键返回信息,若无按键操作,则返回,故不会浪费系统资源;若有按键,则按键计数器keycounter+,当满足短按键操作条件,且非误操作,则将按键消息入消息队列;当满足长按键操作条件,同样将按键消息入消息。按键处理中加入“用于连续两个按键速度过快导致按键混乱”的处理机制,保证按键处理可靠。,到此,MS3的程序架构可以说简单的分析完毕了。,我是一名单片机程序的初学者,初次接触MS3时感
15、觉很有压力,这么“复杂”的程序不知什么时候才能够搞明白。因为初次接触,一开始读的时候有些吃力,边学边读,时间不是很长,花了半天时间就读完了,虽然没有理解其真正的思想,但毕竟有了一个初步的了解。在这个过程中,将自己理解的东西都记录下来了。因为不是很明白,所以接着进行第二次阅读,这次时间反倒长了一些,针对自己不理解的地方,详细分析程序语句,以便了解作者的意图。这样,在第二次学习之后基本掌握了MS3的设计思想。这时反过来看第一次做的笔记,发现有很多错误,但这样通过对照更强化了理解。,思想总结,因为自己水平有限,不会仅仅读两边就能完全领悟MS3的思想,但我感觉它是一个简洁、实用的平台,很容易理解、学习和使用。就像MS3作者所说:“初学单片机并且想更上一层楼的,或者有些基础,想减少工作量的。”都可以来学习MS3。,