0

以下任务中有一个线程。如何查看是否使用了 Round Robin、FIFO 或 Preemptive Scheduling?

void High_Thread(void const *argument)  

{  
   while(1)  
   {     
     GPIOE->DOUT_BYTE1=0xFF;  
   }  
}  

void Low_Thread(void const *argument)  
{  
   while(1)  
   {  
   GPIOE->DOUT_BYTE1=0x00;  
   }  
} 
osThreadDef(High_Thread, osPriorityNormal,1,0);  
osThreadDef(Low_Thread, osPriorityNormal,1,0); 
ThreadId_High=osThreadCreate(osThread(High_Thread), NULL);  
ThreadId_Low=osThreadCreate(osThread(Low_Thread), NULL); 

在这种情况下,这不是循环程序,因为优先级是相同的吗?

4

1 回答 1

0

如何查看是否使用了 Round Robin、FIFO 或 Preemptive Scheduling?

第一的; “抢占式”不是调度算法,它是调度算法的属性。例如,您可以说“轮询、可变时间片长度、可变频率和最早截止日期优先都是抢占式的调度算法”。

现在; 如果您监视任何最后设置的值GPIOE->DOUT_BYTE1=...(我假设使用外部硬件 - 例如连接到通用输出信号的示波器),那么有 3 个可能的结果:

a) 输出以常规模式交替 - 例如,可能 0xFF 持续 10 毫秒,然后 0x00 持续 10 毫秒,然后 0xFF 持续 10 毫秒,依此类推(永远重复)。在这种情况下,调度算法可以是循环或大约 100 种其他调度算法中的任何一种(但不是 FIFO)。

b) 输出永远不会改变 - 例如永远可能是 0xFF。在这种情况下,调度算法可能是 FIFO(因为High_Thread首先启动它将是“第一个启动的任务”,直到它终止或阻塞,但它永远不会终止或阻塞,因此其他任务永远不会获得任何 CPU 时间);但它也可以是大约 20 种其他调度算法中的任何一种(但不是循环)。

c) 输出与上述任何一种情况都不匹配;所以你知道这绝对不是循环或先进先出。

如果您知道调度算法必须是循环或先进先出(绝不可能是大约 120 种其他调度算法中的任何一种);然后您可以确定它是循环还是先进先出。

然而; 很少有像这样的特殊外部监控。如果您使用第三个线程(不断读取/轮询 中的值GPIOE->DOUT_BYTE1),那么这将破坏一切(例如,使用循环法,监视线程可能只会看到值 0xFF,因为它仅在 High_Thread 获得 CPU 时间后才获得 CPU 时间)。

更远; 所有这些都假设只有一个 CPU。如果有多个 CPU,那么 High_Thread 和 Low_Thread 可以同时在不同的 CPU 上运行(不管调度算法是什么),所以你会期待毫无意义的混乱。

于 2021-06-08T10:42:05.743 回答