本篇文章记录我学习FreeRTOS的动态 / 静态创建和删除任务的知识。希望我的分享能给你带来不一样的收获!文中涉及FreeRTOS创建和删除任务的API函数,建议读者参考以下文章:
FreeRTOS任务相关的API函数-CSDN博客
目录
编辑
一、FreeRTOS动态创建任务和删除任务
1、动态创建/删除任务实例分析
2、程序与分析
(1)、任务设置
(2)、main()函数
(3)、任务函数
二、FreeRTOS静态创建和删除任务
1、静态创建任务红外删除任务实例分析
2、 程序与分析
(1)、系统配置
(2)、任务设置
(3)、main()函数
(4)、任务函数
三、结语
一、FreeRTOS动态创建任务和删除任务
1、动态创建/删除任务实例分析
实验内容:
本实验设计三个任务: start_task、task1_task和 task2_task ,这三个任务的任务功能如下:
1、start_task:用来创建其他两个任务。
2、taskl_task :当此任务运行5此以后就会调用函数vTaskDelete()删除任务task2_task,此任务也会控制LEDO的闪烁,并且周期性的刷新LCD指定区域的背景颜色。
3、task2_task :此任务普通的应用任务,此任务也会控制LED1的闪烁,并且周期性的刷新LCD指定区域的背景颜色。
2、程序与分析
(1)、任务设置
(1) 、start_task任务的任务优先级,此处用宏来表示,以后所有的任务优先级都用宏来表示。创建任务设置优先级的时候就用这个宏,当然了也可以直接在创建任务的时候指定任务优先级。
(2)、start_task 任务的任务堆栈大小。(3)、start_task任务的任务句柄。
(4)、start_task任务的任务函数声明。
(2)、main()函数
(1)、调用函数xTaskCreate()创建tart_task任务,函数中的各个参数就是上面的任务设置中定义的,其他任务的创建也用这种方法。
(2)、调用函数 vTaskStartScheduler()开启FreeRTOS的任务调度器,FreeRTOS开始运行。
(3)、任务函数
(1)、start_task任务的任务函数,在此任务函数中我们创建了另外两个任务taskl_task 和task2_task。start_task任务的职责就是用来创建其他的任务或者信号量、消息队列等的,当创建完成以后就可以删除掉start_task任务。
(2)、删除 start_task 任务,注意函数 vTaskDelete()的参数就是 start_task任务的任务句柄StartTask_Handler。
(3)、task1_task任务函数(任务1),任务比较简单,每隔Ⅰ秒钟taskl_num加一并且LEDO反转,串口输出任务运行的次数,其实就是taskl_num的值。当taskl_task运行5次以后就调用函数vTaskDelete()删除任务task2_task。
(4)、任务taskl_task运行了5次,调用函数vTaskDelete()删除任务task2_task。(5)、task2_task任务函数(任务2),和 task1_task 差不多。
简单的总结分析一下此例程的流程,因为这是我们使用FreeRTOS写的第一个程序,很多习惯是我们后面要用到的。比如使用任务宏定义任务优先级,堆栈大小等,一般有关一个任务的东西我们的放到一起,比如任务堆栈、任务句柄、任务函数声明等,这样方便修改。这些东西可以放到一个.h头文件里面去,只是例程里面任务数比较少,所以就直接放到main.c文件里面了,要是工程比较大的话最好做一个专用的头文件来管理。
在main函数中一开始肯定是初始化各种硬件外设,初始化完外设以后调用函数xTaskCreate()创建一个开始任务,注意创建开始任务是在调用函数 vTaskStartScheduler()开启任务调度器之前,这样当后面开启任务调度器以后就会直接运行开始任务了。其他任务的创建就放到开始任务的任务函数中,由于开始任务的职责就是创建其他应用任务和信号量、队列等这些内核对象的,所以它只需要执行一次,当这些东西创建完成以后就可以删除掉开始任务了。
二、FreeRTOS静态创建和删除任务
1、静态创建任务红外删除任务实例分析
实验目的:
上一小节我们讲了使用函数xTaskCreate()来创建任务,本节在上一小节的基础上做简单的修改,使用函数xTaskCreateStatic()来创建任务,也就是静态方法,任务的堆栈、任务控制块就需要由用户来指定了。
2、 程序与分析
程序请看上面的动态创建任务工程!
(1)、系统配置
使用静态方法创建任务的时候需要将宏configSUPPORT_STATIC_ALLOCATION设置为1,在文件FreeRTOSConfig.h中设置,如下所示:
宏configSUPPORT_STATIC_ALLOCATION定义为1以后编译一次,会提示我们有两个函数未定义,如图所示:
这个在我们讲FreeRTOS的配置文件FreeRTOSConfig.h 的时候就说过了,如果使用静态方法的话需要用户实现两个函数vApplicationGetldleTaskMemory()和vApplicationGetTimerTaskMemory()。通过这两个函数来给空闲任务和定时器服务任务的任务堆栈和任务控制块分配内存,这两个函数我们在main.c 中定义,定义如下:
可以看出这两个函数很简单,用户定义静态的任务堆栈和任务控制块内存,然后将这些内存传递给函数参数。最后创建空闲任务和定时器服务任务的API函数会调用vApplicationGetldleTaskMemory()和 vApplicationGetTimerTaskMemory()来获取这些内存。
(2)、任务设置
(1)、静态创建任务需要用户提供任务堆栈,这里定义一个数组作为任务堆栈,堆栈数组为StackType_t类型。
(2)、定义任务控制块,注意任务控制块类型要用StaticTask_t,而不是TCB_t或tskTCB !这里已经要切记!
(3)、main()函数
(1)、调用函数xTaskCreateStatic()创建任务。
(2)、将定义的任务堆栈数组传递给函数。
(3)、将定义的任务控制块传递给函数。
可以看出在用法上xTaskCreateStatic()和xTaskCreate()没有太大的区别,大多数的参数都相同。学习过 UCOS的同学应该会对函数xTaskCreateStatic()感到熟悉,因为UCOS中创建任务的函数和xTaskCreateStatic()类似,也需要用户来指定任务堆栈和任务控制块的内存的,然后将其作为参数传递给任务创建函数。不过我们后面所有的例程不管是创建任务、信号量还是队列都使用动态方法。
(4)、任务函数
(1)、使用静态任务创建函数xTaskCreateStatic()来创建任务task1_task。
(2)、使用静态任务创建函数xTaskCreateStatic()来创建任务task2_task。
三、结语
关于FreeRTOS动态/静态创建/删除任务的知识就分享至此了,相信我的分享一定能给你带来不一样的收获和感悟。愿我们一起努力,不负韶华!
关于以上代码涉及的完整工程,请从下方链接(免费)获取:
https://download.csdn.net/download/m0_73931287/88805980
https://download.csdn.net/download/m0_73931287/88805983