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

内部机制学习笔记二——任务调度机制 2.任务的创建
以下是创建任务线程的程序
/* 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);
相当于是将几个宏定义的参数拼接起来,其函数定义代码如下
【FreeRTOS内部机制学习笔记二——任务调度机制】#define osThreadDef(name, thread, priority, instances, stacksz)
name:任务的名称;
:任务的函数名称;
:任务的优先级 , 这个与后面讲的任务调度有关;
:能够被实例化的最大数量,但是好像没啥作用;
:线程函数的堆栈大小要求(以字节为单位),也就是每个线程分配了固定大小的栈空间,这个大小与线程局部变量和调用深度有关(如果调用其他函数则需要将CPU中的LS寄存器压入栈中) 。
则是实例化线程
osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument)
:定义的线程;

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

文章插图
:为开始参数传递给线程函数的指针 。
2.2 优先级与状态线程有五种状态2.3调度方法
根据任务的状态以及优先级,在中任务可以分为一下的一些状态
这里想说明一下何为被阻塞状态和被挂起状态,当执行到任务中的( )函数时,任务就会进入阻塞状态,而时间片将被分给处在准备运行的任务,直到时间达到,该任务才会进入准备运行状态 , 等待时间片的分配,同时其他的一些硬件阻塞也会使任务进入阻塞状态;有时不需要执行某些任务,可以通过( )函数将任务挂起,此事任务会处于被挂起状态,不会被分配到时间片,直到执行( )释放任务 , 此任务才会进入准备运行状态,等待时间片的分配 。
**至于任务之间是怎样切换?**里面有一个Tick时钟,其是每1ms进入一次Tick中断里面,在中断里会将当前CPU的寄存器压入该任务分配的栈中,同会在列表里面寻找优先级最高的任务(如果同等优先级的任务,则轮流执行) , 将该任务的状态从栈中出栈到CPU寄存器并进行运行 。
2.4抢占与礼让