FreeRTOS内部机制学习笔记二——任务调度机制

FreeRTOS内部机制学习笔记二——任务调度机制

2.1FreeRTOS任务的创建

以下是FreeRTOS创建任务线程的程序

/* Create the thread(s) */
/* definition and creation of LED_RED_Task */
osThreadDef(LED_RED_Task, StartLED_RED_Task, osPriorityNormal, 0, 128);
LED_RED_TaskHandle = osThreadCreate(osThread(LED_RED_Task), NULL);

osThreadDef 相当于是将几个宏定义的参数拼接起来,其函数定义代码如下

#define osThreadDef(name, thread, priority, instances, stacksz)  

name:任务的名称;

thread:任务的函数名称;

priority:任务的优先级,这个与后面讲的任务调度有关;

instances:能够被实例化的最大数量,但是好像没啥作用;

stacksz:线程函数的堆栈大小要求(以字节为单位),也就是每个线程分配了固定大小的栈空间,这个大小与线程局部变量和调用深度有关(如果调用其他函数则需要将CPU中的LS寄存器压入栈中)。

osThreadCreate则是实例化线程

osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument)

thread_def:定义的线程;

argument:为开始参数传递给线程函数的指针。

2.2 优先级与状态

  • 优先级不同
    • 高优先级的任务,优先执行,可以抢占低优先级的任务
    • 高优先级的任务不停止,低优先级的任务永远无法执行
    • 同等优先级的任务,轮流执行:时间片轮转
  • 线程有五种状态
    • 运行态:running
    • 就绪态:ready
    • 阻塞:blocked,等待某件事(时间、事件)
    • 暂停:suspend,被挂起。
    • 暂停:deleted,被删除。

2.3调度方法

根据任务的状态以及优先级,在Freertos中任务可以分为一下的一些状态

FreeRTOS内部机制学习笔记二——任务调度机制_第1张图片

这里想说明一下何为被阻塞状态和被挂起状态,当执行到任务中的osStatus osDelay (uint32_t millisec)函数时,任务就会进入阻塞状态,而时间片将被分给处在准备运行的任务,直到时间达到millisec,该任务才会进入准备运行状态,等待时间片的分配,同时其他的一些硬件阻塞也会使任务进入阻塞状态;有时不需要执行某些任务,可以通过osStatus osThreadSuspend (osThreadId thread_id)函数将任务挂起,此事任务会处于被挂起状态,不会被分配到时间片,直到执行osStatus osThreadResume (osThreadId thread_id)释放任务,此任务才会进入准备运行状态,等待时间片的分配。

**至于任务之间是怎样切换?**Freertos里面有一个Tick时钟,其是每1ms进入一次Tick中断里面,在中断里会将当前CPU的寄存器压入该任务分配的栈中,同会在osThreadReady列表里面寻找优先级最高的任务(如果同等优先级的任务,则轮流执行),将该任务的状态从栈中出栈到CPU寄存器并进行运行。

2.4抢占与礼让

  • 可抢占:高优先级的任务先运行
  • 时间片轮转:同优先级的任务轮流执行
  • 空闲任务礼让:如果有同是优先级0的其他就绪任务,空闲任务主动放弃一次运行机会

你可能感兴趣的:(FREERTOS学习笔记,状态模式)