FreeRTOS基础知识二

65 阅读2分钟

1. 任务创建和删除的API函数

任务的创建和删除本质就是调用FreeRTOS的API函数。

1.1 动态创建任务

xTaskCreate(),任务的任务控制块以及任务的栈空间所需的内存,均由FreeRTOS从FreeRTOS管理的堆中分配

1.1.1 动态创建任务其内部实现

  1. 申请堆栈内存(返回首地址)
  2. 申请任务控制块内存(返回首地址)
  3. 把前面申请的堆栈地址,赋值给控制块的堆栈成员
  4. 调用prvInitialiseNewTask初始化任务控制块中的成员
  5. 调用prvAddNewTaskToReadyList添加新创建任务到就绪列表中

1.1.2 实现动态创建任务流程

  • 使用动态创建任务,需将宏configSUPPORT_DYNAMIC_ALLOCATION配置为1
  • 定义函数入口参数
  • 编写任务函数

1.2 静态创建任务

xTaskCreateStatic(),任务的任务控制块以及任务的栈空间所需的内存,需用户分配提供

1.2.1 静态创建任务其内部实现

  1. 获取控制块内存(首地址)
  2. 获取堆栈内存(首地址)
  3. 标记使用的静态的方式申请的TCB和堆栈内存
  4. 调用prvInitialiseNewTask初始化任务块,并将控制块信息返回给任务句柄,方便返回句柄信息
  5. 调用prvAddNewTaskToReadyList添加新创建任务到就绪列表中

1.2.2 静态创建任务流程

  • 将宏configSUPPORT_STATIC_ALLOCATION配置为1

  • 定义空闲任务&定时器的任务堆栈及TCB

  • 实现两个接口函数

          vApplicationGetldleTaskMemory()
          vApplicationGetTimerTaskMemory()
    
  • 编写任务函数

1.3 删除任务

vTaskDelete()

1.3.1 删除任务的内部实现

  1. 获取所要删除任务的控制块

    通过传入的任务句柄,判断所需要删除哪个任务,NULL代表删除自身

  2. 将被删除任务,移除所在列表

    将该任务在所在列表中移除,包括:就绪、阻塞、挂起、事件等列表

  3. 判断所需要删除的任务

  • 删除任务自身,需先添加到等待删除列表,内存释放将在空闲任务执行
  • 删除其他任务,当前任务数量——  更新下一个任务的阻塞超时时间,以防被删除的任务就是下一个阻塞超时的任务
  1. 删除的任务为其他任务则直接释放内存prvDeleteTCB()
  2. 调度器正在运行且删除任务自身,则需要进行一次任务切换

2. 临界区保护

保护那些不想被打断的程序段,关闭freertos所管理的中断,中断无法打断,滴答中断和PendSV中断无法进行任务调度