利用Small RTOS51实时操作系统实现多任务串行通信系统的设计

引言
在简单的单片机应用系统中 , 前/后台系统被广泛应用 。其中应用程序是一个无限循环 , 循环中调用相应的函数完成相应的操作 。这部分可以看作后台行为 , 也称为任务级;中断服务程序处理异步事件 , 可以看作前台 , 也叫中断级 , 时间相关性很强的操作靠中断服务程序来保证 。中断服务程序提供的信息一直要等到后台程序运行到该处理这个信息时才能得到处理 , 最坏情况下 , 响应时间等于整个循环的执行时间 。随着单片机应用系统的复杂化 , 前/后台系统已不能满足系统实时性的要求 , 这就需要一个嵌入式的实时操作系统来管理和协调多个任务和中断 。
目前在单片机上运行的实时多任务操作系统主要有μC/OS、RTX51 Full和RTX51 Tiny 。μC/OS是Jean J.Labrosse先生编写的源码开放的实时内核 , 可适用于8/16/32位的单片机、ARMDSP等微控制器和微处理器 , 在诸多领域得到广泛应用 。但是μC/Os实时操作系统规模较大 , 相对于处理能力有限的单片机来说有些勉强 , 并且大多需要外扩RAM运行 , 这给应用系统软硬件设计都带来不便 。RTX51是德国Keil公司开发的一种小型的专门应用于McS-51系列单片机的实时多任务操作系统 , 它有RTX51 Full和RTX51 Tiny两个版本 。RTX51 Full无源码 , 自身代码有6 KB多 , 运行时需要大量的外部RAM , 不利于学习和使用;RTX51 Tiny较为简单 , 但是任务没有优先级和中断管理 , 很多时候并不实用 。SmallRTOS51是陈明计先生为51系列单片机编写的源码公开的实时操作系统 , 支持任务优先级和中断管理 , RAM需求量小 , 非常适合在单片机上运行 。本文将在简要介绍Small RTOS51实时操作系统的基础上 , 结合具体应用实例详细说明Small RTOS51环境下的多任务串行通信 。
1 Small RTOS51简介
Small RTOS51嵌入式实时操作系统具有以下特点:
①公开源代码 , 任何人都可以免费获取 。
②可移植、可固化 , 虽然是为51系列单片机编写 , 但是比较容易移植到其他MECU上 , 并可以固化到产品中 , 成为产品的一部分 。
③占先式 , 支持16个优先级不同的用户任务以抢占式运行 。
④中断管理 , 系统支持中断管理功能 , 中断嵌套层数可达255层 。
⑤RAM需求量小 , Small RTOS51为小RAM系统设计 , 128个RAM单元就可以运行 。通常单片机不需要外扩RAM就能运行Small RTOS51实时操作系统 。
下面简要介绍Small RTOS51的任务管理和任务间的通信与同步 。
1.1 Small RTOS51的任务管理
Small RTOS51实时操作系统中 , 任务必须是一个无限循环 , 每个任务必须赋予不同的优先级 , 优先级数值越小 , 优先级越高 。在任意时刻 , 任务的状态必处于以下4 种状态之一:
①运行 , 任务获得CPU后开始执行;
②就绪 , 任务只等待系统分配CPU资源;
【利用Small RTOS51实时操作系统实现多任务串行通信系统的设计】 ③等待或挂起 , 任务因等待时隙、信号量或者消息等资源而被阻塞;
④被中断态 , 发生中断时 , CPU提供相应中断服务 , 原来正在运行的任务暂不能运行 , 就进入了被中断态 。
系统中任务状态的转换关系如图1所示 。

利用Small RTOS51实时操作系统实现多任务串行通信系统的设计
文章插图
1.2 Small RTOS51中任务间的通信与同步
Small RTOS51中 , 任务间的通信与同步主要有两种方式:信号量和消息队列 。
信号量由两部分组成:一个是信号量的计数值 , 它是一个8位无符号的整数;另一个是由等待该信号量的任务组成的等待任务表 , 所有对信号量的访问都必须通过信号量索引来实现 。信号量索引是一个0到OS_MAX_SEMS-1的数值 , 其中OS_MAX_SEMS为用户自定义的最大信号量数目 。
消息队列实际上是一个8位无符号的字节变量数组 。向队列发送一个消息 , 实质上是将O~255之间的一个数值存储到消息队列中;从消息队列中获得一个消息就是获取一个O~255之间的数值 。
2 多任务串行通信研究
下面以一个应用实例详细说明Small RTOS51环境下包含多任务的串行通信 , 该应用的硬件设计以NXP公司的P89V51RD2单片机为核心 , 包含了键盘电路看门狗电路和显示电路等几个部分 。硬件设计简图如图2所示 , 主要完成以下功能:从串口接收数据 , 经P89V51RD2单片机处理 , 并通过I2C总线输出到由LED发光二极管与 8574T组成的显示电路 , 由P89V51RD2扫描键盘 , 检测到按键被按下时 , 进行相应的处理并生成一串命令数据通过串口向远端发送 。

利用Small RTOS51实时操作系统实现多任务串行通信系统的设计
文章插图
2.1 多任务的实现
根据所要完成的功能 , 系统可由1个串口中断服务程序和4个用户任务来实现:
串口中断服务程序 , 当数据到达串口接收缓冲区并产生中断时 , 该中断服务程序负责从接收缓冲区读取数据 , 并加入用户自定义的接收缓冲队列 。若完整地接收了一个数据包 , 则向数据处理任务发送信号量 , 表明有数据包等待处理 , 否则中断服务程序结束 。串口中断下次到来时 , 继续由该中断服务程序接收串口数据 。数据处理任务 , 执行时首先无限期等待中断服务程序发送信号量 , 成功获取信号量后 , 从自定义的接收缓冲队列中取出数据包进行数据解码 , 并通过I2C总线发送数据到显示电路 。
看门狗任务 , 每次运行都反转单片机P89V51RD2输出到看门狗电路的I/O引脚电平(喂看门狗) , 表明P89V51RD2内部程序正常运转 , 以确保看门狗电路不会将P89V51RD2复位 , 然后使本身进入等待状态 , 等待时间到后再次运行 。
键盘扫描任务 , 负责扫描键盘电路 , 检测是否有按键被按下 , 若检测到某一按键被按下 , 则获取键值 , 并发送消息给按键处理任务 。
按键处理任务 , 执行时首先无限期等待按键扫描任务发送消息 , 成功获取消息后 , 根据按键值(消息内容)和当前系统状态生成一串命令数据 , 通过串口向远端发送 。
系统中程序的执行顺序如图3所示 。首先从主程序即main()函数开始执行 , 在main()函数中完成SmallRTOS51实时操作系统、系统定时器、串口、消息、变量和外围设备的初始化工作 , 然后创建用户任务 , 最后主程序放弃CPU资源 , 任务优先级最高的任务开始执行 。

利用Small RTOS51实时操作系统实现多任务串行通信系统的设计
文章插图
Small RTOS51实时操作系统支持16个优先级 , 0为最高优先级 , 15为最低优先级 。程序中将看门狗任务置为最高优先级 , 因为它必须定期向看门狗电路输出喂狗信号 。将它置为最高优先级 , 使其优先运行 , 可以保证单片机P89V51RD2不会被看门狗电路复位 。为了能及时处理串口中断服务程序读取的数据包 , 数据处理任务也应当具有比较高的优先级 。同样 , 在检测到有按键被按下时 , 考虑到按键处理的实时性 , 也不能将按键处理任务的优先级设得太低 。可以将键盘扫描任务置为最低优先级 , 当没有数据到达串口 , 在看门狗任务运行的间隙 , 键盘扫描任务一直运行 , 一旦检测有按键被按下 , 立即发送消息给按键处理任务 , 按键处理任务获得消息后解除挂起状态 , 抢占CPU资源开始运行 。因手工连续按下两次按键的时间间隔远大于按键处理任务进行一次数据处理的时间 , 故而这样的优先级设置既保证了键盘操作能及时被处理 , 又不影响检测连续的键盘操作 。
2.2 任务间的通信与同步
应用中 , 串口中断服务程序与数据处理任务之间、键盘扫描任务与按键处理任务之间都需要进行同步和通信 , 前者使用信号量进行同步和通信 , 后者使用消息 。
串口中断服务程序接收到一个完整的数据包后 , 发送一个信号量给数据处理任务 , 因等待信号量而处于挂起状态的数据处理任务获得信号量后 , 立即从用户自定义的接收缓冲队列取出数据包进行处理 。键盘扫描任务检测到按键被按下时 , 进行去抖动处理并获取键值 。然后 , 以键值作为消息内容 , 发送消息给按键处理任务 。因等待消息而挂起的按键处理任务取得消息后 , 根据消息内容(键值)和当前系统状态 , 生成一串命令数据并通过串口向远端发送 。
结语
本文举例说明了Small RTOS51环境下包含多任务的串行通信 , 重点叙述了多任务的执行过程和任务间的同步与通信 。该应用系统经过较长时问的测试 , 没有发生数据到达串口时因没能及时处理而被后来到达的数据覆盖而造成丢失的情况 , 也没有发生按下按键时不能及时处理的情况 , 应用系统的可靠性和实时性要求均可满足 。
Small RTOS51是一个占用系统资源极小的嵌入式实时操作系统 , 可以应用在绝大多数单片机上 , 而且移植过程简单 。使用它开发基于单片机的多任务应用系统 , 可以较大地缩短开发周期 。
责任编辑:gt

    推荐阅读