



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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_
4、ARRAY_SIZE 来存放消息,消息被定义为U16数据类型, 高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()这个函数,这就是前面提到的入消息操作。 既然有入消息操作了,那么主程序循环体中的取消息操作就将取到当前消息队列中的消息。并按需求执行相对应的程序段。 消息机制小结 前面针对消息机制,分析了程序的执行过程。在这里将前面提到的内容做个归纳。 程序开始运行后,首先执行初始化操作,包括:端口初始化、中断初始
8、化、FLASH初始化、实时时钟初始化等等,其中包括最重要的系统时钟初始化timer0_init()。 初始化完毕后,MS3进入消息机制管理阶段,此阶段程序循环向u16MsgArray 内取消息,将取出的消息通过MSG_TYPE( )得到消息类型,在分支选择语句中根据消息类型执行相应程序段。以上消息机制一直循环贯穿于整个系统的运行中。 除了不断循环的消息机制管理外,那就是例行任务程序以系统节拍为周期,根据需要向消息队列中送人待执行的消息。 这样,MS3在程序前后台两方面的配合下,通过消息机制正常运转。 软件虚拟定时器 本文档开始的时候,我们提到过“软件虚拟定时器”这个名词,那么它有什么作用,并且
9、如何使用呢?下面这部分就将详细介绍 -软件虚拟定时器。 *在初读MS3,还没有完全理解软件虚拟定时器作用的时候,感觉它没什么特别的地方,但一旦后来理解其含义时,才感觉它是很有意思的一个东西。 软件虚拟定时器的引入 现在理解“软件虚拟定时器”之后,感觉作者在MS2程序分析中举的“闹钟”的例子是很恰当的,并且利于初学者对其概念进行理解。 首先我想说说平时我们使用闹钟的目的。假设一个电子表有闹钟的功能,我们使用闹钟就是想在我们定的一段时间之后得到提醒,在定好时间之后,我们就不愿意时时刻刻的去查看定时的时间是否要到了,希望电子表能自动提醒我们。同时在这段时间之内我们还想让电子表正常提供显示时间的功用。
10、 在MS3中使用软件虚拟定时器也是一样的目的,我们想要一个任务在一定时间之后被执行,在我们定好时间之后我们又不愿去管理它,那么虚拟时钟管理程序就会在定时时间到了的时候,自动将待执行的程序加入的MS3的消息机制执行。这就是MS3的另一特色。 以上是从思想和概念上向大家介绍“软件虚拟定时器”,接下来我们看看MS3中软件虚拟定时器是如何具体操作的。 软件虚拟定时器的建立现在分析一下 U8 MSTimerStart( ) 这个函数。 一旦有类似于前文提到的”闹钟”程序要执行,则要通过该函数建立一个软件虚拟定时器。程序开始首先要检查MSTimerID这个参数,以便确认当前有几个虚拟定时器正在被使用。一旦
11、查找到尚空闲的虚拟定时器,则在对应位置上向MSTimerArrayi.delay和MSTimerArrayi.pCallBack中存入所需延时的时间和待执行函数的函数指针。找到这个空闲的位置,并且存入相应参数后,通过SETBIT(MSTimerID, i)将当前空闲位置1,表明此处已使用虚拟定时器,并通过return(i)返回。 *MS3中允许用户最多建立八个软件虚拟定时器。 软件虚拟定时器服务程序 一旦建立软件虚拟定时器后,参数MSTimerID将为非零,表明当前有虚拟定时器工作。那么如下timer2_process( )中 if 语句将满足“MSTimerID0”的条件,这样MSTimer
12、Service( )将会被调用。 当有软件虚拟定时器工作时,一旦系统时钟节拍到时,则调用MSTimerService( )服务程序。程序中对定时器参数MSTimerID从低位开始检测,若判定当前位有虚拟定时器工作,并且定时时间未到,则将定时时间减1,然后循环检测下一位,直到当前位无虚拟定时工作为止。 在检测过程中,当某个虚拟定时器定时时间到了之后,则根据该虚拟定时器被建立时MSTimerMode的设定值,为1则将消息类型MSG_MSTIMER及待执行函数的函数地址均入消息队列;为0则在中断中执行对应的函数。然后清除该虚拟定时器对应的参数MSTimerID 。 以上为一个系统时钟节拍所执行的操作
13、。达到的效果是每个虚拟定时器的定时时间都减1。在若干个时钟节拍之后,若无新的虚拟定时器被建立,则所有虚拟定时都将执行完毕。 通过以上介绍,应该可以知道虚拟定时器服务程序的目的。 它是将建立的需要延时一定时间之后再执行的程序,在定时时间到达后将其加入到消息队列中。由主程序的消息机制来管理,以达到执行相应程序的目的。 这就是MS3中消息机制和软件虚拟定时器的关系。 另外,软件虚拟定时器可以实现嵌套,即软件定时器里可以嵌套新的软件定时器。 按键处理机制 MS3中包含统一和标准化的按键处理机制。 按键处理程序包含在例行任务中,每个系统节拍 到时都会进行按键检查。由于以20ms的系统时钟为执 行周期,故
14、我们常遇到的“20ms按键去抖”处理可以在 MS3中有较好的处理。 MS3有两种按键处理风格,一种针对PC机制,另一种针对MCU机制,在预处理阶段用户可对这两种风格进行选择。下面以PC风格的具体例程看一下MS3的按键处理机制。 每个MS3系统时钟节拍内都会执行key_check()。 首先,检查按键使能是否打开,未开则返回;然后,读取按键返回信息,若无按键操作,则返回,故不会浪费系统资源;若有按键,则按键计数器keycounter+,当满足短按键操作条件,且非误操作,则将按键消息入消息队列;当满足长按键操作条件,同样将按键消息入消息。 按键处理中加入“用于连续两个按键速度过快导致按键混乱”的处理机制,保证按键处理可靠。 到此,MS3的程序架构可以说简单的分析完毕了。 我是一名单片机程序的初学者,初次接触MS3时感觉很有压力,这么“复杂”的程序不知什么时候才能够搞明白。因为初次接触,一开始读的时候有些吃力,边学边读,时间不是很长,花了半天时间就读完了,虽然没有理解其真正的思想,但毕竟有了一个初步的了解。 在这个过程中,将自己理解的东西都记录下来了。因为不是很明白,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 跃层楼梯出租合同协议
- 物资需求协议书
- 合同中账务管理制度
- 四商铺装饰装修服务协议
- 业务代理与经销合同协议书
- 劳务分包合同消防
- 灭鼠灭蟑协议书
- 软件人员租赁合同协议
- 越野摩托采购合同协议
- 爽约处罚协议书
- 2025年钳工(技师)职业技能鉴定理论考试题库(含答案)
- 2025年小学五年体育试题及答案
- 第25课它们吃什么(教学设计)-教科版科学一年级下册
- AI与应急管理:灾害防控的新方向
- 2025届江苏省南京市建邺区重点中学中考化学模拟试卷含解析
- 二年级数学北师大版下册第七单元《淘气的作息时间》教学设计教案1
- 项目进度跟进及完成情况汇报总结报告
- DBJ50- T-445-2023建筑边坡工程监测技术标准
- 基于大数据的慢性病管理-深度研究
- 人教版数学八年级下册17.1《勾股定理》(第1课时)听评课记录
- 2025届高考英语读后续写提分技巧+讲义
评论
0/150
提交评论