现象:一旦使用了合泰的delay_ms后,RT_Thread使用rt_thread_delay后线程resume不回来。不能正常调度线程。
原因是:合泰HT32库中delay_ms每次会清除定时器的计数值和自动转载值等寄存器。
而rt_thread_delay使用到当前线程的定时器来计算休眠的时间,delay_ms会破坏当前线程的定时器。导致执行不到了rt_thread_resume(); rt_schedule();。
解决方法:提前保存这些寄存器,等delay_ms用完后再复原。(增加图中两个红框内容)
void delay_us(u32 us)
{
u32 i;
int tmp1 = SysTick->VAL;
int tmp2 = SysTick->LOAD;
int tmp3 = SysTick->CTRL;
SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000000);
SYSTICK_IntConfig(DISABLE);
SYSTICK_CounterCmd(SYSTICK_COUNTER_CLEAR);
SYSTICK_CounterCmd(SYSTICK_COUNTER_ENABLE);
for( i = 0;i < us;i++ )
{
while( !( (SysTick->CTRL) & (1<<16) ) );
}
SYSTICK_CounterCmd(SYSTICK_COUNTER_DISABLE);
SYSTICK_CounterCmd(SYSTICK_COUNTER_CLEAR);
SysTick->VAL = tmp1;
SysTick->LOAD = tmp2;
SysTick->CTRL = tmp3;
}