STM32_实现双线程控制LED交替闪烁(UCOS)

线程定义函数

void  OSTaskCreate (OS_TCB        *p_tcb,CPU_CHAR      *p_name,OS_TASK_PTR    p_task,void          *p_arg,OS_PRIO        prio,CPU_STK       *p_stk_base,CPU_STK_SIZE   stk_limit,CPU_STK_SIZE   stk_size,OS_MSG_QTY     q_size,OS_TICK        time_quanta,void          *p_ext,OS_OPT         opt,OS_ERR        *p_err)

OSTaskCreate 函数的这种形式看起来像是来自μC/OS-III实时操作系统。这个函数用于创建一个任务,并且提供了更多的配置选项。下面是对每个参数的解释:

  1. p_tcb:指向任务控制块(TCB)的指针。TCB是操作系统用来管理任务的所有信息的结构,包括任务的当前状态、优先级、栈指针等。

  2. p_name:任务的名称,通常是一个以null结尾的字符串,用于调试和识别任务。

  3. p_task:任务函数的指针,这是任务执行的入口点。

  4. p_arg:传递给任务函数的参数的指针。

  5. prio:任务的优先级。在μC/OS-III中,优先级越高,任务越先被执行。

  6. p_stk_base:指向任务栈底的指针。任务栈是任务执行时用于存储局部变量和上下文切换信息的一段内存。

  7. stk_limit:栈的限制大小,用于栈溢出检测。

  8. stk_size:栈的大小,指定了任务栈的容量。

  9. q_size:任务消息队列的大小,如果任务使用消息队列来接收消息,这个参数指定队列可以容纳的最大消息数。

  10. time_quanta:时间片大小,用于时间分片调度。在时间分片调度中,每个任务在被抢占之前可以执行的时间量。

  11. p_ext:指向任务扩展数据的指针,可以用于存储用户定义的数据。

  12. opt:创建任务的选项,可以是位字段,用于指定如何创建任务,例如是否立即启动任务等。

  13. p_err:指向错误码的指针,用于返回函数执行的结果。如果任务创建成功,错误码将为OS_ERR_NONE,否则将是一个错误代码,指示失败的原因。

将定义好的线程提交给内核

void  OSStart (OS_ERR  *p_err)

main.c文件

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2024 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "os.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */#define TASK_STACK_SIZE 1024
OS_ERR      p_err1;/* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
//创建任务栈
static CPU_STK TasK1StK[TASK_STACK_SIZE];
static CPU_STK TasK2StK[TASK_STACK_SIZE];//创建任务控制块
static OS_TCB Task1TCB;
static OS_TCB Task2TCB;
// 任务函数
void Task1(void *p_arg) {MX_GPIO_Init();while (1) {// 点亮LED1HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_3);// 延时OSTimeDlyHMSM(0, 0, 1, 0,OS_OPT_TIME_HMSM_STRICT,&p_err1);//HAL_Delay(500);}
}void Task2(void *p_arg) {MX_GPIO_Init();while (1) {// 点亮LED2HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_5);// 延时OSTimeDlyHMSM(0, 0, 0, 500,OS_OPT_TIME_HMSM_STRICT,&p_err1);}
}/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *///初始化ucosOSInit(&p_err1);/* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */Mem_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */OSTaskCreate((OS_TCB*)&Task1TCB,//任务块名称(CPU_CHAR*)"task 1",//任务名称:调试的时候有用(OS_TASK_PTR)Task1,//任务函数(void*)0,//传递给任务入口函数的参数的指针(OS_PRIO)5,//优先级:数字越低,优先级越高(CPU_STK*)&TasK1StK[0],//(CPU_STK_SIZE)TASK_STACK_SIZE/10,(CPU_STK_SIZE)TASK_STACK_SIZE,(OS_MSG_QTY)0,(OS_TICK)5,(void*)0,(OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR*)&p_err1//错误指针);OSTaskCreate((OS_TCB*)&Task2TCB,//任务块名称(CPU_CHAR*)"task 2",//任务名称:调试的时候有用(OS_TASK_PTR)Task2,//任务函数(void*)0,//传递给任务入口函数的参数的指针(OS_PRIO)1,//优先级:数字越低,优先级越高(CPU_STK*)&TasK2StK[0],//(CPU_STK_SIZE)TASK_STACK_SIZE/10,(CPU_STK_SIZE)TASK_STACK_SIZE,(OS_MSG_QTY)0,(OS_TICK)5,(void*)0,(OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR*)&p_err1//错误指针);OSStart(&p_err1);//启动多任务调度/* USER CODE END WHILE *//* USER CODE BEGIN 3 *//* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

注意

设置内存大小根据主板而定,太小的化有可能个别线程不可运行

具体如何设置我暂时不清楚,有知道的大佬可以在评论区中讲一下吗

我是写一个值,程序能运行就不改了

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

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

相关文章

云顶之弈数据网站

摘要:随着云顶之弈游戏的广泛流行,玩家对于游戏数据的查询和最新资讯的获取需求呈现出显著增长的趋势。设计一款云顶之弈数据网站,为玩家提供便捷、高效的数据查询和资讯浏览服务,能满足玩家对于游戏数据的快速查询和实时资讯获取…

C# 如何单纯的优化循环

Parallel.For(0, 10000, i >{// 并行执行的代码块// 例如: Console.WriteLine(i);}); 这种循环比 单纯常用的for 和 foreach 要稍微快一点 但是呢如果循环里面写的是非常简单的业务逻辑 的话 for和foreach 要更胜一筹一点 Parallel 原理就好像我一个人忙不过来可以多找几个…

已解决java.security.acl.LastOwnerException:无法移除最后一个所有者的正确解决方法,亲测有效!!!

已解决java.security.acl.LastOwnerException:无法移除最后一个所有者的正确解决方法,亲测有效!!! 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 1. 检查当前所有者数量 2. 添加新的所有者 3. 维…

在区块链技术广泛应用的情况下,C 语言如何在区块链的底层开发中发挥更有效的作用,提高性能和安全性?

C语言在区块链底层开发中发挥着重要的作用,可以提高性能和安全性。具体可以从以下几个方面进行优化: 性能优化:C语言是一种高效的编程语言,可以直接访问内存和硬件资源。在区块链底层开发中,使用C语言可以更好地利用底…

ubuntu20.04 docker启动frp服务端

1. docker-compose.yml version: 3.8services:frps:image: snowdreamtech/frps:0.46.0container_name: frpsrestart: alwaysnetwork_mode: hostvolumes:- /root/application/docker/frp/frps.ini:/etc/frp/frps.ini分局实际情况修改挂载目录 2. frps.ini [common] # 监听端口…

【C语言】--数据类型和变量

😗个人主页: 起名字真南 😙个人专栏:【数据结构初阶】 【C语言】 目录 1 数据类型介绍1.1 字符型1.2 整形1.3 浮点型1.4 布尔型1.5 各种数据类型的长度1.5.1 sizeof 操作符1.5.2 数据类型长度1.5.3 sizeof 中表达式不计算 2 signed 和 unsigned3 数据类型…

1978Springboot在线维修预约服务应用系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot在线维修预约服务应用系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发 ),系统具有完整的源代码和…

“Hello, World!“ 历史由来

布莱恩W.克尼汉(Brian W. Kernighan)—— Unix 和 C 语言背后的巨人 布莱恩W.克尼汉在 1942 年出生在加拿大多伦多,他在普林斯顿大学取得了电气工程的博士学位,2000 年之后取得普林斯顿大学计算机科学的教授教职。 1973 年&#…

解释如何在使用Bitmap时进行优化,以减少内存占用和提高性能

技术难点 在使用Bitmap时,优化内存占用和提高性能是一个重要的技术挑战。Bitmap对象本身可以占用大量内存,特别是在处理高分辨率图像时。以下是一些主要的技术难点: 内存管理:Bitmap对象占用的内存需要在不再需要时被及时释放&am…

Windows server 2016.2019 .NET Framework 3.5安装包、安装步骤

windows server2019 操作系统 安装 sqlserver2008时提示缺少 .NET Frameword 3.5, 在功能里选择 .NET Frameword 3.5安装报错, 下载安装包,下载地址 https://download.csdn.net/download/qq445829096/89450429这里指定备份源路径 安装包解…

OpenGL3.3_C++_Windows(22)

材质: 决定物体在渲染过程中最终视觉呈现的关键因素之一,它通过一系列光学(投光物)和物理参数(反光度,反照率、金属度,折射率……)准确模拟现实世界中的材料特性,从而增…

【MySQL】InnoDB的存储结构

InnoDB的存储结构:每个表都会生成一个表空间文件,这个文件里面最小结构就是行,存储的真正的数据,一个页来管理若干行,一个区来管理若干页,一个区组来管理若干区。段并不是真正的物理存储结构,它…

汇总大语言模型LLM的评测基准数据集(BenchMarks)

文章目录 0. 引言1. 知识与语言理解1.1 MMLU1.2 ARC1.3 GLUE1.4 Natural Questions1.5 LAMBADA1.5 HellaSwag1.6 MultiNLI1.7 SuperGLUE1.8 TriviaQA1.9 WinoGrande1.10 SciQ 2. 推理能力2.1 GSM8K2.2 DROP2.3 CRASS2.4 RACE2.5 BBH2.6 AGIEval2.7 BoolQ 3. 多轮开放式对话3.1 …

vue3中获取Excel和csv文件中的内容

1.效果 2.安装 npm install xlsxyarn add xlsx 3.引入使用 <el-upload ref"uploadRef" :on-change"changeFile" :show-file-list"false" class"mr10" accept".csv, .xlsx, .xls"action"#" :auto-upload&quo…

滚动表格(vue版本)【已验证可正常运行】

演示图 注&#xff1a;以下代码来自于GPT4o&#xff1a;国内官方直连GPT4o 代码 <template><div><div class"alarmList-child" ref"alarmList" mouseenter.stop"autoRoll(1)" mouseleave.stop"autoRoll()"><div…

基于DPU的Ceph存储解决方案

1. 方案背景和挑战 Ceph是一个高度可扩展、高性能的开源分布式存储系统&#xff0c;设计用于提供优秀的对象存储、块存储和文件存储服务。它的几个核心特点是&#xff1a; 弹性扩展&#xff1a;Ceph能够无缝地水平扩展存储容量和性能&#xff0c;只需添加新的存储节点即可&am…

【AUTOSAR 基础软件】DEM模块详解(诊断故障管理)

文章包含了AUTOSAR基础软件&#xff08;BSW&#xff09;中DEM模块相关的内容详解。本文从ISO标准&#xff0c;AUTOSAR规范解析&#xff0c;ISOLAR-AB配置以及模块相关代码分析四个维度来帮读者清晰的认识和了解DEM这一基础软件模块。文中涉及的ISOLAR-AB配置以及模块相关代码都…

查询DBA_TEMP_FILES报错,删除临时表空间报错ORA-60100

SYMPTOMS 查询DBA_TEMP_FILES报错如下图 ORA-01157: cannotidentify/ock data fle 201 -see DBWR trace fle ORA-01110: data fle 20 1: D:APPADMINISTRATORIORADATA MARTIDATAFILE 01157,00000-"cannotidentify/ock data fle %s -see DBWR trace fle"*Cause: The b…

2024年湖北省安全员-C证证考试题库及湖北省安全员-C证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年湖北省安全员-C证证考试题库及湖北省安全员-C证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试…

云计算:重塑数字时代的基石

目录 一、引言 二、云计算的定义与特点 三、云计算的发展历程 四、云计算的应用场景 五、云计算面临的挑战 六、云计算的未来发展趋势 七、结语 一、引言 随着信息技术的飞速发展&#xff0c;云计算已经逐渐渗透到我们生活的方方面面。从个人用户的在线存储、在线办公&…