RTOS的消息机制是任务之间传递信息的重要手段,我们来仿真试验一下SmallRTOS的消息传递。
我们建立两个任务:
任务B: 扫描按键,经过去抖动、等待按键松开,取得键值后向任务B发送消息,这里简单地把键值直接作为消息值发送。
任务A: 等待任务B发来消息,收到的以后消息, 把按键序号和键值显示出来
按键按下时,LED D7会闪一下,表示按键事件已经检测到,可以松开按键,按键松开以后才认为有效。
程序其实很简单,这里不多述,直接看源码吧。下载后解压到EX4目录。
使用消息前,os_cfg.h中要做相应的设置:
#define EN_OS_Q 1 /* 禁止(0)或允许(1)消息队列 */
#define EN_OS_Q_CHK 0 /* 禁止(0)或允许(1)校验消息队列指针 */
#define OS_Q_MEM_SEL idata /* 消息队列存储空间选择,keil c51有用,必须为idata、xdata */
/* 不是keil c51时它必须为空格 */
#define EN_OS_Q_PENT 1 /* 禁止(0)或允许(1)等待队列中的消息 */
#define EN_OS_Q_ACCEPT 0 /* 禁止(0)或允许(1)无等待的从队列中取得消息 */
#define EN_OS_Q_POST 1 /* 禁止(0)或允许(1)FIFO方式向对列发送消息
这里采用的消息队列有16个字节的长度,实际上有缓冲输入的功能。因为接收消息的任务处理时间比较快,消息队列中基本上只有一个消息,看不到消息队列排队的情况。
为了在实验中看到消息队列排队现象,在任务A中做了一个较长的延时,模拟消息处理慢的情形。仿真中,可以看到按下按键以后,显示比较迟钝(延时的原因),而所有按键会陆续显示出来(排队处理)。
另外,电路图修改了一个原来的错误:
修改2*4键盘连线(原来P24那条线漏接了)
文章评论(0条评论)
登录后参与讨论