00. 目录

文章目录

  • 00. 目录
  • 01. 概述
  • 02. 功能描述
  • 03. 任务设计
  • 04. 程序设计
  • 05. 执行结果
  • 06. 附录
  • 07. 参考

01. 概述

任务挂起和恢复,当某个任务要停止运行一段时间就可以将这个任务挂起,当要重新运行这个任务的话就恢复这个任务的运行。

02. 功能描述

设计三个任务:start_task、task1_task和task2_task,这三个任务的功能分别如下:

start_task: 用来创建其它两个任务。

task1_task: 当此任务运行5秒以后就会调用函数vTaskSuspend()挂起任务task2_task,当此任务运行10秒以后就会调用函数vTaskResume()恢复任务task2_task该任务控制LED0的闪烁,并且周期性的输出信息到串口中。

task2_task:普通的应用任务,此任务控制LED1的闪烁,并且周期性的输出信息到串口中。

03. 任务设计

任务优先级,堆栈大小,任务句柄和任务函数

//任务优先级
#define START_TASK_PRIO     1
//任务堆栈大小
#define START_STK_SIZE      128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define TASK1_TASK_PRIO     2
//任务堆栈大小
#define TASK1_STK_SIZE      50
//任务句柄
TaskHandle_t Task1Task_Handler;
//任务函数
void task1_task(void *pvParameters);//任务优先级
#define TASK2_TASK_PRIO     3
//任务堆栈大小
#define TASK2_STK_SIZE      50
//任务句柄
TaskHandle_t Task2Task_Handler;
//任务函数
void task2_task(void *pvParameters);

start_task函数

//开始任务任务函数
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //进入临界区//创建TASK1任务xTaskCreate((TaskFunction_t )task1_task,         (const char*    )"task1_task",    (uint16_t       )TASK1_STK_SIZE, (void*          )NULL,             (UBaseType_t    )TASK1_TASK_PRIO,   (TaskHandle_t*  )&Task1Task_Handler);   //创建TASK2任务xTaskCreate((TaskFunction_t )task2_task,     (const char*    )"task2_task",   (uint16_t       )TASK2_STK_SIZE, (void*          )NULL,(UBaseType_t    )TASK2_TASK_PRIO,(TaskHandle_t*  )&Task2Task_Handler);        vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区
}

task1_task函数

//任务1
void task1_task(void *pvParameters)
{u8 task1_num = 0;while(1){task1_num++;LED0 = !LED0;printf("任务1已经运行%d次\r\n", task1_num);if (5 == task1_num){//任务1挂起任务2vTaskSuspend( Task2Task_Handler);printf("任务1挂起了任务2\r\n");}if(10 == task1_num){//任务1恢复任务2vTaskResume(Task2Task_Handler);printf("任务1恢复了任务2\r\n");}//延时1秒 1000个时钟节拍vTaskDelay(1000);}
}

task2_task函数

//任务2
void task2_task(void *pvParameters)
{u8 task2_num = 0;while(1){task2_num++;LED1 = !LED1;printf("任务2已经执行了%d次\r\n", task2_num);//延时1秒 1000个时钟节拍vTaskDelay(1000);}
}

04. 程序设计

main.c文件

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"//任务优先级
#define START_TASK_PRIO     1
//任务堆栈大小
#define START_STK_SIZE      128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define TASK1_TASK_PRIO     2
//任务堆栈大小
#define TASK1_STK_SIZE      50
//任务句柄
TaskHandle_t Task1Task_Handler;
//任务函数
void task1_task(void *pvParameters);//任务优先级
#define TASK2_TASK_PRIO     3
//任务堆栈大小
#define TASK2_STK_SIZE      50
//任务句柄
TaskHandle_t Task2Task_Handler;
//任务函数
void task2_task(void *pvParameters);//主函数
int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4delay_init(168);     //初始化延时函数uart_init(115200);         //初始化串口LED_Init();              //初始化LED端口//创建开始任务xTaskCreate((TaskFunction_t )start_task,            //任务函数(const char*    )"start_task",          //任务名称(uint16_t       )START_STK_SIZE,        //任务堆栈大小(void*          )NULL,                  //传递给任务函数的参数(UBaseType_t    )START_TASK_PRIO,       //任务优先级(TaskHandle_t*  )&StartTask_Handler);   //任务句柄              vTaskStartScheduler();          //开启任务调度
}//开始任务任务函数
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //进入临界区//创建TASK1任务xTaskCreate((TaskFunction_t )task1_task,         (const char*    )"task1_task",    (uint16_t       )TASK1_STK_SIZE, (void*          )NULL,             (UBaseType_t    )TASK1_TASK_PRIO,   (TaskHandle_t*  )&Task1Task_Handler);   //创建TASK2任务xTaskCreate((TaskFunction_t )task2_task,     (const char*    )"task2_task",   (uint16_t       )TASK2_STK_SIZE, (void*          )NULL,(UBaseType_t    )TASK2_TASK_PRIO,(TaskHandle_t*  )&Task2Task_Handler);        vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区
}//任务1
void task1_task(void *pvParameters)
{u8 task1_num = 0;while(1){task1_num++;LED0 = !LED0;printf("任务1已经运行%d次\r\n", task1_num);if (5 == task1_num){//任务1挂起任务2vTaskSuspend( Task2Task_Handler);printf("任务1挂起了任务2\r\n");}if(10 == task1_num){//任务1恢复任务2vTaskResume(Task2Task_Handler);printf("任务1恢复了任务2\r\n");}//延时1秒 1000个时钟节拍vTaskDelay(1000);}
}//任务2
void task2_task(void *pvParameters)
{u8 task2_num = 0;while(1){task2_num++;LED1 = !LED1;printf("任务2已经执行了%d次\r\n", task2_num);//延时1秒 1000个时钟节拍vTaskDelay(1000);}
}

05. 执行结果

任务2已经执行了1次
任务1已经运行1次
任务2已经执行了2次
任务1已经运行2次
任务2已经执行了3次
任务1已经运行3次
任务2已经执行了4次
任务1已经运行4次
任务2已经执行了5次
任务1已经运行5次
任务1挂起了任务2
任务1已经运行6次
任务1已经运行7次
任务1已经运行8次
任务1已经运行9次
任务1已经运行10次
任务2已经执行了6次
任务2已经执行了7次
任务1已经运行11次
任务2已经执行了8次

06. 附录

6.1 【STM32】STM32系列教程汇总

网址:【STM32】STM32系列教程汇总

07. 参考

《FreeRTOS Reference Manual》

《Using the FreeRTOS Real Time Kernel -A Practical Guide》

《The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors,3rd Edition》

【STM32】FreeRTOS任务挂起和恢复示例相关推荐

  1. 【STM32】FreeRTOS任务挂起和恢复API

    00. 目录 文章目录 00. 目录 01. 概述 02. vTaskSuspend函数 03. vTaskResume函数 04. xTaskResumeFromISR函数 05. 预留 06. 附 ...

  2. FreeRTOS任务挂起和恢复

    任务挂起:暂停某个任务的执行 任务恢复:让暂停的任务继续执行 通过任务挂起和恢复,可以达到让任务停止一段时间后重新运行. 相关API函数: vTaskSuspend void vTaskSuspend ...

  3. STM32mini使用UCOSII信号量和邮箱实现任务挂起和恢复

    本文结构 1.UCOSII原理 2.UCOSII实验代码 1.UCOSII原理 UCOSII 是一个可以基于ROM 运行的.可裁减的.抢占式.实时多任务内核,具有高度可 移植性,特别适合于微处理器和控 ...

  4. Java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)

    挂起和恢复线程 Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时),此时 ...

  5. 基于STM32+FreeRtos+ESP8266+MQTT连接阿里云

    基于STM32+FreeRtos+DHT12+ESP8266+MQTT连接阿里云 1.概述 2.实现步骤 2.1.MQTT.fx模拟器与阿里云通信 2.2.STM32与阿里云通信 3. 搭建云平台 3 ...

  6. STM32 FreeRTOS CMSIS—OS

    STM32 FreeRTOS CMSIS-OS 前言 1.关于 osThreadNew () 1.1 FreeRTOS线程与任务的关系 1.2 osThreadNew () 1.2.1 osThrea ...

  7. 来了!STM32移植LuatOS,潘多拉示例全新教程

    进击的五月,继上期<使用Air724UG制作简易贪吃蛇>教程之后,@打盹的消防车 又为大家带来基于STM32的潘多拉LuatOS移植全新教程: 为什么使用潘多拉作为教程呢? STM32不能 ...

  8. 分析Kotlin协程只挂起不恢复会怎样(是否存在协程泄漏),以及挂起的协程存在哪里?

    前言 刚开始正式学协程原理的时候(以前只是学api怎么用),大概是20年6月,也就是bennyhuo大佬出书<深入理解Kotlin协程>的时候,我买了本然后细细研究,我的内心就一直有一个问 ...

  9. 树莓派cpu检测_【树莓派3B+测评】线程的挂起与恢复CPU温度检测

    [树莓派3B+测评]线程的挂起与恢复&CPU温度检测 [复制链接] 本帖最后由 donatello1996 于 2018-12-22 17:33 编辑 在TCP通信中,除了线程的创建和删除以外 ...

最新文章

  1. 机器学习要警惕的4个常见陷阱!
  2. JS 动态添加 onload、onresize、onscroll 事件
  3. java内存分配和回收策略
  4. mysql创建外键级联更新_MySQL中利用外键实现级联删除、更新
  5. linux定时任务生效_Linux 添加定时任务
  6. xcopy和robocopy
  7. 【转】Snagit 8.0使用方法
  8. matlab直流电机pid调速仿真,直流电机双闭环PID调速系统仿真设计
  9. 【jzoj5053】【石子游戏】【搜索】
  10. 风吹衣袖,月上西楼- 一个技术人员的心声
  11. 收藏!从十篇顶会论文解读计算机视觉的未来之路!
  12. 程序员没有那么多996!
  13. 【写论文技巧】如何写一篇好论文?
  14. spring boot 启动报错:Reason: Canonical names should be kebab-case ('-' separated), lowercase
  15. D. Lizard Era: Beginning
  16. 小号系统搭建接口教程
  17. 2018中国智造金长城奖:创新能力与行业竞争力并重
  18. Cobalt Strike Aggressor Script
  19. 新店速递 | IU酒店带您领略“东方古罗马”
  20. mysql函数if为负数_MySQL的if,case语句

热门文章

  1. Windows ICS 服务无法启动问题解决
  2. 基于八叉树快速分类的Shear-Warp交互式体绘制算法
  3. matlab能控型模型,级倒立摆MATLAB仿真、能控能观性分析、数学模型、极点配置
  4. java校验文件格式_Java 判断文件是否为文本格式,并获取文件编码格式,读取内容!...
  5. wamp2 php配置,Wamp2+SVN+Eclipse配置_PHP教程
  6. python加载dll函数失败_Python:使用ctypes访问DLL函数 – 按函数* name *访问失败
  7. md文件编辑器_File Cabinet Pro for Mac(菜单栏文件管理器)
  8. CSS 七层叠层顺序(stacking level)
  9. Java黑皮书课后题第3章:*3.18(运输成本)一个运输公司使用下面的函数,根据运输重量(以磅为单位)来计算运输成本(美元为单位)。编写程序,提示用户输入包裹重量,显示运输成本
  10. PPS2013校园招聘笔试题