FreeRTOS学习笔记——FreeRTOS任务创建和删除实验(静态方法)

6.3 任务创建和删除实验(静态方法)
6.3.1 实验程序设计
1、实验目的
上一小节我们讲了使用函数xTaskCreate()来创建任务,本节在上一小节的基础上做简单的修改,使用函数xTaskCreateStatic()来创建任务,也就是静态方法,任务的堆栈、任务控制块就需要由用户来指定了。
2、实验设计
参考实验:FreeRTOS 实验6-1 FreeRTOS 任务创建和删除实验(动态方法)。
3、实验工程

FreeRTOS 实验6-2 FreeRTOS 任务创建和删除实验(动态方法)。

点击下载代码

4、实验程序与分析
● 系统设置
使用静态方法创建任务的时候需要将宏configSUPPORT_STATIC_ALLOCATION 设置为1,在文件FreeRTOSConfig.h 中设置,如下所示:
#define configSUPPORT_STATIC_ALLOCATION 1 //静态内存
宏configSUPPORT_STATIC_ALLOCATION 定义为1 以后编译一次,会提示我们有两个函数未定义,如图6.3.1.1 所示:


图6.3.3.1 错误提示

这个在我们讲FreeRTOS 的配置文件FreeRTOSConfig.h 的时候就说过了,如果使用静态方法的话需要用户实现两个函数vApplicationGetIdleTaskMemory() 和vApplicationGetTimerTaskMemory()。通过这两个函数来给空闲任务和定时器服务任务的任务堆栈和任务控制块分配内存,这两个函数我们在mainc.c 中定义,定义如下:



可以看出这两个函数很简单,用户定义静态的任务堆栈和任务控制块内存,然后将这些内存传递给函数参数。最后创建空闲任和定时器服务任务的API 函数会调用vApplicationGetIdleTaskMemory()和vApplicationGetTimerTaskMemory()来获取这些内存。

● 任务设置


(1)、静态创建任务需要用户提供任务堆栈,这里定义一个数组作为任务堆栈,堆栈数组为StackType_t 类型。
(2)、定义任务控制块,注意任务控制块类型要用StaticTask_t,而不是TCB_t 或tskTCB!这里已经要切记!

● main()函数


(1)、调用函数xTaskCreateStatic()创建任务。
(2)、将定义的任务堆栈数组传递给函数。
(3)、将定义的任务控制块传递给函数。
可以看出在用法上xTaskCreateStatic()和xTaskCreate()没有太大的区别,大多数的参数都相同。学习过UCOS 的同学应该会对函数xTaskCreateStatic()感到熟悉,因为UCOS 中创建任务的函数和xTaskCreateStatic()类似,也需要用户来指定任务堆栈和任务控制块的内存的,然后将其作为参数传递给任务创建函数。不过我们后面所有的例程不管是创建任务、信号量还是队列都使用动态方法。

● 任务函数




(1)、使用静态任务创建函数xTaskCreateStatic()来创建任务task1_task。
(2)、使用静态任务创建函数xTaskCreateStatic()来创建任务task2_task。
6.3.2 程序运行结果分析
参考6.2.2 小节。





猜你喜欢

转载自blog.csdn.net/tichimi3375/article/details/80671733
今日推荐