目录
一、问题描述
最近在移植stm32裸机工程到FreeRtos时出现程序崩溃,网上找了很久没找到原因,最终在B站上找到相关资料解决:
有问题的代码如下,
1,delay函数:
2,任务1代码
2,默认任务实现500ms电平翻转
理论上代码烧录之后应该是任务一正常进行i++,默认任务电平500ms实现翻转,实际上任务一正常进行i++,默认任务电平大约8s实现翻转一次
二、解决方法
出现这种问题的原因是因为delay函数修改了tick里的计数,裸机的话这个没问题,但是freertos调度是用到tick中断来切换任务的,所以导致冲突了。
修改Delay函数
1,Delay初始化
void Delay_Init(void)
{
uint32_t reload;
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
reload = SystemCoreClock;
reload = reload/1000;
SysTick->LOAD = reload;
SysTick->CTRL|=SysTick_CTRL_CLKSOURCE_Msk;
g_fac_us = SystemCoreClock/1000000;
}
2,delay_us
void Delay_us(uint32_t nus)
{
uint32_t ticks;
uint32_t reload;
uint32_t told,tnow,tcnt;
reload = SysTick->LOAD;
ticks = nus * g_fac_us;
told = SysTick->VAL;
while(1)
{
tnow = SysTick->VAL;
if(tnow != told)
{
if(tnow < told)
{
tcnt += told -tnow;
}
else
{
tcnt += reload - tnow +told;
}
told = tnow;
if(tcnt >= ticks)
{
break;
}
}
}
}