和在线程中不一样的地方在于,线程中调用 `rt_mq_send_wait` 时 `thread` 指针*肯定*是当前线程;在中断中调用 rt_mq_send_wait ,因中断不定什么时候出现, `thread` 指针可能是任意被创建的(有机会进入运行态的)线程。 为了不失一般性,我们再次假设,这个中断优先级比较低,可能被另外一个中断嵌套。而且假设在...
rt_mq_send_wait() 与 rt_mq_send() 的区别在于有等待时间,如果消息队列已经满了,那么发送线程将根据设定的 timeout 参数进行等待。如果设置的超时时间到达依然没有空出空间,这时发送线程将被唤醒并返回错误码。下表描述了该函数的输入参数与返回值: ...
使用rt_mq_send()发送消息时,队列中有空闲消息块时,才能成功发送消息,否则返回错误码(-RT_EFULL)。 使用rt_mq_send_wait()发送消息时,如果队列中没有可用的空闲消息块,会根据 timeout 参数等待,超时后才返回错误。 使用rt_mq_urgent()发送消息时,也要先得到空闲消息块,它会把消息块放在消息队列的头部,以便...
rt_mb_delete rt_mq_create rt_mq_delete 完成量 登录后复制rt_completion_wait 队列类 登录后复制rt_wqueue_wait rt_data_queue_push rt_data_queue_pop 延时 登录后复制rt_thread_sleep rt_thread_delay rt_thread_delay_until rt_thread_mdelay 注:源码中摘录,并无理论考证,更无实际验证 所有被禁止在中...
rt_err_t rt_mq_send_wait(rt_mq_t mq,const void *buffer,rt_size_t size,rt_int32_t timeout) 此函数的参数timeout为发送等待超时时间,单位为系统时钟节拍。其他参数与rt_mq_send()相同。 如果消息队列已经满了,发送线程会根据设定的timeout参数等待消息队列中因为收取消息而空出空间。若超时时间到达依...
voidthread2t(void*param){rt_uint32_ti=0;while(1){rt_mq_send_wait(messageQueue,&i,1,RT_WAITING_FOREVER);i++;}} 我们可以使用RT_WAITING_FOREVER来无限等待 发送消息 我们可以使用下面这个函数来发送不等待的消息 rt_err_trt_mq_send(rt_mq_tmq,void*buffer,rt_size_tsize); ...
发送消息,其实所有的步骤都是在rt_mq_send_wait函数中的,再次强调,学会看源码! 关键的几个地方说明一下: 当然这里没有特意的说明等待时间问题,因为发送和接收都可以阻塞等待,这里不是要理解的重点。 发送完完成以后如果发现有线程在等待消息队列,会发生一次调度: ...
result = rt_mq_send_wait(&rtc_rx_mq, (void*)&msg,sizeof(structframe_msg),10);if(result != RT_EOK) { rt_kprintf("%s: msgqueue send error-[%d]\n", __func__, result); } rx_state = SERIAL2_STATE_WAIT_FRAME;/* 一帧结束 */rt_kprintf("%s: frame end\n", __func__); ...
虽然rt_mq_sendrt_mq_send_waitrt_mq_urgentrt_mq_recv几个 api 有 size 参数,但是请严格按照rt_mq_initrt_mq_create中的 msg_size 参数值传递相等的实参值。千万不要随意改变 size 参数的数值。 换种说法,别用消息队列直接发变长数据。 Q8. INIT_xxx_EXPORT 宏详解 ...
发送消息,其实所有的步骤都是在rt_mq_send_wait函数中的,再次强调,学会看源码! 关键的几个地方说明一下: 当然这里没有特意的说明等待时间问题,因为发送和接收都可以阻塞等待,这里不是要理解的重点。 发送完完成以后如果发现有线程在等待消息队列,会发生一次调度: ...