【问题标题】:Initializing LwIP causes RTOS to stop working初始化 LwIP 导致 RTOS 停止工作
【发布时间】:2022-10-20 00:10:23
【问题描述】:

再会

目标:

我正在尝试配置 FreeRTOS 和 LwIP,以便我可以设置 MQTT。

  • 我使用的是STM32-NucleoF429ZI开发板

我做了什么:

  1. 我正在使用 CubeMX 生成项目文件,我正在使用 Visual Studio 和 VisualGDB 进行编译和调试。
  2. 我已经使用 CMSIS_V2 和 Heap_4 为开发板设置了 FreeRTOS。
  3. 我已经设置了 LwIP:Static IPMEM_SIZE of 1024*10
  4. 我保留了 nucleo 板的所有标准引脚排列(即我已经记下清除的引脚排列)
  5. 我设置了一个“以太网”线程,我在以太网线程和默认线程上闪烁和 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);
        }
    }
    

【问题讨论】:

    标签: freertos stm32f4 lwip


    【解决方案1】:

    我不确定这个问题的原因,但我已经从 FreeRTOS CMSIS_V2 更改为 CMSIS_V1,它解决了这个问题。我不知道 CMSIS_V2 中是否存在错误配置,或者是否存在实际错误,但 CMSIS_V1 和 LwIP 现在工作得很好。

    【讨论】:

    • 不适合我
    • 尝试将 CubeMx 回滚到 V6.4。
    • 我用过CubeIDE,问题已经解决了。似乎是内存问题。
    【解决方案2】:

    我有同样的问题,但对我来说它不能用 CMSISv1 解决。 你能告诉我你正在使用的 cubeMx 版本吗?

    【讨论】:

    猜你喜欢
    • 2011-06-26
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多