Files
car_stm32f103vet6/Core/Src/freertos.c
wangbeihong 48a443c6c1 Update FreeRTOS configuration and enhance upper computer AI documentation
- Increased total heap size in FreeRTOSConfig.h from 10000 to 18000.
- Modified stack sizes for various tasks in freertos.c to improve performance:
  - initTask: 128 to 256
  - CarCtrlTask: 256 to 1024
  - timerTask: 512 to 1024
  - sr04Task: 128 to 512
  - rc522Task: 128 to 512
- Added comprehensive upper computer AI guide for TCP client implementation, detailing protocol contracts, command sets, telemetry, architecture requirements, and error handling strategies.
- Introduced a Python web upper computer AI guide with a recommended tech stack and project structure.
- Created a Chinese version of the upper computer AI guide for local developers.
- Updated STM32 project configuration to reflect new task stack sizes and heap settings.
- Adjusted configuration files for various tools to ensure compatibility with the new project structure.
2026-04-17 22:15:54 +08:00

316 lines
8.5 KiB
C
Raw 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.
/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : freertos.c
* Description : Code for freertos applications
******************************************************************************
* @attention
*
* Copyright (c) 2026 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 "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "bsp_beep.h"
#include "bsp_motor.h"
#include "bsp_uart.h"
#include "elog.h"
#include "protocol.h"
#include "usart.h"
#include "bsp_hall.h" // 添加对 bsp_hall.h 的包含
#include "bsp_track_ir.h" // 添加对 bsp_track_ir.h 的包含
#include "bsp_sr04.h" // 添加超声波头文件
#include "bsp_rc522.h" // 添加 RFID 头文件
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
/* USER CODE END Variables */
/* Definitions for initTask */
osThreadId_t initTaskHandle;
const osThreadAttr_t initTask_attributes = {
.name = "initTask",
.stack_size = 256 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Definitions for CarCtrlTask */
osThreadId_t CarCtrlTaskHandle;
const osThreadAttr_t CarCtrlTask_attributes = {
.name = "CarCtrlTask",
.stack_size = 1024 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Definitions for timerTask */
osThreadId_t timerTaskHandle;
const osThreadAttr_t timerTask_attributes = {
.name = "timerTask",
.stack_size = 1024 * 4,
.priority = (osPriority_t) osPriorityBelowNormal,
};
/* Definitions for sr04Task */
osThreadId_t sr04TaskHandle;
const osThreadAttr_t sr04Task_attributes = {
.name = "sr04Task",
.stack_size = 512 * 4,
.priority = (osPriority_t) osPriorityLow,
};
/* Definitions for rc522Task */
osThreadId_t rc522TaskHandle;
const osThreadAttr_t rc522Task_attributes = {
.name = "rc522Task",
.stack_size = 512 * 4,
.priority = (osPriority_t) osPriorityBelowNormal,
};
/* Definitions for CmdQueue */
osMessageQueueId_t CmdQueueHandle;
const osMessageQueueAttr_t CmdQueue_attributes = {
.name = "CmdQueue"
};
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE {
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
/* USER CODE END FunctionPrototypes */
void StartDefaultTask(void *argument);
void CarCtrl_Task(void *argument);
void speed_get(void *argument);
void sr04_task(void *argument);
void rc522_task(void *argument);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
/**
* @brief FreeRTOS initialization
* @param None
* @retval None
*/
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
easylogger_init();
BEEP_Init();
BSP_UART1_Init();
elog_raw("FreeRTOS Initialized\r\n");
motor_init(); // 初始化电机相关外设
hall_init(); // 初始化霍尔传感器
track_ir_init(); // 初始化轨迹红外传感器
sr04_init(); // 初始化超声波
rc522_init(); // 初始化 RFID 模块
/* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX */
/* add mutexes, ... */
/* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */
/* add semaphores, ... */
/* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */
/* Create the queue(s) */
/* creation of CmdQueue */
CmdQueueHandle = osMessageQueueNew (16, 16, &CmdQueue_attributes);
/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
/* Create the thread(s) */
/* creation of initTask */
initTaskHandle = osThreadNew(StartDefaultTask, NULL, &initTask_attributes);
/* creation of CarCtrlTask */
CarCtrlTaskHandle = osThreadNew(CarCtrl_Task, NULL, &CarCtrlTask_attributes);
/* creation of timerTask */
timerTaskHandle = osThreadNew(speed_get, NULL, &timerTask_attributes);
/* creation of sr04Task */
sr04TaskHandle = osThreadNew(sr04_task, NULL, &sr04Task_attributes);
/* creation of rc522Task */
rc522TaskHandle = osThreadNew(rc522_task, NULL, &rc522Task_attributes);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
/* USER CODE BEGIN RTOS_EVENTS */
/* add events, ... */
/* USER CODE END RTOS_EVENTS */
}
/* USER CODE BEGIN Header_StartDefaultTask */
/**
* @brief Function implementing the initTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
uint32_t last_log_tick = 0;
for (;;) {
track_ir_state_t state = track_ir_basic_judge();
uint32_t now_tick = HAL_GetTick();
/* 降低串口打印频率,避免阻塞式输出影响电机节拍 */
if ((now_tick - last_log_tick) >= 500U) {
printf("循迹状态: %s\r\n", track_ir_state_to_string(state));
printf("当前距离: %.2f cm\r\n", sr04_get_distance());
last_log_tick = now_tick;
}
osDelay(100);
}
/* USER CODE END StartDefaultTask */
}
/* USER CODE BEGIN Header_CarCtrl_Task */
/**
* @brief Function implementing the CarCtrlTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_CarCtrl_Task */
__weak void CarCtrl_Task(void *argument)
{
/* USER CODE BEGIN CarCtrl_Task */
/* Infinite loop */
for (;;) {
osDelay(1); // osMessageQueueGet 已经是阻塞的,不需要额外的 osDelay
}
/* USER CODE END CarCtrl_Task */
}
/* USER CODE BEGIN Header_speed_get */
/**
* @brief Function implementing the timerTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_speed_get */
__weak void speed_get(void *argument)
{
/* USER CODE BEGIN speed_get */
/* Infinite loop */
for(;;)
{
osDelay(1);
}
/* USER CODE END speed_get */
}
/* USER CODE BEGIN Header_sr04_task */
/**
* @brief Function implementing the sr04Task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_sr04_task */
void sr04_task(void *argument)
{
/* USER CODE BEGIN sr04_task */
/* Infinite loop */
for(;;)
{
/* 超声波单独运行,避免阻塞控制任务 */
sr04_measure();
osDelay(100);
}
/* USER CODE END sr04_task */
}
/* USER CODE BEGIN Header_rc522_task */
/**
* @brief Function implementing the rc522Task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_rc522_task */
void rc522_task(void *argument)
{
/* USER CODE BEGIN rc522_task */
rc522_card_info_t card;
char uid_str[3 * RC522_UID_MAX_LEN] = {0};
station_id_t station = STATION_NONE;
/* Infinite loop */
for(;;)
{
rc522_status_t st = rc522_poll(&card);
if (st == RC522_OK) {
if (rc522_uid_to_string(&card, uid_str, sizeof(uid_str))) {
printf("RFID UID: %s, SAK:0x%02X, ATQA:0x%04X\r\n",
uid_str, card.sak, card.atqa);
}
// 站点匹配逻辑
station = rc522_match_station(card.uid, card.uid_len);
if (station == STATION_1) {
printf("到达站点1\r\n");
// 可在此处添加到站动作,如停车、蜂鸣等
} else if (station == STATION_2) {
printf("到达站点2\r\n");
// 可在此处添加到站动作,如停车、蜂鸣等
}
}
osDelay(100);
}
/* USER CODE END rc522_task */
}
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
/* USER CODE END Application */