提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
任务创建与删除
前言
对于整个单片机程序,我们称之为application,应用程序。
使用FreeRTOS时,我们可以在application中创建多个任务(task),有些文档把任务也称为线程(thread)。
提示:以下是本篇文章正文内容,下面内容可供参考
一、什么是任务?
在FreeRTOS中,任务就是一个函数,原型如下:
void ATaskFunction( void *pvParameters );
注意:
- 这个函数不能返回,无返回值
- 同一个函数,可以用来创建多个任务;换句话说,多个任务可以运行同一个函数
- 函数内部,尽量使用局部变量,每个任务都有自己的独立的栈。
- 函数使用全局变量、静态变量的话只有一个副本,多个任务使用的是同一个副本
提示:以下是一份示例代码,可供参考:
void ATaskFunction( void *pvParameters )
{
/* 对于不同的任务,局部变量放在任务的栈里,有各自的副本 */
int32_t lVariableExample = 0;
/* 任务函数通常实现为一个无限循环 */
for( ;; )
{
/* 任务的代码 */
}
/* 如果程序从循环中退出,一定要使用vTaskDelete删除自己
* NULL表示删除的是自己
*/
vTaskDelete( NULL );
/* 程序不会执行到这里, 如果执行到这里就出错了 */
}
二、任务创建
1.函数原型:
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数
const char * const pcName, // 任务的名字
const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节
void * const pvParameters, // 调用任务函数时传入的参数
UBaseType_t uxPriority, // 优先级
TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用它来操作这个任务
参数说明:
参数 | 描述 |
---|---|
pvTaskCode | 函数指针,可以简单地认为任务就是一个C函数 |
pcName | 任务的名字,长度为:configMAX_TASK_NAME_LEN |
usStackDepth | 每个任务都有自己的栈,这里指定栈大小。单位是word |
pvParameters | 传递形参,创建任务时用户自己传入 |
uxPriority | 优先级范围:0~(configMAX_PRIORITIES – 1)数值越小优先级越低 |
pxCreatedTask | 用来保存任务句柄:task handle。如果不想使用该handle,可以传入NULL |
返回值 | 成功:pdPASS;失败:err |
2.任务创建:
提示:以下是使用任务创建函数创建任务,仅供参考:
代码如下(示例):
void vTask1( void *pvParameters )
{
/* 任务函数的主体一般都是无限循环 */
for( ;; )
{
/* 任务1的功能块 */
}
}
int main( void )
{
prvSetupHardware();
xTaskCreate(vTask1, "Task 1", 1000, NULL, 1, NULL);
/* 启动调度器 */
vTaskStartScheduler();
/* 如果程序运行到了这里就表示出错了, 一般是内存不足 */
return 0;
}
三、任务删除
1.函数原型:
void vTaskDelete( TaskHandle_t xTaskToDelete );
参数说明:
参数 | 描述 |
---|---|
pvTaskCode | 任务句柄,使用xTaskCreate创建任务时可以得到一个句柄。也可传入NULL,这表示删除自己。 |
四、任务优先级
优先级的取值范围是:0~(configMAX_PRIORITIES – 1),数值越大优先级越高。
FreeRTOS的调度器可以使用2种方法来快速找出优先级最高的、可以运行的任务。使用不同的方法时,configMAX_PRIORITIES的取值有所不同。
- 通用方法:使用C函数实现,对所有的架构都是同样的代码。对configMAX_PRIORITIES的取值没有限制。但是configMAX_PRIORITIES的取值还是尽量小,因为取值越大越浪费内存,也浪费时间configUSE_PORT_OPTIMISED_TASK_SELECTION被定义为0、或者未定义时,使用此方法。
- 架构相关的优化的方法:架构相关的汇编指令,可以从一个32位的数里快速地找出为1的最高位。使用这些指令,可以快速找出优先级最高的、可以运行的任务。使用这种方法时,configMAX_PRIORITIES的取值不能超过32。
configUSE_PORT_OPTIMISED_TASK_SELECTION被定义为1时,使用此方法。
1.优先级修改:
获取任务的优先级
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );
参数说明:
参数 | 描述 |
---|---|
xTask | 任务句柄,使用xTaskCreate创建任务时可以得到的一个句柄 |
设置任务的优先级
void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );
参数说明:
参数 | 描述 |
---|---|
xTask | 任务句柄,使用xTaskCreate创建任务时可以得到的一个句柄 |
uxNewPriority | 优先级 |
总结
例如:以上就是今天要讲的内容,本文仅仅简单介绍了FreeRtos任务相关的一些API接口的使用。