FreeRtos学习记录-任务基本概念(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
任务创建与删除


前言

对于整个单片机程序,我们称之为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接口的使用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值