论文部分内容阅读
由于体积、功耗、成本等方面的因素,嵌入式系统不能使用一些性能优异的设备,通常嵌入式系统的处理器的运算能力有限,存储器的容量也偏小,嵌入式面对的应用场景有资源受限和实时性高两大特点。随着实际应用变得越来越复杂,在裸机上直接开发程序变得不再适用,嵌入式操作系统由于它的高效性而慢慢成为了解决这一问题的有效方法。传统的顺序型编程方式是困难的,会带来处理多个任务时引起的多线程之间的数据互斥和共享的问题,并且在等待当前事件时,就不能对其它事件起反应,陷入忙等待状态。事件驱动编程模型可以有效的解决这种问题。本文针对事件驱动编程范式,提出了快速的层次状态机的实现方法,并且提供了状态机运行所需的上下文和事件队列,基于事件优先级的事件驱动框架。本文分别研究了传统的嵌入式实时多任务操作系统μC/OS-II和基于状态机,事件驱动型的软件框架QP,并对比分析了这两种基于截然不同编程理念的系统之间的区别。事件驱动型系统中的任务是运行到完成的,不需要任务间的切换时上下文的保存与恢复,提高了响应速度,并且只需要一个堆栈,减少了RAM的消耗,从理论上确定了事件驱动编程的优势。状态机是众所周知的实现对事件做出实时响应的事件驱动型系统的方法。在以事件的最快响应速度为前提的基础上,提出了快速的层次状态机的实现方法,状态直接表示成状态处理函数,同时将状态切换过程硬编码到状态处理函数中,适用于实时性高,状态拓扑简单的情况。本文提供的事件驱动框架具有控制反转、单堆栈、基于事件优先级等特点。调度策略参考传统操作系统对中断的处理流程,事件(中断)具备优先级而任务(中断处理程序)不具备优先级的概念。内部的核心数据结构有:事件控制块类HEP_ECB,事件池类HEP_Evt Pool,事件帮助类HEP_ECBHelper,事件池帮助类HEP_Evt Pool Helper,状态机基类HEP_AO。事件的调度借鉴μC/OS-II操作系统,实现了O(1)时间复杂度查完成最高优先级事件的查找。最后,本文开发了一个基于本框架的事件驱动应用程序,在Arduino上搭建了一个的服务器,用户可以在网页端控制与Arduino相连的设备。验证了框架的可行性。