/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file app_threadx.c * @author MCD Application Team * @brief ThreadX applicative file ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "app_threadx.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ // BLE define #define BLE_RX_THREAD_STACK_SIZE 2048 #define BLE_RX_THREAD_PRIORITY 10 #define BLE_TX_THREAD_STACK_SIZE 2048 #define BLE_TX_THREAD_PRIORITY 10 // /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* ȫ<>ֱ */ TX_EVENT_FLAGS_GROUP system_events; MotorCommand current_motor_cmd = {0,0}; _GPSData gps_data; // Ble thread vd TX_THREAD ble_rx_thread; TX_THREAD ble_tx_thread; UCHAR ble_rx_stack[BLE_RX_THREAD_STACK_SIZE]; UCHAR ble_tx_stack[BLE_TX_THREAD_STACK_SIZE]; TX_QUEUE ble_tx_queue; #define BLE_TX_QUEUE_LEN 10 //ULONG ble_tx_queue_buffer[BLE_TX_QUEUE_LEN]; // 一定要是ULONG类型 之前使用的是BLE_Message #define BLE_TX_MSG_LEN 64 #define BLE_TX_QUEUE_LEN 10 __attribute__((aligned(4))) ULONG ble_tx_queue_buffer[BLE_TX_QUEUE_LEN * ((BLE_TX_MSG_LEN + sizeof(ULONG) - 1) / sizeof(ULONG))]; // /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN PFP */ /* USER CODE END 1 */ /* USER CODE END 1 */ /* USER CODE END PFP */ /** * @brief Application ThreadX Initialization. * @param memory_ptr: memory pointer * @retval int */ UINT App_ThreadX_Init(VOID *memory_ptr) { HCBle_SendData("进入 App_ThreadX_Init\r\n"); // HCBle_SendData("%d",sizeof(ULONG)); UINT status; // === 创建 BLE RX 线程 === status = tx_thread_create(&ble_rx_thread, "BLE RX Thread", ble_rx_task_entry, 0, ble_rx_stack, BLE_RX_THREAD_STACK_SIZE, BLE_RX_THREAD_PRIORITY, BLE_RX_THREAD_PRIORITY, TX_NO_TIME_SLICE, TX_AUTO_START); if(status != TX_SUCCESS) { return status; } // === 创建 BLE TX 线程 === status = tx_thread_create(&ble_tx_thread, "BLE TX Thread", ble_tx_task_entry, 0, ble_tx_stack, BLE_TX_THREAD_STACK_SIZE, BLE_TX_THREAD_PRIORITY, BLE_TX_THREAD_PRIORITY, TX_NO_TIME_SLICE, TX_AUTO_START); if (status != TX_SUCCESS) { HCBle_SendData("❌ BLE TX 线程创建失败,错误码=%d\r\n", status); return status; } // === 创建 BLE TX 消息队列 === status = tx_queue_create(&ble_tx_queue, "BLE TX Queue", (BLE_TX_MSG_LEN + sizeof(ULONG) - 1) / sizeof(ULONG), ble_tx_queue_buffer, sizeof(ble_tx_queue_buffer)); if (status != TX_SUCCESS) { HCBle_SendData("❌ BLE TX 消息队列创建失败,错误码=%d\r\n", status); return status; } HCBle_SendData("✅ BLE RX/TX 线程和队列初始化完成\r\n"); return TX_SUCCESS; } /** * @brief Function that implements the kernel's initialization. * @param None * @retval None */ void MX_ThreadX_Init(void) { /* USER CODE BEGIN Before_Kernel_Start */ HCBle_InitEventFlags(); // 这必须在任何使用前调用一次 /* USER CODE END Before_Kernel_Start */ tx_kernel_enter(); /* USER CODE BEGIN Kernel_Start_Error */ /* USER CODE END Kernel_Start_Error */ } /* USER CODE BEGIN 1 */ #ifdef TEST //Ŀǰڲ /* USER CODE BEGIN 1 */ void main_control_thread_entry(ULONG thread_input) { ULONG events; MotorCommand motor_cmd = {0, 0}; while(1) { // 等待事件发生 tx_event_flags_get(&system_events, EVENT_OBSTACLE_DETECTED | EVENT_BLE_COMMAND_RECEIVED, TX_OR_CLEAR, &events, TX_WAIT_FOREVER); // 处理障碍物事件 if(events & EVENT_OBSTACLE_DETECTED) { // 触发蜂鸣器和振动提示 Buzzer_Open(); Shake_Motor_Open(); tx_thread_sleep(100); // 振动100ms Buzzer_Close(); Shake_Motor_Close(); } // 处理蓝牙控制指令 if(events & EVENT_BLE_COMMAND_RECEIVED) { // 从队列获取电机命令 // tx_queue_receive(&ble_rx_queue, &motor_cmd, TX_WAIT_FOREVER); // 实际控制电机 (伪代码) // set_motor_speed(motor_cmd.leftSpeed, motor_cmd.rightSpeed); } } } #endif /* USER CODE END 1 */