用什么样的程序来计算线程

问题描述

以下任务中有一个线程。如何查看那里是否使用了循环、FIFO 或抢占式调度?

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,0); 
ThreadId_High=osThreadCreate(osThread(High_Thread),NULL);  
ThreadId_Low=osThreadCreate(osThread(Low_Thread),NULL); 

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

解决方法

如何查看那里是否使用了循环、FIFO 或抢占式调度?

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

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

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

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

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

如果您知道调度算法必须是循环法或先进先出(并且不能是大约 120 种其他调度算法中的任何一种);然后就可以判断是round robin 还是FIFO。

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

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