Skip to content

Commit 5e0300a

Browse files
committed
feat: 在 Rknpu 提交过程中添加中断清除方法以增强任务处理的稳定性
1 parent e8dc96e commit 5e0300a

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

src/ioctrl.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
use core::hint::spin_loop;
22

33
use mbarrier::mb;
4+
use tock_registers::interfaces::Readable;
45

5-
use crate::{JobMode, Rknpu, RknpuError, RknpuTask, SubmitBase, SubmitRef};
6+
use crate::{
7+
JobMode, Rknpu, RknpuError, RknpuTask, SubmitBase, SubmitRef, registers::rknpu_fuzz_status,
8+
};
69

710
/// 子核心任务索引结构体
811
///
@@ -141,17 +144,17 @@ impl Rknpu {
141144
regcmd_base_addr: submit_tasks[0].regcmd_addr as _,
142145
};
143146
debug!("Submit job: {job:#x?}");
144-
145147
while self.base[0].handle_interrupt() != 0 {
146148
spin_loop();
147149
}
148-
150+
debug!("Submitting PC job...");
149151
self.base[0].submit_pc(&self.data, &job).unwrap();
150-
mb();
152+
151153
// Wait for completion
152154
loop {
153-
let status = self.base[0].handle_interrupt();
154-
mb();
155+
let status = self.base[0].pc().interrupt_status.get();
156+
let status = rknpu_fuzz_status(status);
157+
155158
if status == job.base.int_mask {
156159
break;
157160
}
@@ -160,6 +163,7 @@ impl Rknpu {
160163
return Err(RknpuError::TaskError);
161164
}
162165
}
166+
self.base[0].pc().clean_interrupts();
163167
debug!("Job completed");
164168
tasks = &tasks[submit_tasks.len()..];
165169
}

src/registers/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ impl RknpuCore {
174174

175175
pub fn handle_interrupt(&self) -> u32 {
176176
let int_status = self.pc().interrupt_status.get();
177+
mb();
177178
self.pc().interrupt_clear.set(INT_CLEAR_ALL);
178179
rknpu_fuzz_status(int_status)
179180
}

src/registers/pc.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use tock_registers::{interfaces::*, register_structs, registers::*};
22

3+
use crate::registers::consts::INT_CLEAR_ALL;
4+
35
register_structs! {
46
#[allow(non_snake_case)]
57
pub PcRegs {
@@ -71,4 +73,8 @@ impl PcRegs {
7173
.get()
7274
.wrapping_add(self.version_num.get() & 0xffff)
7375
}
76+
77+
pub fn clean_interrupts(&self) {
78+
self.interrupt_clear.set(INT_CLEAR_ALL);
79+
}
7480
}

0 commit comments

Comments
 (0)