CLINT和PLIC,risc-v中断

中断这个东西理论上属于CPU核心的东西。一般来说并不需要重新设计。实际的实现中是比较繁琐的,此处只介绍原理。ARM基本上会用NVIC(Nested Vectored Interrupt Controller) 的东西,RISC-V目前实现了一个比较简单的东西(有人称之为简洁高效),不支持嵌套的中断,所以讲原理起来还是比较简单的。只是我隐隐觉得,ARM之所以中断比较复杂,那是因为踩过无数坑以后慢慢变复杂的。RISC-V的中断机制是不是too young too simple还有待生产生活的检验。

一、RISC V中断架构

RISC V 中断被分为两类中断。局部中断和全局中断。

  • 局部中断,算是内部中断,标准是只规定了有两种,即使中断timer和软件中断software。局部中断连接在Core Local Interruptor (CLINT) 上。
  • 全局中断,也就是所说的外部中断,其他外设统统都是外部中断。外部中断连接在Platform-Level Interrupt Controller (PLIC)上。

如图所示,CLINT和PLIC最大的区别在于,CLINT没有仲裁,包括software和Timer,一有中断马上响应(software中断怎么产生的:用软件直接写一个寄存器当作软件中断)。PLIC需要一个仲裁决定谁先中断,存在个优先级的问题。

二、一个典型的中断流程

中断流程只要是CPU都大同小异的。对于RISC-V来讲,中断流程是这样的。

  1. 外设发出中断信号。
  2. PLIC或者CLINT响应中断,RISC-V核心保存此时的CSR(control and status registers,包括了PC啊,中断原因啊一堆信息)。
  3. 跳转到中断处理程序(直接换PC值取指令即可)。
  4. 关闭其他中断响应使能(RISC-V不支持嵌套,所以一个中断要屏蔽其他中断)。
  5. 软件保存通用的寄存器。
  6. 然后处理中断(过程中会清掉外设的中断)。
  7. 软件恢复通用的寄存器。
  8. 然后回复CSR。
  9. 然后跳转PC跳回原来位置退出异常。

一个完整流程就结束了。其他细节直接阅读RISC-V core的说明书即可。

 

  • 7
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在 Arduino 和 K210 之间通过串口 UART 实现两个二维码的识别,你需要以下几个步骤: 1. 在 Arduino 上发送摄像头图像数据到 K210。 2. 在 K210 上接收并处理来自 Arduino 的图像数据。 3. 使用 K210 上的二维码识别库进行二维码的解码。 4. 将解码结果发送回 Arduino。 下面是一个简单的示例代码,展示了如何在 Arduino 和 K210 之间通过串口 UART 实现这个过程: Arduino 代码: ```cpp #include <SoftwareSerial.h> SoftwareSerial k210Serial(10, 11); // 设置与 K210 通信的串口引脚 void setup() { Serial.begin(9600); k210Serial.begin(115200); // 设置与 K210 通信的串口波特率 delay(1000); Serial.println("K210 Communication Initialized."); } void loop() { // 获取摄像头图像数据并发送到 K210 // 这里需要根据你的实际情况添加相应的代码 } ``` K210 代码: ```c #include <stdio.h> #include "fpioa.h" #include "uart.h" #include "dvp.h" #include "ov2640.h" #include "plic.h" #define UART_NUM UART_DEVICE_3 void uart_send_data(unsigned char *data, uint32_t len) { uart_send_data(UART_NUM, data, len); } int main(void) { /* 初始化串口 */ uart_init(UART_NUM); /* 配置串口引脚 */ fpioa_set_function(4, FUNC_UART3_RX); fpioa_set_function(5, FUNC_UART3_TX); /* 初始化 DVP 摄像头 */ dvp_init(8); ov2640_init(); dvp_set_xclk_rate(24000000); while (1) { // 接收来自 Arduino 的图像数据 // 这里需要根据你的实际情况添加相应的代码 // 处理图像数据,进行二维码识别 // 这里需要根据你的实际情况添加相应的代码 // 将解码结果发送回 Arduino // 这里需要根据你的实际情况添加相应的代码 } return 0; } ``` 这只是一个简单的示例,你需要根据你的具体情况进行相应的修改和完善。请确保你已经正确连接了 Arduino 和 K210 的串口,并根据实际情况设置引脚和波特率。 希望这个示例能对你有所帮助!如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值