UCOSII消息队列 深藏阁楼爱情的钟 2022-06-02 01:54 211阅读 0赞 **主结构体** typedef struct os_q { /* QUEUE CONTROL BLOCK */ struct os_q *OSQPtr; /* Link to next queue control block in list of free blocks */ void **OSQStart; /* Ptr to start of queue data */ void **OSQEnd; /* Ptr to end of queue data */ void **OSQIn; /* Ptr to where next message will be inserted in the Q */ void **OSQOut; /* Ptr to where next message will be extracted from the Q */ INT16U OSQSize; /* Size of queue (maximum number of entries) */ INT16U OSQEntries; /* Current number of entries in the queue */ } OS_Q; typedef struct os_q_data { void *OSMsg; /* Pointer to next message to be extracted from queue */ INT16U OSNMsgs; /* Number of messages in message queue */ INT16U OSQSize; /* Size of message queue */ OS_PRIO OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur */ OS_PRIO OSEventGrp; /* Group corresponding to tasks waiting for event to occur */ } OS_Q_DATA; typedef struct os_event { INT8U OSEventType; /* Type of event control block (see OS_EVENT_TYPE_xxxx) */ void *OSEventPtr; /* Pointer to message or queue structure */ INT16U OSEventCnt; /* Semaphore Count (not used if other EVENT type) */ OS_PRIO OSEventGrp; /* Group corresponding to tasks waiting for event to occur */ OS_PRIO OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur */ #if OS_EVENT_NAME_EN > 0u INT8U *OSEventName; #endif } OS_EVENT; **API函数** //无等待地从消息队列中得到一个消息 void *OSQAccept (OS_EVENT *pevent, INT8U *perr); //创建 OS_EVENT *OSQCreate (void **start, INT16U size); //删除 OS_EVENT *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *perr); //清空 INT8U OSQFlush (OS_EVENT *pevent); //等待-1,接收消息 void *OSQPend (OS_EVENT *pevent, INT32U timeout, INT8U *perr); //取消等待 INT8U OSQPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr); //释放+1,发送消息(队列式) INT8U OSQPost (OS_EVENT *pevent, void *pmsg); //发送消息(堆栈式) INT8U OSQPostFront (OS_EVENT *pevent, void *pmsg); //单选项的消息发送 INT8U OSQPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt); //查询 INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *p_q_data); **应用举例** #define OSQ_MSG_NUM 1 //消息队列消息数量 OS_EVENT *DATA_Msg; void *MsgGrp[OSQ_MSG_NUM]; void start_task(void *pdata) { OS_CRITICAL_ENTER(); //进入临界区 DATA_Msg = OSQCreate ((void** )&MsgGrp[0], (INT16U )OSQ_MSG_NUM); OS_EXIT_CRITICAL(); } void msgpost_task(void *p_arg) { static u8 msg_num; OS_Q_DATA p_q_data; OSQQuery(DATA_Msg, &p_q_data); if(p_q_data.OSNMsgs >= OSQ_MSG_NUM) { printf("OSQQuery OSNMsgs: %d\r\n", p_q_data.OSNMsgs); return; } msg_num++; OSQPost((OS_EVENT* )DATA_Msg, (void* )&msg_num); } void msgpend_task(void *p_arg) { void *p; INT8U err; u8 msg_num; p = OSQPend((OS_EVENT* )DATA_Msg, (INT32U )0, (INT8U* )&err); msg_num = *p; }
相关 消息队列 一、消息队列MQ(Message Queue): 1)消息队列是一种先进先出的数据结构; 2)消息队列使用的“协议”不是具体的通讯协议,而是更高层次通讯模型。它定义 「爱情、让人受尽委屈。」/ 2023年10月11日 11:11/ 0 赞/ 56 阅读
相关 消息队列? 对于 MQ 来说,其实不管是 RocketMQ、Kafka 还是其他消息队列,它们的本质都是:一发一存一消费。下面我们以这个本质作为根,一起由浅入深地聊聊 MQ。 01 从 Bertha 。/ 2023年10月10日 12:49/ 0 赞/ 34 阅读
相关 消息队列 1. 消息队列在项目中的使用 背景:在分布式系统中是如何处理高并发的。 由于在高并发的环境下,来不及同步处理用户发送的请求,则会导致请求发生阻塞。比如说,大量的ins ﹏ヽ暗。殇╰゛Y/ 2022年12月15日 03:23/ 0 赞/ 278 阅读
相关 ucosii 消息队列的应用 由于某个项目做二次开发,别人用的是UCOS这个嵌入式操作系统.也因为产品的消息处理的需求,所以考虑使用ucos的消息队列方式来实现功能.感觉ucos跟wince或 ゝ一世哀愁。/ 2022年09月23日 08:28/ 0 赞/ 287 阅读
相关 UCOSII消息队列 主结构体 typedef struct os_q { / QUEUE CONTROL BLOCK / struct os_q 深藏阁楼爱情的钟/ 2022年06月02日 01:54/ 0 赞/ 212 阅读
相关 消息队列 https://www.cnblogs.com/457248499-qq-com/p/7392678.html 来源 消息队列:在消息的传输过程中保存消息的容器。 迈不过友情╰/ 2022年05月30日 07:42/ 0 赞/ 294 阅读
相关 消息队列 消息队列是啥?我觉得大家都心知肚明,已经众所周知到不用解释的程度。不过,但凡学习、解释一样东西,都应该遵循 “它是什么?”、 “做什么用?”、 “为啥要用它” ╰半橙微兮°/ 2022年04月23日 08:42/ 0 赞/ 364 阅读
相关 消息队列 消息队列介绍 维基百科上的描述:在计算机科学中,消息队列(Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通 红太狼/ 2022年01月26日 10:51/ 0 赞/ 356 阅读
相关 消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: 1. 小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑。再不然就 小咪咪/ 2021年12月20日 06:51/ 0 赞/ 446 阅读
还没有评论,来说两句吧...