嵌入式学习小组
直播中

李明聪

7年用户 1167经验值
私信 关注

FreeRTOS内核默认会初始化systick是必须的吗?

FreeRTOS内核默认会初始化systick;原子哥的视频教程里的例程也会使用delay_init初始化systick。
请问是否是必须,有无影响?

回帖(5)

李建平

2020-7-20 07:05:58
FreeRTOS使用了系统时钟SystemCoreClock(F103板子就是72M)做为滴答定时器的时基,所以做为用户的我们就只能在自己编写的delay.c中也使用SystemCoreClock,而不是1/8;因此需要将裸机版本的delay.c中的滴答定时器时基改为SystemCoreClock!这样我们就可以使用裸机下比如delay_us()函数了。
在main函数开始的时候使用delay_init()的目的是为了初始化函数delay_xms(u32 nms)和delay_us(u32 nus)所需要的某些因子(这两个函数不是用的系统延时函数),这样你就可以在你的工程里像使用裸机一样使用这两个延时函数了。 也可以把delay_init()函数里的这行注释掉”SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);” 因为任务开启任务调度器里也有这样的设置(包括systick的相关寄存器设置)。
举报

李可熠

2020-7-20 07:20:50
http://www.openedv.com/forum.php ... &extra=page%3D1
举报

王颖

2020-7-20 07:32:14
如果不需要使用裸机延时函数delay_xms(u32 nms)和delay_us(u32 nus)的话,是不是就不需要delay_init,系统也是正常的?
举报

王玉梅

2020-7-20 07:55:28
这位道友,我一直有一个疑问。之前我也是有和楼主一样的问题。我之前是没有用原子的delay。sys。usart。这三个文件。我直接移植的官方例程,先用系统点了个灯。成功后,让灯闪烁我用到了延时,起初我用的是系统提供的延时vTaskDelay(),灯也开始拿着这个延时开始闪烁了。直到后来,学到后面的系统中断测试实验。
                while(1)
                {
                        printf("¹Ø±ÕÖжÏ.............rn");
                        portDISABLE_INTERRUPTS();               
                        delay_xms(5000);                                               
                        printf("´ò¿ªÖжÏ.............rn");
                        portENABLE_INTERRUPTS();
                        delay_xms(5000);
                }
这个就是任务具体实现;程序中延时用vTaskDelay()函数不行。只能用原子的delay_xms()
我比对了一下区别。说是vTaskDelay会导致任务调度。我不明白怎么回事。或者说这两个延时函数到底什么时候用vTaskDelay(),什么时候用delay_xms()。道友能帮我解惑嘛?
举报

陈静

2020-7-20 08:02:29
portDISABLE_INTERRUPTS();   为什么要在这里关中断?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分