【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 );
  • 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",      //任务的名字:我的第一个任务MyFirstTask
                128,                //栈的深度 128
                NULL,               //不需要什么参数 NULL
                osPriorityNormal,   //优先级 osPriorityNormal
                NULL);              //最后一个参数先不用 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

在这里插入图片描述

我们下文再见~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全网首发-Docker被封后的代理设置教程

最近上交、科大以及阿里的一些docker镜像,好像都因为不可控力导致无法访问。 所以,之前好多正常的一些镜像的打包都会报错: 比如: #1 [internall load build definition from Dockerfile#1transferring dockerfile:972B done#1 D…

5.2 参照完整性

5.2.1 外键约束 语法格式&#xff1a;constraint < symbol > foreign key ( col_nam1[, col_nam2... ] ) references table_name (col_nam1[, col_nam2...]) [ on delete { restrict | cascade | set null | no action } ] [ on update { restrict | cascade | set nu…

水帘降温水温

不同环境下的水帘啊&#xff0c;使用水温是不一样的&#xff0c;夏天使用水疗的水有两种&#xff0c;一个是常温的循环水&#xff0c;20~26左右&#xff0c;另外一个呢&#xff0c;就是深井水&#xff0c;重点是啥呢&#xff1f;就是无论我们用哪一种&#xff0c;能够把温度降到…

新版Win11强制开启Bitlocker已实锤,难道真就治不了它了?(含自制工具下载)

网管小贾 / sysadm.cc 满院芳草绿&#xff0c;几树梨花香。 如此大一座院落中&#xff0c;唯范贤一人正自斟自饮悠闲地品着茶。 忽闻得一阵微风拂面&#xff0c;似乎有人在呼喊他…… “哥……哥㖿……原来你在这儿啊……哎哟……” 范贤转过脸去&#xff0c;正想看看来者何…

【虚拟现实】二、主要的AR/VR硬件设备

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 2.1 微软HoloLens 微软HoloLens是一款领先的混合现实设备&#xff0c;结合了AR和VR的元素&#xff0c;允许用户…

计算机科学(学习笔记三)

内容来源&#xff1a;计算机科学 指令和程序 指令&#xff1a;指示计算机要做什么的代码&#xff0c;多条指令共同组成程序。 计算机指令长度 由于早期计算机每个字只有8位&#xff0c;指令只占4位&#xff0c;意味着只能有16个指令&#xff0c;这远远不够。 现代计算机有两…

北交字节联合提出ClassDiffusion: 使用显式类别引导的一致性个性化生成。

在个性化生成领域, 微调可能会引起过拟合导致模型无法生成与提示词一致的结果。针对这个问题&#xff0c;北交&字节联合提出ClassDiffusion&#xff0c;来提升个性化生成的一致性。 通过两个重要观察及理论分析提出了新的观点:一致性的损失是个性化概念语义偏移导致的, 还…

[ue5]建模场景学习笔记(5)——必修内容可交互的地形,交互沙(2)

1需求分析&#xff1a; 继续制作可交互沙子内容&#xff0c;前面我们已经让角色在指定区域留下痕迹&#xff0c;那么能否让区域移动起来&#xff0c;这样才能逐步满足角色走到哪里都能产生交互痕迹&#xff0c;满足更大的地图。 2.操作实现&#xff1a; 1.首先建立角色能产生…

【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 标准对话框 | 输入对话框QInputDialog 文章编号&#xff1a;…

AOSP12隐藏首页搜索框----隐藏google 搜索栏

目录 第一步&#xff1a;修改文件 第二步&#xff1a;修改文件 第三步&#xff1a;重新编译源码&#xff0c;启动模拟器 第四步、运行效果 第一步&#xff1a;修改文件 源码文件路径: packages/apps/Launcher3/res/layout/search_container_workspace.xml&#xff0c;将…

rv1126-rv1109-串口显示路径不变化

串口只有#, 后来看了教程改成如下 但是没有变化,那个路径都只显示rootLonbon# 于是最后改成了这样 因为:

ADS基础教程19 - 电磁仿真(EM)基本概念和实操

EM介绍 一、引言二、基本概念1.EM介绍2.Momentum介绍3.FEM介绍4.Substrate介绍 三、创建Layout并进行Momentum仿真1.创建Layout2.添加Microtrip&#xff08;微带线&#xff09;3.添加Substrate4.Momentum仿真 四、总结 一、引言 本章节开始介绍EM的基本概念、内容以及实现具体…

JavaWeb6 Tomcat+postman请求、响应

Web服务器 对HTTP协议操作进行封装&#xff0c;简化web程序开发 部署web项目&#xff0c;对外提供网上信息浏览服务 Tomcat 轻量级web服务器&#xff0c;支持servlet&#xff0c;jsp等少量javaEE规范 也被称为web容器&#xff0c;servlet容器 Springboot有内置Tomcat nginx…

使用AlphaCodium进行代码生成,从提示工程到流程工程

AlphaCodium 的代码生成方法 论文地址&#xff1a;https://arxiv.org/pdf/2401.08500.pdf 源码地址&#xff1a;https://github.com/codium-ai/alphacodium 研究要点包括 **挑战&#xff1a;**现有的自然语言优化方法无法扩展 LLM 的代码生成能力**解决方案&#xff1a;**使…

二刷算法训练营Day29 | 回溯算法(5/6)

目录 详细布置&#xff1a; 1. 491. 非递减子序列 2. 46. 全排列 3. 47. 全排列 II 详细布置&#xff1a; 1. 491. 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序…

用教育邮箱在官网安装origin2024中文版教程

打开origin官网&#xff0c;点击learning Edition&#xff0c;教育版只能维持六个月&#xff0c;但是过期之后可以在官网更新&#xff0c;能够免费使用六次&#xff0c;也就是三年。 OriginLab - Origin and OriginPro - Data Analysis and Graphing Software 填写学校信息&…

一文讲清:生产报工系统的功能、报价以及如何选择

最近这几年&#xff0c;企业越来越注重生产的速度和成本&#xff0c;尤其是“性价比”&#xff0c;生产报工系统已经变成了制造业里不可或缺的一部分。不过&#xff0c;市场上生产报工系统的选择太多&#xff0c;价格也都不一样&#xff0c;这就给很多企业出了个难题&#xff1…

LVS+Keepalived高可用负载均衡群集

目录 一.高可用群集相关概述 1.高可用&#xff08;HA&#xff09;群集与普通群集的比较 普通群集 高可用群集&#xff08;HA&#xff09; 两者比较 2.Keepalived高可用方案 3.Keepalived的体系模块及其作用 4.Keepalived实现原理 二.LVSKeepAlived高可用负载均衡集群的…

RERCS系统开发实战案例-Part03 创建Web Dynpro对应的FPM Application

1、通过事务码SE80 资源浏览器创建 2、通过事务码FPM_WB在WEB端创建 3、创建FPM Application步骤 1&#xff09;选择&#xff1a;在业务实体上创建FPM应用程序的向导&#xff1b; 2&#xff09;配置&#xff1a;输入平面布置对象&#xff1b; 3&#xff09;单击 下一个&#…

朴素贝叶斯分类器 #数据挖掘 #Python

朴素贝叶斯分类器是一种基于概率统计的简单但强大的机器学习算法。它假设特征之间是相互独立的&#xff08;“朴素”&#xff09;&#xff0c;尽管在现实世界中这通常不成立&#xff0c;但在许多情况下这种简化假设仍能提供良好的性能。 基本原理&#xff1a;朴素贝叶斯分类器…