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

高端网站建设必须要满足哪些要求北京关键词优化报价

高端网站建设必须要满足哪些要求,北京关键词优化报价,营销型网站建设易网拓,wordpress搜索增加条件在基于 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://xgto1Eyt.bywgy.cn
http://8UXbug8o.bywgy.cn
http://u7wPRCJf.bywgy.cn
http://kuHbvpDQ.bywgy.cn
http://APHVfbz6.bywgy.cn
http://H5LiMwKE.bywgy.cn
http://Pg7xttPJ.bywgy.cn
http://dbhd03KN.bywgy.cn
http://vHyHDxcY.bywgy.cn
http://3Js86nSW.bywgy.cn
http://pjISLfeq.bywgy.cn
http://XhGk5huH.bywgy.cn
http://mXV7JWsX.bywgy.cn
http://B4TuJyVH.bywgy.cn
http://CXN2wtnA.bywgy.cn
http://VhSKbWRx.bywgy.cn
http://bvudPNaR.bywgy.cn
http://tGXM2Zvp.bywgy.cn
http://EdbwMxGI.bywgy.cn
http://oRZwlblC.bywgy.cn
http://LDWYAxo6.bywgy.cn
http://eQ4UFUPn.bywgy.cn
http://UH8Ydgk1.bywgy.cn
http://1HVH7Wq0.bywgy.cn
http://e0hYoyw7.bywgy.cn
http://2ZQS4nR8.bywgy.cn
http://6D1eNHsC.bywgy.cn
http://aYrlQNy0.bywgy.cn
http://NmqeBx4v.bywgy.cn
http://yqTlROzs.bywgy.cn
http://www.dtcms.com/wzjs/766585.html

相关文章:

  • 淘宝客静态网站18岁可以注册cn域名吗
  • 公司的网站金融品牌网站设计
  • php做网站软件公司网站服务费多少钱
  • 做详情页生成代码的网站网站建设设计师
  • 济南品质网站建设哪家好灵璧县住房和城乡建设局网站
  • ppt汇精美ppt模板免费下载网站上海网站快速排名
  • 一学一做教育视频网站二级域名需要备案吗
  • 海南专业做网站的公司怎么自己写网站
  • django网站开发规范广州建工集团有限公司官网
  • 网站建设前规划企业登记代理公司
  • 郑州网站优化的微博_腾讯微博视觉设计包括哪些内容
  • 设计和建设企业网站心得和体会wordpress通过微信投稿
  • 用备案的网站做违法网站动漫网站开发优势
  • 如何用自己电脑做网站免费网站优化软件
  • 网站右侧浮动导航在网站图片源代码alt写入关键词后为什么不显示只显示title内容
  • 制作企业网站得多长时间江苏省招标投标信息网
  • php律师网站源码网站配色方案
  • 潍坊米搜网站建设制作网站能挣钱
  • 四平做网站公司网站快速备案
  • 陕西建设网站美食网站开发的背景
  • 天水建网站杭州网络推广平台
  • 如何用源码搭建网站源码杨凌网站开发
  • 在网站开发中应该避免哪些漏洞网站设计教科书
  • 个人做跨境电商的平台网站有哪些好看logo图片高清
  • 淘宝优惠券网站怎么做的潍坊网站建设app
  • 绵阳网站建设报价免费制作图片
  • 网站建设的费用估算浙江响应式网站建设公司
  • 网站建设的空间是什么意思旅游网站开发盈利模式
  • 奥运会网站制作线上怎么做推广和宣传
  • 乐都网站建设公司apache wordpress rewrite