【STM32】FreeRTOS任务挂起和恢复示例
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任务挂起和恢复示例相关推荐
- 【STM32】FreeRTOS任务挂起和恢复API
00. 目录 文章目录 00. 目录 01. 概述 02. vTaskSuspend函数 03. vTaskResume函数 04. xTaskResumeFromISR函数 05. 预留 06. 附 ...
- FreeRTOS任务挂起和恢复
任务挂起:暂停某个任务的执行 任务恢复:让暂停的任务继续执行 通过任务挂起和恢复,可以达到让任务停止一段时间后重新运行. 相关API函数: vTaskSuspend void vTaskSuspend ...
- STM32mini使用UCOSII信号量和邮箱实现任务挂起和恢复
本文结构 1.UCOSII原理 2.UCOSII实验代码 1.UCOSII原理 UCOSII 是一个可以基于ROM 运行的.可裁减的.抢占式.实时多任务内核,具有高度可 移植性,特别适合于微处理器和控 ...
- Java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)
挂起和恢复线程 Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时),此时 ...
- 基于STM32+FreeRtos+ESP8266+MQTT连接阿里云
基于STM32+FreeRtos+DHT12+ESP8266+MQTT连接阿里云 1.概述 2.实现步骤 2.1.MQTT.fx模拟器与阿里云通信 2.2.STM32与阿里云通信 3. 搭建云平台 3 ...
- STM32 FreeRTOS CMSIS—OS
STM32 FreeRTOS CMSIS-OS 前言 1.关于 osThreadNew () 1.1 FreeRTOS线程与任务的关系 1.2 osThreadNew () 1.2.1 osThrea ...
- 来了!STM32移植LuatOS,潘多拉示例全新教程
进击的五月,继上期<使用Air724UG制作简易贪吃蛇>教程之后,@打盹的消防车 又为大家带来基于STM32的潘多拉LuatOS移植全新教程: 为什么使用潘多拉作为教程呢? STM32不能 ...
- 分析Kotlin协程只挂起不恢复会怎样(是否存在协程泄漏),以及挂起的协程存在哪里?
前言 刚开始正式学协程原理的时候(以前只是学api怎么用),大概是20年6月,也就是bennyhuo大佬出书<深入理解Kotlin协程>的时候,我买了本然后细细研究,我的内心就一直有一个问 ...
- 树莓派cpu检测_【树莓派3B+测评】线程的挂起与恢复CPU温度检测
[树莓派3B+测评]线程的挂起与恢复&CPU温度检测 [复制链接] 本帖最后由 donatello1996 于 2018-12-22 17:33 编辑 在TCP通信中,除了线程的创建和删除以外 ...
最新文章
- 机器学习要警惕的4个常见陷阱!
- JS 动态添加 onload、onresize、onscroll 事件
- java内存分配和回收策略
- mysql创建外键级联更新_MySQL中利用外键实现级联删除、更新
- linux定时任务生效_Linux 添加定时任务
- xcopy和robocopy
- 【转】Snagit 8.0使用方法
- matlab直流电机pid调速仿真,直流电机双闭环PID调速系统仿真设计
- 【jzoj5053】【石子游戏】【搜索】
- 风吹衣袖,月上西楼- 一个技术人员的心声
- 收藏!从十篇顶会论文解读计算机视觉的未来之路!
- 程序员没有那么多996!
- 【写论文技巧】如何写一篇好论文?
- spring boot 启动报错:Reason: Canonical names should be kebab-case ('-' separated), lowercase
- D. Lizard Era: Beginning
- 小号系统搭建接口教程
- 2018中国智造金长城奖:创新能力与行业竞争力并重
- Cobalt Strike Aggressor Script
- 新店速递 | IU酒店带您领略“东方古罗马”
- mysql函数if为负数_MySQL的if,case语句
热门文章
- Windows ICS 服务无法启动问题解决
- 基于八叉树快速分类的Shear-Warp交互式体绘制算法
- matlab能控型模型,级倒立摆MATLAB仿真、能控能观性分析、数学模型、极点配置
- java校验文件格式_Java 判断文件是否为文本格式,并获取文件编码格式,读取内容!...
- wamp2 php配置,Wamp2+SVN+Eclipse配置_PHP教程
- python加载dll函数失败_Python:使用ctypes访问DLL函数 – 按函数* name *访问失败
- md文件编辑器_File Cabinet Pro for Mac(菜单栏文件管理器)
- CSS 七层叠层顺序(stacking level)
- Java黑皮书课后题第3章:*3.18(运输成本)一个运输公司使用下面的函数,根据运输重量(以磅为单位)来计算运输成本(美元为单位)。编写程序,提示用户输入包裹重量,显示运输成本
- PPS2013校园招聘笔试题