基于单片机的电子存包柜的软件设计

Small RTOS 对RAM 需求小 , 非常适合单片机这类资源比较少的系统上 。RTOS具有多任务处理 , 较强的实时性 , 可裁减的内核 , 使得实时应用程序的设计、扩展和维护变得更容易 。RTOS思想的引入 , 一改传统单片机软件设计方法 , 使其不再是单一线程结构方式 , 通过应用程序分割为若干独立的任务 , RTOS使得应用程序的设计过程大为简化 。本文结合基于单片机的电子存包柜的软件设计 , 简要分析了Small RTOS 的设计思想及消息队列通信机制的应用 。
1. Small RTOS51 的基本原理
Small RTOS51是一个很小的内核 , 完全集成在KEILC51编译器中 , 仅占用较少的程序存储空间 , 可以在没有外挂数据存储器的51单片机系统中运行 。内核负责系统的初始化和开放、调度其它任务 , 根据各个任务的优先级 , 合理地在不同任务之间分配CPU的时间 , 内核一般都能提供任务调度和中断服务等功能 。把一道程序和一个任务对应 , 把任务中的每个分开的、独立执行的部分称之为线程 。所有的事件驱动和时间驱动都体现在设置相应的任务标识和线程标识 。当硬件环境一定时 , 依据这些标识 , 通过安排系统内中断响应方式和调整任务调度算法 , 采用设置环境变量的方法 , 使中断退出后可以任意返回到多个设置入口中的某一个去执行 , 有效地解决了前台和后台任务线程的灵活切换这一关键问题 。SmallRTOS 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 多任务的思想应用在一个具体的单片机控制的电子式存包柜系统的软件设计中 , 介绍了基于消息队列的任务通讯的编程方法 。

    推荐阅读