云安 发表于 2023-4-15 20:10:57

未进FreeRTOS前用vportmalloc的问题

在硬件初始化的时候,进入FreeRTOS任务调度之前,给Fatfs文件系统申请内存,想着用vportmalloc来动态申请。我担心会在内存管理初始化之前就进行内存分配,所以大概看了一下vportmalloc函数,发现它会在自己第一次调用时进行初始化。

所以我就直接用了,也不报错。但是我在usbd初始化的时候卡住了,debug的时候发现系统时钟突然不再进中断了,但是会自减,。排除systick初始化错误之后。(我在文件系统初始化之前加延时不会出问题。之后就会卡住。或者把vportmalloc屏蔽也会进systick中断。)

云安 发表于 2023-4-15 20:12:08

我的思路是看看是不是哪里把systick的中断关闭了。

eric2013 发表于 2023-4-15 21:25:22

在FreeRTOS进入启动任务之前,任何额外操作都不要做,非常不利于问题的排查以及后续新功能添加维护。

所有RTOS正确的姿势都应该是仅创建一个启动任务,启动后在启动任务里面初始化BSP,创建其他各种应用任务等。

22020843 发表于 2023-5-5 01:05:09

eric2013 发表于 2023-4-15 21:25
在FreeRTOS进入启动任务之前,任何额外操作都不要做,非常不利于问题的排查以及后续新功能添加维护。

所 ...

请问相关初始化也这样吗?如串口通讯任务

云安 发表于 2023-5-8 15:55:24

eric2013 发表于 2023-4-15 21:25
在FreeRTOS进入启动任务之前,任何额外操作都不要做,非常不利于问题的排查以及后续新功能添加维护。

所 ...

啊?头一次听说:funk:
那么在进入启动任务之前,我应该只初始化时钟,中断优先级,系统定时器,sdram吗?
然后其他非必要的外设都放在初始化任务里?拿小本本记下来:loveliness:
另外大大,我遇见一个内存管理的问题,似乎rtos,malloc,以及lvgl等中间层都提供内存管理功能,是用一个中间层管理所有内存好呢,还是分开分配好?

eric2013 发表于 2023-5-8 15:59:09

22020843 发表于 2023-5-5 01:05
请问相关初始化也这样吗?如串口通讯任务

对,我们现在新作的uCOS-II,uCOS-III,FreeRTOS,ThreadX,RTX4, RTX5都是这么玩的。

eric2013 发表于 2023-5-8 16:01:55

云安 发表于 2023-5-8 15:55
啊?头一次听说
那么在进入启动任务之前,我应该只初始化时钟,中断优先级,系统定时器,sdram吗 ...
标准姿势

/*
*********************************************************************************************************
*      函 数 名: main
*      功能说明: 标准c程序入口。
*      形    参: 无
*      返 回 值: 无
*********************************************************************************************************
*/
int main (void)
{      
      /* HAL库,MPU,Cache,时钟等系统初始化 */
      System_Init();

      /* 内核开启前关闭HAL的时间基准 */
      HAL_SuspendTick();
      
      /* 内核初始化 */
      osKernelInitialize();                                 

      /* 创建启动任务 */
      ThreadIdStart = osThreadNew(AppTaskStart, NULL, &ThreadStart_Attr);

      /* 开启多任务 */
      osKernelStart();
      
      while(1);
}

/*
*********************************************************************************************************
*        函 数 名: AppTaskStart
*        功能说明: 启动任务,这里用作BSP驱动包处理。
*        形    参: 无
*        返 回 值: 无
*   优 先 级: osPriorityNormal4
*********************************************************************************************************
*/
void AppTaskStart(void *argument)
{
        const uint16_t usFrequency = 1; /* 延迟周期 */
        uint32_t tick;
       
        /* 初始化外设 */
        HAL_ResumeTick();
        bsp_Init();

        /* 创建任务 */
        AppTaskCreate();

        /* 获取当前时间 */
        tick = osKernelGetTickCount();
       
    while(1)
    {
                /* 需要周期性处理的程序,对应裸机工程调用的SysTick_ISR */
                bsp_ProPer1ms();
               
                /* 相对延迟 */
                tick += usFrequency;                        
                osDelayUntil(tick);
    }
}

云安 发表于 2023-5-8 16:04:14

eric2013 发表于 2023-5-8 16:01
标准姿势

/*


哦哦,学习了,谢谢大大:hug:

fyyxxm 发表于 2023-5-18 15:49:45

eric2013 发表于 2023-4-15 21:25
在FreeRTOS进入启动任务之前,任何额外操作都不要做,非常不利于问题的排查以及后续新功能添加维护。

所 ...

时钟初始化 也需要在rtos任务里吗。

会飞的猪_2020 发表于 2024-3-15 08:43:13

fyyxxm 发表于 2023-5-18 15:49
时钟初始化 也需要在rtos任务里吗。

freertos自己会初始化嘀嗒时钟的吧。
页: [1]
查看完整版本: 未进FreeRTOS前用vportmalloc的问题