STM32F2xx+FreeRTOS+wolfMQTT+DHT11联合运行故障求助
STM32F2xx FreeRTOS+LWIP+wolfMQTT联合运行MQTT任务卡顿问题
环境与目标
基于STM32F2xx平台,使用FreeRTOS(CMSIS_V1)、LWIP和wolfMQTT开发,实现DHT11温湿度数据读取并发布至MQTT Broker。
创建了4个任务:defaultTask、TaskMQTT、TaskSensor、TaskActor,任务创建代码如下:
/* Create the thread(s) */ /* definition and creation of defaultTask */ osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); /* definition and creation of TaskMQTT */ osThreadDef(TaskMQTT, StartTaskMQTT, osPriorityNormal, 0, 512); TaskMQTTHandle = osThreadCreate(osThread(TaskMQTT), NULL); /* definition and creation of TaskSensor */ osThreadDef(TaskSensor, StartTaskSensor, osPriorityNormal, 0, 512); TaskSensorHandle = osThreadCreate(osThread(TaskSensor), NULL); /* definition and creation of TaskActor */ osThreadDef(TaskActor, StartTaskActor, osPriorityNormal, 0, 512); TaskActorHandle = osThreadCreate(osThread(TaskActor), NULL);
TaskMQTT任务代码
void StartTaskMQTT(void const * argument) { extern struct netif gnetif; char temp_buffer[16]; char hum_buffer[16]; MX_LWIP_Init(); while (!netif_is_link_up(&gnetif)) { osDelay(100); } mqtt_client_t client; simple_mqtt_init(&client, "192.168.0.71", // Broker-IP 1883, // MQTT-Port "stm32_client01", // ClientID 60); // Keep-Alive if (simple_mqtt_connect(&client) != 0) { printf("MQTT Connect failed\n"); vTaskDelete(NULL); } simple_mqtt_subscribe(&client, "test/topic", 0); simple_mqtt_publish(&client, "test/topic", "Hello World from STM32"); while (1) { //snprintf(temp_buffer, sizeof(temp_buffer), "%.2f", dht.Temperature); //snprintf(hum_buffer, sizeof(hum_buffer), "%.2f", dht.Humidity); ftoa(dht.Temperature, temp_buffer, 1); ftoa(dht.Humidity, hum_buffer, 1); simple_mqtt_publish(&client, "test/temperature", temp_buffer); simple_mqtt_publish(&client, "test/humidity", hum_buffer); simple_mqtt_loop(&client, 100); vTaskDelay(pdMS_TO_TICKS(1000)); } }
TaskSensor任务代码
基于DHT11单总线驱动实现,代码如下:
void StartTaskSensor(void const * argument) { HAL_DHT11_Init(&dht, DHT11_GPIO_Port, DHT11_Pin, &htim1); /* USER CODE BEGIN StartTaskSensor */ /* Infinite loop */ for(;;) { osDelay(1000); err = HAL_DHT11_ReadData(&dht); if(err != DHT11_OK) { continue; } osDelay(1); } HAL_DHT11_DeInit(&dht); /* USER CODE END StartTaskSensor */ }
TaskActor任务代码
void StartTaskActor(void const * argument) { /* USER CODE BEGIN StartTaskActor */ /* Infinite loop */ for(;;) { HAL_GPIO_WritePin(BlueLED_GPIO_Port, BlueLED_Pin, GPIO_PIN_SET); //delay_us(50000); osDelay(1000); HAL_GPIO_WritePin(BlueLED_GPIO_Port, BlueLED_Pin, GPIO_PIN_RESET); //delay_us(50000); osDelay(1000); } /* USER CODE END StartTaskActor */ }
问题现象
- 单独运行MQTT任务或DHT11传感器任务时,功能均正常;
- 联合运行所有任务时,MQTT任务仅能成功发布2-3次数据后就卡住;
- TaskActor任务持续正常运行,设备仍可被ping通;
- DHT11采用单总线协议,读取数据时不能被中断,否则会丢失数据。
已尝试的无效方案
- 移除DHT11驱动中的
__disable_irq(); - 使用基于DWT的微秒级延时函数:
void delay_us(uint32_t us) { uint32_t start = DWT->CYCCNT; uint32_t ticks = us * (SystemCoreClock / 1000000UL); while ((DWT->CYCCNT - start) < ticks) ; }
- 调整任务优先级;
- 修改任务中的延时时长。
寻求可行的解决方案。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

