1. 选择系统tick定时器
在riscv架构中已经定义了定时器,但是如果要使用这个定时器就必须配合OpenSBI提供的接口来设置定时器的新值,在这里为了和之前的BSP教程统一,我们选择使用全志提供的厂商定时器来作为系统tick定时器。由于和全志R16使用的是相同的定时器,所以同样直接将定时器代码复制到driver目录下,并修改定时器模块的基址,如下所示。
2. 修改 bspLibc
首先在bspTickInit中添加定时器的启动代码,如下所示:
这里我们先不关心中断号设置,同样放到中断控制器设置好之后再回头来修改。在定时器中断处理函数中添加清除中断的代码,如下所示。
最后为定时器添加高精度修正接口,如下所示。
3. 功能验证
由于中断控制器我们还未初始化好,所以我们只能通过轮询定时器的中断状态寄存器来确定中断是否产生,在bspTickInit最后添加如下代码:
最后别忘了在bspMap.h中添加定时器寄存器的映射地址:
最后的最后我们将bspInit.c中内核启动参数中的kdlog改为no,不然会有一堆的输出打印干扰我们分析:
重新编译内核引导,如果在串口上看到我们添加的定时器验证打印,就说明定时器初始化没问题了:
评论