freertos多任务

以前我们都是一个任务,假设现在我们创建三个任务,项目工程在上一节网盘

#include "stm32f10x.h"                  // Device header
#include "freertos.h"
#include "task.h"
#include "usart.h"TaskHandle_t myTaskHandler1;
TaskHandle_t myTaskHandler2;
TaskHandle_t myTaskHandler3;void myTask1( void * arg)
{while(1){printf("myTask1 running\n");vTaskDelay(200);}}void myTask2( void * arg)
{while(1){printf("myTask2 running\n");vTaskDelay(200);}}void myTask3( void * arg)
{while(1){printf("myTask3 running\n");vTaskDelay(200);}}int main(void){GPIO_InitTypeDef GPIO_Initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_Initstruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Initstruct.GPIO_Pin = GPIO_Pin_13;GPIO_Initstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_Initstruct);GPIO_ResetBits(GPIOC, GPIO_Pin_13);USART_Config();xTaskCreate(myTask1, "myTask1", 128, NULL, 2, &myTaskHandler1); xTaskCreate(myTask2, "myTask2", 128, NULL, 2, &myTaskHandler2); xTaskCreate(myTask3, "myTask3", 128, NULL, 2, &myTaskHandler3); vTaskStartScheduler();while(1){}}StaticTask_t	IdleTaskTCB;
StackType_t		IdleTaskStack[configMINIMAL_STACK_SIZE];
void vApplicationGetIdleTaskMemory( StaticTask_t 	**ppxIdleTaskTCBBuffer, StackType_t 	**ppxIdleTaskStackBuffer, uint32_t 		*pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer = &IdleTaskTCB;*ppxIdleTaskStackBuffer = IdleTaskStack;	*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;}

现象如下,这时会发现模拟串口仿真输出的是乱序的
在这里插入图片描述
出现多个线程竞争同一个输出函数,非线程安全,这样我们对临界区实现保护:

#include "stm32f10x.h"                  // Device header
#include "freertos.h"
#include "task.h"
#include "usart.h"TaskHandle_t myTaskHandler1;
TaskHandle_t myTaskHandler2;
TaskHandle_t myTaskHandler3;void myTask1( void * arg)
{while(1){taskENTER_CRITICAL();printf("myTask1 running\n");taskEXIT_CRITICAL();vTaskDelay(200);}}void myTask2( void * arg)
{while(1){taskENTER_CRITICAL();printf("myTask2 running\n");taskEXIT_CRITICAL();vTaskDelay(200);}}void myTask3( void * arg)
{while(1){taskENTER_CRITICAL();printf("myTask3 running\n");taskEXIT_CRITICAL();vTaskDelay(200);}}int main(void){GPIO_InitTypeDef GPIO_Initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_Initstruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Initstruct.GPIO_Pin = GPIO_Pin_13;GPIO_Initstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_Initstruct);GPIO_ResetBits(GPIOC, GPIO_Pin_13);USART_Config();xTaskCreate(myTask1, "myTask1", 128, NULL, 2, &myTaskHandler1); xTaskCreate(myTask2, "myTask2", 128, NULL, 2, &myTaskHandler2); xTaskCreate(myTask3, "myTask3", 128, NULL, 2, &myTaskHandler3); vTaskStartScheduler();while(1){}}StaticTask_t	IdleTaskTCB;
StackType_t		IdleTaskStack[configMINIMAL_STACK_SIZE];
void vApplicationGetIdleTaskMemory( StaticTask_t 	**ppxIdleTaskTCBBuffer, StackType_t 	**ppxIdleTaskStackBuffer, uint32_t 		*pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer = &IdleTaskTCB;*ppxIdleTaskStackBuffer = IdleTaskStack;	*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;}

在这里插入图片描述
然后我们试验一下删除任务在mytask1里实现:


void myTask1( void * arg)
{uint8_t i=0;while(1){taskENTER_CRITICAL();printf("myTask1 running\n");taskEXIT_CRITICAL();vTaskDelay(200);i++;if(i==2){vTaskDelete(myTaskHandler2);}else if(i==3){vTaskDelete(NULL);}else if(i==4){vTaskDelete(myTaskHandler3);}}}

现象如下
在这里插入图片描述
还有一种创建多任务的实现。使用开始任务创建其他任务,感觉为了好看规整点吧…

#include "stm32f10x.h"                  // Device header
#include "freertos.h"
#include "task.h"
#include "usart.h"TaskHandle_t myTaskHandler1;
TaskHandle_t myTaskHandler2;
TaskHandle_t myTaskHandler3;
TaskHandle_t startTaskHandler;void myTask1( void * arg)
{uint8_t i=0;while(1){taskENTER_CRITICAL();printf("myTask1 running\n");taskEXIT_CRITICAL();i++;if(i==1){vTaskDelete(myTaskHandler3);}else if(i==2){vTaskDelete(NULL);}vTaskDelay(200);}}void myTask2( void * arg)
{while(1){taskENTER_CRITICAL();printf("myTask2 running\n");taskEXIT_CRITICAL();vTaskDelay(200);}}void myTask3( void * arg)
{while(1){taskENTER_CRITICAL();printf("myTask3 running\n");taskEXIT_CRITICAL();vTaskDelay(200);}}void startTask(void* arg){taskENTER_CRITICAL();printf("start running\n");taskEXIT_CRITICAL();xTaskCreate(myTask1, "myTask1", 128, NULL, 2, &myTaskHandler1); xTaskCreate(myTask2, "myTask2", 128, NULL, 2, &myTaskHandler2); xTaskCreate(myTask3, "myTask3", 128, NULL, 2, &myTaskHandler3); vTaskDelete(NULL);
}
int main(void){GPIO_InitTypeDef GPIO_Initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_Initstruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Initstruct.GPIO_Pin = GPIO_Pin_13;GPIO_Initstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_Initstruct);GPIO_ResetBits(GPIOC, GPIO_Pin_13);USART_Config();xTaskCreate(startTask,"startTask",128,NULL,2,&startTaskHandler);vTaskStartScheduler();while(1){}}StaticTask_t	IdleTaskTCB;
StackType_t		IdleTaskStack[configMINIMAL_STACK_SIZE];
void vApplicationGetIdleTaskMemory( StaticTask_t 	**ppxIdleTaskTCBBuffer, StackType_t 	**ppxIdleTaskStackBuffer, uint32_t 		*pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer = &IdleTaskTCB;*ppxIdleTaskStackBuffer = IdleTaskStack;	*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;}

不过这样创建的任务在相同优先级下会按照创建的顺序执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/182848.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue纯CSS实现掷色子

效果图&#xff1a; 实现代码 直接利用CSS3动画实现的效果&#xff0c;无js代码。 <template><div class"wrap"><input type"checkbox" id"roll"><label for"roll"><div class"content"><…

音视频报警可视对讲15.6寸管理机

音视频报警可视对讲15.6寸管理机 一、管理机技术指标&#xff1a; 1、15.6寸原装京东方工业液晶触摸屏&#xff0c;分辨率1920 (H) x 1080 (V)&#xff1b; 2、1000M/100M自适应双网口&#xff1b; 4、按键设置&#xff1a;报警/呼叫按键&#xff0c;通话/挂机按键&#xff…

Android Studio(列表视图ListView)

前言 前面在适配器章节&#xff0c;已经介绍了ListView的作用(干什么的)&#xff0c;这节将主要介绍如何去设计ListView页面视图。 思考 列表视图需要些什么&#xff1f; 1. 列表项容器&#xff08;装载各列表项的容器&#xff09;&#xff1a;<ListView/> 2. 列表项布局…

使用IDEA让文本对比不在变的困难

文章目录 前言操作1、IDEA与电脑磁盘任意文件的比较2、项目内部的文件比较3、剪切板比较4、IDEA本地历史比较5、IDEA版本历史对比 前言 在日常实际开发当中我们常常会对一些代码或内容进行比对查看是否有差异&#xff0c;这个时候不需要借用第三方比对插件&#xff0c;在IDEA中…

Android-JobService

JobService 这里写目录标题 JobService一、API详解1 onStartJob2 onStopJob 二、onStartJob | onStopJob 返回值case 1case 2case 3 ref: 深入理解JobScheduler与JobService的使用 - 掘金 (juejin.cn) (28条消息) JobService的使用介绍_TechMerger的博客-CSDN博客 (28条消息) J…

为什么有了MAC地址,还需要IP地址?

解释 搞懂这个问题&#xff0c;首先需要了解交换机的功能 交换机内部有一张MAC地址映射表&#xff0c;记录着MAC地址和端口的对应关系。 如果A要给B发送一个数据包&#xff0c;构造如下格式的数据结构&#xff1a; 到达交换机时&#xff0c;交换机内部通过自己维护的 MAC 地…

4 Tensorflow图像识别模型——数据预处理

上一篇&#xff1a;3 tensorflow构建模型详解-CSDN博客 本篇开始介绍识别猫狗图片的模型&#xff0c;内容较多&#xff0c;会分为多个章节介绍。模型构建还是和之前一样的流程&#xff1a; 数据集准备数据预处理创建模型设置损失函数和优化器训练模型 本篇先介绍数据集准备&am…

每日一题 318. 最大单词长度乘积(中等)

暴力求解没超时&#xff0c;那就这样吧 class Solution:def maxProduct(self, words: List[str]) -> int:ans 0for i in range(len(words)):for j in range(i 1, len(words)):if len(words[i]) * len(words[j]) < ans:continuet 0for k in range(26):ch chr(k ord(…

使用蒙特卡罗模拟的投资组合优化

在金融市场中&#xff0c;优化投资组合对于实现风险与回报之间的预期平衡至关重要。蒙特卡罗模拟提供了一个强大的工具来评估不同的资产配置策略及其在不确定市场条件下的潜在结果。 我们的目标是开发一个蒙特卡罗模拟模型的投资组合优化。参与者将被要求构建和分析由各种资产…

Camtasia2024破解版电脑屏幕录制剪辑软件

屏幕录制剪辑 TechSmith Camtasia for Mac v2021是 TechSmith 公司所开发出一款专业屏幕录像和编辑&#xff0c; Camtasia Studio2024版是由TechSmith公司官方进行汉化推出的最新版本,除2023版以下版本均没有官方汉化。 同时TechSmith公司打击第三方贩卖Camtasia Studio汉化的…

数据库的备份和恢复

备份&#xff1a;完全备份&#xff0c;增量备份 完全备份&#xff1a;将整个数据库完整的进行备份 增量备份&#xff1a;在完全备份基础的之上&#xff0c;对后续新增的内容进行备份 备份的需求 1生产环境中&#xff0c;数据的安全性至关重要&#xff0c;任何数据都可能产生非…

Disk Drill v5.3.1313(数据恢复备份)

Disk Drill是一款功能强大的数据恢复软件&#xff0c;它可以帮助用户恢复已删除、丢失、格式化或损坏的文件&#xff0c;并支持多种存储设备&#xff0c;包括计算机硬盘驱动器、外部硬盘、USB闪存驱动器、内存卡和其他存储介质。它和很多的文件系统都兼容&#xff0c;比如&…

NOIP2023模拟12联测33 B. 游戏

NOIP2023模拟12联测33 B. 游戏 文章目录 NOIP2023模拟12联测33 B. 游戏题目大意思路code 题目大意 期望题 思路 二分答案 m i d mid mid &#xff0c;我们只关注学生是否能够使得被抓的人数 ≤ m i d \le mid ≤mid 那我们就只关心 a > m i d a > mid a>mid 的房…

No Presto metadata available for docker-ce-stable

Linux CentOS中执行Docker一键安装脚本报错&#xff1a; No Presto metadata available for docker-ce-stable 执行以下命令可以解决&#xff0c;整个过程比较耗费时间&#xff0c;请耐心等待。 yum install docker-ce -y

蓝桥杯每日一题2023.11.6

取位数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 由题意我们知道len中为现阶段长度&#xff0c;如果其与k相等也就是找到了正确的位数&#xff0c;否则就调用递归来进行搜索&#xff0c;每次搜索一位数。 #include <stdio.h> // 求x用10进制表示时的数位长度 int …

LED点阵显示原理(取字模软件+Keil+Proteus)

前言 写这个的时候我还是有点生气的&#xff0c;因为发现完全按照书上面的步骤来&#xff0c;结果发现不理想&#xff0c;后面还是自己调试才解决了。-_-说多了都是泪&#xff0c;直接进入正文。 软件的操作还是参考我之前的博客。 LED数码管的静态显示与动态显示&#xff0…

基于wireguard与NAT实现windows10代理服务器

参考文章&#xff1a;https://blog.csdn.net/babytiger/article/details/127111474 一、 下载windows 安装包 下载wireguard安装包 二、 配置服务端&#xff1a; 新建空隧道并保存为server1&#xff0c;配置如下&#xff1a; 点击保存&#xff0c;并连接&#xff0c;多了个se…

Docker数据管理、网络与Cgroup资源限制

目录 一、Docker的数据管理 1、数据卷 2、数据卷容器 3、端口映射 4、容器互联 二、Docker网络 2.1Docker网络实现原理 2.2Docker 的网络模式 3.3网络模式详解&#xff1a; host模式 container模式 none模式 bridge模式 自定义网络 创建自定义网络 三、Cgroup资源…

Harbor企业级Registry基础镜像仓库的详细安装使用教程(保姆级)

Harbor Docker 官方提供的私有仓库 registry&#xff0c;用起来虽然简单 &#xff0c;但在管理的功能上存在不足。 Harbor是vmware一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。 ha…

shell综合项目

主菜单 http和Nginx分别的install的菜单&#xff0c;安装过程通过重定向到/dev/null达到看不见的效果 输入非整数或者大于4的数字都会提示错误 代码如下: [rootserver ~]# vim install_menu.sh #!/bin/bash function menu() { cat << EOF …