概述
一,静态建立任务
1,定义任务函数(一个无限循环且不带返回值的函数)
任务必须是死循环,否则任务将经过 LR 返回,如果 LR 指向了非法内存就会产生HardFault_Handler,而 FreeRTOS 指向一个死循环,那么任务返回以后就在死循环中执行,这样子的任务是不安全的。编程因此避免这种状况,任务通常都是死循环而且无返回值的。若是任务,执行一次以后就进行删除,则不影响系统运行,所以,只执行一次的任务在执行完毕要记得及时删除。数组任务里面的延时函数必须使用 FreeRTOS 里面提供的延时函数,并不能使用咱们裸机编程中的那种延时。这两种延时的区别是 FreeRTOS 里面的延时是阻塞延时,即调用vTaskDelay()函数的时候,当前任务会被挂起,调度器会切换到其它就绪的任务,从而实现多任务。安全若是仍是使用裸机编程中的那种延时,那么整个任务就成为了一个死循环,若是刚好该任务的优先级是最高的,那么系统永远都是在这个任务中运行,比它优先级更低的任务没法运行,根本没法实现多任务。
当任务进入延时的时候,由于没有另外就绪的用户任务,那么系统就会进入空闲任务,空闲任务是 FreeRTOS 系统本身启动的一个任务,优先级最低。当整个系统都没有就绪任务的时候,系统必须保证有一个任务在运行,空闲任务就是为这个设计的。当用户任务延时到期,又会从空闲任务切换回用户任务。
2,定义任务栈 :任务使用的栈和任务控制块是预先定义好的全局变量。
在 FreeRTOS 系统中,每个任务都是独立的,他们的运行环境都单独的保存在他们的栈空间当中。那么在定义好任务函数以后,咱们还要为任务定义一个栈任务的栈占用的是 MCU 内部的 RAM,当任务越多的时候,须要使用的栈空间就越大,即须要使用的RAM空间就越多。一个 MCU 可以支持多少任务,就得看你的 RAM空间有多少。操作系统在大多数系统中须要作栈空间地址对齐,在 FreeRTOS 中是以 8 字节大小对齐。固然用户能够在 portmacro .h中修改宏的值为 1、2、4、8、16、32 等字节对齐设计。
3,定义任务控制块
定义好任务函数和任务栈以后,咱们还须要为任务定义一个任务控制块,一般咱们称这个任务控制块为任务的身份证。在 C 代码上,任务控制块就是一个结构体,里面有很是多的成员,这些成员共同描述了任务的所有信息
4,建立任务
一个任务的三要素是任务主体函数,任务栈,任务控制块。FreeRTOS 里面有一个叫静态任务建立函数 xTaskCreateStatic(),它就是干这个活的。它将任务主体函数,任务栈(静态的)和任务控制块(静态的)这三者联系在一块儿,让任务能够随时被系统启动。
5,启动任务
当任务建立好后,是处于任务就绪( Ready ) ,处于就绪态的任务能够参与操做系统的调度。要开启任务调度器,或建立空闲任务与定时器任务(若是使能了 configUSE_TIMERS 这个宏定义),那这两个任务就是在启动任务调度器中实现。每一个操做系统,任务调度器只启动一次,以后就不会再次执行了。FreeRTOS 中启动任务调度器的函数是 vTaskStartScheduler(),而且启动任务调度器的时候就不会返回,今后任务管理都由FreeRTOS 管理,此时才是真正进入实时操做系统中的第一步
二,动态建立:建立任务—SRAM 动态内存,任务使用的栈和任务控制块是在建立任务的时候FreeRTOS 动态分配的。
动态内存空间的堆从哪里来?
动态内存,即堆,其实堆也是内存,也属于 SRAM。FreeRTOS 作法是在 SRAM 里面定义一个大数组,也就是堆内存,供 FreeRTOS 的动态内存分配函数使用,在第一次使用的时候,系统会将定义的堆内存进行初始化,这些代码在 FreeRTOS 提供的内存管理方案中实现(heap_1.c、heap_2.c、heap_4.c等)
1,定义任务函数
使用动态内存的时候,任务的主体函数与使用静态内存时是同样的。
2,定义任务栈
使用动态内存的时候,任务栈在任务建立的时候建立,不用跟使用静态内存那样要预先定义好一个全局的静态的栈空间,动态内存就是按需分配内存,随用随取。
3,定义任务控制块指针
使用动态内存时候,不用跟使用静态内存那样要预先定义好一个全局的静态的任务控制块空间。任务控制块是在任务建立的时候分配内存空间建立,任务建立函数会返回一个指针,用于指向任务控制块,因此要预先为任务栈定义一个任务控制块指针,也是咱们常说的任务句柄
4,动态建立任务或启动任务
使用静态内存时,使用 xTaskCreateStatic()来建立一个任务,而使用动态内存的时,则使用 xTaskCreate()函数来建立一个任务,二者的函数名不同,具体的形参也有区别。
/* 建立 AppTaskCreate 任务 */
xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate, /* 任务入口函数 */(1)
(const char* )"AppTaskCreate",/* 任务名字 */(2)
(uint16_t )512, /* 任务栈大小 */ (3)
(void* )NULL,/* 任务入口函数参数 */ (4)
(UBaseType_t )1, /* 任务的优先级 */ (5)
(TaskHandle_t* )&AppTaskCreate_Handle);/* 任务控制块指针 */ (6)
(1) :任务入口函数,即任务函数的名称,须要咱们本身定义而且实现。
(2) :任务名字,字符串形式, 最大长度由 FreeRTOSConfig .h 中定义的
(3) :任务堆栈大小,单位为字,在 32 位的处理器下(STM32),一个字等于 4 个字节,那么任务大小就为 128 * 4 字节。
(4) :任务入口函数形参,不用的时候配置为 0 或者 NULL便可。
(5) : 任务的优先级,数值越大优先级越高,0 表明最低优先级。
(6) :任务控制块指针,在使用内存的时候,须要给任务初始化函数
xTaskCreateStatic()传递预先定义好的任务控制块的指针。在使用动态内存的时候,任务建立函数 xTaskCreate()会返回一个指针指向任务控制块,该任务控制块是 xTaskCreate()函数里面动态分配的一块内存。
最后
以上就是和谐鸭子为你收集整理的freeRTOS系统静态与动态建立任务的全部内容,希望文章能够帮你解决freeRTOS系统静态与动态建立任务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复