77范文网 - 专业文章范例文档资料分享平台

ucos-II消息队列处理多按键_--_适合初学者

来源:网络收集 时间:2019-03-28 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

2011-08-24 17:36

ucos-II消息队列处理多按键

上一次采用信号量的方式处理一个按键,采用发送和等待信号量的方式来实现该按键的扫描。但是如果系统有多个按键需要处理呢?是否还可以用信号量呢?当然其实也可以的,多个按键就创建对个信号量呗!这样处理可是可以,不过很繁琐。本文介绍另外一种处理方案:采用消息队列的方式。将每一个按键对应一条消息,当某个按键按下时,就发送该按键的消息到消息队列:OSQPost(KeyQEvent, Qmsg_KA);然后在按键处理任务重一直调用q_keymsg =

(INT8U*)OSQPend(KeyQEvent,10,&err);读取消息队列,也就是判断该函数的返回值是否是按键消息Qmsg_KA,如果是则相应,如果不是则延时任务。 /*消息队列相关变量定义初始化

-------------------------------------------------*/

OS_EVENT *KeyQEvent; /*定义消息队列的事件控制块,用于接收消息队列返回值,如果消息队列

创建成功,则返回一个指针,这个指针用于以后对消息队列的操作

因此,该指针可以看做是相应消息队列的句柄。

QEvent = OSQCreate(&Qstart[0],10); */

INT8U err; /*定义消息队列的错误变量 OSQPend(QEvent,2000,&err);接收消息等待错误*/

void *Qstart[10]; /*定义消息队列的指针数组,可容纳10则消息*/ INT8U *Qmsg_KA = \定义一则消息,*/ INT8U *Qmsg_KB = \定义一则消息,*/

KeyQEvent = OSQCreate(&Qstart[0],10); /* 创建一个消息队列,可容纳10则消息*/

void TaskKeyScan(void * pdata)/*按键扫描任务*/ {

INT8U KeyAState; INT8U KeyBState;

INT8U keyA_release = 0; INT8U keyB_release = 0;

pdata = pdata; for(;;) {

OSTimeDlyHMSM(0,0,0,50);

KeyAState = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13); /* 按键按下返回 0 */

KeyBState = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2); /* 按键按下返回 1 */

/*按键KEYA有效--------------------*/ if (KeyAState == 0) {

OSTimeDlyHMSM(0,0,0,20);/*20ms去抖动*/

KeyAState = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13); if (KeyAState == 0) {

keyA_release = 1; } }

if (KeyAState == 1 && keyA_release == 1) /* 本次按键有效 */ {

OSQPost(KeyQEvent, Qmsg_KA); /*发送按键KEYA被按下消息*/ keyA_release = 0; /* 按键释放标识清除 */ printf( \ }

/*按键KEYB有效---------------------*/ if (KeyBState == 1) {

OSTimeDlyHMSM(0,0,0,20);

KeyBState = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2); if (KeyBState == 1) {

keyB_release = 1; } }

if (KeyBState == 0 && keyB_release == 1) /* 本次按键有效 */ {

OSQPost(KeyQEvent, Qmsg_KB);/*发送按键KEYB被按下消息*/ keyB_release = 0; /* 按键释放标识清除 */ printf( \ }

} }

void TaskLed(void * pdata)/* 按键相应任务*/ {

INT8U *q_keymsg; pdata = pdata;

for(;;) {

q_keymsg = (INT8U*)OSQPend(KeyQEvent,10,&err);/*扫描消息队列*/ if(err == OS_NO_ERR) {

if(q_keymsg == Qmsg_KB)/*如果按键B被按键,则相应相关处理函数*/ {

LED4_TOGGLE(); Num ++; }

else if(q_keymsg == Qmsg_KA) /*如果按键A被按键*/ {

LED4_TOGGLE(); Num --; } } } }

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库ucos-II消息队列处理多按键_--_适合初学者在线全文阅读。

ucos-II消息队列处理多按键_--_适合初学者.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/550789.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: