aboutsummaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2015-06-26 10:03:37 +0200
committerClifford Wolf <clifford@clifford.at>2015-06-26 10:03:37 +0200
commit9a4a06d981d1b2787b3f42907c3cd21b95cdfaf0 (patch)
tree70b9b773cec4a59578e6a370a3383cc89b0cb302 /firmware
parent9d26ebcf58a7326167d175d9458e04950371b9cb (diff)
downloadpicorv32-9a4a06d981d1b2787b3f42907c3cd21b95cdfaf0.tar.gz
picorv32-9a4a06d981d1b2787b3f42907c3cd21b95cdfaf0.zip
Refactoring of IRQ handling
Diffstat (limited to 'firmware')
-rw-r--r--firmware/sieve.c57
-rw-r--r--firmware/start.S2
2 files changed, 39 insertions, 20 deletions
diff --git a/firmware/sieve.c b/firmware/sieve.c
index 7f1c82e..6fb5b17 100644
--- a/firmware/sieve.c
+++ b/firmware/sieve.c
@@ -33,7 +33,7 @@ static void print_dec(int val)
{
char buffer[10];
char *p = buffer;
- while (val) {
+ while (val || p == buffer) {
*(p++) = val % 10;
val = val / 10;
}
@@ -88,24 +88,28 @@ void sieve()
}
}
-void irq(uint32_t *regs, uint32_t irqnum)
+uint32_t *irq(uint32_t *regs, uint32_t irqs)
{
- static int ext_irq_count = 0;
+ static int ext_irq_4_count = 0;
+ static int ext_irq_5_count = 0;
static int timer_irq_count = 0;
- if (irqnum == 0) {
- ext_irq_count++;
- // print_str("[EXT-IRQ]");
- return;
+ if ((irqs & (1<<4)) != 0) {
+ ext_irq_4_count++;
+ // print_str("[EXT-IRQ-4]");
}
- if (irqnum == 1) {
+ if ((irqs & (1<<5)) != 0) {
+ ext_irq_5_count++;
+ // print_str("[EXT-IRQ-5]");
+ }
+
+ if ((irqs & 1) != 0) {
timer_irq_count++;
// print_str("[TIMER-IRQ]");
- return;
}
- if (irqnum == 2)
+ if ((irqs & 6) != 0)
{
int i, k;
uint32_t pc = regs[0] - 4;
@@ -114,12 +118,22 @@ void irq(uint32_t *regs, uint32_t irqnum)
print_str("\n");
print_str("------------------------------------------------------------\n");
- if (instr == 0x00100073) {
- print_str("SBREAK instruction at 0x");
- print_hex(pc);
- print_str("\n");
- } else {
- print_str("Illegal Instruction at 0x");
+ if ((irqs & 2) != 0) {
+ if (instr == 0x00100073) {
+ print_str("SBREAK instruction at 0x");
+ print_hex(pc);
+ print_str("\n");
+ } else {
+ print_str("Illegal Instruction at 0x");
+ print_hex(pc);
+ print_str(": 0x");
+ print_hex(instr);
+ print_str("\n");
+ }
+ }
+
+ if ((irqs & 4) != 0) {
+ print_str("Bus error in Instruction at 0x");
print_hex(pc);
print_str(": 0x");
print_hex(instr);
@@ -164,8 +178,12 @@ void irq(uint32_t *regs, uint32_t irqnum)
print_str("------------------------------------------------------------\n");
- print_str("Number of external IRQs counted: ");
- print_dec(ext_irq_count);
+ print_str("Number of fast external IRQs counted: ");
+ print_dec(ext_irq_4_count);
+ print_str("\n");
+
+ print_str("Number of slow external IRQs counted: ");
+ print_dec(ext_irq_5_count);
print_str("\n");
print_str("Number of timer IRQs counted: ");
@@ -173,7 +191,8 @@ void irq(uint32_t *regs, uint32_t irqnum)
print_str("\n");
__asm__("sbreak");
- return;
}
+
+ return regs;
}
diff --git a/firmware/start.S b/firmware/start.S
index cdb8da0..3e4705a 100644
--- a/firmware/start.S
+++ b/firmware/start.S
@@ -10,7 +10,7 @@
jal zero,n; n ## _ret:
reset_vec:
- custom0 0,0,7,3 // maskirq 7
+ custom0 0,0,0,3 // maskirq zero, zero
j start
nop
nop