【FreeRTOS】创建第一个多任务程序

创建第1个多任务程序

韦东山 Freertos学习 第一个多任务程序创建

1. 目标

创建两个任务,任务A运行Led_Test,任务B运行LCD_Test。
硬件平台:DShanMCU-F103开发板

2. 接口函数

创建任务的API函数
不同操作系统有不同的创建API函数
FreeRTOS: xTaskCreate
RT-Thread: rt_thread_create

统一:osThreadNew
在cmsis_os2.c里面定义了

参考《FreeRTOS入门与工程实践(基于DshanMCU-103)》里《9.2.2 创建任务》,关键信息如下:

	BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode,const char * const pcName,		const configSTACK_DEPTH_TYPE usStackDepth,void * const pvParameters,UBaseType_t uxPriority,TaskHandle_t * const pxCreatedTask );

pdT

  • ASK_CODE pvTaskCode :是一个指向任务的实现函数的指针,任务只是一个不会退出的子函数,通常我们会写一个死循环来实现;
  • const signed portCHAR * const pcName:任务名,用于辅助调试FreeRTOS并不会使用他;
  • unsigned portSHORT usStackDepth:当任务创建时,内核会分为每个任务分配属于任务自己的唯一状态,该值用于指定分配多大的栈空间,传入的值表示的是栈空间可以保存多少个字(word),而不是多少个字节(byte)。比如说,如果是 32 位宽的栈空间,传入的
  • usStackDepth值为 100,则将会分配 400 字节的栈空间(100 * 4bytes)。栈深度乘以栈宽度的结果千万不能超过一个 size_t 类型变量所能表达的最大值,大部分时间用户赋予较合理的数值即可(小了就调大,大了就调小尽量保证空间的不浪费)
  • void *pvParameters:传入我们任务函数中的值,一般为NULL
  • unsigned portBASE_TYPE uxPriority:指定任务执行的优先级。优先级的取值范围可以从最低优先级 0 到最高优先级(configMAX_PRIORITIES – 1)
  • xTaskHandle *pxCreatedTask:传入任务句柄,如果该任务不会被应用程序用到也可以设置为NULL;
  • 该函数有两个可能的返回值:
    pdTRUE: 表明任务创建成功。
    errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:由于内存堆空间不足,FreeRTOS 无法分配足够的空间来保存任务结构数据和任务栈,因此无法创建任务

当我们创建完成一个任务,我们的任务状态还是处于就绪状态,还未开启任务调度器,也没创建空闲任务与定时器任务任务调度器只启动一次,之后就不会再次执行了,FreeRTOS 中启动任务调度器的函数是 vTaskStartScheduler(),并且启动任务调度器的时候就不会返回,从此任务管理都由 FreeRTOS管理,如果这里我们卸载vTaskStartScheduler后面的语句执行了也就说明我们的任务启动失败这时候我们需要根据情况特殊处理(这里需要注意在实时操作系统中我们的任务看似是可以共同执行,但实际过程中他们也是有一个切换过程的,在任何时刻只可能有一个任务处于运行态。所以一个任务进入运行态后(切入)另一个任务就会进入非运行态(切出),更多理论上的就不多赘述了网上有很多大神写过,或者查看官方文档了解freertos的任务调度算法;
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_43581670/article/details/127655121

3. 编程

FreeRTOS原生代码创建任务
先写一个自己的函数MyTask, 在这个任务里执行Led_Test();函数

void MyTask(void *argumment) // 自己创建的任务的函数
{while (1){Led_Test();}
}

创建这个任务
freertos的所有任务都是一个while循环

void MX_FREERTOS_Init(void)
{/* USER CODE BEGIN Init *//* USER CODE END Init *//* USER CODE BEGIN RTOS_MUTEX *//* add mutexes, ... *//* USER CODE END RTOS_MUTEX *//* USER CODE BEGIN RTOS_SEMAPHORES *//* add semaphores, ... *//* USER CODE END RTOS_SEMAPHORES *//* USER CODE BEGIN RTOS_TIMERS *//* start timers, add new ones, ... *//* USER CODE END RTOS_TIMERS *//* USER CODE BEGIN RTOS_QUEUES *//* add queues, ... *//* USER CODE END RTOS_QUEUES *//* Create the thread(s) *//* creation of defaultTask */defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);/* USER CODE BEGIN RTOS_THREADS *//* add threads, ... */xTaskCreate(MyTask,             //用MyTask函数来创建一个任务"MyFirstTask",      //任务的名字:我的第一个任务MyFirstTask128,                //栈的深度 128NULL,               //不需要什么参数 NULLosPriorityNormal,   //优先级 osPriorityNormalNULL);              //最后一个参数先不用 NULL/* USER CODE END RTOS_THREADS *//* USER CODE BEGIN RTOS_EVENTS *//* add events, ... *//* USER CODE END RTOS_EVENTS */
}

CubeMX创建的默认任务,执行LCD_Test();函数

/*** @brief  Function implementing the defaultTask thread.* @param  argument: Not used* @retval None*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */LCD_Init();LCD_Clear();for (;;){// Led_Test();LCD_Test();// MPU6050_Test();// DS18B20_Test();// DHT11_Test();// ActiveBuzzer_Test();// PassiveBuzzer_Test();// ColorLED_Test();// IRReceiver_Test();// IRSender_Test();// LightSensor_Test();// IRObstacle_Test();// SR04_Test();// W25Q64_Test();// RotaryEncoder_Test();// Motor_Test();// Key_Test();// UART_Test();}/* USER CODE END StartDefaultTask */
}

修改LCD_Test();的内容,LCD_Test();函数里是OLED_Test(); 只修改OLED_Test函数即可

void OLED_Test(void)
{int OLED_Count = 0;OLED_Init();// 清屏OLED_Clear();while (1){// 在(0, 0)打印'A'OLED_PutChar(0, 0, 'A');// 在(1, 0)打印'Y'OLED_PutChar(1, 0, 'Y');// 在第0列第2页打印一个字符串"Hello World!"OLED_PrintString(0, 2, "Hello World!");OLED_PrintSignedVal(6, 4, OLED_Count++);}
}

4. 测试

编译程序,下载测试~

在这里插入图片描述

开发板使用

1. 硬件接线

DshanMCU-103上有4个插针,它们分别是GND、SWCLK、SWDIO、3.3V。ST-Link上有10个插针,它们的功能在外壳上有标注。接线方法如下图所示:
在这里插入图片描述
连接好的实物图如下(ST-Link的USB口要插到电脑上):
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3ead43300b704f8e8ea90feefcee09bc.png## 2. 打开工程

解压如下程序,放入无中文字符的目录里:

在这里插入图片描述

使用Keil打开工程。

3. 修改代码

在这里插入图片描述

4. 注意事项

有些模块的引脚是共用的,所以它们要么不能同时接,要么不能同时使用。

打开底板原理图,里面有说明:

在这里插入图片描述

列表如下:

模块1模块2备注
M2(DS18B20)M10(DHT11温湿度模块)不能同时接
M4(红外发射模块)M9(蜂鸣器)不能同时接
M6(超声波模块)M12(Flash模块)可以同时接,但是要互斥访问

在这里插入图片描述

参考文章:

http://t.csdnimg.cn/a6WMU
http://t.csdnimg.cn/nuOz1
http://t.csdnimg.cn/yr2Ms
http://t.csdnimg.cn/SO6iz

在这里插入图片描述

我们下文再见~

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

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

相关文章

常见的api:BigDecima

一.计算中的小数 float和double占有的位置是有限的 二.BigDecima的作用 1.用于小数的精确计算 2.用来表示很大的小数 三.使用(传入小数) BigDecimal b1 new BigDecimal(0.01);BigDecimal b2 new BigDecimal(0.09);System.out.println(b1);System.out.println(b2); 不精确&…

币安用户达2亿,代币BNB创新高,赵长鹏成“美国最富囚犯” 苹果迈向AI新纪元:芯片、应用与大模型三线作战

赵长鹏坐牢第一个月,越坐越富。 在币安联合创始人赵长鹏入狱服刑的第一个月,币安代币BNB创下了历史新高,使得赵长鹏成为美国联邦监狱中史上“最富囚犯”。与此同时,币安用户数量也到达2亿“里程碑”。 根据CoinGecko的数据&…

让GNSSRTK不再难【第二天-第3部分】

第11讲 定位方程构建以及最小二乘 11.1 定位方程重构 历史讲中我们已经初步构建了单点定位的先验残差: p i s P i s − ( X s − X 0 ) 2 ( Y s − Y 0 ) 2 ( Z s − Z 0 ) 2 c δ t r − I i s − T i s − ϵ P i s p_i^s P_i^s - \sqrt{(X^s - X_0)^2 (Y…

【小米商城】页面编写笔记(自用)

页面展示&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>body{margin: 0;}img{width:100%;height: 100%;}.header{/*height: 38px;*…

PowerDesigner 16.5安装教程

&#x1f4d6;PowerDesigner 16.5安装教程 ✅1. 下载✅2. 安装 ✅1. 下载 官网地址&#xff1a;https://www.powerdesigner.biz/EN/powerdesigner/powerdesigner-licensing-history.php 云盘下载&#xff1a;https://www.123pan.com/s/4brbVv-aUoWA.html ✅2. 安装 1.运行P…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(一)

主要帮助大家面向工作过程中Linux系统常用的命令联系&#xff0c;采用极致的实用主义&#xff0c;帮助大家节省时间。 文章目录 前言 一、linux系统 二、linux系统基本命令 1.Linux系统的目录结构 2. 常用命令介绍 3.命令演示 4.作业练习 总结 前言 主要帮助大家面向工作过程中…

【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

43【PS 作图】颜色速途

1 通过PS让画面细节模糊&#xff0c;避免被过多的颜色干扰 2 分析画面的颜色 3 作图 参考网站&#xff1a; 色感不好要怎么提升呢&#xff1f;分享一下我是怎么练习色感的&#xff01;_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1h1421Z76p/?spm_id_from333.1007.…

汇聚荣科技有限公司实力怎么样?

汇聚荣科技有限公司&#xff0c;一家专注于高新技术研发和应用的企业&#xff0c;在业界享有一定的声誉。那么&#xff0c;这家公司的实力究竟如何?我们将从公司概况、技术研发、市场表现、企业文化和未来展望五个方面进行详细探讨。 一、公司概况 汇聚荣科技有限公司经过多年…

GAN的入门理解

这一篇主要是关于生成对抗网络的模型笔记&#xff0c;有一些简单的证明和原理&#xff0c;是根据李宏毅老师的课程整理的&#xff0c;下面有链接。本篇文章主要就是梳理基础的概念和训练过程&#xff0c;如果有什么问题的话也可以指出的。 李宏毅老师的课程链接 1.概述 GAN是…

[Cloud Networking] Layer3 (Continue)

文章目录 1. DHCP Protocol1.1 DHCP 三种分配方式1.2 DHCP Relay (中继) 2. 路由协议 (Routing Protocol)2.1 RIP (Routing Information Protocol)2.2 OSPF Protocol2.3 BGP Protocol2.4 IS-IS Protocol2.5 ICMP&#xff08;Internet Control Message Protocol&#xff09; 1. …

RocketMq源码解析六:消息存储

一、消息存储核心类 rocketmq消息存储的功能主要在store这个模块下。 核心类就是DefaultMessageStore。我们看下其属性 // 配置文件 private final MessageStoreConfig messageStoreConfig; // CommitLog 文件存储实现类 private final CommitLog commitLog; …

jquery.datetimepicker无法添加清除按钮的问题

项目场景&#xff1a; 自从决定用现有新技术实现CRM老项目起&#xff0c;就开始了我的折腾之路&#xff0c;最近一直在折腾前端页面&#xff0c;不像后端Java&#xff0c;写的有问题运行会报错&#xff0c;大多数报错一搜就能找到解决方案&#xff0c;前端这个倒好&#xff0c…

利用阿里云PAI平台微调ChatGLM3-6B

1.介绍ChatGLM3-6B ChatGLM3-6B大模型是智谱AI和清华大学 KEG 实验室联合发布的对话预训练模型。 1.1 模型规模 模型规模通常用参数数量&#xff08;parameters&#xff09;来衡量。参数数量越多&#xff0c;模型理论上越强大&#xff0c;但也更耗费资源。以下是一些典型模型…

Java入门教程上

常见的cmd命令 类 class 字面量 数据类型 输入 public static void main(String[] args) {Scanner anew Scanner(System.in);int na.nextInt();int ma.nextInt();System.out.println(mn);} } 算数运算符 package wclg;public class test {public static void main(String[] ar…

智慧交通的神经中枢:利用ARMxy进行实时交通流数据采集

气候变化和水资源日益紧张&#xff0c;精准农业成为了提高农业生产效率、节约资源的关键。在这一变革中&#xff0c;ARMxy工业计算机扮演了核心角色&#xff0c;特别是在智能灌溉系统的实施中。 背景介绍&#xff1a; 某大型农场面临着灌溉效率低、水资源浪费严重的问题。传统的…

讯飞星火大模型个人API账号免费使用申请教程

文章目录 1.登录讯飞星火大模型官网 https://www.xfyun.cn/ 2.下滑找到Spark Lite&#xff0c;点击立即调用 3.星火大模型需要和具体的应用绑定&#xff0c;我们需要先创建一个新应用 https://console.xfyun.cn/app/myapp&#xff0c;应用名称可以按照自己的意愿起。 4.填写应用…

类和对象(上续)

前言&#xff1a;本文介绍类和对象中的一些比较重要的知识点&#xff0c;为以后的继续学习打好基础。 目录 拷贝构造 拷贝构造的特征&#xff1a; 自定义类型的传值传参 自定义类型在函数中的传值返回 如果返回值时自定义的引用呢&#xff1f; 在什么情况下使用呢&#…

Vue3【十五】标签的Ref属性

Vue3【十五】标签的Ref属性 标签的ref属性 用于注册模板引用 用在dom标签上&#xff0c;获取的是dom节点 用在组件上&#xff0c;获取的是组件实例对象 案例截图 目录结构 代码 app.vue <template><div class"app"><h1 ref"title2">你…

MATLAB实现磷虾算法(Krill herd algorithm)

1.算法介绍 磷虾算法&#xff08;Krill Herd Algorithm, KH&#xff09;是一种基于生物启发的优化算法&#xff0c;其原理模拟了南极磷虾&#xff08;Euphausia superba&#xff09;群体的聚集行为。该算法旨在通过模拟磷虾个体间的相互作用、觅食行为和随机扩散&#xff0c;来…