FreeRTOS——创建任务

FreeRTOS的设计小巧且简易,整个核心代码只有3到4个C文件,为了让代码容易阅读、移植和维护,大部分的代码都是以C语言编写,只有一些函数(多数是架构特定排班副程序)采用汇编语言编写。

FreeRTOS提供许多方法以实现多线程(threads)、多作业(task)、互斥锁(mutex)、信号量(semaphore)和软件计时器(software timer),有个为低耗电应用程序提供的无嘀嗒(tick-less)模式,线程的优先权管理也有支持。

FreeRTOS所有的工作都是在任务中完成的,所以我们来看看任务是怎么创建的;

创建任务API函数

创建任务使用xTaskCreate函数

portBASE_TYPE xTaskCreate(  pdTASK_CODE pvTaskCode,
                            const signed portCHAR * const pcName,
                            unsigned portSHORT usStackDepth,
							void *pvParameters,
							unsigned portBASE_TYPE uxPriority,
							xTaskHandle *pxCreatedTask );
参数名描述
pvTaskCode任务只是永不退出的C 函数,实现常通常是一个死循环。参数pvTaskCode 只一个指向任务的实现函数的指针(效果上仅仅是函数名)。
pcName具有描述性的任务名。这个参数不会被FreeRTOS 使用。其只是单纯地用于辅助调试。识别一个具有可读性的名字总是比通过句柄来识别容易得多。应用程序可以通过定义常量config_MAX_TASK_NAME_LEN 来定义任务名的最大长度——包括’\0’结束符。如果传入的字符串长度超过了这个最大值,字符串将会自动被截断。
usStackDepth当任务创建时,内核会分为每个任务分配属于任务自己的唯一状态。usStackDepth 值用于告诉内核为它分配多大的栈空间。这个值指定的是栈空间可以保存多少个字(word),而不是多少个字节(byte)。比如说,如果是32 位宽的栈空间,传入的usStackDepth值为100,则将会分配400 字节的栈空间(100 * 4bytes)。栈深度乘以栈宽度的结果千万不能超过一个size_t 类型变量所能表达的最大值。应用程序通过定义常量configMINIMAL_STACK_SIZE 来决定空闲任务任用的栈空间大小。
pvParameters任务函数接受一个指向void 的指针(void*)。pvParameters 的值即是传递到任务中的值。这篇文档中的一些范例程序将会示范这个参数可以如何使用。
uxPriority指定任务执行的优先级。优先级的取值范围可以从最低优先级0 到最高优先级(configMAX_PRIORITIES – 1)。configMAX_PRIORITIES 是一个由用户定义的常量。优先级号并没有上限(除了受限于采用的数据类型和系统的有效内存空间),但最好使用实际需要的最小数值以避免内存浪费。如果uxPriority 的值超过了(configMAX_PRIORITIES – 1),将会导致实际赋给任务的优先级被自动封顶到最大合法值。
pxCreatedTaskpxCreatedTask 用于传出任务的句柄。这个句柄将在API 调用中对该创建出来的任务进行引用,比如改变任务优先级,或者删除任务。如果应用程序中不会用到这个任务的句柄,则pxCreatedTask 可以被设为NULL。
返回值
1. pdTRUE

表明任务创建成功。

2. errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY

由于内存堆空间不足,FreeRTOS 无法分配足够的空间来保存任务
结构数据和任务栈,因此无法创建任务。

例子

1.创建任务1

void Task1( void *pvParameters )
{
	const char *pcTaskName = "Task1 output ........";
	volatile unsigned long ul;
	/* 和该任务处于一个死循环中。 */
	while(1)
	{
		/* 输出变量名,此处可以用自己方式验证 */
		vPrintString( pcTaskName );
		/* 延迟,以产生一个周期 */
		for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
		{
		/* 这个空循环是最原始的延迟实现方式。 */
		}
	}
}

1.创建任务2

void Task2( void *pvParameters )
{
	const char *pcTaskName = "Task2 output ........";
	volatile unsigned long ul;
	/* 和该任务处于一个死循环中。 */
	while(1)
	{
		/* 输出变量名,此处可以用自己方式验证 */
		vPrintString( pcTaskName );
		/* 延迟,以产生一个周期 */
		for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
		{
		/* 这个空循环是最原始的延迟实现方式。 */
		}
	}
}

3、main()函数只是简单地创建这两个任务,然后启动调度器

int main( void )
{
/* 创建第一个任务。需要说明的是一个实用的应用程序中应当检测函数xTaskCreate()的返回值,以确保任
务创建成功。 */
	xTaskCreate( Task1, /* 指向任务函数的指针 */
				"Task 1", /* 任务的文本名字,只会在调试中用到 */
				1000, /* 栈深度 – 大多数小型微控制器会使用的值会比此值小得多 */
				NULL, /* 没有任务参数 */
				1, /* 此任务运行在优先级1上. */
				NULL ); /* 不会用到任务句柄 */
	/* Create the other task in exactly the same way and at the same priority. */
	xTaskCreate( Task2, "Task 2", 1000, NULL, 1, NULL );
	/* 启动调度器,任务开始执行 */
	vTaskStartScheduler();
	/* 如果一切正常,main()函数不应该会执行到这里。但如果执行到这里,很可能是内存堆空间不足导致空闲
	任务无法创建。第五章有讲述更多关于内存管理方面的信息 */
	while(1);
}

这样两个简单的任务就创建完成了

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeRTOS创建任务的函数是 `xTaskCreate`,该函数的原型如下: ``` BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint32_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask ); ``` 其中各参数的含义如下: - `pxTaskCode`:任务函数指针,即任务所执行的函数。 - `pcName`:任务名称,用于调试和诊断。 - `usStackDepth`:任务堆栈大小,以字节为单位。 - `pvParameters`:指向传递给任务函数的参数的指针。 - `uxPriority`:任务优先级,范围为 0 到 configMAX_PRIORITIES - 1,其中 configMAX_PRIORITIES 是 FreeRTOS 中定义的最大任务优先级数。 - `pxCreatedTask`:指向一个变量的指针,该变量将保存创建任务的句柄。 下面是一个示例代码,演示如何使用 `xTaskCreate` 函数创建一个任务: ``` #include "FreeRTOS.h" #include "task.h" void vTaskFunction( void *pvParameters ) { while( true ) { // 任务执行的代码 } } void main( void ) { TaskHandle_t xTaskHandle; xTaskCreate( vTaskFunction, "TaskName", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, &xTaskHandle ); vTaskStartScheduler(); // 不应该运行到这里 } ``` 在上面的示例中,我们先定义了一个任务函数 `vTaskFunction`,然后在 `main` 函数中使用 `xTaskCreate` 创建了一个名为 `"TaskName"` 的任务,并将任务句柄保存到 `xTaskHandle` 变量中。最后,我们启动 FreeRTOS 调度器,开始执行任务

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值