任务
pyRTOS的任务由任务对象和包含任务代码的函数组成。任务函数只接受一个参数,即对包含该参数的任务对象。任务函数由Python创建。在第一个yield之前的任何代码都是设置代码,这个yield返回的任何内容都将被忽略。主任务循环在这个yield之后,这就是调度程序分配任务CPU时间时将执行的代码。
主任务循环通常是一个无限循环。如果任务需要终止,则应该调用返回(return),并且在返回之前执行任何必要的操作。但通常情况下,任务永远不会返回。
在pyRTOS中抢占是完全自愿的。这意味着所有任务都必须周期性地将控制权交回操作系统,否则其他任务将得不到CPU时间,任务之间无法传递消息,操作系统的其他管理功能将永远无法执行。在pyRTOS中 yield 有两个函数,其中一个是仅仅将控制权传递回操作系统,这允许操作系统重新评估任务优先级并将控制权传递给更高优先级的就绪任务,并且允许操作系统处理诸如消息传递、锁定之类的管理。Yield 应该相当频繁,但不要频繁到在操作系统中花费的时间比在任务中花费的时间还多。对于小任务,每个主循环一次就足够了。对于较大的任务,yield 应该放在重要的子部分之间。如果一个任务有一段与时间相关的代码,不要将 yield 放在可能中断时间关键流程的地方,因为不能保证 yield 会在规定的时间内恢复。
Yields 还用于进行某些阻塞 API 的调用。最常见的可能是延时。更高优先级的进程需要优先考虑,因为即使频繁的 yield 也不会给较低优先级的进程分配 CPU 时间,默认的调度程序总是给优先级最高的就绪任务分配CPU时间。低优先级任务获得时间的唯一方法是,高优先级任务在不需要CPU时间时被阻塞。通常这意味着延时,在pyRTOS中是通过超时生成器实现的。当超时生成器过期时,任务将再次就绪。在此之前,较低优先级的任务将允许分配CPU时间。任务也可以在等待消息或互斥锁定时阻塞。在未来,可能会有更多宽容的非实时调度程序。
还有一些地方的任务应该总是yield。每当传递消息时,它都会被放置在本地队列中。当任务 yield 时本地任务传出队列中的消息被传递,其它需要采取 yield 解决的地方,将在文档中注明。
|