网上一堆通篇的转载,这里实际经验谈下怎么用。
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)