UCOS II 消息队列学习二
来源:互联网 发布:淘宝女士运动服 编辑:程序博客网 时间:2024/04/27 21:50
今天终于利用消息队列实现了串口的映射!
要点回顾:
1.刚开始一直用消息邮箱经行映射,后来才发现消息邮箱只能发送一个指针的数据(4个字节),而消息队列可以发送N个消息邮箱的消息!
简言之,消息邮箱只能发送4个字节的数据,消息队列可以发送无限数据!
2.消息队列的发送OSQPost(MsgQueue, (void *)&txmsg[0]); 和消息队列的请求 OSQPend(MsgQueue, 0, &err);
需要放到不同的任务中,否则会出现“假死”现象
本节我建立了四个TASK来接收发送数
int main (void)
{
BSP_IntDisAll(); /* Disable all interrupts until we are ready to accept them */
OSInit(); /* Initialize "uC/OS-II, The Real-Time Kernel" */
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart(); /* Start multitasking (i.e. give control to uC/OS-II) */
}
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
// msg_key_rfid=OSMboxCreate((void*)0); //创建消息邮箱
// msg_key_rfid_gprs=OSMboxCreate((void*)0); //创建消息邮箱
// msg_key_gprs_rfid=OSMboxCreate((void*)0); //创建消息邮箱
// sem_beep=OSSemCreate(0); //创建信号量
MsgQueue = OSQCreate(&MsgQueueTbl[0], QUEUE_TABLE_SIZE); //创建消息队列
MsgQueue1 = OSQCreate(&MsgQueueTb2[0], QUEUE_TABLE_SIZE1); //创建消息队列
BSP_Init();
OS_CPU_SysTickInit(); /* Initialize the SysTick. */
OSStatInit(); //初始化统计任务.这里会延时1秒钟左右
GPRS_ON();
Start_GPRS();
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
OSTaskCreate(one_task,(void *)0,(OS_STK*)&ONE_TASK_STK[ONE_STK_SIZE-1],ONE_TASK_PRIO);
OSTaskCreate(two_task,(void *)0,(OS_STK*)&TWO_TASK_STK[TWO_STK_SIZE-1],TWO_TASK_PRIO);
OSTaskCreate(three_task,(void *)0,(OS_STK*)&THREE_TASK_STK[THREE_STK_SIZE-1],THREE_TASK_PRIO);
OSTaskCreate(main_task,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
}
void one_task(void *pdata)//PC---RFID---GPRS
{
u8 err;
char txmsg[50];
char *rxmsg;
while(1)
{
if(re_RFID)
{
re_RFID=0;
for(u16 i=0;i<20;i++)
txmsg[i]=USART_RX_BUF[i];
OSQPost(MsgQueue, (void *)&txmsg[0]);
OSTimeDlyHMSM(0,0,0,50);
}
OSTimeDlyHMSM(0,0,0,100);
}
OSTimeDlyHMSM(0,0,0,100);
}
void two_task(void *pdata)//GPRS---RFID---PC
{
u8 err;
char txmsg[50];
char *rxmsg;
while(1)
{
OSTimeDlyHMSM(0,0,0,50);
if(re_GPRS)
{
re_GPRS=0;
for(u16 i=0;i<20;i++)
txmsg[i]=GPRS_ReBuffer[i];
OSQPost(MsgQueue1, (void *)&txmsg[0]);
Clear_GPRS_ReBuffer();//清除数据很关键
}
}
OSTimeDlyHMSM(0,0,0,20);
}
void three_task(void *pdata)
{
char txmsg[50];
char *rxmsg;
u8 err;
while(1)
{
OSTimeDlyHMSM(0,0,0,50);
rxmsg = (char *)OSQPend(MsgQueue, 0, &err);
PRS_SendString(rxmsg);
OSTimeDlyHMSM(0,0,0,50);
}
}
void main_task(void *pdata)
{
char txmsg[50];
char *rxmsg;
u32 key=0;
u8 err;
while(1)
{
OSTimeDlyHMSM(0,0,0,50);
rxmsg = (char *)OSQPend(MsgQueue1, 0, &err);
RFID_SendString(rxmsg);
Clear_RFID_ReBuffer();//清除数据很关键
OSTimeDlyHMSM(0,0,0,50);
}
}
- UCOS II 消息队列学习二
- ucos-II消息队列学习笔记
- UCOS II 消息队列学习一
- uCOS-ii之消息队列
- ucos ii学习笔记3 消息队列、信号量集
- uCOS-II邮箱和消息队列
- uCOS II 消息队列的使用方法
- uCOS-II邮箱和消息队列
- uCOS-II邮箱和消息队列
- ucos-ii示例5:消息队列测试
- uCOS II 消息队列的使用方法
- ucos-ii学习笔记——消息队列的原理及使用
- ucos-ii学习笔记——消息队列的原理及使用
- Ucos学习之邮箱与消息队列
- ucos II 任务间 通信之五:消息队列1
- ucos II 任务间 通信之五:消息队列2
- ucos II 任务间 通信之五:消息队列1
- ucos II 任务间 通信之五:消息队列2
- PERL语言的子程序
- 关于UIView的autoresizingMask属性的研究
- 杭电acm2039三角形
- python正则表达式使用
- redis持久化方式
- UCOS II 消息队列学习二
- SSH框架学习(五、加入log4j)
- 骑车记
- 算法blog 传送门
- 杭电acm2003求绝对值
- POJ 3276 —— 开关问题
- 执行路由核心复制
- OpenGL超级宝典笔记(二)
- 杭电acm2002计算球体积