ucos3/ucosIII 任务内建消息队列使用方法

网上一堆通篇的转载,这里实际经验谈下怎么用。

1、发送:

#define taskq_put(p_tcb,pmsg,size) do{OS_ERR os_err;\
    OSTaskQPost(p_tcb,pmsg,size,OS_OPT_POST_FIFO,&os_err); \
    }while(0)

int g_msg = 1;  /* 必须为全局变量 */

taskq_put(ptcb,&g_msg,sizeof(g_msg));

2、接收:

#define taskq_wait(p_tcb,psize,os_err) OSTaskQPend(0,OS_OPT_PEND_BLOCKING,psize,NULL,&os_err)

OS_MSG_SIZE size;

OS_ERR os_err;

int themsg;

void *pmsg;

pmsg = taskq_wait(p_tcb,&size,os_err);

if(os_err==OS_ERR_NONE && pmsg != NULL){

    themsg = *(int*)pmsg;

}


注意点就是:

1、发送时的消息变量必须是全局的,否则你在一个函数调用局部变量,函数退出后该局部变量释放,虽然地址传过去了,但是你取地址的时候这个地址已经不是调用时的数据了,所以一定要放到全局变量,全局变量在哪里都是一个地址。

2、接收的时候需要判断错误号和空指针,只有2者都OK返回的数据才是有效的。

3、如果数据量大,最好自己做一个环形队列。也可以一次性把当前数组全部发出去,就是msg=buf, size=sizeof(buf)

本文为3YL原创,转载无需联系,但请注明来自labisart.com。

原创文章不易,如果觉得有帮助,可打赏或点击右侧广告支持:

查看打赏记录

发表评论请遵守党国法律!后台审核后方可显示!
  • 最新评论
  • 总共0条评论
  • Blog v1.1© 2024 labisart.com 版权所有 | 联系:labartwork@163.com