Files

156 lines
4.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stm32f10x.h" // Device header
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "Delay.h"
#include "USART.h"
#include "LED.h"
#include "ESP8266.h"
#include "NetFIFO.h"
/* 待验证的改动:合并串口。 */
/* 创建一个新任务,需要创建任务句柄,任务句柄与任务函数一一对应。 */
TaskHandle_t xTaskStateLedHdlr;
TaskHandle_t xTaskWifiConnectHdlr;
/* 创建队列句柄 */
QueueHandle_t xQueueUsart1IrqHdlr;
QueueHandle_t xQueueUsart2IrqHdlr;
QueueHandle_t xQueueUsart3IrqHdlr;
/* 创建二值信号量句柄 */
SemaphoreHandle_t xSemWifiRetOkHdlr;
SemaphoreHandle_t xSemWifiRetErrHdlr;
/**
* @brief 状态指示LED任务
* @note 通过控制PC13引脚的LED灯实现系统状态的指示功能。
* @param *pvParameters 任务参数,若没有特定的参数则设置为空指针
* @retval None
*/
/* 创建任务 */
void vTaskStateLed(void *pvParameters)
{
while(1)
{
vPc13LedOn();
vTaskDelay(1000);
vPc13LedOff();
vTaskDelay(1000);
}
}
/**
* @brief 连接WiFi任务
* @note 利用FreeRTOS中断消息队列机制接收ESP8266的响应数据并将响应数据存到内置的FIFO缓冲区内。在再判断数据是否符合要求。
* @note 问题:将接收消息队列函数和处理响应数据函数混到一块了,造成了代码的冗余。
* @param *pvParameters 任务参数,若没有特定的参数则设置为空指针
* @retval None
*/
void vTaskWifiConnection(void *pvParameters)
{
NetFifoBuffer_t espBuffer;
vNetBufferInit(&espBuffer);
uint8_t ucRetvalQueueWifiSta = 0;
uint8_t ucRetvalQueueByte = 0;
while (1)
{
/* code */
ucEsp8266SetMode(1);
TickType_t startTime = xTaskGetTickCount();
while ((xTaskGetTickCount() - startTime) < pdMS_TO_TICKS(3000))
{
ucRetvalQueueWifiSta = xQueueReceive(xQueueUsart2IrqHdlr,
&ucRetvalQueueByte,
pdMS_TO_TICKS(100));
if (ucRetvalQueueWifiSta == pdTRUE)
{
// 将接收到的字节处理到缓冲区
vNetBufferWrite(&espBuffer, (char)ucRetvalQueueByte);
// 处理响应数据
uint8_t ucResponseStatus = ucEsp8266ResponseHandler(&espBuffer);
if (strstr(espBuffer.cResponseBuffer, "ready") != NULL)
{
vUsartSendString(USART3, "WiFi Reset Successfully!\r\n");
vUsartSendString(USART3, espBuffer.cResponseBuffer);
vTaskDelay(1000);
break;
} else if (strstr(espBuffer.cResponseBuffer, "OK") != NULL)
{
/* code */
vUsartSendString(USART3, "Set WiFi Mode Successfully!\r\n");
vUsartSendString(USART3, espBuffer.cResponseBuffer);
} else if (strstr(espBuffer.cResponseBuffer, "ERROR") != NULL ||
strstr(espBuffer.cResponseBuffer, "FAIL") != NULL)
{
vUsartSendString(USART3, "Error!\r\n");
vUsartSendString(USART3, espBuffer.cResponseBuffer);
vUsartSendString(USART3, "\r\n");
break;
}
}
}
vTaskDelete(NULL);
}
}
void vCreateTasksList(void)
{
xTaskCreate(
(TaskFunction_t ) vTaskStateLed,
(char * ) "TaskName_StateLed",
(configSTACK_DEPTH_TYPE) 256,
(void * ) NULL,
(UBaseType_t ) 2,
(TaskHandle_t * ) &xTaskStateLedHdlr);
xTaskCreate(
(TaskFunction_t ) vTaskWifiConnection,
(char * ) "TaskName_WifiConnectToAP",
(configSTACK_DEPTH_TYPE) 512,
(void * ) NULL,
(UBaseType_t ) 2,
(TaskHandle_t * ) &xTaskWifiConnectHdlr);
}
void vCreateQueuesList(void)
{
xQueueUsart1IrqHdlr = xQueueCreate(
(UBaseType_t) 64,
(UBaseType_t) sizeof(uint8_t *));
xQueueUsart2IrqHdlr = xQueueCreate(
(UBaseType_t) 1024,
(UBaseType_t) sizeof(char *));
xQueueUsart3IrqHdlr = xQueueCreate(
(UBaseType_t) 64,
(UBaseType_t) sizeof(uint8_t *));
if (xQueueUsart2IrqHdlr == NULL)
{
/* code */
vUsartSendString(USART1, "Queue Init Failed.\r\n");
vTaskDelay(1000);
}
}
void vCreateSemaphoresList(void)
{
xSemWifiRetOkHdlr = xSemaphoreCreateBinary();
xSemWifiRetErrHdlr = xSemaphoreCreateBinary();
}
int main(void)
{
vUsartInit(USART2, 115200);
vUsartInit(USART3, 115200);
vDelayInit();
vPc13LedInit();
vCreateTasksList();
vCreateQueuesList();
vCreateSemaphoresList();
vTaskStartScheduler();
while(1)
{
}
}