FreeRTOS-任务-消息队列

任务

  1. FreeRTOS 中的任务是抢占式调度机制,高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度。
  2. 不在运行的任务必须删除,否则将产生hardfault错误
  3. 同时 FreeRTOS 也支持时间片轮转调度方式,只不过时间片的调度是不允许抢占任务的 CPU 使用权。
  4. 除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外系统的其他部分都是可以抢占的
  5. 0 为最低优先级,分配给空闲任务使用,一般不建议用户来使用这个优先级,一般设置32个优先级
  6. FreeRTOS 内核中也允许创建相同优先级的任务。相同优先级的任务采用时间片轮转方式进行调度(也就是通常说的分时调度器),时间片轮转调度仅在当前系统中无更高优先级就绪任务存在的情况下才有效

任务状态

  • 阻塞状态(Blocked)
  • 暂停状态(Suspended)
  • 就绪状态(Ready)
    FreeRTOS-任务-消息队列_第1张图片

在阻塞状态的任务,它可以等待两种类型的事件,第一类是时间相关的时间,第二类是同步类事件

同步类事件有

  1. 消息队列
  2. 二值信号量
  3. 计数信号量
  4. 互斥量
  5. 递归互斥量
  6. 事件组
  7. 任务通知

1. 任务相关函数

1.1 任务挂起函数

  • 被挂起的任务绝不会得到 CPU 的使用权,不管该任务具有什么优先级
void vTaskSuspend( TaskHandle_t xTaskToSuspend )

1.2 挂起所有任务=挂起调度器

实质就是挂起调度器

 void vTaskSuspendAll( void )

1.3 任务恢复函数

让任务进入就绪态

 void vTaskResume( TaskHandle_t xTaskToResume )

中断函数专用–中断版

xTaskResumeFromISR()不能用于任务和中断间的同步

 BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )

启动恢复调度器

BaseType_t xTaskResumeAll( void )

动态任务创建

 BaseType_t xTaskCreate( 
		TaskFunction_t pxTaskCode,							//任务函数入口
		const char * const pcName, 						//任务名称
		const configSTACK_DEPTH_TYPE usStackDepth,//栈的大小
		void * const pvParameters,							//给任务传递的参数
		UBaseType_t uxPriority,								//任务优先级
		TaskHandle_t * const pxCreatedTask )			//任务控制块 

返回值
成功: pdPASS;
失败: errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY(失败原因只有内存不足)

FreeRTOS 内部宏 定义
pdFALSE ( ( BaseType_t ) 0 )
pdTRUE ( ( BaseType_t ) 1 )
pdPASS pdTRUE
pdFAIL pdFALSE

删除任务

void vTaskDelete( TaskHandle_t xTaskToDelete )//创建任务时返回的任务句柄

任务延时

单位为系统节拍周期

void vTaskDelay( const TickType_t xTicksToDelay )

绝对延时函数 vTaskDelayUntil()

 void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime,//指向一个变量,该变量保存任务最后一次解除阻塞的的时 刻。第一次使用时,该变量必须初始化为当前时间,之后这个变量会在 vTaskDelayUntil()函数内自动更新
										const TickType_t xTimeIncrement );//周 期 循 环 时 间 。 当 时 间 等 于 (*pxPreviousWakeTime + xTimeIncrement)时,任务解除阻塞

开启任务调度器

开始调度器后,该函数是不会返回的

void vTaskStartScheduler( void )

任务优先级

获取优先级

设置为 NULL 表示获取自己的优先级

UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );

设置任务优先级

使 用 参 数 xTask 来 指 定 任 务 , 设 置 为 NULL 表 示 设 置 自 己 的 优 先 级 ;参数 uxNewPriority 表示新的优先级,取值范围是 0~(configMAX_PRIORITIES – 1)。

void vTaskPrioritySet( TaskHandle_t xTask,	//任务句柄
										UBaseType_t uxNewPriority ); //待设置的优先级

空闲任务

必须在FreeRTOSConfig.h 函数内定义 configUSE_IDLE_HOOK

你可能感兴趣的:(FreeRTOS,STM32,stm32,任务task,队列queue)