【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 );
}
结果还是不行,请问怎么破
gptimer 根本不能在休眠下工作。gptim必须在休眠前关闭,休眠后再打开。如果想要在休眠下也能工作,请使用lptimer或bstim、推荐使用lptimer,因为比较简单。 顾博文 发表于 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也挂了。。:'( yukezhe2008 发表于 2021-8-23 12:06
void MF_BSTIM32_Init(void)
{
NVIC_ConfigTypeDef InterruptConfigStruct;
1、挂了是指什么现象?
2、另外您看一下BSTIM的初始化配置,如果低功耗模式下想用BSTIM 要将BSTIM的时钟源修改为LSCLK。
wangpeng 发表于 2021-8-23 14:38
1、挂了是指什么现象?
2、另外您看一下BSTIM的初始化配置,如果低功耗模式下想用BSTIM 要将BSTIM的时钟 ...
1.挂了就是程序进入了HardFault_Handler
2.我只是用了带DEEPSLEEP的例程,并不是想在deepsleep中使用BSTIM,我想这个跟跑死现象无关吧! wangpeng 发表于 2021-8-23 14:38
1、挂了是指什么现象?
2、另外您看一下BSTIM的初始化配置,如果低功耗模式下想用BSTIM 要将BSTIM的时钟 ...
不知道为啥回复没显示,再回复一次:
1.挂了就是跑到了HardFault_Handler
2.我这个定时器是提供时钟给vTaskGetRunTimeStats这个函数用的,这个时钟必须比系统时钟快10倍以上,至于睡眠模式里用不用这个定时器不是我关心的,我倒希望睡眠模式里定时器是停用的! yukezhe2008 发表于 2021-8-23 20:55
不知道为啥回复没显示,再回复一次:
1.挂了就是跑到了HardFault_Handler
2.我这个定时器是提供时钟给vTa ...
如果休眠模式不用那就将休眠函数注释掉,看会不会死。休眠了,中断外设又不关,这是有问题的。休眠前关下,休眠后再打开看看有没有问题。 顾博文 发表于 2021-8-24 08:27
如果休眠模式不用那就将休眠函数注释掉,看会不会死。休眠了,中断外设又不关,这是有问题的。休眠前关下 ...
时钟换成LSCLK跑了一晚上没死,看来就是这个问题,后续再观察一下,感谢! 这个问题我在另外一个帖子补充回复了。系统的tickless功能是有问题。而且默认开启的。http://www.fmdevelopers.com.cn/forum.php?mod=viewthread&tid=9911&page=1#pid12785。这里有我描述原因和解决问题点。主要是,一定要用LSCK加LPTIM做唤醒源。而且,还要修改休眠函数的。原厂的中断控制与系统脉冲补偿有问题。
论坛的添加图片真是麻烦。想贴2张图,快速给出解决方法的。还有回复要隔5分钟?我看帖子快,发现有的问题我解决了,想回复还不行,要等5分钟。。。1小时内只能回复2条?算了算了,浪费时间。走了
我用的例程的FreeRtos。发现编译完成以后占用了大量的RAM
Program Size: Code=8284 RO-data=224 RW-data=92 ZI-data=21804
占用了21K的RAM。
页:
[1]
2