【RTOS】快速体验FreeRTOS所有常用API(2)任务管理

这篇具有很好参考价值的文章主要介绍了【RTOS】快速体验FreeRTOS所有常用API(2)任务管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

快速体验FreeRTOS所有常用API(1)工程创建
快速体验FreeRTOS所有常用API(2)任务管理
快速体验FreeRTOS所有常用API(3)同步与互斥
快速体验FreeRTOS所有常用API(4)队列
快速体验FreeRTOS所有常用API(5)信号量、互斥量
快速体验FreeRTOS所有常用API(6)事件组
快速体验FreeRTOS所有常用API(7)任务通知
快速体验FreeRTOS所有常用API(8)软件定时器
快速体验FreeRTOS所有常用API(9)中断管理
快速体验FreeRTOS所有常用API(10)资源管理
快速体验FreeRTOS所有常用API(11)打印空闲栈、CPU占用比

二、任务管理

该部分在上份代码基础上修改得来,代码下载链接:

https://wwzr.lanzout.com/iPEbq1l75bri 密码:1ffe

该代码尽量做到最简,不添加多余的、不规范的代码。

内容主要包括三个部分:任务创建任务删除两种delay函数

最终实现效果:通过三种任务创建方式,创建三个任务task1、task2、task3,每个任务在OLED上显示各自的字符串,运行几秒后删除任务。

【RTOS】快速体验FreeRTOS所有常用API(2)任务管理,嵌入式,FreeRTOS,stm32,RTOS

2.1 任务创建(三种方式)

动态内存分配方式创建任务、静态内存分配方式创建任务、带有任务参数方式创建任务。

1)动态内存分配方式创建任务

函数说明:

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数
                        const char * const pcName, // 任务的名字
                        const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节
                        void * const pvParameters, // 调用任务函数时传入的参数
                        UBaseType_t uxPriority,    // 优先级
                        TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用它来操作这个任务

示例:

// 定义任务句柄
static TaskHandle_t g_xTask1Handle;

/* 动态内存分配方式创建任务 */
xTaskCreate(vTask1, "Task1", 128, NULL, osPriorityNormal, &g_xTask1Handle);

// 任务函数声明
void vTask1(void *pvParameters);

// 任务函数定义
void vTask1(void *pvParameters)
{
    for(;;)
    {
       vTaskDelay(500);
    }
}
2)静态内存分配方式创建任务

函数说明:

TaskHandle_t xTaskCreateStatic ( 
    TaskFunction_t pxTaskCode,   // 函数指针, 任务函数
    const char * const pcName,   // 任务的名字
    const uint32_t ulStackDepth, // 栈大小,单位为word,10表示40字节
    void * const pvParameters,   // 调用任务函数时传入的参数
    UBaseType_t uxPriority,      // 优先级
    StackType_t * const puxStackBuffer, // 静态分配的栈,就是一个buffer
    StaticTask_t * const pxTaskBuffer // 静态分配的任务结构体的指针,用它来操作这个任务
    );

示例:

// 定义任务句柄
static TaskHandle_t g_xTask2Handle;

// 静态内存分配,定义任务栈和任务控制块(TCB)
static StackType_t g_xTask2Stack[128];
static StaticTask_t g_xTask2TCB;

/* 静态内存分配方式创建任务 */
g_xTask2Handle = xTaskCreateStatic(vTask2, "Task2", 128, NULL, osPriorityNormal, g_xTask2Stack, &g_xTask2TCB);

// 任务函数声明
void vTask2(void *pvParameters);

// 任务函数定义
void vTask2(void *pvParameters)
{
    for(;;)
    {
       vTaskDelay(500);
    }
}
3)带有任务参数方式创建任务

示例:

// 定义任务句柄
static TaskHandle_t g_xTask3Handle;

// 定义任务3的输入参数
static char g_Task3Param = 'A'; 

/* 带有任务参数方式创建任务 */
xTaskCreate(vTask3, "Task3", 128, &g_Task3Param, osPriorityNormal, &g_xTask3Handle);

// 任务函数声明
void vTask3(void *pvParameters);

// 任务函数定义
void vTask3(void *pvParameters)
{
    // 将输入参数转换为正确的类型
    char *param = (char *)pvParameters; 
    for(;;)
    {
       vTaskDelay(500);
    }
}

实例:

【RTOS】快速体验FreeRTOS所有常用API(2)任务管理,嵌入式,FreeRTOS,stm32,RTOS

在三个任务中添加用户代码,让OLED分别显示各任务的cnt++。由于三个任务共用了OLED,此处先用全局变量来实现一个简陋的互斥操作,这种操作是不安全的,后续会进行改进。

【RTOS】快速体验FreeRTOS所有常用API(2)任务管理,嵌入式,FreeRTOS,stm32,RTOS

2.2 任务删除

运行数秒后删除任务。

函数说明:

void vTaskDelete( TaskHandle_t xTaskToDelete );

示例:

// 杀自己
vTaskDelete(NULL)
// 杀别人
vTaskDelete(任务句柄)

实例:

在默认任务中,每隔3秒删除一个任务,最终OLED数值全部静止。

【RTOS】快速体验FreeRTOS所有常用API(2)任务管理,嵌入式,FreeRTOS,stm32,RTOS

2.3 两种delay

有两个Delay函数:

  • vTaskDelay 函数是一种相对延时函数,用于让任务在当前位置暂停执行一段时间。
  • vTaskDelayUntil:函数是一种周期性延时函数,用于让任务按照指定的时间间隔执行

这两个延时函数的选择取决于任务的具体需求。

  • vTaskDelay 适用于相对延时
  • vTaskDelayUntil 更适用于周期性执行的任务

函数说明:

/* xTicksToDelay: 需要延时的时钟节拍数。 */
void vTaskDelay( const TickType_t xTicksToDelay ); 


/* 
    pxPreviousWakeTime:任务上次唤醒的时间,需要用指针传递。
    xTimeIncrement:任务的执行周期,以时钟节拍为单位。
*/
BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,const TickType_t xTimeIncrement );

示例:

// 延时500毫秒
vTaskDelay(500);
// 定义变量记录上次唤醒的时间
TickType_t xLastWakeTime;

// 记录上次唤醒的时间
xLastWakeTime = xTaskGetTickCount();

while (1) {
    // 任务的实际工作
    // ...
    
    // 等待下一个周期
    vTaskDelayUntil(&xLastWakeTime, 500);//500个tick中断、500ms
}

实例:

两种函数的使用感受是很明显的,OLED显示有明显区别。

举个例子,下面代码使用vTaskDelay 时,len = OLED_PrintString(0, 0, "Task1:");这行代码,每次执行的时间间隔是**不确定的,总会有个10ms左右的波动。**无法真正做到让 cnt 500ms 自加一次。

使用vTaskDelayUntil时,len = OLED_PrintString(0, 0, "Task1:");这行代码,每次执行的时间间隔是**确定的,这行代码在周期执行,每500ms执行一次。**是真正做到了让 cnt 500ms 自加一次。

【RTOS】快速体验FreeRTOS所有常用API(2)任务管理,嵌入式,FreeRTOS,stm32,RTOS文章来源地址https://www.toymoban.com/news/detail-791773.html

到了这里,关于【RTOS】快速体验FreeRTOS所有常用API(2)任务管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FreeRTOS 任务相关 API 函数(一)

    FreeRTOS 最基本的功能就是任务管理,而任务管理最基本的操作就是创建和删除任务,FreeRTOS 的任务创建和删除 API 函数如下表所示: 此函数用来创建一个任务,任务需要 RAM 来保存与任务有关的状态信息(任务控制块),任务也需要一定的 RAM 来作为任务堆栈。如果使用函数 xT

    2023年04月20日
    浏览(25)
  • FreeRTOS教程2 任务管理

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCOM V2.6串口助手 一个滑动变阻器 逻辑分析仪nanoDLA 本文主要学习FreeRTOS任务管理的相关知识, 包括FreeRTOS创建/删除任务、任务状态、任务优先级、延时函数、空闲任务和任务

    2024年03月12日
    浏览(32)
  • Freertos任务的管理是何物?

    提示:文章来自正点原子和野火 使用Freertos,创建任务,运行任务,必须知道怎么配置任务的状态,并将其修改运行的状态,做到想让哪个任务保证必须优先的情况下,也能保证其他任务的实时性。所以要知道任务有 几种运行状态 ,还要知道怎么修改任务的状态。 说白了就

    2024年02月15日
    浏览(25)
  • 详解FreeRTOS:FreeRTOS任务管理程序设计思路(基础篇—9)

    目录 1、中断服务函数 2、任务 3、空闲任务 4、任务的执行时间 作为一位RTOS程序开发者,要对自己设计的嵌入式系统要了如指掌,任务的优先级信息,任务与中断的处理,任务的运行时间、逻辑、状态等都要知道,才能设计出好的系统,所以,在设计的时候需要根据需求制定

    2024年02月13日
    浏览(25)
  • 【FreeRTOS】【应用篇】任务管理相关函数

    本篇文章主要对 FreeRTOS 中任务管理相关的函数进行了详解,最最重要的是解析了 绝对延时 vTaskDelayUntil()” 为什么能够确保任务执行周期准确??? 一部分代码和图片参考野火 FreeRTOS 教程。 ① 使用场景 当一个任务暂时不使用时,我们可以将其挂起 挂起的意思就是这个任务不参

    2024年02月11日
    浏览(33)
  • 【Freertos基础教程】任务管理之基本使用

    本freertos是以 stm32 系列为操作的 任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS,它提供了强大的任务管理功能,让开发者能够轻松创建和控制任务。本文将介绍 FreeRTOS 的任务管理功能,包括任

    2024年02月13日
    浏览(29)
  • 【RTOS学习】CubeMX对FreeRTOS的适配

    🐱作者:一只大喵咪1201 🐱专栏:《RTOS学习》 🔥格言: 你只管努力,剩下的交给时间! 经过前面的学习,现在我已经对FreeRTOS有了一个初步的认识,而且也可以使用FreeRTOS来写代码了,为了让我们的开发更加方便迅速,本喵来介绍下如何使用CubeMX来配置带有FreeRTOS的工程。

    2024年02月07日
    浏览(36)
  • freertos学习之路1-裸机和rtos的区别

    由于工作需要,需要开始学习freertos的相关知识,本专题主要记录freertos的相关内容 参考: https://www.bilibili.com/video/BV19g411p7UT 正点原子视频 试想一种场景,我们正在打游戏,但女朋友在你打游戏的过程中给你发送消息,你需要回复消息 1.1 裸机处理方式 玩过51或者stm32的裸机编

    2023年04月17日
    浏览(28)
  • [RTOS]rtthread,freeRTOS,uCOS等系统简单对比

    在上一篇《嵌入式操作系统浅谈》中,大概介绍了我自己再工作中使用到的如rt-thread,freeRTOS,uCOS,luatos等系统,在这一篇文章中,我简单说一下这些操作系统一些特点,还有就是我们平时的工作中什么场景下用哪种系统比较好。 csdn里面很多大神对上面的一些系统都做过了

    2023年04月15日
    浏览(23)
  • STM32 hal库使用笔记之FreeRTOS—任务创建、删除,任务挂起、恢复,任务中断管理

    一、简介 1.FreeRTOS简介     RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。而Free显而易见体现的是其免费性。总的来说这是一个免费的嵌入式实时操作系统。     其特点是:免费开源、可剪裁(独立性强,适应范围广)、简单、优先级/任务不限(但是受到不

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包