首页 > 其他分享 >02常用任务函数

02常用任务函数

时间:2023-09-05 20:55:04浏览次数:35  
标签:02 常用 const 函数 任务 内存 堆栈 优先级

1.任务创建和删除

任务创建和删除调用的API函数。

函数 描述
xTaskCreate() 使用动态的方法创建一个任务
xTaskCreateStatic() 使用静态的方法创建一个任务
vTaskDelete() 删除一个任务

(1)任务创建和删除(动态方法)

  • 使用动态任务创建函数 xTaskCreate() 来创建一个任务,任务需要 RAM 来保存与任务有关的状态信息,也需要一定的 RAM 来作为任务堆栈。所需的 RAM 就会自动的从 FreeRTOS 的堆中分配,因此必须提供内存管理文件,默认使用
    heap_4.c 这个内存管理文件,而且宏 configSUPPORT_DYNAMIC_ALLOCATION 必须为 1,支持动态内存申请。新创建的任务默认就是就绪态的,如果当前没有比它更高优先级的任务运行那么此任务就会立即进入运行态开始运行,不管在任务调度器启动前还是启动后,都可以创建任务。
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,   //任务入口函数
                        const char * const pcName,  //任务名字
                        const uint16_t usStackDepth,//任务栈大小
                        void * const pvParameters,  //任务入口函数参数
                        UBaseType_t uxPriority,    //任务的优先级,0-31
                        TaskHandle_t * const pxCreatedTask ) //任务句柄
  • 动态创建及内部实现:
    ① 申请堆栈内存(返回首地址)
    ②申请任务控制块内存(返回首地址)
    ③把申请的堆栈地址赋值给控制块的堆栈成员
    ④调用 prvInitialiseNewTask 初始化任务控制块中的成员

    • 初始化堆栈为0xa5(可选);
    • 记录栈顶,保存在 pxTopOfStack;
    • 保存任务名字到 pxNewTCB->pcTaskName[x]中;
    • 保存任务优先级到 pxNewTCB->uxPriority;
    • 设置状态列表项的所属控制块,设置事件列表项的值;
    • 列表项的插入是从小到大插入,将越高优先级的任务事件列表项值设置越小就可以排到前面;
    • 调用 pxPortInitialiseStack 初始化任务栈,用于保存当前任务上下文寄存器信息,以备后续任务切换使用;
    • 将任务句柄等于任务控制块。

    ⑤调用 prvAddNewTaskToReadyList 添加新创建任务到就绪列表中

    • 记录任务数量 uxCurrentNumberOfTasks++;
    • 判断新创建的任务是否为第一个任务
      • 是第一个任务,初始化任务列表 prvInitialiseTaskLists;
      • 不是第一个任务,并且调度器还未启动,比较新任务与正在执行的任务优先级大小,新任务优先级大的话,将当前控制块指向新的控制块。
    • 将新的任务控制块添加到就绪列表中,使用函数 prvAddNewTaskToReadyList
    • 如果调度器已经开始运行,并且新任务的优先级更大的话,进行一次任务切换。

(2)任务创建和删除(静态方法)

  • ① 使用函数 xTaskCreateStatic()创建,这些 RAM 就需要用户来提供,configSUPPORT_STATIC_ALLOCATION 定义为 1。

  • ② 定义空闲任务和定时器任务的任务堆栈、PCB及实现两个接口函数

空闲任务使用vApplicationGetIdleTaskMemory()函数

参数:

  • ppxIdleTaskTCBBuffer:任务控制块内存
  • ppxIdleTaskStackBuffer:任务堆栈内存
  • pulIdleTaskStackSize:任务堆栈大小

void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, 
								   StackType_t **ppxIdleTaskStackBuffer, 
								   uint32_t *pulIdleTaskStackSize)
{
	*ppxIdleTaskTCBBuffer=&IdleTaskTCB;      //任务控制块内存
	*ppxIdleTaskStackBuffer=IdleTaskStack;   //任务堆栈内存 
	*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE; //任务堆栈大小
}
  • 定时器任务使用vApplicationGetTimerTaskMemory()函数
    参数:
  • ppxTimerTaskTCBBuffer:任务控制块内存
  • ppxTimerTaskStackBuffer:任务堆栈内存
  • pulTimerTaskStackSize:任务堆栈大小
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, 
									StackType_t **ppxTimerTaskStackBuffer, 
									uint32_t *pulTimerTaskStackSize)
{
	*ppxTimerTaskTCBBuffer=&TimerTaskTCB;     //任务控制块内存
	*ppxTimerTaskStackBuffer=TimerTaskStack;  //任务堆栈内存
	*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH; //任务堆栈大小
}

③定义函数入口参数

④编写任务函数

TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,//任务入口函数
                                const char * const pcName,//任务名字
                                const uint32_t ulStackDepth,//任务栈大小
                                void * const pvParameters,//任务入口函数参数
                                UBaseType_t uxPriority,//任务的优先级
                                StackType_t * const puxStackBuffer,//任务堆栈
                                StaticTask_t * const pxTaskBuffer )//任务控制块

标签:02,常用,const,函数,任务,内存,堆栈,优先级
From: https://www.cnblogs.com/xiaohuzaixue/p/17667342.html

相关文章

  • 2023你需要使用的最佳VSCode扩展
    VisualStudioCode(VSCode)是一款广受欢迎的多功能代码编辑器,在最新的StackOverflow开发者调查中,近75%的开发者将其选为首选集成开发环境。VSCode提供了一系列开箱即用的特性和功能,但其真正的威力在于市场上庞大的扩展生态系统。整理了VSCode30大扩展列表,希望大家能使用这些......
  • 无涯教程-JavaScript - DAYS360函数
    描述DAYS360函数返回基于360天的年份(十二个月为30天)的两个日期之间的天数,该天数用于会计计算。语法DAYS360(start_date,end_date,[method])争论Argument描述Required/OptionalStart_dateThetwodatesbetweenwhichyouwanttoknowthenumberofdays.Requir......
  • 【愚公系列】2023年09月 WPF控件专题 Calendar控件详解
    (文章目录)前言WPF控件是WindowsPresentationFoundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见......
  • Linux中有哪些常用的网络命令,分别适用于什么场景?
    Linux作为一种广泛使用的操作系统,其网络功能非常强大。在Linux系统中,有很多网络相关的命令可以用于管理和配置网络,比如ifconfig、netstat、ping、traceroute、route等等。本文将对一些常用的Linux网络命令进行详细介绍。一、ifconfig命令ifconfig命令用于显示和配置Linux系统的网......
  • 2023/9/5 虹日刊 关键词:数字化零售
    ......
  • 深入了解Git:介绍及常用命令指南
    当今软件开发领域中,版本控制是一个至关重要的概念,而Git作为最流行的分布式版本控制系统,发挥着不可替代的作用。本文将介绍Git的基本概念以及常用命令,帮助你更好地理解和使用这一强大的工具。Git简介Git是一种分布式版本管理系统(版本管理就是管理更新的历史记录。它为我们提供了一些......
  • 【IEEE802】IEEE802协议组简述
    IEEE802协议概览协议说明功能IEEE802IEEE802是一种物理协议,因为有很多子协议,把这些协议汇集在一起就叫802协议集IEEE802.1x基于端口的访问控制协议能够在利用IEEE802局域网优势的基础上提供一种对连接到局域网的用户进行认证和授权的手段,达到了接受合法用户接......
  • Golang匿名函数浅谈
    Go匿名函数(闭包)在Go中,匿名函数(也称为闭包)可以捕获外部变量。Go的闭包是指一个函数值(函数变量)包含了对其外部作用域中变量的引用。匿名函数可以访问和修改其外部作用域中的变量。它可以捕获外部变量的值,并在函数体中使用这些变量。下面是一个示例,展示了如何在匿名函数中捕......
  • 文件操作补充+函数伊始
    二进制模式下读写操作#withopen('a.txt','r',encoding='utf-8')asf:#print(f.read(5))withopen('a.txt','rb')asf:#print(f.read().decode('utf-8'))#b'helloworld'print(f.rea......
  • 回调函数
      ......