当前位置: 首页 > wzjs >正文

建设银行官网站下载地址网站建设的第一阶段

建设银行官网站下载地址,网站建设的第一阶段,西安房产网签查询系统,军用棉被门网站建设在基于 STM32F407 HAL 库和 FreeRTOS 的开发中,队列是一种重要的任务间通信机制,它允许任务之间安全地传递数据。下面将详细解析如何使用 FreeRTOS 的队列。 1. 队列的基本概念 队列是一种先进先出(FIFO)的数据结构,…

在基于 STM32F407 HAL 库和 FreeRTOS 的开发中,队列是一种重要的任务间通信机制,它允许任务之间安全地传递数据。下面将详细解析如何使用 FreeRTOS 的队列。

1. 队列的基本概念

队列是一种先进先出(FIFO)的数据结构,在 FreeRTOS 中,队列可以用来在任务之间传递数据。队列中的每个数据项都有固定的大小,并且可以存储多个数据项。

2. 配置开发环境

首先,你需要使用 STM32CubeMX 配置好 STM32F407 的项目,并启用 FreeRTOS。步骤如下:

  1. 打开 STM32CubeMX,选择 STM32F407 芯片。
  2. 配置时钟、调试接口等基本设置。
  3. 在 “Middleware” -> “RTOS” 中选择 FreeRTOS,并进行必要的配置。
  4. 生成代码并导入到 Keil MDK 中。

3. 队列的创建与使用示例

以下是一个基于 STM32F407 HAL 库和 FreeRTOS 的队列使用示例代码:

stm32f407-freertos-queue基于STM32F407 HAL库和FreeRTOS的队列使用示例代码

生成 main.c

#include "main.h"
#include "stm32f4xx_hal.h"
#include "cmsis_os.h"// 队列句柄
osMessageQId myQueueHandle;// 发送任务函数
void SenderTask(void const * argument)
{uint32_t data = 0;for(;;){// 发送数据到队列if(osMessagePut(myQueueHandle, data, osWaitForever) == osOK){HAL_UART_Transmit(&huart1, (uint8_t *)"Data sent to queue!\r\n", 20, 100);data++;}osDelay(1000); // 每隔1秒发送一次数据}
}// 接收任务函数
void ReceiverTask(void const * argument)
{osEvent event;for(;;){// 从队列中接收数据event = osMessageGet(myQueueHandle, osWaitForever);if(event.status == osEventMessage){uint32_t receivedData = event.value.v;char buffer[50];sprintf(buffer, "Received data: %lu\r\n", receivedData);HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), 100);}}
}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)
{// 创建队列osMessageQDef(myQueue, 16, uint32_t);myQueueHandle = osMessageCreate(osMessageQ(myQueue), NULL);// 创建发送任务osThreadDef(SenderTask, SenderTask, osPriorityNormal, 0, 128);osThreadCreate(osThread(SenderTask), NULL);// 创建接收任务osThreadDef(ReceiverTask, ReceiverTask, osPriorityNormal, 0, 128);osThreadCreate(osThread(ReceiverTask), NULL);
}void Error_Handler(void)
{while(1){}
}    

4. 代码解析

4.1 队列的创建

MX_FREERTOS_Init函数中,使用osMessageQDef宏定义队列的参数,包括队列名称、队列长度和数据项类型。然后使用osMessageCreate函数创建队列,并返回队列句柄。

osMessageQDef(myQueue, 16, uint32_t);
myQueueHandle = osMessageCreate(osMessageQ(myQueue), NULL);

这里创建了一个长度为 16,数据项类型为uint32_t的队列。

4.2 发送数据到队列

SenderTask函数中,使用osMessagePut函数将数据发送到队列中。osWaitForever表示如果队列已满,任务将一直等待直到有空间可用。

if(osMessagePut(myQueueHandle, data, osWaitForever) == osOK)
{HAL_UART_Transmit(&huart1, (uint8_t *)"Data sent to queue!\r\n", 20, 100);data++;
}
4.3 从队列中接收数据

ReceiverTask函数中,使用osMessageGet函数从队列中接收数据。osWaitForever表示如果队列为空,任务将一直等待直到有数据可用。

event = osMessageGet(myQueueHandle, osWaitForever);
if(event.status == osEventMessage)
{uint32_t receivedData = event.value.v;char buffer[50];sprintf(buffer, "Received data: %lu\r\n", receivedData);HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), 100);
}

5. 注意事项

  • 队列长度:队列的长度决定了队列可以存储的数据项数量。如果队列已满,继续发送数据可能会导致任务阻塞。
  • 数据类型:队列中的数据项必须是相同的数据类型,在创建队列时需要明确指定。
  • 错误处理:在使用osMessagePutosMessageGet函数时,需要检查返回值以确保操作成功。

通过以上步骤,你可以在基于 STM32F407 HAL 库和 FreeRTOS 的项目中使用队列进行任务间通信。


文章转载自:

http://jlYyoR5Z.nLnmy.cn
http://N5oEMjM7.nLnmy.cn
http://s0kmy0ap.nLnmy.cn
http://NQPkDv8W.nLnmy.cn
http://FMjrtYQ5.nLnmy.cn
http://JK501RL3.nLnmy.cn
http://d5y4grig.nLnmy.cn
http://mXkwVhJc.nLnmy.cn
http://qqwHmbIi.nLnmy.cn
http://ginR9Rmq.nLnmy.cn
http://UBHluoIt.nLnmy.cn
http://zc5a40w1.nLnmy.cn
http://9c906pOP.nLnmy.cn
http://YbMvygdK.nLnmy.cn
http://C2u2MrMc.nLnmy.cn
http://LWoNz1Hh.nLnmy.cn
http://okqzD9md.nLnmy.cn
http://nYRL4Hkq.nLnmy.cn
http://faSl6weK.nLnmy.cn
http://EQ2VLhdW.nLnmy.cn
http://ycLQTEIX.nLnmy.cn
http://QcOv0A19.nLnmy.cn
http://fkdaMKNE.nLnmy.cn
http://bQnqRCrj.nLnmy.cn
http://QUVGlto1.nLnmy.cn
http://VcqtaRK9.nLnmy.cn
http://lGvJC5bo.nLnmy.cn
http://0ZWk0zuq.nLnmy.cn
http://dYMCSaWO.nLnmy.cn
http://SQJ73ikN.nLnmy.cn
http://www.dtcms.com/wzjs/644284.html

相关文章:

  • 企业网站建设硬件wordpress电视剧主题
  • 成都创新互联网站建设学做古装网站
  • 网站添加定位怎么做什么网站模板
  • 百度seo快速见效方法搜索引擎优化的特点
  • 建站公司服务高端网站建设合同
  • 网站开发协议中的注意事项宝塔和WordPress一样吗
  • 天津建设网站首页wordpress修改首页名称
  • 英语写作网站微商城app开发公司
  • flash做的网站网站设置域名
  • 网站建设开头聊城网站建设价位
  • 葫芦岛网站网站建设招生网站模版
  • 陶瓷网站源码嘉兴 网站 建设
  • dw做的网站解压后为什么没了wordpress两个导航栏
  • 公司宣传网站建设开题报告网站语言有几种
  • 怎么做一个论坛网站网站建设图标图片
  • g时代网站建设wordpress 微信导航菜单
  • 网站建设验收要求东莞市招投标交易中心
  • 站群管理系统cms杭州平面设计师工资一般多少
  • 新建的网站 找不到了抖音企业号官网入口
  • 网站无法链接学中文网站
  • 手机网站首页怎样做网站的当前位置栏
  • 织梦网站做关键词txt网站推荐
  • 3d演示中国空间站建造免费网页制作工具下载
  • 郑州网站建设公司服务公司设计图纸平面图
  • 柬埔寨网赌网站开发深圳工业设计公司哪家好
  • 专业网站设计建设公司wordpress在线查询系统
  • 音乐网站 模板手游app平台排行榜
  • 壁纸网站模板公司网址注册一般需要多少钱
  • 网站在国内服务器在国外什么叫网站后台
  • 潍坊网站建设科技有限公司软文自动发布软件