|
因为明天就要继续工作了,所以RAW OS这段时间的学习今晚必须告一段落了。
时间比较紧,就不贴流程图了。
多对象阻塞问题具体是指:
比如一个任务需要从两个消息队列中获取消息,这时候就存在“多对象”了,这时考虑到阻塞问题,不管把消息A的读取放在前还是消息B的读取放在前,设计都是有问题的。
ROW OS 提供了一种消息队列注册回调函数的机制高效解决了这个问题。
下图演示的是raw os 对于上面问题的解决方
我们通过这个信号量做中继处理,就可以很好的解决多对象阻塞的问题。
接下来就是演示。
raw_queue_send_notify(&test_queue_ins,notify_queue);
我通过这个ROW OS 函数将notify_queue 作为test_queue_ins这个queue收到消息的回调函数。
void notify_queue(RAW_QUEUE *ptr)
{
raw_semaphore_put(&TestSem);
}
同理,我们也可以为别的队列注册同一个回调函数。
void notify_queue(RAW_QUEUE *ptr)
{
raw_semaphore_put(&TestSem);
}
void test_task1(void * pParam)
{
RAW_U32 * Res;
while(1)
{
raw_semaphore_get(&TestSem, RAW_WAIT_FOREVER);
raw_queue_receive(&test_queue_ins, RAW_WAIT_FOREVER,(RAW_VOID **)&queue_cont);
UartSend("TASK1:I GET MESSAGE\n");
}
}
这是任务的代码,因为是验证可行性,就不搞多个事件了。
没有消息时,任务1被阻塞。
来消息后:
确实是非常好的解决多对象阻塞的办法。
回首几天前给自己定的任务,没有完成的是:中断下半部,中断下半部主要是为了解决中断不能放太多东西,否则影响实时性,这一与某些应用设计矛盾的问题,具体实现只能找哪天比较闲再研究了,RAW OS 提供的软件定时器已经试过,很简单,所以就不写帖子了。
在此感谢jorya_txj 为我们提供了优秀的国产RTOS.
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|