0414

本文介绍了一个消息队列发送函数OSQPost的工作原理,包括如何处理消息队列中的任务等待情况,以及如何向消息队列中插入新的消息。同时探讨了在不同情况下任务调度的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

向消息队列发送一个消息(FIFO),OSQPost()

  1. 程序清单 L6.23是OSQPost()函数的源代码。在确认事件控制块是消息队列后 [L6.23(1)],OSQPost()函数检查是否有任务在等待该消息队列中的消息[L6.23(2)]。当事件控制块的.OSEventGrp域为非0值时,说明该消息队列的等待任务列表中有任务。这时,调用OSEventTaskRdy()函数 [见6.02节,使一个任务进入就绪状态,OSEventTaskRdy()]从列表中取出最高优先级的任务[L6.23(3)],并将它置于就绪状态。然后调用函数OSSched() [L6.23(4)]进行任务的调度。如果上面取出的任务的优先级在整个系统就绪的任务里也是最高的,而且OSQPost()函数不是中断服务子程序调用的,就执行任务切换,该最高优先级任务被执行。否则的话,OSSched()函数直接返回,调用OSQPost()函数的任务继续执行。  
  2.   
  3. 程序清单 L6.23 向消息队列发送一条消息  
  4. INT8U OSQPost (OS_EVENT *pevent, void *msg)  
  5. {  
  6.     OS_Q   *pq;  
  7.     OS_ENTER_CRITICAL();  
  8.     if (pevent->OSEventType != OS_EVENT_TYPE_Q) {                    (1)  
  9.         OS_EXIT_CRITICAL();  
  10.         return (OS_ERR_EVENT_TYPE);  
  11.     }  
  12.     if (pevent->OSEventGrp) {                                        (2)  
  13.         OSEventTaskRdy(pevent, msg, OS_STAT_Q);                   (3)  
  14.         OS_EXIT_CRITICAL();  
  15.         OSSched();                                                           (4)  
  16.         return (OS_NO_ERR);  
  17.     } else {  
  18.         pq = pevent->OSEventPtr;  
  19.         if (pq->OSQEntries >= pq->OSQSize) {                        (5)  
  20.             OS_EXIT_CRITICAL();  
  21.             return (OS_Q_FULL);  
  22.         } else {  
  23.             *pq->OSQIn++ = msg;                                    (6)  
  24.             pq->OSQEntries++;  
  25.             if (pq->OSQIn == pq->OSQEnd) {  
  26.                 pq->OSQIn = pq->OSQStart;  
  27.             }  
  28.             OS_EXIT_CRITICAL();  
  29.         }  
  30.         return (OS_NO_ERR);  
  31.     }  
  32. }  
  33.   
  34. 如果没有任务等待该消息队列中的消息,而且此时消息队列未满[L6.23(5)],指向该消息的指针被插入到消息队列中[L6.23(6)]。这样,下一个调用OSQPend()函数的任务就可以马上得到该消息。注意,如果此时消息队列已满,那么该消息将由于不能插入到消息队列中而丢失。  
  35. 此外,如果OSQPost()函数是由中断服务子程序调用的,那么即使产生了更高优先级的任务,也不会在调用OSSched()函数时发生任务切换。这个动作一直要等到中断嵌套的最外层中断服务子程序调用OSIntExit()函数时才能进行(见3.09节,µC/OS-II中的中断)。  

内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值