当前位置:首页 > 单片机 > 单片机
[导读] Small RTOS 对RAM 需求小,非常适合单片机这类资源比较少的系统上。RTOS 具有多任务处理,较强的实时性,可裁减的内核,使得实时应用程序的设计、扩展和维护变得更容易。RTOS 思想的引入,一改传统单

 

Small RTOS 对RAM 需求小,非常适合单片机这类资源比较少的系统上。RTOS 具有多任务处理,较强的实时性,可裁减的内核,使得实时应用程序的设计、扩展和维护变得更容易。RTOS 思想的引入,一改传统单片机软件设计方法,使其不再是单一线程结构方式,通过应用程序分割为若干独立的任务,RTOS 使得应用程序的设计过程大为简化。本文结合基于单片机的电子存包柜的软件设计,简要分析了Small RTOS 的设计思想及消息队列通信机制的应用。

 

1. Small RTOS51 的基本原理

Small RTOS51是一个很小的内核,完全集成在KEIL C51编译器中,仅占用较少的程序存储空间,可以在没有外挂数据存储器的51单片机系统中运行。内核负责系统的初始化和开放、调度其它任务,根据各个任务的优先级,合理地在不同任务之间分配CPU 的时间,内核一般都能提供任务调度和中断服务等功能。把一道程序和一个任务对应,把任务中的每个分开的、独立执行的部分称之为线程。所有的事件驱动和时间驱动都体现在设置相应的任务标识和线程标识。当硬件环境一定时,依据这些标识,通过安排系统内中断响应方式和调整任务调度算法,采用设置环境变量的方法,使中断退出后可以任意返回到多个设置入口中的某一个去执行,有效地解决了前台和后台任务线程的灵活切换这一关键问题。Small RTOS 51 的用户任务具有运行态、就绪态、等待和挂起、中断服务程序。任何一个时刻,任务的状态就是这四种状态之一。为了节省内存,OS 不能动态的建立和删除任务,用函数OSSTART()启动多任务环境后,OS 就把所有的任务建立起来,并把它们设为就绪状态,开始运行优先级最高的任务。只有当所有的优先级高于它的任务转为等待时。就绪的任务才能进入运行状态。调度程序将“任务就绪表”中的最高优先级别的任务作为下个要执行的任务。

任务调用 os_wait 函数,挂起当前任务,等待一个或几个间隔(K_IVL)、超时(K_TMO)、信号(K_SIG)事件。如果所等待的事件已经发生,继续执行当前任务;如果所等待的事件没有发生,则置相应的等待标志后,挂起该任务,转任务切换程序段切换到下一任务。

Small RTOS51 通过执行函数init ( )来给寄存器赋初值,调用函数OSSTart ( ) 来初始化每一个任务的堆栈并执行第一个任务,而选择第一个任务执行的理由是该任务的优先级别。在选择过程中就完成了任务的调度。

1.1 任务之间的通讯

任务之间的通讯采用消息队列,经过3步:创建消息队列OSQCreate(),向消息队列发消息OSQPost(),取消息OSQPend()。调用OSQPost ( )函数发送消息时,如果已经有任务在等待该消息,则立即转向等待该消息的任务,如果消息队列已满,则无法传递该消息,返回一个错误信息。如消息队列未满,同时也没有其他任务等待该消息,则入列。值得注意的是,当队列满时,该函数并不挂起当前任务,因此调用该函数的任务应当判断返回条件,如果消息满,则应挂起当前任务。接收消息时,如果消息队列空,则取消息的任务将挂起,直到该消息队列中有消息时才会继续执行。

2. 应用实例

2.1 硬件平台

以应用在大型超市、书店的电子式存包柜为例,系统框图如下

该电子存包柜可以控制的最大货物存储箱数为 32 个,分左右各16 个箱子,上图只画出16 路控制。控制芯片采用AT89C55 单片机,配有实时时钟模块、条码读入器、液晶显示模块、热敏打印机组成,设计为三块PCB板。

1 主控板,进行用户的存包和取包人机交互,保存存包密码,显示用户取*程中的密码输入以及全部32 个存包箱的状态。

2 门控制板由三部分组成,第一部分箱内物品检测,包含16 路红外线检测输入、16 路红外发射控制驱动。第二部分16 路继电器控制,开箱控制由16 个小直流电机构成16 个箱子的开门控制。第三部分箱门状态检测,检测16 个箱门的开/关。

3 存取包的条码打印、语音提示,整个系统由 4 个单片机配合工作,主控单片机管理存包用户的操作并记录其历史参数,然后向从单片机发出指令,分配空箱并打印输出存包条,给用户。

 

2.1 软件设计

电子存包柜主要包括按键处理、显示处理、通讯处理等模块,由中断处理条码读入和串口通讯。因此,可以把任务分为按键显示、接收数据、命令处理、发送数据等4 个任务。

以主控单片机1 接收用户按存包输入密码、键值处理、密码显示及箱子状态显示、发送开箱命令为例,说明主体设计思想。

 

主程序进行系统初始化以后,调用函数OSStart()设置多任务环境,为每一个任务建立任务堆栈,顺序建立了4 个任务,等待相应任务的唤醒。用户只需把自己想要实现的功能定义为任务,在cONfig.h 中声明任务函数名和它的优先级,并且编写好自己的代码段就可以了,完全没有了传统编程下的那种上下调用的关系,系统会自动运行代码。Small RTOS51 的移植主要是要配置OS_CPU.H、OS_CFG.H 和CONFIG.H 三个文件,其中OS_CFG.H 文件主要用于对操作系统的裁减和时钟等的相关配置。

在 CONFIG.H 文件中定义4 个任务

#ifndef …..

…………

#endif

 

 

 

 

 

 

 

 

限于篇幅,向单片机2、3 的发送及接收单片机2 数据的程序略

4.结论

采用实时多任务操作系统使得编程效率更高、维护及修改也更方便,所以目前得到广泛应用,尤其是在嵌入系统中。在低端的51 单片机应用领域,利用实时多任务操作系统的思想,采用Small RTOS 多任务平台进行系统应用设计及改进,同样也有现实意义。

本文创新点:将Small RTOS 多任务的思想应用在一个具体的单片机控制的电子式存包柜系统的软件设计中,介绍了基于消息队列的任务通讯的编程方法。

 

 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭