全志科技
直播中

张秀兰

7年用户 1267经验值
私信 关注
[问答]

PLIC在写入complete寄存器后立马会触发下一次中断的原因?如何解决?

PLIC在写入complete寄存器后立马会触发下一次中断的原因?如何解决?

回帖(2)

刘甜甜

2021-12-28 09:25:31
  • PLIC在写入complete寄存器后立马会触发下一次中断。
按照文档说明,PLIC的处理过程应该是在CPU收到外中断后读取claim/complete 寄存器,取出中断号,随后处理中断,再向claim/complete 寄存器写入完成处理的中断号。
现在我发现在从claim/complete 寄存器读出中断号后对应的pending位已经为0(正常),但将处理完成的中断号写入claim/complete 寄存器后对应中断的pending位会立刻变为1,随后PLIC发出外中断,进入了下一轮中断处理程序,虽然在这之中,外中断源并未真正发出中断信号。
我主要测试了UART与RTC,在QEMU中一切正常,使用D1所对应的驱动在D1上跑则会出如上问题。另:此系统为裸机程序,没有使用任何其他内核
代码链接如下:
plic.c
plic.h
sunxi-rtc.c
rtc.h
trap.c
另:我发现D1的user manual中关于PLIC的部分寄存器位描述有许多错误,且和C906的文档不一致,倒是和F133的一致,不知是不是全志的小编抄错了我就知道 硬件肯定没有问题
  • 还有224页底部链接的问题。其他的部分我也只看了RTC,那里没有问题


    • P899 此处应为LSR
    • 还有哪些写错了?求大佬指出
      (这个问题我们先看下)









举报

ss

2021-12-28 09:41:31


破案了,alarm0_irq_sta_reg=0不行,要用alarm0_irq_sta_reg=1,alarm0_irq_sta_reg寄存器是W1C,一开始不知道这是啥意思,以为是可写,去查了一下才知道是写1来清零。
问题解决了一个,但是又有一个来了,alarm不按设定的时间发生中断,总是要晚一秒


这个问题也解决了,看起来是因为rtc是在从x秒跳到x+1秒的那一刹那才会触发设置在x秒的闹钟
举报

更多回帖

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