RISC-V中应用FreeRTOS的时钟分析

关于configCPU_CLOCK_HZ

在FreeRTOS配置文件FreeRTOSConfig.h,定义宏configCPU_CLOCK_HZ来表示CPU时钟的频率。则系统一个Tick的时间是1/configCPU_CLOCK_HZ。

关于configTICK_RATE_HZ

FreeRTOS的时钟Tick的频率,也就是FreeRTOS用到的定时中断的产生频率。默认值是1000,即1ms,即1000个Tick上报一次timer中断。

Risc-v时钟信号

Risc-v的时钟信号是由rtc_toggle接入的,一般不能超过core-clock的1/2。这个信号仅用来计时使用,所以不需要太高频率。一般1mHz就够了。

mtime

mtime是risc-v一直在走的真实时间,是由rtc_toggle直接决定的。是系统时间。

mtimecmp

mtimecmp是用来触发timer中断的,当mtime大于等于mtimecmp时,会触发上报一次timer中断。

在FreeRTOS中,每次上报timer中断会重置mtimecmp的值。
mtimecmp = mtime + configCPU_CLOCK_HZ/configTICK_RATE_HZ;
以此来决定下一次timer中断触发的时间,在实际使用中,需要再加10cycles左右的时间,这是算一些io访问消耗的时间。

关于FreeRTOS线程调度

调度器调度的调度周期是一个timer中断时间。
所以在risc-v中需要合理设置configCPU_CLOCK_HZ/configTICK_RATE_HZ的值,来保证一个调度周期内能够执行足够多的指令。

降频处理

以Risc-v core-clock为200kHz为例(降频5000倍,实际1gHz),则cpu 1秒能够执行200k条指令(以单指令周期来算)。

Risc-v rtc_toggle为31.25kHz,即时钟信号是这么多。一个tick时间为1/31250;

configCPU_CLOCK_HZ和configTICK_RATE_HZ怎么设置才合理?

以实际值为例

configCPU_CLOCK_HZ = 31250
 configTICK_RATE_HZ = 1000

则触发一次timer中断的时间是31250/1000=31.25Tick,即1ms。
再算一下1ms之内cpu能够执行的指令数:1秒是200k,1ms就是200条。
所以可以看出一个timer中断时间内只能执行200条指令,是远远不够调度器使用的。线程不可能运行起来。

所以在这种情况下,需要使用软件“欺骗”的方法,将configCPU_CLOCK_HZ变大或者configTICK_RATE_HZ变小。
我的做法是:

configCPU_CLOCK_HZ = 3125000
configTICK_RATE_HZ = 1000

相当于是把时间放大100倍,实际是1ms的,这里变成了100ms。这样算下来,一个调度节点执行20k条指令,足够FreeRTOS调度器使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章