FreeRTOS任务的挂起和恢复 | FreeRTOS四

这篇具有很好参考价值的文章主要介绍了FreeRTOS任务的挂起和恢复 | FreeRTOS四。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

说明:

一、任务挂起与恢复

1.1、什么是任务挂起

1.2、任务挂起函数

1.3、什么是任务恢复

1.4、任务恢复函数

1.5、什么是中断任务恢复函数

1.6、中断任务恢复函数

二、任务挂起与恢复实例代码(任务中)

2.1、主要代码

2.2、结果

三、任务挂起与恢复实例代码(中断中)

3.1、主要代码

3.2、结果


说明:

关于内容:

1)以下内容多为概念了解与步骤分析

2)暂无个人示例代码,使用的是FreeRTOS的示例代码

3)若想移植代码测试的,请移步其它地方寻找,下文内容暂无个人示例代码供测试

关于其它:

1)操作系统:win 10

2)平台:keil 5 mdk

3)语言:c语言

4)板子:STM32系列移植FreeRTOS

一、任务挂起与恢复

1.1、什么是任务挂起

1)任务挂起,含义:任务挂起相当于暂停,把任务挂起了,任务就暂停运行,是可以恢复的。

2)任务挂起内部实现:

1、根据任务句柄获取任务控制块,如果任务句柄为NULL,表示挂起任务自身
2、将要挂起的任务从相应的状态列表和事件列表中移除
3、将待挂起任务的任务状态列表向插入到挂起态任务列表末尾
4、判断任务调度器是否运行,在运行,更新下一次阻塞时间,防止被挂起任务为下一次阻塞超时任务调度器正在运行,强制进行一次任务切换;
5、如果挂起的是任务自身

调度器正在运行,强制进行一次任务切换;

调度器没有运行,判断挂起任务数是否等于任务总数:
是:代表所有任务均被挂起,则当前控制块赋值为NULL,调度器没有运行,判断挂起任务数是否等于任务总数,
否:通过函数vTaskSwitchContext寻找下一个最高优先级任务

1.2、任务挂起函数

1)函数原型:void vTaskSuspend(TaskHandle_t xTaskToSuspend)

2)形参描述:xTaskToSuspend是待挂起任务的任务句柄

3)使用条件:此函数用于挂起任务,使用时需将宏INCLUDE_ vTaskSuspend 配置为1

4)使用说明:无论优先级如何,被挂起的任务都将不再被执行,直到任务被恢复
5)注意点:当传入的参数为NULL, )则代表挂起任务自身当前正在运行的任务))

1.3、什么是任务恢复

1)任务恢复,含义:恢复被挂起的任务。

2)任务恢复内部实现:

1、恢复任务不能是正在运行任务且不能为NULL
2、判断任务是否被挂起,是:就会将该任务在挂起列表中移除,将该任务添加到就绪列
表中
3、判断恢复的任务优先级是否大于当前正在运行的是的话执行任务切换

1.4、任务恢复函数

1)函数原型:void vTaskResume(TaskHandle_t xTaskToResume)
2)形参描述:xTaskToResume,待恢复任务的任务句柄
3)使用条件:宏定义INCLUDE _vTaskSuspend必须定义为1
4)使用说明:注意:任务无论被yTaskSuspend挂起多少次,只需在任务中调vTakResume()恢复一次, 就可以继续运行。且被恢复的任务会进入就绪态! )

1.5、什么是中断任务恢复函数

中断任务恢复函数,含义:在中断服务函数中,恢复被挂起的任务函数。

1.6、中断任务恢复函数

1)函数原型: BaseType _t xTaskResumeFromlSR(TaskHandle_t xTaskToResume)
2)形参描述:xTaskToResume,待恢复任务的任务句柄
3)使用条件:宏定义 INCLUDE _vTaskSuspene和INCLODE_ xTaskResumeFromISR必须定义为 1
4)使用说明:必须是在中断服务函数中调用该函数

5)返回值描述:返回值为pdTRUE,任务恢复后需要进行任务切换;返回值为pdFALSE,任务恢复后不需要进行任务切换;注意:任务切换是需要我们手动进行的,需要调用切换函数:
6)注意点:中断服务函数中调用FreeRTOS的API函数则中断优先级不能高于FreeRTOS所管理的最高优先级

二、任务挂起与恢复实例代码(任务中)

2.1、主要代码

板子不在身边,无法测试,之后补上。

FreeRTOS任务挂起函数官网用法示例:

void vAFunction( void ) {
TaskHandle_t xHandle;  //定义任务句柄
// Create a task, storing the handle.
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
//创建了一个任务
// ...
// Use the handle to suspend the created task.
vTaskSuspend( xHandle );  //调用挂起任务,传入要挂起任务的句柄
// ...
// The created task will not run during this period, unless
// another task calls vTaskResume( xHandle ).
//...
// Suspend ourselves.
vTaskSuspend( NULL );  //传入NULL,挂起正在运行的任务自身
// We cannot get here unless another task calls vTaskResume
// with our handle as the parameter.
}

FreeRTOS任务恢复官方示例:

void vAFunction( void ) {
TaskHandle_t xHandle;
// Create a task, storing the handle.
//先创建任务
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
// ...
// Use the handle to suspend the created task.
//挂起任务
vTaskSuspend( xHandle );
// ...
// The created task will not run during this period, unless
// another task calls vTaskResume( xHandle ).
//...
// Resume the suspended task ourselves.
//恢复被挂起的任务
vTaskResume( xHandle );
// The created task will once again get microcontroller processing
// time in accordance with its priority within the system.
}

2.2、结果

板子不在身边,无法测试,之后补上。

三、任务挂起与恢复实例代码(中断中)

3.1、主要代码

板子不在身边,无法测试,之后补上。

FreeRTOS任务恢复函数官网用法示例(中断中):

TaskHandle_t xHandle;  //定义任务句柄

 void vAFunction( void )
 {
     // Create a task, storing the handle.
     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

     // ... Rest of code.
 }

 void vTaskCode( void *pvParameters )
 {
     // The task being suspended and resumed.
     for( ;; )
     {
         // ... Perform some function here.

         // The task suspends itself.
         vTaskSuspend( NULL );

         // The task is now suspended, so will not reach here until the ISR resumes it.
     }
 }


 void vAnExampleISR( void )
 {
     BaseType_t xYieldRequired;

     // Resume the suspended task.
     xYieldRequired = xTaskResumeFromISR( xHandle );

     // We should switch context so the ISR returns to a different task.
     // NOTE:  How this is done depends on the port you are using.  Check
     // the documentation and examples for your port.
     portYIELD_FROM_ISR( xYieldRequired );
 }

3.2、结果

板子不在身边,无法测试,之后补上。文章来源地址https://www.toymoban.com/news/detail-594460.html

到了这里,关于FreeRTOS任务的挂起和恢复 | FreeRTOS四的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32 CubeMX (第一步Freertos任务管理:创建、删除、挂起、恢复)

    学习使用Freertos第一步 FreeRTOS 任务管理,您需要掌握以下几个关键函数: 1. xTaskCreate() :用于创建一个任务,需要指定任务函数、任务名称、任务栈大小和优先级等参数。 2. vTaskDelete() :用于删除一个任务,可以由任务自身或其他任务调用。 3. vTaskDelay() :用于使当前任务进

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

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

    2024年02月04日
    浏览(37)
  • FreeRTOS如何解决访问冲突/线程不安全(临界段、互斥锁、挂起调度、看门人任务)

    在多任务(多线程)系统中,存在一个隐患,那就是多线程的访问(在FreeRTOS中就是任务)。当一个任务A开始访问一个资源(外设、一块内存等),但是A还没有完成访问,B任务运行了,也开始访问,这就会造成数据破坏、错误等问题。 例如: 两个任务试图写入一个液晶显示

    2024年02月07日
    浏览(39)
  • 7.6 实现进程挂起与恢复

    挂起与恢复进程是指暂停或恢复进程的工作状态,以达到一定的控制和管理效果。在 Windows 操作系统中,可以使用系统提供的函数实现进程的挂起和恢复,以达到对进程的控制和调度。需要注意,过度使用进程挂起/恢复操作可能会造成系统性能的降低,导致死锁等问题,因此

    2024年02月08日
    浏览(22)
  • 【STM32&RT-Thread零基础入门】 6. 线程创建应用(线程挂起与恢复)

    硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 在上一个任务中,通过停止命令把线程删除后,线程在系统中就不存在了,也无法再使线程重新运行。例如输入stop_led_thread命令后,led停止闪烁,但也无法重新开启LED灯闪烁

    2024年02月11日
    浏览(25)
  • FreeRTOS任务调度与任务切换 | FreeRTOS八

    目录 说明: 一、任务调度器 1.1、开启任务调度器函数 1.2、任务调度器实现步骤 1.3、xPortStartScheduler()函数 二、启动一个任务 2.1、prvStartFirstTask()函数 2.2、vPortSVCHandler()函数 三、任务切换 3.1、任务切换触发途径 3.2、PendSV中断触发任务切换步骤 关于内容: 1)以下内容多为概

    2023年04月15日
    浏览(23)
  • 【Freertos基础入门】freertos任务的优先级

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

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

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

    2024年02月13日
    浏览(26)
  • FreeRTOS-任务通知详解

    ✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页: @rivencode的个人主页 🔥系列专栏: 玩转FreeRTOS 💬保持学习、保持热爱、认真分享、一起进步!!! FreeRTOS越学越简单,前面已经把真实的队列、信号量、事件组全部学完,现在学

    2024年02月06日
    浏览(23)
  • FreeRTOS_任务切换

    目录 1. RendSV 异常 2. FreeRTOS 任务切换场合 2.1 执行系统调用 2.2 系统滴答定时器(SysTick)中断 3. PendSV 中断服务函数 4. 查找下一个要运行的任务 4.1 通用方法 4.2 硬件方法 5. FreeRTOS 的时间片调度 6. 时间片调度实验 6.1 实验程序         RTOS 系统的核心是任务管理,而任务管理的

    2024年02月12日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包