FreeRTOS任务创建、删除

2023-11-16

目录

一、FreeRTOS任务创建与删除有关函数

1.1、创建/删除任务的API函数

1.1.1、动态创建任务

1.1.2、静态创建任务

1.1.3、删除任务

二、FreeRTOS任务创建与删除(动态方法)

2.1、实例

三、FreeRTOS任务创建与删除(静态方法)

四、临界区与任务调度器

4.1、临界区是什么

4.2、临界区使用

4.3、任务调度器


一、FreeRTOS任务创建与删除有关函数

1.1、创建/删除任务的API函数

1.1.1、动态创建任务

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

函数名:xTaskCreate(xxx参数),作用:动态方式创建任务;

动态创建任务分析:

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

2)函数存在返回值,当返回paPASS则表示任务创建成功,当返回

errCOULD_ NOT_ ALLOCATE REQUIRED_ MEMORY表示任务创建失败

3)实现动态创建任务流程只需三步:

        1、将宏configSUPPORT_DYNAMIC_ALLOCATION配置为1;

        2、定义函数入口参数;

        3、编写任务函数。

此函数创建的任务会立即进入就绪态,有任务调度器调度运行,内部实现三步:

        1、申请堆栈内存与任务控制块内存;

        2、TCB结构体成员赋值;

        3、添加新任务到就绪列表中。

动态任务创建函数原型:

    BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
                            const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                            const configSTACK_DEPTH_TYPE usStackDepth,
                            void * const pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t * const pxCreatedTask )

参数解释:

pxTaskCode,含义:指向任务函数的指针

pcName,含义:任务名称

usStackDepth,含义:栈堆大小

pvParameters,含义:传递给任务的参数

uxPriority,含义:任务优先级

pxCreatedTask,含义:任务句柄

1.1.2、静态创建任务

函数名:xTaskCreateStatic(xxx参数),作用:静态方式创建任务

静态创建任务分析:

1)任务的任务控制块以及任务的栈空间所需内存,需要用户自己分配提供

2)函数存在返回值,返回值为NULL则表示用户没有提供相应的内存,任务创建失败,反正为其他值,则表示任务句柄,任务创建成功

3)静态创建任务流程五大步:

        1、需将宏configSUPPORT_ STATIC_ ALLOCATION 配置为1
        2、定义空闲任务&定时器任务的任务堆栈及TCB
        3、实现两个接口函数:vApplicationGetTimerTaskMemory()、vApplicationGetldleTaskMemory()

        4、定义函数入口参数

        5、编写任务函数

此函数创建的任务会立即进入就绪态,由任务调度器调度运行,内部实现为:

        1、TCB结构体成员赋值(因为内存已经提前设置好了,无需申请内存)

        2、添加新任务到就绪列表中

静态任务创建原型:

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   /*任务控制块指针,由用户分配
);

1.1.3、删除任务

函数名:vTaskDelete(TaskHandle_t xTaskToDelete),作用:删除任务

形参:xTaskToDelete,描述:待删除任务的任务句柄

删除任务函数分析:

1)被删除的任务将从就绪态任务列表、阻塞态任务列表、挂起态任务列表和事件列表中移除

2)当传入的参数为NULL时,则任务删除任务自身(当前正在运行任务)

3)空闲任务会负责释放被删除任务中由系统分配的内存,但是用户在任务删除前申请的内存,需要用户在任务被删除前提前释放,否则将导致内存泄露

4)使用只需两步:

        1、使用删除任务函数,需将宏INCLUDE_ _vTaskDelete 配置为1
        2、入口参数输入需要删除的任务句柄(NULL代表删除本身)

5)任务删除内部实现过程:
        1、获取所要删除任务的控制块,通过传入的任务句柄,判断所需要删除哪个任务,NULL代表删除自身
        2、将被删除任务,移除所在列表,将该任务在所在列表中移除,包括:就绪、阻塞、挂起、事件等列表
        3、删除任务自身,需先添加到等待删除列表,内存释放将在空闲任务执行,判断所需要删除的任务,删除其他任务,释放内存,任务数量-1
        4、 更新下个任务的阻塞时间,更新下一个任务的阻塞超时时间,以防被删除的任务就是下一个阻塞超时的任务

二、FreeRTOS任务创建与删除(动态方法)

2.1、实例

说明:

1)下列实例实现了创建了一个开始任务,并在开始任务中创建了任务1和任务2,并在创建完成两个任务后删除自身

2)任务1实现了led0的每隔100ms闪烁,任务1实现了led1的每隔100ms闪烁

3)移植测试要注意对应的配置是否一致,直接复制代码测试基本上都会报错

#include "stm32f10x.h"
#include "stdio.h"
#include "string.h"
 
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "queue.h"
#include "timers.h"
#include "event_groups.h"
 
#include "led.h"
#include "usart.h"
 
 
 
//初始任务 用于创建其他任务,创建后自动删除
#define INIT_TASK_PRIO 1              /* 任务优先级   */
#define INIT_STK_SIZE  256            /* 任务堆栈大小 */
TaskHandle_t INITTask_Handler;        /* 任务句柄     */
void init_task(void *pvParameters);   /* 任务函数     */
 
//LED0灯闪烁 
#define LED0_TASK_PRIO 2              /* 任务优先级   */
#define LED0_STK_SIZE  128            /* 任务堆栈大小 */
TaskHandle_t LED0Task_Handler;        /* 任务句柄     */
void led0_task(void *pvParameters);   /* 任务函数     */
 
//LED1灯闪烁
#define LED1_TASK_PRIO 3              /* 任务优先级   */
#define LED1_STK_SIZE  128            /* 任务堆栈大小 */
TaskHandle_t LED1Task_Handler;        /* 任务句柄     */
void led1_task(void *pvParameters);   /* 任务函数     */
 
 
 
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	LED_Init();                      //LED初始化
	USART1_Init(115200);             //USART1初始化
	
	LED0_H;
	LED1_H;
	//初始任务
  xTaskCreate((TaskFunction_t )init_task,             //任务函数
              (const char*    )"init_task",           //任务名称
              (uint16_t       )INIT_STK_SIZE,         //任务堆栈大小
              (void*          )NULL,                  //传递给任务函数的参数
              (UBaseType_t    )INIT_TASK_PRIO,        //任务优先级
              (TaskHandle_t*  )&INITTask_Handler);    //任务句柄              
  vTaskStartScheduler();    
}
 
//初始任务任务函数
void init_task(void *pvParameters)
{
	taskENTER_CRITICAL();            //进入临界区
							
	//创建LED0任务
	xTaskCreate((TaskFunction_t )led0_task,
							(const char*    )"led0_task",
							(uint16_t       )LED0_STK_SIZE,
							(void*          )NULL,
							(UBaseType_t    )LED0_TASK_PRIO,
							(TaskHandle_t*  )&LED0Task_Handler);
							
	//创建LED1任务
	xTaskCreate((TaskFunction_t )led1_task,
							(const char*    )"led1_task",
							(uint16_t       )LED1_STK_SIZE,
							(void*          )NULL,
							(UBaseType_t    )LED1_TASK_PRIO,
							(TaskHandle_t*  )&LED1Task_Handler);
							
	vTaskDelete(INITTask_Handler); //删除初始任务
	taskEXIT_CRITICAL();           //退出临界区
}
 
void led0_task(void *pvParameters)
{
	while(1)
	{
		LED0_L;
		vTaskDelay(100);
		LED0_H;
		vTaskDelay(100);
		printf("LED0 Test\r\n");
	}
}
 
void led1_task(void *pvParameters)
{
	while(1)
	{
		LED1_L;
		vTaskDelay(100);
		LED1_H;
		vTaskDelay(100);
		printf("LED1 Test\r\n");
	}
}

三、FreeRTOS任务创建与删除(静态方法)

说明:

1)静态创建任务比状态创建任务多的步骤,如下:

1、需要实现两个接口函数-->空闲任务接口必须实现,定时器任务不是必须的,不使用则关闭对应的宏

2)其它步骤与创建动态任务一致

实例暂无

四、临界区与任务调度器

4.1、临界区是什么

1、代码的临界区

        代码的临界区也称为临界区,指处理时不可分割的代码,运行这些代码不允许被打断。一旦这部分代码开始执行,则不允许任何中断打入(这不是绝对的,如果中断不调用任何包含临界区的代码,也不访问任何临界区使用的共享资源,这个中断可能可以执行)。为确保临界区代码的执行,在进入临界区之前要关中断,而临界区代码执行完成以后要立即开中断。

4.2、临界区使用

实例:当我们创建任务时,每创建一个任务,这个任务就会被任务调度器调度到运行态。但是我们希望所有的任务创建好了,按照指定的优先级进行运行,这种情况下就需要使用临界区。

使用思路:在创建任务前,使用FreeRTOS的内置函数-->taskENTER_CRITICAL()进入到临界区,在之后被创建的任务,就保持在就绪态,任务调度器无法进行任务的调度,当所有的任务完成创建时,我们使用FreeRTOS的内置函数-->taskEXIT_CRITICAL()退出临界区。此时所有被创建的任务都是就绪态,但当我们使用抢占式时,任务就回按照优先级进行运行,达到我们的目的。

4.3、任务调度器

函数:vTaskStartScheduler(),作用:开启任务调度

怎么使用:在创建任务后,调用该函数即可,每次程序运行只需调用一次(在第一个创建的任务函数后面调用该函数即可)

当我们创建任务,任务并不会自动的进行排序,我们需要使用FreeRTOS内置的函数-->vTaskStartScheduler()帮助我们把创建的任务按照优先级进行排序,程序才会有序运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS任务创建、删除 的相关文章

随机推荐

  • 如何在vue中引入百度地图

    1 进入百度地图开放平台官网 进行实名认证 https lbsyun baidu com 2 完成实名认证后 进入控制台 3 进入应用管理 gt 我的应用 gt 创建应用 4 根据应用场景更改应用类型 5 白名单填写 gt 提交 6 这样就
  • 机器人编程课必要性

    机器人编程课必要性 说起小孩的学习 想必家长们都是非常的有发言权的 很多的家长想要孩子去学习机器人编程的课程 但是有的家长对于机器人编程课必要性并不是特别的清楚 他们不知道孩子学习机器人编程有啥好处 今天我们就一起来了解一下机器人编程课必要
  • 年末盘点,2021年最值得推荐的10个提高开发效率工具,程序员必备

    程序员的日常工作中 好用的工具往往能让我们事半功倍 极大提升我们的开发效率 接下来分享下我平时工作中经常使用的一些工具 也欢迎大家在评论区给我推荐一些好用的工具软件 一起学习 一 网络抓包工具 1 Proxyman 平时自己编写的程序网络通
  • MySQL 多种查询方法

    这里写目录标题 查询 1 单表查询 1 选择表中的若干列 2 选择表中的若干元组 3 order by子句 4 聚集函数 5 group by分组 2 连接查询 1 等值与非等值连接查询 2 自身连接 3 外连接 4 多表连接 3 嵌套查询
  • CSS学习(六)

    定位 为什么需要定位 提问 以下情况使用标准流或者浮动能实现吗 某个元素可以自由的在一个盒子内移动位置 并且压住其他盒子 当我们滚动窗口的时候 盒子是固定屏幕某个位置的 以上效果 标准流或浮动都无法快速实现 此时需要定位来实现 所以 浮动可
  • vscode 检查c代码语法和补全_VScode下搭配ESLint、TSLint、stylelint的代码检查配方

    使用VScode打开项目时 避免项目路径过深 尽量做到开发a项目就打开a项目 如 dir path path a这样的路径 不要vscode打开 dir来开发 a 因为可能会导致eslint的一些提示出现不准确的现象 关键词 ESLint配
  • tensorflow4:创建一个简单的强化学习游戏

    Deep Q Network是DeepMind最早 2013年 提出来的 是深度强化学习方法 最开始AI什么也不会 通过给它提供游戏界面像素和分数 慢慢把它训练成游戏高手 这里首先给出一个基本的游戏例子 然后再给出强化学习方法 1 基本游戏
  • elementui 计数器

    输入值超过规定的最大值 比如999 输入1000时 输入后 直接提交表单 中间计数器会自动把1000转化为999 再提交 测试人员说没有出现 不能超过3位数字的提示 解决办法 把min和max去掉 再写自定义验证规则就可以了 计数器自动转化
  • JavaScript:iterable类型

    遍历Array可以采用下标循环 遍历Map和Set就无法使用下标 为了统一集合类型 ES6标准引入了新的iterable类型 Array Map和Set都属于iterable类型 具有iterable类型的集合可以通过新的for of循环来
  • 向量积(叉积)及其计算

    定义 两个向量a和b的 向量积 外积 叉积 是一个向量 记作a b 这里 并不是乘号 只是一种表示方法 与 不同 也可记做 若a b不共线 则a b的模是 a b a b sin a b a b的方向是 垂直于a和b 且a b和a b按这个
  • 【Linux】基于单例模式懒汉实现方式的线程池

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 LockGuard hpp 二 Task hpp 三
  • 二叉查找树(BST)的基本概念及常用操作

    二叉查找树 二叉查找树 Binary Search Tree 也称二叉搜索树 有序二叉树 ordered binary tree 排序二叉树 orted binary tree 是指一棵空树或者具有下列性质的二叉树 若任意节点的左子树不空
  • 有效的括号 力扣 栈应用

    上班摸鱼打代码 o 目录 题目描述 AC代码 思路分析 题目描述 给定一个只包括 的字符串 s 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 示例 1 输入 s 输出 true示例 2
  • HECI-Securtiy 防火墙路由技术

    目录 一 防火墙路由基本原理 1 路由分类 2 路由优先级 3 路由查询先后顺序 4 静态路由基本原理 1 指定出接口场景 2 指定下一跳地址场景 5 静态路由与多出口 1 主备备份 2 均衡式负载分担 3 溢出式负载分担 二 逐流与逐包报
  • 2022年实习面试 凉经

    2022年实习面试 凉经 字节跳动 数据分析师 2022 8 3 首先是自我介绍 其次给我出了一道sql的题目 里面用到了group by 的分组函数 以及最好嵌套一个子查询 然后出了一道题 感觉是产品经理方向 说B战有一个视频的播放量 一
  • java awt实现拖拉式文件路径获取

    package com example drag import java awt GridLayout import java awt datatransfer DataFlavor import java awt dnd DnDConst
  • SQL——根据字段包含值,统计条数(全文索引、CONTAINS、instr)

    根据字段包含值 统计条数 例如my column字段值可能为 0 1 2 3 4 5 目标 统计my column中的值为0 为1 为2 的各个条数 方式一 使用CONTAINS 该功能建立在全文索引之上 删除全文索引 DROP CONTE
  • 景联文科技高质量教育GPT题库:引领教育行业的技术革命

    ChatGPT拉开了大语言题库和生成式AI产业蓬勃发展的序幕 全世界教育科技公司扎堆接入GPT 4 涵盖美国 欧洲 日韩 中东和北非地区等 大语言题库在教育领域中势必将获得更加广阔的应用前景和丰富的应用场景 杭州景联文科技是AI基础数据行业
  • ElasticSearch text 和 keyword 类型

    ElasticSearch text 和 keyword 类型 text 会进行分词 先把对象进行分词处理 然后存入到es中 当使用多个单词进行查询的时候 查不到已经分词过的内容 keyword 不会进行分词 不会对es中的对象进行分词处理
  • FreeRTOS任务创建、删除

    目录 一 FreeRTOS任务创建与删除有关函数 1 1 创建 删除任务的API函数 1 1 1 动态创建任务 1 1 2 静态创建任务 1 1 3 删除任务 二 FreeRTOS任务创建与删除 动态方法 2 1 实例 三 FreeRTOS