diff --git a/software/Power_Pico/User/Tasks/Inc/user_MessageTask.h b/software/Power_Pico/User/Tasks/Inc/user_MessageTask.h index 16892bb..d639dd3 100644 --- a/software/Power_Pico/User/Tasks/Inc/user_MessageTask.h +++ b/software/Power_Pico/User/Tasks/Inc/user_MessageTask.h @@ -5,8 +5,8 @@ extern "C" { #endif -void MessageTask(void *argument); - +void MessageReceiveTask(void *argument); +void MessageSendTask(void *argument); #ifdef __cplusplus } diff --git a/software/Power_Pico/User/Tasks/Inc/user_TasksInit.h b/software/Power_Pico/User/Tasks/Inc/user_TasksInit.h index f969542..ff5a3e0 100644 --- a/software/Power_Pico/User/Tasks/Inc/user_TasksInit.h +++ b/software/Power_Pico/User/Tasks/Inc/user_TasksInit.h @@ -8,6 +8,12 @@ extern "C" { #include "FreeRTOS.h" #include "cmsis_os.h" +// 定义一个标志位,表示 ADC 数据已经准备好,可以发送了 +#define FLAG_ADC_HALF_READY 0x0001U // 0000 0001 +#define FLAG_ADC_FULL_READY 0x0002U // 0000 0010 + +extern osThreadId_t MessageSendTaskHandle; // 用于发送 ADC 数据的任务句柄 + extern osMessageQueueId_t Key_MessageQueue; extern osMessageQueueId_t PD_cmd_MessageQueue; extern osMessageQueueId_t PD_handle_event_MsgQueue; diff --git a/software/Power_Pico/User/Tasks/Src/user_MessageTask.c b/software/Power_Pico/User/Tasks/Src/user_MessageTask.c index 150e557..3019d40 100644 --- a/software/Power_Pico/User/Tasks/Src/user_MessageTask.c +++ b/software/Power_Pico/User/Tasks/Src/user_MessageTask.c @@ -1,5 +1,6 @@ /* Private includes -----------------------------------------------------------*/ //includes +#include "adc.h" #include "user_TasksInit.h" #include "user_MessageTask.h" #include "usbd_cdc_if.h" @@ -16,11 +17,11 @@ /** - * @brief task for check the usart message + * @brief task for receiving messages, such as USB update requests. * @param argument: Not used * @retval None */ -void MessageTask(void *argument) +void MessageReceiveTask(void *argument) { while(1) { @@ -40,3 +41,35 @@ void MessageTask(void *argument) osDelay(500); } } + +/** + * @brief send adc data to PC via USB, + * @param argument: Not used + */ +void MessageSendTask(void *argument) +{ + uint32_t flags; + while (1) + { + // 1. 等待两个标志中的任意一个 (osFlagsWaitAny) + flags = osThreadFlagsWait(FLAG_ADC_HALF_READY | FLAG_ADC_FULL_READY, + osFlagsWaitAny, + osWaitForever); + + // 2. 判断是不是出错了 (比如超时或者传参错误,通常返回值最高位会置1) + if (flags & 0x80000000) { + continue; // 错误处理 + } + + // 3. 检查具体是哪个标志位被置位了,然后处理对应的数据 + if (flags & FLAG_ADC_HALF_READY) + { + Process_ADC_Chunk(&adc_raw_buffer[0][0], 0); + } + + if (flags & FLAG_ADC_FULL_READY) + { + Process_ADC_Chunk(&adc_raw_buffer[ADC_TIMES][0], 1); + } + } +} diff --git a/software/Power_Pico/User/Tasks/Src/user_TasksInit.c b/software/Power_Pico/User/Tasks/Src/user_TasksInit.c index 0251ff5..befc38c 100644 --- a/software/Power_Pico/User/Tasks/Src/user_TasksInit.c +++ b/software/Power_Pico/User/Tasks/Src/user_TasksInit.c @@ -41,14 +41,22 @@ const osThreadAttr_t HardwareInitTask_attributes = { .priority = (osPriority_t) osPriorityHigh, }; -// message task -osThreadId_t MessageTaskHandle; -const osThreadAttr_t MessageTask_attributes = { - .name = "MessageTask", +// message receive task +osThreadId_t MessageReceiveTaskHandle; +const osThreadAttr_t MessageReceiveTask_attributes = { + .name = "MessageReceiveTask", .stack_size = 128 * 1, .priority = (osPriority_t) osPriorityNormal2, }; +// message send task +osThreadId_t MessageSendTaskHandle; +const osThreadAttr_t MessageSendTask_attributes = { + .name = "MessageSendTask", + .stack_size = 128 * 8, + .priority = (osPriority_t) osPriorityHigh, +}; + // Key task osThreadId_t KeyTaskHandle; const osThreadAttr_t KeyTask_attributes = { @@ -107,7 +115,8 @@ void User_Tasks_Init(void) HardwareInitTaskHandle = osThreadNew(HardwareInitTask, NULL, &HardwareInitTask_attributes); PDUFPTaskHandle = osThreadNew(PDUFPTask, NULL, &PDUFPTask_attributes); KeyTaskHandle = osThreadNew(KeyTask, NULL, &KeyTask_attributes); - MessageTaskHandle = osThreadNew(MessageTask, NULL, &MessageTask_attributes); + MessageReceiveTaskHandle = osThreadNew(MessageReceiveTask, NULL, &MessageReceiveTask_attributes); + MessageSendTaskHandle = osThreadNew(MessageSendTask, NULL, &MessageSendTask_attributes); LvHandlerTaskHandle = osThreadNew(LvHandlerTask, NULL, &LvHandlerTask_attributes); /* add events, ... */