【发布时间】:2022-10-20 00:10:23
【问题描述】:
再会
目标:
我正在尝试配置 FreeRTOS 和 LwIP,以便我可以设置 MQTT。
- 我使用的是STM32-NucleoF429ZI开发板
我做了什么:
- 我正在使用 CubeMX 生成项目文件,我正在使用 Visual Studio 和 VisualGDB 进行编译和调试。
- 我已经使用 CMSIS_V2 和 Heap_4 为开发板设置了 FreeRTOS。
- 我已经设置了 LwIP:
Static IP和MEM_SIZE of 1024*10 - 我保留了 nucleo 板的所有标准引脚排列(即我已经记下清除的引脚排列)
- 我设置了一个“以太网”线程,我在以太网线程和默认线程上闪烁和 LED。
除此之外没有其他设置被更改。我没有设置 MPU,因为据我所知,这个 MCU 没有它。
问题:
如果我注释掉
MX_LWIP_Init();行(cubeMX 将其放入默认线程),那么板运行良好,并且两个线程上的 LED 都在我测试过的情况下永远闪烁。但是,一旦我离开MX_LWIP_Init();,FreeRTOS 就会卡住,如图所示。- 这会在电路板通电后 30 秒到几分钟内发生
- 请原谅图片,但是当我暂停它时,它显示了程序的确切位置。如果我恢复调试器并再次暂停它,它总是在同一个地方暂停。
- 我已经尝试将
MX_LWIP_Init();与其他初始化函数一起移动到main.c 中,并移动到它应该属于的以太网线程中。所有这些都会在某个时候产生相同的错误。 - 添加
MX_LWIP_Init();后,我可以ping 董事会
freertos.c
/* USER CODE BEGIN Header */ /** ****************************************************************************** * File Name : freertos.c * Description : Code for freertos applications ****************************************************************************** * @attention * * Copyright (c) 2022 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 "config.h" #include "EthernetLwIP_thread.h" /* 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 defaultTask */ osThreadId_t defaultTaskHandle; const osThreadAttr_t defaultTask_attributes = { .name = "defaultTask", .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityNormal, }; /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ /* USER CODE END FunctionPrototypes */ void StartDefaultTask(void *argument); extern void MX_LWIP_Init(void); 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 */ /* 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 */ /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ /* USER CODE END RTOS_QUEUES */ /* Create the thread(s) */ /* creation of defaultTask */ defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); /* USER CODE BEGIN RTOS_THREADS */ if (EthernetModule_Init() == Result_Successful) { logger("template module successfully initialized!!!"); } /* 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 defaultTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void *argument) { /* init code for LWIP */ //MX_LWIP_Init(); /* USER CODE BEGIN StartDefaultTask */ // Task timing TickType_t xLastWakeTime; xLastWakeTime = xTaskGetTickCount(); const TickType_t xDelay_Ticks = 1000; // Current RTOS clock config has 1 tick equal 1ms. Thus 20 ticks sets a frequency of 50Hz /* Infinite loop */ while (1) { vTaskDelayUntil(&xLastWakeTime, xDelay_Ticks); // waits until a certain number of ticks have passed before it starts this task again in a timely manner HAL_GPIO_TogglePin(LED_BLUE_PORT, LED_BLUE_PIN); //HAL_GPIO_TogglePin(LED_RED_PORT, LED_RED_PIN); //HAL_GPIO_TogglePin(LED_GREEN_PORT, LED_GREEN_PIN); } /* USER CODE END StartDefaultTask */ } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ /* USER CODE END Application */以太网 src 文件
/* Ethernet_thread.c */ // Includes: ---------------------------------------------------------- #include "EthernetLwIP_thread.h" #include "config.h" // Instantiations: ---------------------------------------------------- // Thread declaration: ------------------------------------------------ osThreadId_t EthernetModule_ThreadId; const osThreadAttr_t EthernetModule_Attributes = { .name = "EthernetModule", .priority = (osPriority_t) osPriorityHigh, .stack_size = 1024 * 4 // This needs to be optimized at a later stage }; void EthernetModule_Thread(void *argument); // Functions: -------------------------------------------------------- // Initializing functions: --------------------------------------------------------------------- MResult EthernetModule_HardwareInit() { return Result_Successful; } MResult EthernetModule_Init() { MX_LWIP_Init(); if (EthernetModule_HardwareInit() == Result_Error) return Result_Error; EthernetModule_ThreadId = osThreadNew(EthernetModule_Thread, NULL, &EthernetModule_Attributes); if (EthernetModule_ThreadId == NULL) return Result_Error; return Result_Successful; } // Thread: --------------------------------------------------------------------------------------- void EthernetModule_Thread(void *argument) { // Task timing TickType_t xLastWakeTime; xLastWakeTime = xTaskGetTickCount(); const TickType_t xDelay_Ticks = 500; while (1) { vTaskDelayUntil(&xLastWakeTime, xDelay_Ticks); HAL_GPIO_TogglePin(LED_GREEN_PORT, LED_GREEN_PIN); } }
【问题讨论】: