赞
踩
以下是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:为开始参数传递给线程函数的指针。
根据任务的状态以及优先级,在Freertos中任务可以分为一下的一些状态
这里想说明一下何为被阻塞状态和被挂起状态,当执行到任务中的osStatus osDelay (uint32_t millisec)函数时,任务就会进入阻塞状态,而时间片将被分给处在准备运行的任务,直到时间达到millisec,该任务才会进入准备运行状态,等待时间片的分配,同时其他的一些硬件阻塞也会使任务进入阻塞状态;有时不需要执行某些任务,可以通过osStatus osThreadSuspend (osThreadId thread_id)函数将任务挂起,此事任务会处于被挂起状态,不会被分配到时间片,直到执行osStatus osThreadResume (osThreadId thread_id)释放任务,此任务才会进入准备运行状态,等待时间片的分配。
**至于任务之间是怎样切换?**Freertos里面有一个Tick时钟,其是每1ms进入一次Tick中断里面,在中断里会将当前CPU的寄存器压入该任务分配的栈中,同会在osThreadReady列表里面寻找优先级最高的任务(如果同等优先级的任务,则轮流执行),将该任务的状态从栈中出栈到CPU寄存器并进行运行。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。