网站发布新闻的好处 seo阳江房产网二手房

张小明 2026/1/13 7:16:33
网站发布新闻的好处 seo,阳江房产网二手房,桂林微信网站开发,做网站是要云空间吗前置文章#xff1a; Freertos手把手教STM32CubeMx设置STM32F4芯片DMA发送ADC数据#xff08;一#xff09;-CSDN博客Freertos手把手教STM32CubeMx设置STM32F4芯片DMA发送ADC数据#xff08;二#xff09;-CSDN博客 Freertos手把手教STM32CubeMx设置STM32F4芯片DMA发送A…前置文章Freertos手把手教STM32CubeMx设置STM32F4芯片DMA发送ADC数据一-CSDN博客Freertos手把手教STM32CubeMx设置STM32F4芯片DMA发送ADC数据二-CSDN博客Freertos手把手教STM32CubeMx设置STM32F4芯片DMA发送ADC数据三-CSDN博客在以上章节完成了对框架的初步探索以及对CubeMx的配置在freertos的task中对buffer进行了一些测试完成了队列的发送接收测试以及对ADC触发的中断函数进行了编写下面继续上一章的内容继续完成本次目标本期目标理清本工程系统框架弄懂CubeMx配置相关原理及设置的背后含义对DMA以及ADC相关的重要API接口使用详解梳理代码设计流程xQueueSendFromISR当你在中断里面发送这个函数的时候 如果有优先级更高的队列接收任务正在等待队列唤醒他会在发送队列的过程中立马切换任务 去执行优先级更高的任务 以保证系统的实时性对于立刻切换的这个动作 一定会使用PendSV中断 但是这个中断在任何时候优先级都是最低的 所以就不可能在我们当前这个DMA里面去中断所以在这里用这个函数会被卡死ret_queue xQueueSend( xQueue1, dma_pattern_cplt, 0 );而xQueueSendFromISR这个函数相较于xQueueSend 在任务切换时做了一个延迟的动作xHigherPriorityTaskWoken在发送过程中这个函数xQueueSendFromISR如果发现有更高优先级的任务要切换 它将会把xHigherPriorityTaskWoken置为true如果xHigherPriorityTaskWoken置为true了 系统就会暂时先把PendSV置位等退出了当前中断函数并且比PendSV更高优先级的中断都结束了再去执行PendSVif( xHigherPriorityTaskWoken ) { taskYIELD (); }就是这个taskYIELD 其原理就是会在这里进行一个悬起 在离开这个中断之后就会立即响应此悬起 从而完成任务切换注意xQueue1 xQueueCreate(10 , 4 ); if(NULL xQueue1) { printf(Queue create failed \r\n); return ; }创建队列的代码要放在ADC启动前 ADC一启动中断立马就产生但是队列还没创建 会出问题/* Includes ------------------------------------------------------------------*/ #include FreeRTOS.h #include task.h #include main.h #include cmsis_os.h /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include stdlib.h #include queue.h /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ #define BUFFER_SIZE 1 uint32_t * buffer1 NULL; uint32_t * buffer2 NULL; /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ #define DMA_ADC_CPLT_INT 0xA1A1A1A1 /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN Variables */ extern ADC_HandleTypeDef hadc1; extern DMA_HandleTypeDef hdma_adc1; QueueHandle_t xQueue1 NULL; /* USER CODE END Variables */ /* Definitions for defaultTask */ osThreadId_t defaultTaskHandle; const osThreadAttr_t defaultTask_attributes { .name defaultTask, .stack_size 128 * 4, .priority (osPriority_t) osPriorityNormal, }; /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ /* USER CODE END FunctionPrototypes */ void StartDefaultTask(void *argument); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ /** * brief FreeRTOS initialization * param None * retval None */ 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, ... */ /* USER CODE END RTOS_THREADS */ /* USER CODE BEGIN RTOS_EVENTS */ /* add events, ... */ /* USER CODE END RTOS_EVENTS */ } /* USER CODE BEGIN Header_StartDefaultTask */ /** * 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 */ buffer1 (uint32_t *)malloc((sizeof(uint32_t)* BUFFER_SIZE)); buffer2 (uint32_t *)malloc((sizeof(uint32_t)* BUFFER_SIZE)); if(NULL buffer1) { printf(buffer1 malloc failed \r\n); } if(NULL buffer2) { printf(buffer2 malloc failed \r\n); return; } printf(buffer1 , buffer2 malloc success\r\n ); memset(buffer1, 0xff , (sizeof(uint32_t)* BUFFER_SIZE)); memset(buffer2, 0xff , (sizeof(uint32_t)* BUFFER_SIZE)); printf(Unit test ADC DMA\r\n ); xQueue1 xQueueCreate(10 , 4 ); if(NULL xQueue1) { printf(Queue create failed \r\n); return ; } HAL_StatusTypeDef ret1 HAL_OK; HAL_StatusTypeDef ret2 HAL_OK; ret1 HAL_ADC_Start_DMA(hadc1, buffer1, BUFFER_SIZE); ret2 HAL_ADC_Start_DMA(hadc1, buffer2, BUFFER_SIZE); if(HAL_OK ! ret1) { printf(HAL_ADC1 call failed ); } if(HAL_OK ! ret2) { printf(HAL_ADC2 call failed ); } //UnitTest Queue send and receive BaseType_t ret_queue pdPASS; uint32_t queue_data_2 0xff; ret_queue xQueueReceive( xQueue1, queue_data_2, 0 ); printf(xQueueSend ret_queue [%ld]\r\n , ret_queue); printf(xQueueReceive queue_data_2 [%d]\r\n , queue_data_2); /* Infinite loop */ for(;;) { printf(hello world \r\n); //printf(buffer1 data [%d] \r\n , buffer1[0]); //printf(buffer2 data [%d] \r\n , buffer2[0]); osDelay(1000); } /* USER CODE END StartDefaultTask */ } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { /* Prevent unused argument(s) compilation warning */ UNUSED(hadc); /* NOTE : This function Should not be modified, when the callback is needed, the HAL_ADC_ConvCpltCallback could be implemented in the user file */ printf(buffer1 data [%d] \r\n , buffer1[0]); BaseType_t xHigherPriorityTaskWoken; xHigherPriorityTaskWoken pdFALSE; uint32_t dma_pattern_cplt DMA_ADC_CPLT_INT; BaseType_t ret_queue pdPASS; ret_queue xQueueSendFromISR( xQueue1, dma_pattern_cplt, xHigherPriorityTaskWoken ); if( xHigherPriorityTaskWoken ) { taskYIELD (); } printf(QueueSend ret_queue [%ld]\r\n , ret_queue); } void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc) { /* Prevent unused argument(s) compilation warning */ UNUSED(hadc); /* NOTE : This function Should not be modified, when the callback is needed, the HAL_ADC_ErrorCallback could be implemented in the user file */ printf(ADC trasfer error \r\n); } /* USER CODE END Application */由此可见成功接收了数据并且在串口打印了出来
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

教学网站前台er图自适应h5网站

第一章:内存优化的核心概念与重要性内存优化是提升系统性能和应用程序响应速度的关键环节。在资源受限或高并发场景下,不合理的内存使用可能导致应用崩溃、延迟升高甚至服务不可用。因此,理解内存管理的基本机制并实施有效的优化策略至关重要…

张小明 2026/1/13 7:12:43 网站建设

网站建设 山西wordpress 异次元主题

面对网络完全隔离的生产环境,如何高效部署软件系统?隔离环境部署已成为金融、关键基础设施等安全敏感领域的刚需技术。本文通过宝塔面板v7.7.0的离线安装方案,为你提供一套完整的隔离环境部署指南,包含快速配置技巧和性能优化方法…

张小明 2026/1/3 21:37:15 网站建设

重庆做网站公司成都制作网页

第一章:Open-AutoGLM自适应调整算法概述Open-AutoGLM 是一种面向大语言模型训练过程的自适应参数调整算法,专为动态优化学习率、权重衰减与梯度裁剪阈值而设计。该算法通过实时监控模型在验证集上的损失变化与梯度分布特征,自动调节优化器超参…

张小明 2026/1/4 6:57:00 网站建设

专做美妆的视频网站wordpress收购

第一章:揭秘Open-AutoGLM源码下载地址 Open-AutoGLM 是一个面向自动化自然语言处理任务的开源框架,由深度学习研究团队精心打造,旨在简化大语言模型的微调与部署流程。其源码托管于主流代码平台,便于开发者快速获取并参与社区共建…

张小明 2026/1/3 18:40:15 网站建设

邢台网站推广专业服务社区类网站开发实践

手把手带你玩转ESP32 GPIO:从点亮LED到稳定控制的实战指南 你有没有过这样的经历? 明明代码写得没问题,下载也成功了,可板子上的LED就是不亮;或者按键按下去没反应,查了半天才发现用错了引脚。这些问题背后…

张小明 2026/1/3 19:42:31 网站建设

.net做网站后台wordpress sql自定义菜单

宁海元“【提示】2025第八届年度金猿颁奖典礼将在上海举行,此次榜单/奖项的评选依然会进行初审、公审、终审三轮严格评定,并会在国内外渠道大规模发布传播欢迎申报。大数据产业创新服务媒体——聚焦数据 改变商业过去十年,数据中台经历了“全…

张小明 2026/1/7 16:02:57 网站建设