Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RISC-V_milk-v_CV1800B
设备驱动
调试
MilkV Duo 对接 RT-Thread 设备驱动 Bug 记录
发布于 2024-07-15 13:11:06 浏览:119
订阅该版
[tocm] ## BUG现象描述 该 bug 在支持 Milk Duo 大核的定时器设备驱动时出现。 实测小核定时器驱动正常,大核能够正常启动和读写定时器设备,但不能正常进入定时器中断。(测试代码参考 RT-Thread 官方文档中心 [hwtimer 设备使用示例](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/hwtimer/hwtimer?id=%e7%a1%ac%e4%bb%b6%e5%ae%9a%e6%97%b6%e5%99%a8%e8%ae%be%e5%a4%87%e5%ae%8c%e6%95%b4%e4%bd%bf%e7%94%a8%e7%a4%ba%e4%be%8b) ) ## 调试思路 - 首先参考官方 datasheet 核对中断号是否正确,需要注意的是,大小核的中断号是不同的。但是这里确认中断号是正确的。 - 在中断回调函数中添加打印调试语句,发现从未正常触发中断并进入回调函数。 - 以轮询的方式查看并打印对应的中断触发标志位寄存器,以及查看是否屏蔽了相应中断号 ```c status = hal_timer_get_int_status(DW_TIMER4_BASE); mask = hal_timer_get_mask(DW_TIMER4_BASE); rt_kprintf("status = %d\n", status); rt_kprintf("mask = %d\n", mask); ``` 结果表示定时时间截至后,能够正常置位对应中断标志位,并且并没有屏蔽该中断。 - 怀疑该中断号没有正常注册到中断管理器。检查发现大小核心的 `rt_hw_interrupt_install` 实现不一样,小核实现在`bsp/cvitek/c906_little/board/interrupt.c` 中 ``` rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, void *param, const char *name) { rt_isr_handler_t old_handler = RT_NULL; if ((vector < 0) || (vector > IRQ_MAX_NR)) { return old_handler; } old_handler = isr_table[vector].handler; #ifdef RT_USING_INTERRUPT_INFO rt_strncpy(isr_table[vector].name, name, RT_NAME_MAX); #endif /* RT_USING_INTERRUPT_INFO */ isr_table[vector].handler = handler; isr_table[vector].param = param; // set highest priority plic_set_priority(vector, 7); // rt_kprintf("\n"); return old_handler; } ``` 大核实现在 `libcpu/risc-v/t-head/c906_smode/interrupt.c` 中 ``` rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, void *param, const char *name) { rt_isr_handler_t old_handler = RT_NULL; if ((vector < 0) || (vector > IRQ_MAX_NR)) { return old_handler; } old_handler = isr_table[IRQ_OFFSET + vector].handler; #ifdef RT_USING_INTERRUPT_INFO rt_strncpy(isr_table[IRQ_OFFSET + vector].name, name, RT_NAME_MAX); #endif /* RT_USING_INTERRUPT_INFO */ isr_table[IRQ_OFFSET + vector].handler = handler; isr_table[IRQ_OFFSET + vector].param = param; return old_handler; } ``` 于是关注该函数运行,在执行完成返回前添加调试打印,查看运行情况。 ``` // 打印中断号 及对应详细信息 rt_kprintf("name: %s\n", name); rt_kprintf("vector: %d, isr_table[vector].handler: %p, isr_table[vector].param: %p\n", vector, isr_table[vector].handler, isr_table[vector].param); ``` - 结果发现没有打印定时器中断相关信息(这里是定时器5对应中断号84),应该是前面不满足判断条件,提前返回了,在大核的 `rtconfig.h` 文件中找到 `IRQ_MAX_NR` 的定义为 64 ,而手册中大核的最大中断号实际为 101 ,找到相关定义的 Kconfig 文件,修正`IRQ_MAX_NR` 值为 101,重新编译烧录,定时器驱动终于测试正常。 ## 最终解决方案 在 `bsp/cvitek/cv18xx_risc-v/Kconfig` 文件中,修正`IRQ_MAX_NR` 值为 101,符合芯片手册。
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
螺丝松掉的人
这家伙很懒,什么也没写!
文章
40
回答
0
被采纳
0
关注TA
发私信
相关文章
1
让成员函数能作为rt_device中的回调函数
2
关于设备配置时延时的处理
3
rt_device_set_rx_indicate设置的回调如何传递参数?
4
关于 输入捕获 驱动的
5
关于设备驱动的迷茫与疑惑
6
关于rtthread中各种驱动的问题
7
drv_hwtimer 和hwtimer关系是啥?
8
RTT有没有接口文档,可以用于写一些自己创建的设备的这些文档?
9
i2c设备驱动为什么没有速率设置
10
UART设备中断接收及轮询发送
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
ART-Pi
CAN总线
FinSH
USB
文件系统
DMA
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
ota在线升级
WIZnet_W5500
I2C_IIC
UART
flash
packages_软件包
cubemx
PWM
freemodbus
潘多拉开发板_Pandora
BSP
定时器
ADC
中断
flashDB
socket
Debug
GD32
编译报错
msh
at_device
rt_mq_消息队列_msg_queue
keil_MDK
ulog
C++_cpp
SFUD
本月问答贡献
踩姑娘的小蘑菇
11
个答案
2
次被采纳
张世争
6
个答案
2
次被采纳
红枫
2
个答案
2
次被采纳
rv666
2
个答案
2
次被采纳
梦笑真美
12
个答案
1
次被采纳
本月文章贡献
大龄码农
1
篇文章
10
次点赞
530china
1
篇文章
3
次点赞
螺丝松掉的人
1
篇文章
3
次点赞
zhp123
1
篇文章
3
次点赞
ljcjames
1
篇文章
3
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部