uSmartX总结
今天,大体看了一下uSmartX的源代码,先总结如下
usmartx的调度属于非抢占式。代码量不算太大。它实现的特点是有一个主调度器,它不停的选择合适的任务执行。各个任务不能yield到其它的任务,它要迅速执行并返回,再由调度器选择合适的下一个任务并执行。这也挺新颖的,适合做创新点。
那么,任务之间如何协调呢? uSmartX使用了event。它总共定义了几种事件,
typedef enum {
SYS_OK, /*!< System call or scheduler returned successefuly */
SYS_ERROR, /*!< System call or scheduler returned with error (resource not avaible) */
SYS_IDLE, /*!< Scheduler returned in idle state, meaning there was no ready task to run */
SYS_MBX, /*!< Mailbox was posted or freed */
SYS_SEM, /*!< Semaphore was posted */
SYS_RESUMED, /*!< Task was explicitely resumed */
SYS_TOUT, /*!< Task sleep timeout expired */
SYS_MBX_TOUT, /*!< Task timeout expired when pending on a mailbox */
SYS_SEM_TOUT, /*!< Task timeout expired when pending on a semaphore */
SYS_NONE /*!< Task didn't recived any system events */
} STATUS;
因此任务要始终维持这个事件状态的变量,并根据不同的event做不同的工作。
但我觉得,对于每一个任务,这样编程似乎挺麻烦的,在任务内部必须根据不同的event做不同的工作。如果没有主调度器,每个任务可以在必要时挂起自己,条件满足再继续执行,这似乎比维护这些event要直观并省去了不少麻烦。
总之,觉得uSmarX的方法挺新颖,也有一定的研究价值,但和自己平时对rtos的理解有一些出入,思路不太一致,决定不在实际中使用。