【FreeRTOS】任务的创建

2023-05-16

启动流程

LiteOS 和 ucos 第一种和第二种都可以使用,由用户选择,RT-Thread 和 FreeRTOS 则默认

  1. 创建各个任务,然后等待启动调度器
  2. 创建一个起始任务,任务都在这个起始任务内创建,然后删除起始任务,启动调度器

创建任务

在这里插入图片描述

BaseType_t xTaskCreate(
           TaskFunction_t 		pvTaskCode,
          	const char * const 	pcName,
           unsigned short 		usStackDepth,
           void * const			pvParameters,
           UBaseType_t 			uxPriority,
           TaskHandle_t * 		pvCreatedTask)

用法示例

//任务优先级
#define APPTask_TASK_PRIO		1
//任务堆栈大小	(单位为字,在32位处理器下,一个字等于4个字节)
#define AppTask_STK_SIZE 		512
//任务句柄
TaskHandle_t AppTaskCreate_Handle;
//任务函数
void AppTaskCreate(void *pvParameters);

int main(void)
{	
  BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
  
  /* 开发板硬件初始化 */
  BSP_Init();
  
  printf("这是一个[野火]-STM32全系列开发板-FreeRTOS任务管理实验!\n\n");
  printf("按下KEY1挂起任务,按下KEY2恢复任务\n");
   /* 创建AppTaskCreate任务 */
  xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,  /* 任务入口函数 */
                        (const char*    )"AppTaskCreate",/* 任务名字 */
                        (uint16_t       )AppTask_STK_SIZE,  /* 任务栈大小 */
                        (void*          )NULL,/* 任务入口函数参数 */
                        (UBaseType_t    )APPTask_TASK_PRIO, /* 任务的优先级 */
                        (TaskHandle_t*  )&AppTaskCreate_Handle);/* 任务控制块指针 */ 
  /* 启动任务调度 */           
  if(pdPASS == xReturn)
    vTaskStartScheduler();   /* 启动任务,开启调度 */
  else
    return -1;  
    
  while(1);   /* 正常不会执行到这里 */  
}
/***********************************************************************
 * @ 函数名  : AppTaskCreate
 * @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面
 * @ 参数    : 无  
 * @ 返回值  : 无
  **********************************************************************/
static void AppTaskCreate(void)
{
  BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
  
  taskENTER_CRITICAL();           //进入临界区
  
  /* 创建LED_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )LED_Task, /* 任务入口函数 */
                        (const char*    )"LED_Task",/* 任务名字 */
                        (uint16_t       )512,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )2,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&LED_Task_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
    printf("创建LED_Task任务成功!\r\n");
  /* 创建KEY_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )KEY_Task,  /* 任务入口函数 */
                        (const char*    )"KEY_Task",/* 任务名字 */
                        (uint16_t       )512,  /* 任务栈大小 */
                        (void*          )NULL,/* 任务入口函数参数 */
                        (UBaseType_t    )3, /* 任务的优先级 */
                        (TaskHandle_t*  )&KEY_Task_Handle);/* 任务控制块指针 */ 
  if(pdPASS == xReturn)
    printf("创建KEY_Task任务成功!\r\n");
  
  vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
  
  taskEXIT_CRITICAL();            //退出临界区
}

任务状态

在这里插入图片描述

  • 就绪(Ready):该任务在就绪列表中,就绪的任务已经具备执行的能力,只等待调度器进行调度,新创建的任务会初始化为就绪态。
  • 运行(Running):该状态表明任务正在执行,此时它占用处理器,FreeRTOS 调度器选择运行的永远是处于最高优先级的就绪态任务,当任务被运行的一刻,它的任务状态就变成了运行态。
  • 阻塞(Blocked):如果任务当前正在等待某个时序或外部中断,我们就说这个任务处于阻塞状态,该任务不在就绪列表中。包含任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等。
  • 挂起态(Suspended):处于挂起态的任务对调度器而言是不可见的,让一个任务进入挂起状态的唯一办法就是调用 vTaskSuspend()函数;而 把 一 个 挂 起 状态 的任 务 恢复的 唯 一 途 径 就 是 调 用 vTaskResume() 或 vTaskResumeFromISR()函数,我们可以这么理解挂起态与阻塞态的区别,当任务有较长的时间不允许运行的时候,我们可以挂起任务,这样子调度器就不会管这个任务的任何信息,直到我们调用恢复任务的 API 函数;而任务处于阻塞态的时候,系统还需要判断阻塞态的任务是否超时,是否可以解除阻塞。

任务延时

相对延时

void vTaskDelay( const TickType_t xTicksToDelay );
timeout:xTicksToDelay * tick

绝对延时(延时时间>>任务时间)

void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime,const TickType_t xTimeIncrement );
pxPreviousWakeTime:当前时间
timeout:(*pxPreviousWakeTime + xTimeIncrement)

void vTaskA( void * pvParameters )
{
 /*  用于保存上次时间。调用后系统自动更新 */
 static portTickType PreviousWakeTime;
 /*  设置延时时间,将时间转为节拍数 */
 const portTickType TimeIncrement = pdMS_TO_TICKS(1000);

 /*  获取当前系统时间 */
 PreviousWakeTime = xTaskGetTickCount();

 while (1)
 {

 
 /*  调用绝对延时函数, 任务时间间隔为 为 1000 个 个 tick */
 vTaskDelayUntil( &PreviousWakeTime ,TimeIncrement );

 
 // ...
 // 这里为任务主体代码
 // ...
 
 }

启动流程
LiteOS 和 ucos 第一种和第二种都可以使用,由用户选择,RT-Thread 和 FreeRTOS 则默认

创建各个任务,然后等待启动调度器
创建一个起始任务,任务都在这个起始任务内创建,然后删除起始任务,启动调度器
创建任务
在这里插入图片描述

BaseType_t xTaskCreate(
TaskFunction_t pvTaskCode,
const char * const pcName,
unsigned short usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * pvCreatedTask)
用法示例
//任务优先级
#define APPTask_TASK_PRIO 1
//任务堆栈大小
#define AppTask_STK_SIZE 512
//任务句柄
TaskHandle_t AppTaskCreate_Handle;
//任务函数
void AppTaskCreate(void *pvParameters);

int main(void)
{
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */

/* 开发板硬件初始化 */
BSP_Init();

printf(“这是一个[野火]-STM32全系列开发板-FreeRTOS任务管理实验!\n\n”);
printf(“按下KEY1挂起任务,按下KEY2恢复任务\n”);
/* 创建AppTaskCreate任务 /
xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate, /
任务入口函数 /
(const char
)“AppTaskCreate”,/* 任务名字 /
(uint16_t )AppTask_STK_SIZE, /
任务栈大小 /
(void
)NULL,/* 任务入口函数参数 /
(UBaseType_t )APPTask_TASK_PRIO, /
任务的优先级 /
(TaskHandle_t
)&AppTaskCreate_Handle);/* 任务控制块指针 /
/
启动任务调度 /
if(pdPASS == xReturn)
vTaskStartScheduler(); /
启动任务,开启调度 */
else
return -1;

while(1); /* 正常不会执行到这里 /
}
/
**********************************************************************

  • @ 函数名 : AppTaskCreate
  • @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面
  • @ 参数 : 无
  • @ 返回值 : 无
    *********************************************************************/
    static void AppTaskCreate(void)
    {
    BaseType_t xReturn = pdPASS;/
    定义一个创建信息返回值,默认为pdPASS */

taskENTER_CRITICAL(); //进入临界区

/* 创建LED_Task任务 /
xReturn = xTaskCreate((TaskFunction_t )LED_Task, /
任务入口函数 /
(const char
)“LED_Task”,/* 任务名字 /
(uint16_t )512, /
任务栈大小 /
(void
)NULL, /* 任务入口函数参数 /
(UBaseType_t )2, /
任务的优先级 /
(TaskHandle_t
)&LED_Task_Handle);/* 任务控制块指针 /
if(pdPASS == xReturn)
printf(“创建LED_Task任务成功!\r\n”);
/
创建KEY_Task任务 /
xReturn = xTaskCreate((TaskFunction_t )KEY_Task, /
任务入口函数 /
(const char
)“KEY_Task”,/* 任务名字 /
(uint16_t )512, /
任务栈大小 /
(void
)NULL,/* 任务入口函数参数 /
(UBaseType_t )3, /
任务的优先级 /
(TaskHandle_t
)&KEY_Task_Handle);/* 任务控制块指针 */
if(pdPASS == xReturn)
printf(“创建KEY_Task任务成功!\r\n”);

vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务

taskEXIT_CRITICAL(); //退出临界区
}
任务状态
在这里插入图片描述

就绪(Ready):该任务在就绪列表中,就绪的任务已经具备执行的能力,只等待调度器进行调度,新创建的任务会初始化为就绪态。
运行(Running):该状态表明任务正在执行,此时它占用处理器,FreeRTOS 调度器选择运行的永远是处于最高优先级的就绪态任务,当任务被运行的一刻,它的任务状态就变成了运行态。
阻塞(Blocked):如果任务当前正在等待某个时序或外部中断,我们就说这个任务处于阻塞状态,该任务不在就绪列表中。包含任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等。
挂起态(Suspended):处于挂起态的任务对调度器而言是不可见的,让一个任务进入挂起状态的唯一办法就是调用 vTaskSuspend()函数;而 把 一 个 挂 起 状态 的任 务 恢复的 唯 一 途 径 就 是 调 用 vTaskResume() 或 vTaskResumeFromISR()函数,我们可以这么理解挂起态与阻塞态的区别,当任务有较长的时间不允许运行的时候,我们可以挂起任务,这样子调度器就不会管这个任务的任何信息,直到我们调用恢复任务的 API 函数;而任务处于阻塞态的时候,系统还需要判断阻塞态的任务是否超时,是否可以解除阻塞。
任务延时
相对延时
void vTaskDelay( const TickType_t xTicksToDelay );
timeout:xTicksToDelay * tick
绝对延时(延时时间>>任务时间)
void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime,const TickType_t xTimeIncrement );
pxPreviousWakeTime:当前时间
timeout:(*pxPreviousWakeTime + xTimeIncrement)

void vTaskA( void * pvParameters )
{
/* 用于保存上次时间。调用后系统自动更新 /
static portTickType PreviousWakeTime;
/
设置延时时间,将时间转为节拍数 */
const portTickType TimeIncrement = pdMS_TO_TICKS(1000);

/* 获取当前系统时间 */
PreviousWakeTime = xTaskGetTickCount();

while (1)
{

/* 调用绝对延时函数, 任务时间间隔为 为 1000 个 个 tick */
vTaskDelayUntil( &PreviousWakeTime ,TimeIncrement );

// …
// 这里为任务主体代码
// …

}

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

【FreeRTOS】任务的创建 的相关文章

  • FreeRTOS系列

    1 多任务系统 1 1 前后台系统 单片机裸机开发时 一般都是在main函数里面用while 1 做一个大循环来完成所有的处理 循环中调用相应的函数完成所需的处理 有时也需要在中断中完成一些处理 相对于多任务系统而言 这就是单人单任务系统也
  • STM32CubeMX+FreeRTOS学习笔记(一)

    嵌入式实时操作系统FreeRTOS 基本概述 在嵌入式领域当中 实时操作系统的应用越来越广泛了 目前嵌入式操作系统种类很多 例如 Clinux C OS II C OS III FreeRTOS RT Thread等等 这篇文章所记录的就是
  • FreeRTOS软件定时器创建、复位、开始和停止(备忘)

    目录 一 简介 1 1 开发环境 1 2 摘要 二 STM32CubeIDE配置 三 创建定时器 3 1 头文件声明 3 2 工程文件定义 3 3 创建定时器 3 4 开启 复位 和关闭定时器 四 定时器回调函数 一 简介 1 1 开发环境
  • STM32移植FreeRTOS的Tips

    转自 http bbs armfly com read php tid 7140 1 在FreeRTOS的demo文件夹中拷贝对应的FreeRTOSConfig h文件后 需要加入一行 define configUSE MUTEXES 1
  • FreeRTOS打印任务对CPU的占有率

    1 配置RTOS 1 打开RTOS Config Parameter 找到Run Time And Task States gathering related definitions 使能GENERATE RUN TIME STATS US
  • 基于HAL库的FREERTOS----------一.任务

    FreeROTS 就是一个免费的 RTOS 类系统 这里要注意 RTOS 不是指某一个确定的系统 而是指一类系统 比如 UCOS FreeRTOS RTX RT Thread 等这些都是 RTOS 类操作系统 FreeRTOS 是 RTOS
  • 【FreeRTOS(三)】任务状态

    文章目录 任务状态 任务挂起 vTaskSuspend 取消任务挂起 vTaskResume 挂起任务调度器 vTaskSuspendAll 取消挂起任务调度器 xTaskResumeAll 代码示例 任务挂起 取消任务挂起 代码示例 挂起
  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • FreeRTOS临界段和开关中断

    http blog sina com cn s blog 98ee3a930102wg5u html 本章教程为大家讲解两个重要的概念 FreeRTOS的临界段和开关中断 本章教程配套的例子含Cortex M3内核的STM32F103和Co
  • FreeRTOS之软件定时器

    FreeRTOS之软件定时器 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 include sys h include delay h include usart h include led h in
  • FreeRTOS之事件

    FreeRTOS之事件 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 一 事件定义 事件 事件集 与高数上的集合意义差不多 事件啊 其实是实现任务间通信的机制 主要用于实现多任务间的同步 但是事件类型
  • [FreeRTOS入门学习笔记]定时器

    定时器的使用步骤 1 定义一个handle xTimerCreate创建 2 启动定时器 在Task1中调用 通过队列通知守护任务来执行定时器任务 要再config头文件中定义守护任务相关配置 虽然定时器是在task1中启动 但是定时器的任
  • 【FreeRTOS 事件】任务通知事件

    普通任务通知事件创建创建及运行 参阅安富莱电子demo define BIT 0 1 lt lt 0 define BIT 1 1 lt lt 1 static TaskHandle t xHandleTaskUserIF NULL sta
  • STM32 Freertos 添加 外部sram heap_5.c

    1 添加外部SRAM 初始化 2 添加heap 5 c 3 初始化heap 5 c 外部堆栈 Define the start address and size of the two RAM regions not used by the
  • FreeRTOS实时操作系统(三)任务挂起与恢复

    系列文章 FreeRTOS实时操作系统 一 RTOS的基本概念 FreeRTOS实时操作系统 二 任务创建与任务删除 HAL库 FreeRTOS实时操作系统 三 任务挂起与恢复 FreeRTOS实时操作系统 四 中断任务管理 FreeRTO
  • 再论FreeRTOS中的configTOTAL_HEAP_SIZE

    关于任务栈和系统栈的基础知识 可以参考之前的随笔 FreeRTOS 任务栈大小确定及其溢出检测 这里再次说明 define configTOTAL HEAP SIZE size t 17 1024 这个宏 官方文档解释 configTOTA
  • FreeRTOSConfig.h 配置优化及深入

    本篇目标 基于上一篇的移植freertos stm32f4 freertos 上 修改 FreeRTOSConfig h 文件的相关配置来优化辅助 FreeRtos 的使用 并且建立一些基本功能 信号量 消息地列等 的简单应用位于 stm3
  • FreeRTOS 配置TICK_RATE_HZ

    我使用的是带有 5 4 版 FreeRTOS 的 MSP430f5438 我有一个有趣的问题 我无法弄清楚 基本上 当我将 configTICK RATE HZ 设置为不同的值时 LED 闪烁得更快或更慢 它应该保持相同的速率 我将 con
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https

随机推荐

  • 从零开始学习HBase - 一文详解HBase常用API

    HBase常用API总结 使用的HBase版本为 1 31 1 pom xml文件 span class token comment lt 配置 Hbase 的依赖 gt span span class token tag span cla
  • 基于SDN的访问控制模块实现

    一 背景 1 访问控制 访问控制技术 xff0c 指防止对任何资源进行未授权的访问 xff0c 从而使计算机系统在合法的范围内使用 意指用户身份及其所归属的某项定义组来限制用户对某些信息项的访问 xff0c 或限制对某些控制功能的使用的一种
  • Java -- 访问权限控制(public,protected,private)

    访问权限控制 xff08 public xff0c protected xff0c private xff09 Java中最大权限到最小权限依次为 xff1a public xff0c protected xff0c private 类库
  • 认识一下toB和toC

    这个话题似乎是老生常谈 xff0c 但其实每个人的理解都不尽相同 xff0c 甚至一个人在不同阶段也有很大不同 xff0c 就好像金庸武侠独孤求败的利剑 软剑 重剑 木剑 xff0c 阅历不同 xff0c 感悟不同 xff0c 境界就不同
  • 将Docker镜像安全扫描步骤添加到CI/CD管道

    使用GitlabCI和Trivy 介绍 如今 xff0c 镜像安全扫描变得越来越流行 这个想法是分析一个Docker镜像并基于CVE数据库寻找漏洞 这样 xff0c 我们可以在使用镜像之前知道其包含哪些漏洞 xff0c 因此我们只能在生产中
  • 卡尔曼滤波器之经典卡尔曼滤波

    参考文献 xff1a xff11 http www bzarg com p how a kalman filter works in pictures xff12 https blog csdn net u010720661 article
  • 卡尔曼滤波器之扩展卡尔曼滤波

    参考文献 xff1a xff11 https zhuanlan zhihu com p 63641680 目录 xff11 xff0e 非线性模型 xff12 xff0e 非线性模型到线性模型的近似 xff11 xff0e 非线性模型 卡尔
  • VINS fusion软件架构分析(3)--- 输入IMU和相机信息 inputIMU + inputImage

    文章目录 1 输入IMU和相机信息1 1 inputIMU1 1 1 fastPredictIMU1 1 1 1 Utility deltaQ 1 1 2 pubLatestOdometry知识点 pair 1 2 inputImage1
  • VINS fusion软件架构分析(2)---- 从参数文件读取参数

    1 参数配置文件 VINS是利用参数文件yaml统一管理重要的参数 xff0c 主要分为两个参数配置文件 xff0c 如下图 普通参数配置文件 xff0c 如euroc mono imu config yaml相机模型参数配置文件 xff0
  • VINS fusion软件架构分析(5)--- 坐标系转换

    对于VINS代码的解读 xff0c 其中一个重要的知识储备就是理解坐标系间的转换 xff0c 这对于后面代码阅读非常重要 xff0c 因此本章重点解释一下 VINS中有3个坐标系 xff1a 世界坐标系 worldIMU坐标系body相机坐
  • 《算法导论》习题5.3-1 ~ 5.3-7

    算法导论 习题 5 3 1 5 3 7 5 3 5 带星号我抄了一下题目 5 3 6 比较有意思我抄了一下题目 其他的题可以自己对照书 原书第三版 5 3 1 直接考虑第2次循环前 第1次循环后第1个位置的元素是原集合1 n中任意一个元素的
  • ROS:坐标系之间的关系 (map \ odom \ base_link)

    ROS 坐标系之间的关系 map odom base link 在使用ROS进行定位与导航操作时 xff0c 会伴随着各种坐标系 xff0c 并且每种坐标系都有明确的含义 xff0c ros中定义了常见的坐标系 xff0c 并且所有的坐标系
  • 上下拉电阻的作用

    这是在论坛上收集到的一些总结 xff1a 一 OC OD门 xff0c 这种门结构如果不做上拉的话 xff0c 是不能实现电平的高底跳变的 xff0c 不能实现跳变 xff0c 便不能表征数据 二 驱动能力 xff0c 我们看很多的CPU或
  • 实测MySQL 查询结果保留两位小数函数的区别汇总

    MySQL查询结果保留两位小数常用的几个函数的区别 xff0c 使用场景 1 随机函数format x d 2 格式化小数函数format x d 例如 xff1a select format 23456 789 2 或 select fo
  • STLINK怎么与STM32单片机连接

    STLink是ST官方开发的单片机仿真工具 xff0c 可以烧写程序 在线仿真 xff0c 使用非常方便 STLink具有两种接口 xff0c 分别为 1 SWD模式 2 SWIM单总线模式 SWD模式主要针对STM32系列的单片机 xff
  • Ubuntu 18.04系统下创建新用户

    以下介绍在Ubuntu 18 04系统下创建新用户 目录 修改用户权限及删除用户的正确方法 在Ubuntu系统上创建新用户使用 sudo useradd 用户名 命令 xff0c 但只能创建用户 xff0c 不能在 home 中创建用户目录
  • 大数据面试题(一)

    一 hdfs写文件的步骤 答案 xff1a 1 client向NameNode申请上传 xxx txt文件 2 NN向client响应可以上传文件 3 Client向NameNode申请DataNode 4 NN向Client返回DN1 D
  • packages.xml和packages.list全解析

    更多干货 xff0c 欢迎关注微信公众号 tmac lover 今天给大家介绍一下Android系统中保存app信息的两个配置文件 xff0c packages xml和packages list 系统中所有安装的app的基本信息在这里都能
  • linux中vim: command not found

    bash vim command not found 1 查看系统是否安装完整vim 2 安装vim 3 我的解决过程 解决问题步骤 xff1a 1 查看系统是否安装完整vim 执行一下命令 xff1a rpm qa grep vim 如果
  • 【FreeRTOS】任务的创建

    启动流程 LiteOS 和 ucos 第一种和第二种都可以使用 xff0c 由用户选择 xff0c RT Thread 和 FreeRTOS 则默认 创建各个任务 xff0c 然后等待启动调度器创建一个起始任务 xff0c 任务都在这个起始