/* 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 // IMU thread config // IMU thread config #define IMU_ANGLE_THREAD_STACK_SIZE 1024 #define IMU_ANGLE_THREAD_PRIORITY 11 /* 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; TX_EVENT_FLAGS_GROUP sensor_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))]; // imu TX_THREAD imu_angle_thread; UCHAR imu_angle_stack[IMU_ANGLE_THREAD_STACK_SIZE]; #define IM948_RX_QUEUE_SIZE 64 ULONG im948_rx_queue_buffer[IM948_RX_QUEUE_SIZE]; TX_QUEUE im948_uart_rx_queue; /* 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; } status = tx_thread_create(&imu_angle_thread, "IMU Angle Thread", imu_angle_ble_task_entry, 0, imu_angle_stack, IMU_ANGLE_THREAD_STACK_SIZE, IMU_ANGLE_THREAD_PRIORITY, IMU_ANGLE_THREAD_PRIORITY, TX_NO_TIME_SLICE, TX_AUTO_START); if (status != TX_SUCCESS) { return status; } status = tx_queue_create(&im948_uart_rx_queue, "IM948_RX_QUEUE", TX_1_ULONG, // sizeof(ULONG) bytes per entry im948_rx_queue_buffer, IM948_RX_QUEUE_SIZE * sizeof(ULONG)); 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 */ /* USER CODE END 1 */