LeeReindeer / ROS

🤖 RTOS implementation(Current port on Arduino Uno)
MIT License
6 stars 3 forks source link

Code Review 1: 关于cooperative multitasking的讨论 #2

Open LeeReindeer opened 2 years ago

LeeReindeer commented 2 years ago

https://github.com/LeeReindeer/ROS/blob/048799ccc07725fdb7cad54064135a60fd5fa04e/ros.c?_pjax=%23js-repo-pjax-container%2C%20div%5Bitemtype%3D%22http%3A%2F%2Fschema.org%2FSoftwareSourceCode%22%5D%20main%2C%20%5Bdata-pjax-container%5D#L139

else {
    // remove terminated task
    do {
      new_tcb = ros_tcb_dequeue(current_tcb->priority);
    } while (new_tcb && new_tcb->status == TASK_TERMINATED);
    if (new_tcb) {
      ros_tcb_enqueue(current_tcb);
      ros_switch_context_shell(current_tcb, new_tcb);
    }
  1. 是否存在一个低优先级任务被调度器切出,而被高优先级任务抢占的情况?
  2. 调度器会进入该 else 分支吗(存在需要删除TASK_TERMINATED的任务的情况吗?)?如不存在可以删除该分支
LeeReindeer commented 2 years ago

对于第一个问题,比方说一个优先级为1(0为优先级最高)的任务 t1 正在运行,也就说明当前就绪队列中没有优先级比1更高的任务,优先级更高的任务不存在或者在阻塞队列中。t1 运行一段时间后,新增一个优先级为0的任务 t0,下次调度时new_tcb = ros_tcb_dequeue(current_tcb->priority); 会返回 t0 任务,并进行上下文切换,所以优先级更高的 t0 任务会抢占 t1 任务运行。

ROS 算是 preemptive multitasking,可以通过适当的编码方式实现 cooperative multitasking:

对于第二个问题,已经忘了当初写这段代码的本意是什么,如上所述,会进入该段逻辑,但是不存在需要删除TASK_TERMINATED的情况。反而造成 ROS是 preemptive multitasking,可能是当初没搞清概念。