yukezhe2008 发表于 2021-8-20 22:08:23

【FreeRTOS】FM33LC015N使用Freertos死机问题

为了使用vTaskList()和vTaskGetRunTimeStats()这两个函数打印系统信息,我在freertos+deepsleep的例程中加了一个定时器GPTIM0,结果只要一开这个定时器的中断,程序就会运行一会儿后死机,少则几秒钟,多则几小时。关闭该定时器的中断,就不会死机

初始化函数:
void MF_GPTIM0_TimerBase_Init(void)
{
    /*IO CONFIG*/
    FL_GPTIM_InitTypeDef    TimerBaseInitStruct;
    NVIC_ConfigTypeDef    InterruptConfigStruct;

    TimerBaseInitStruct.prescaler = 1;
    TimerBaseInitStruct.counterMode = FL_GPTIM_COUNTER_DIR_UP;
    TimerBaseInitStruct.autoReload = 0xffU;
    TimerBaseInitStruct.autoReloadState = FL_ENABLE;
    TimerBaseInitStruct.clockDivision = FL_GPTIM_CLK_DIVISION_DIV1;

    FL_GPTIM_Init(GPTIM0,&TimerBaseInitStruct );

    FL_GPTIM_EnableIT_Update(GPTIM0 );

    InterruptConfigStruct.preemptPriority = 0x03;
    NVIC_Init(&InterruptConfigStruct,GPTIM0_IRQn );
    Debug_DelayTicks=0;
    FL_GPTIM_Enable(GPTIM0);
}

中断函数(优先级=3):
void GPTIM0_IRQHandler()
{
    if(FL_GPTIM_IsEnabledIT_Update(GPTIM0) && FL_GPTIM_IsActiveFlag_Update(GPTIM0))
    {
            Debug_DelayTicks++;
      FL_GPTIM_ClearFlag_Update(GPTIM0);
    }
}

曾怀疑过是不是这个定时器意外把睡眠唤醒了,导致系统错乱,于是改了以下这段:
void prvSleep(void)
{
    FL_LPTIM32_EnableIT_CC(LPTIM32, FL_LPTIM32_CHANNEL_1);

    //使能LPTIMER的外设中断
    NVIC_DisableIRQ(GPTIM0_IRQn );
    NVIC_DisableIRQ(LPTIM_IRQn);
    NVIC_SetPriority(LPTIM_IRQn, 2);
    NVIC_EnableIRQ(LPTIM_IRQn);
    sleepConfig();
    FL_LPTIM32_DisableIT_CC(LPTIM32, FL_LPTIM32_CHANNEL_1);
    NVIC_EnableIRQ(GPTIM0_IRQn );
}
结果还是不行,请问怎么破

顾博文 发表于 2021-8-23 08:37:28

gptimer 根本不能在休眠下工作。gptim必须在休眠前关闭,休眠后再打开。如果想要在休眠下也能工作,请使用lptimer或bstim、推荐使用lptimer,因为比较简单。

yukezhe2008 发表于 2021-8-23 12:06:10

顾博文 发表于 2021-8-23 08:37
gptimer 根本不能在休眠下工作。gptim必须在休眠前关闭,休眠后再打开。如果想要在休眠下也能工作,请使用l ...

void MF_BSTIM32_Init(void)
{
    NVIC_ConfigTypeDef    InterruptConfigStruct;
    /*IO CONFIG*/
    FL_BSTIM32_InitTypeDef    defaultInitStruct;

    defaultInitStruct.prescaler = 1;
    defaultInitStruct.autoReload = 999;
    defaultInitStruct.autoReloadState = FL_ENABLE;
    defaultInitStruct.clockSource = FL_RCC_BSTIM32_CLK_SOURCE_APB1CLK;

    FL_BSTIM32_Init(BSTIM32,&defaultInitStruct );

    FL_BSTIM32_EnableIT_Update(BSTIM32 );


    InterruptConfigStruct.preemptPriority = 0x03;
    NVIC_Init(&InterruptConfigStruct,BSTIM_IRQn );

    FL_BSTIM32_Enable(BSTIM32);

}


void BSTIM_IRQHandler()
{
    if(FL_BSTIM32_IsEnabledIT_Update(BSTIM32) && FL_BSTIM32_IsActiveFlag_Update(BSTIM32))
    {
      FL_BSTIM32_ClearFlag_Update(BSTIM32);
      Debug_DelayTicks++;
    }
}

用BSTIM也挂了。。:'(

wangpeng 发表于 2021-8-23 14:38:59

yukezhe2008 发表于 2021-8-23 12:06
void MF_BSTIM32_Init(void)
{
    NVIC_ConfigTypeDef    InterruptConfigStruct;


1、挂了是指什么现象?
2、另外您看一下BSTIM的初始化配置,如果低功耗模式下想用BSTIM 要将BSTIM的时钟源修改为LSCLK。

yukezhe2008 发表于 2021-8-23 15:41:10

wangpeng 发表于 2021-8-23 14:38
1、挂了是指什么现象?
2、另外您看一下BSTIM的初始化配置,如果低功耗模式下想用BSTIM 要将BSTIM的时钟 ...

1.挂了就是程序进入了HardFault_Handler
2.我只是用了带DEEPSLEEP的例程,并不是想在deepsleep中使用BSTIM,我想这个跟跑死现象无关吧!

yukezhe2008 发表于 2021-8-23 20:55:07

wangpeng 发表于 2021-8-23 14:38
1、挂了是指什么现象?
2、另外您看一下BSTIM的初始化配置,如果低功耗模式下想用BSTIM 要将BSTIM的时钟 ...

不知道为啥回复没显示,再回复一次:
1.挂了就是跑到了HardFault_Handler
2.我这个定时器是提供时钟给vTaskGetRunTimeStats这个函数用的,这个时钟必须比系统时钟快10倍以上,至于睡眠模式里用不用这个定时器不是我关心的,我倒希望睡眠模式里定时器是停用的!

顾博文 发表于 2021-8-24 08:27:56

yukezhe2008 发表于 2021-8-23 20:55
不知道为啥回复没显示,再回复一次:
1.挂了就是跑到了HardFault_Handler
2.我这个定时器是提供时钟给vTa ...

如果休眠模式不用那就将休眠函数注释掉,看会不会死。休眠了,中断外设又不关,这是有问题的。休眠前关下,休眠后再打开看看有没有问题。

yukezhe2008 发表于 2021-8-24 10:07:36

顾博文 发表于 2021-8-24 08:27
如果休眠模式不用那就将休眠函数注释掉,看会不会死。休眠了,中断外设又不关,这是有问题的。休眠前关下 ...

时钟换成LSCLK跑了一晚上没死,看来就是这个问题,后续再观察一下,感谢!

cyril 发表于 2021-9-2 10:01:09

这个问题我在另外一个帖子补充回复了。系统的tickless功能是有问题。而且默认开启的。http://www.fmdevelopers.com.cn/forum.php?mod=viewthread&tid=9911&page=1#pid12785。这里有我描述原因和解决问题点。主要是,一定要用LSCK加LPTIM做唤醒源。而且,还要修改休眠函数的。原厂的中断控制与系统脉冲补偿有问题。

论坛的添加图片真是麻烦。想贴2张图,快速给出解决方法的。还有回复要隔5分钟?我看帖子快,发现有的问题我解决了,想回复还不行,要等5分钟。。。1小时内只能回复2条?算了算了,浪费时间。走了

qianxilin 发表于 2021-9-8 18:20:47

我用的例程的FreeRtos。发现编译完成以后占用了大量的RAM
Program Size: Code=8284 RO-data=224 RW-data=92 ZI-data=21804
占用了21K的RAM。
页: [1] 2
查看完整版本: 【FreeRTOS】FM33LC015N使用Freertos死机问题