6.1任务创建和删除 API 函数
FreeRTOS 的任务创建和删除 API 函数如表:
函数 xTaxkCreate()
此函数用来创建一个任务,任务需要 RAM 来保存与任务有关的状态信息(任务控制块),任务也需要一定的 RAM 来作为任务堆栈。如果使用函数 xTaskCreate()来创建任务的话那么这些所需的 RAM 就会自动的从 FreeRTOS 的堆中分配,因此必须提供内存管理文件,默认我们使用 heap_4.c 这个内存管理文件,而且宏 configSUPPORT_DYNAMIC_ALLOCATION 必须为 1。
如果使用函数 xTaskCreateStatic()创建的话这些 RAM 就需要用户来提供了。新创建的任务默认就是就绪态的,如果当前没有比它更高优先级的任务运行那么此任务就会立即进入运行态开始运 行,不管在任务调度器启动前还是启动后,都可以创建任务。此函数也是我们以后经常用到的, 本教程所有例程均用此函数来创建任务,函数原型如下:
函数 xTaskCreateStatic()
此函数和 xTaskCreate()的功能相同,但是使用此函数创建的任务所需的 RAM需要用用户来提供 。 如果要使用此函数的话需要将宏 configSUPPORT_STATIC_ALLOCATION 定义为 1。
函数 xTaskCreateRestricted()
此函数也是用来创建任务的,只不过此函数要求所使用的 MCU 有 MPU(内存保护单元), 用此函数创建的任务会受到 MPU 的保护。其他的功能和函数 xTaxkCreate()一样。
函数 vTaskDelete()
删除一个用函数 xTaskCreate()或者 xTaskCreateStatic()创建的任务,被删除了的任务不再存 在,也就是说再也不会进入运行态。任务被删除以后就不能再使用此任务的句柄!
如果此任务 是使用动态方法创建的,也就是使用函数 xTaskCreate()创建的,那么在此任务被删除以后此任 务之前申请的堆栈和控制块内存会在空闲任务中被释放掉,因此当调用函数 vTaskDelete()删除任务以后必须给空闲任务一定的运行时间。 只有那些由内核分配给任务的内存才会在任务被删除以后自动的释放掉,用户分配给任务的内存需要用户自行释放掉。
比如某个任务中用户调用函数 pvPortMalloc()分配了 500 字节的内 存,那么在此任务被删除以后用户也必须调用函数 vPortFree()将这 500 字节的内存释放掉,否则会导致内存泄露。此函数原型如下:
6.4 任务挂起和恢复 API 函数
有时候我们需要暂停某个任务的运行,过一段时间以后在重新运行。FreeRTOS 给我们提供了解决 这种问题的方法,那就是任务挂起和恢复,当某个任务要停止运行一段时间的话就将这个任务挂起,当要重新运行这个任务的话就恢复这个任务的运行。FreeRTOS 的任务挂起和恢复 API 函 数如表所示:
函数 vTaskSuspend()
此函数用于将某个任务设置为挂起态,进入挂起态的任务永远都不会进入运行态。退出挂 起态的唯一方法就是调用任务恢复函数 vTaskResume()或 xTaskResumeFromISR()
函数 vTaskResume()
将一个任务从挂起态恢复到就绪态,只有通过函数 vTaskSuspend()设置为挂起态的任务才 可以使用 vTaskRexume()恢复!函数原型如下:
函数 xTaskResumeFromISR()
此函数是 vTaskResume()的中断版本,用于在中断服务函数中恢复一个任务
小点:
1.start_task 任务的职责就是用来创建其他的任务或者信号量、消息队列等的,当创建完成以后就可以删除掉 start_task 任务。调用函数 vTaskStartScheduler()开启 FreeRTOS 的任务调度器,FreeRTOS 开始运行。
2.使用任务宏定义任务优先级,堆栈大小等,一般有关一个任务 的东西我们的放到一起,比如任务堆栈、任务句柄、任务函数声明等,这样方便修改。这些东西可以放到一个.h 头文件里面去,例程里面任务数比较少,所以就直接放到 main.c 文件里 面了,要是工程比较大的话最好做一个专用的头文件来管理.
3.在 main 函数中一开始肯定是初始化各种硬件外设,初始化完外设以后调用函数 xTaskCreate()创建一个开始任务,注意创建开始任务是在调用函数 vTaskStartScheduler()开启任 务调度器之前,这样当后面开启任务调度器以后就会直接运行开始任务了。其他任务的创建就 放到开始任务的任务函数中,由于开始任务的职责就是创建其他应用任务和信号量、队列等这 些内核对象的,所以它只需要执行一次,当这些东西创建完成以后就可以删除掉开始任务了。
4.如果使用静态方 法 的 话 需 要 用 户 实 现 两 个 函 数 vApplicationGetIdleTaskMemory() 和 vApplicationGetTimerTaskMemory()。通过这两个函数来给空闲任务和定时器服务任务的任务堆 栈和任务控制块分配内存,
标签:函数,FreeRTOS,创建,调用函数,任务,API,第六章,删除 From: https://blog.csdn.net/qq_45150278/article/details/143258403