您的位置:首页 > 新闻 > 会展 > 平面设计有哪些_seo优化推广软件_网站建设开发简介_东莞网站优化公司

平面设计有哪些_seo优化推广软件_网站建设开发简介_东莞网站优化公司

2025/10/19 8:58:35 来源:https://blog.csdn.net/m0_75187370/article/details/147319002  浏览:    关键词:平面设计有哪些_seo优化推广软件_网站建设开发简介_东莞网站优化公司
平面设计有哪些_seo优化推广软件_网站建设开发简介_东莞网站优化公司
1. 引言

STM32F407 是 ST 公司推出的一款高性能微控制器,具有丰富的外设资源和强大的处理能力。HAL(Hardware Abstraction Layer)库是 ST 为其微控制器提供的硬件抽象层,它简化了硬件操作,提高了开发效率。FreeRTOS 是一个开源的实时操作系统,具有轻量级、可移植性强等特点,广泛应用于嵌入式系统开发中。本文将详细介绍如何基于 STM32F407 HAL 库和 FreeRTOS 创建多任务。

2. 开发环境搭建

在开始开发之前,需要搭建好相应的开发环境。以下是具体步骤:

2.1 安装开发工具
  • STM32CubeMX:用于生成初始化代码和配置硬件。可以从 ST 官方网站下载并安装。
  • Keil MDK:一款常用的 ARM 开发工具,支持 STM32 系列微控制器的开发。可以从 Keil 官方网站下载并安装。
2.2 安装 STM32F407 HAL 库

在 STM32CubeMX 中,通过 “Help” -> “Manage embedded software packages” 安装 STM32F4 系列的 HAL 库。

2.3 安装 FreeRTOS

在 STM32CubeMX 中,通过 “Middleware” -> “RTOS” 选择 FreeRTOS 进行安装。

3. 使用 STM32CubeMX 配置项目

打开 STM32CubeMX,创建一个新的项目,选择 STM32F407 芯片。以下是具体的配置步骤:

3.1 配置时钟

在 “RCC” 选项中,选择外部晶振作为时钟源,并配置系统时钟频率为 168MHz。

3.2 配置调试接口

在 “System Core” -> “SYS” 中,选择调试接口为 “Serial Wire”。

3.3 配置 FreeRTOS

在 “Middleware” -> “RTOS” 中,选择 FreeRTOS 的版本和内核选项。可以根据需要配置任务栈大小、优先级等参数。

3.4 生成代码

配置完成后,点击 “Project Manager”,选择生成代码的工具链为 “MDK-ARM”,然后点击 “Generate Code” 生成初始化代码。

4. 创建多任务

打开生成的 Keil 项目,在main.c文件中可以看到 FreeRTOS 的初始化代码。以下是创建多任务的详细步骤:

4.1 定义任务函数

main.c文件中定义任务函数,每个任务函数都有一个特定的功能。例如,以下是两个简单的任务函数:

#include "main.h"
#include "stm32f4xx_hal.h"
#include "cmsis_os.h"// 任务句柄
osThreadId Task1Handle;
osThreadId Task2Handle;// 任务1函数
void Task1(void const * argument)
{for(;;){// 任务1的具体操作HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);  // 翻转LED引脚osDelay(1000);  // 延时1秒}
}// 任务2函数
void Task2(void const * argument)
{for(;;){// 任务2的具体操作HAL_UART_Transmit(&huart1, (uint8_t *)"Task 2 is running!\r\n", 20, 100);  // 发送串口信息osDelay(2000);  // 延时2秒}
}
4.2 创建任务

main.c文件的MX_FREERTOS_Init函数中创建任务。代码如下:

void MX_FREERTOS_Init(void) {/* 创建任务 */osThreadDef(Task1, Task1, osPriorityNormal, 0, 128);Task1Handle = osThreadCreate(osThread(Task1), NULL);osThreadDef(Task2, Task2, osPriorityNormal, 0, 128);Task2Handle = osThreadCreate(osThread(Task2), NULL);
}
4.3 启动调度器

main函数中启动 FreeRTOS 调度器。代码如下:

int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();MX_FREERTOS_Init();/* 启动调度器 */osKernelStart();while (1){// 主循环一般为空}
}

下面是一个基于 STM32F407 HAL 库和 FreeRTOS 创建多任务的示例代码:

#include "main.h"
#include "stm32f4xx_hal.h"
#include "cmsis_os.h"// 任务句柄
osThreadId Task1Handle;
osThreadId Task2Handle;// 任务1函数
void Task1(void const * argument)
{for(;;){// 任务1的具体操作HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);  // 翻转LED引脚osDelay(1000);  // 延时1秒}
}// 任务2函数
void Task2(void const * argument)
{for(;;){// 任务2的具体操作HAL_UART_Transmit(&huart1, (uint8_t *)"Task 2 is running!\r\n", 20, 100);  // 发送串口信息osDelay(2000);  // 延时2秒}
}void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_FREERTOS_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();MX_FREERTOS_Init();/* 启动调度器 */osKernelStart();while (1){// 主循环一般为空}
}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** 初始化RCC振荡器 */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 8;RCC_OscInitStruct.PLL.PLLN = 336;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 7;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** 初始化RCC时钟 */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_DIV4;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK){Error_Handler();}
}static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);/*Configure GPIO pin : PA5 */GPIO_InitStruct.Pin = GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}static void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}
}static void MX_FREERTOS_Init(void)
{/* 创建任务 */osThreadDef(Task1, Task1, osPriorityNormal, 0, 128);Task1Handle = osThreadCreate(osThread(Task1), NULL);osThreadDef(Task2, Task2, osPriorityNormal, 0, 128);Task2Handle = osThreadCreate(osThread(Task2), NULL);
}void Error_Handler(void)
{while(1){}
}    

代码解释

  • 任务函数Task1Task2是两个任务函数,在for(;;)无限循环里执行各自的操作。Task1每隔 1 秒翻转一次 LED 引脚,Task2每隔 2 秒通过串口发送一条信息。
  • 任务创建:在MX_FREERTOS_Init函数中,借助osThreadDef宏定义任务,再用osThreadCreate函数创建任务。
  • 调度器启动:在main函数中调用osKernelStart函数启动 FreeRTOS 调度器。

任务调度机制解析

FreeRTOS 支持两种主要的任务调度算法:抢占式调度和时间片轮转调度。

1. 抢占式调度
  • 原理:高优先级的任务能够抢占低优先级任务的执行。一旦高优先级任务就绪(例如,等待的事件发生),调度器会马上暂停当前低优先级任务的执行,转而执行高优先级任务。
  • 示例:若把Task1的优先级设为高,Task2的优先级设为低,当Task2正在执行时,Task1就绪,调度器会暂停Task2,开始执行Task1,等Task1阻塞或者完成后,再恢复执行Task2
2. 时间片轮转调度
  • 原理:针对相同优先级的任务,调度器采用时间片轮转的方式让它们轮流执行。每个任务在规定的时间片内执行,时间片用完后,调度器会切换到下一个相同优先级的就绪任务。
  • 示例:若Task1Task2优先级相同,调度器会给每个任务分配一个时间片,比如 10ms。Task1执行 10ms 后,调度器切换到Task2执行 10ms,如此循环。
3. 调度器工作流程
  • 初始化:在启动调度器之前,要创建所有任务并将它们添加到就绪列表中。
  • 选择任务:调度器会从就绪列表里选择优先级最高的任务。若有多个相同优先级的任务,就采用时间片轮转的方式选择。
  • 任务切换:当任务阻塞(例如,调用osDelay函数)或者被高优先级任务抢占时,调度器会保存当前任务的上下文(寄存器值等),然后恢复下一个要执行任务的上下文,实现任务切换。

通过以上的配置和机制,FreeRTOS 能够有效地管理多个任务的执行,保证系统的实时性和稳定性。

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com