fixed ISR memory alignement
This commit is contained in:
parent
d83a15eec5
commit
e9ef03890f
|
@ -0,0 +1,3 @@
|
|||
riscv32-unknown-elf-gcc -Wall -I. -O0 -static -march=rv32imac -mabi=ilp32 --specs=nosys.specs timer.c timerasm.S -o timer.elf
|
||||
objcopy -Oihex timer.elf timer.hex
|
||||
riscv32-unknown-elf-objdump timer.elf -d > dump
|
|
@ -1,10 +1,10 @@
|
|||
#include <stdio.h>
|
||||
|
||||
#define TIMER (*(uint64_t *)0x40004000)
|
||||
#define TIMER_CMP (*(uint64_t *)0x40004008)
|
||||
#define TRACE (*(unsigned char *)0x40000000)
|
||||
#define TIMER (*(uint64_t volatile *)0x40004000)
|
||||
#define TIMER_CMP (*(uint64_t volatile *)0x40004008)
|
||||
#define TRACE (*(unsigned char volatile *)0x40000000)
|
||||
|
||||
volatile int ticks = 0;
|
||||
volatile uint32_t ticks = 0;
|
||||
|
||||
int _write(int file, const char *ptr, int len) {
|
||||
int x;
|
||||
|
@ -17,20 +17,22 @@ int _write(int file, const char *ptr, int len) {
|
|||
}
|
||||
|
||||
void timer_ISR() {
|
||||
uint32_t timer_value;
|
||||
volatile uint32_t timer_value;
|
||||
|
||||
ticks++;
|
||||
if (ticks < 10) {
|
||||
timer_value = TIMER;
|
||||
// timer is in nanoseconds, set to 1 ms.
|
||||
// comparator value fixed to take into account number of instructions executed
|
||||
TIMER_CMP = timer_value + 590;
|
||||
}
|
||||
|
||||
timer_value = TIMER;
|
||||
|
||||
// timer is in nanoseconds, set to 1 ms.
|
||||
// comparator value fixed to take into account number of instructions executed
|
||||
TIMER_CMP = timer_value + 610;
|
||||
}
|
||||
|
||||
void register_timer_isr() {
|
||||
asm volatile("la t0, TIMER_CMP_INT \n csrw mtvec, t0");
|
||||
asm volatile("li t1, 0x888 \n csrw mie, t1");
|
||||
asm volatile("la t0, TIMER_CMP_INT");
|
||||
asm volatile("csrw mtvec, t0");
|
||||
asm volatile("li t1, 0x888");
|
||||
asm volatile("csrw mie, t1");
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
|
@ -43,14 +45,20 @@ int main(void) {
|
|||
start_time = TIMER;
|
||||
TIMER_CMP = start_time + 10000;
|
||||
printf("set timer to %ld ns\n", start_time + 10000);
|
||||
|
||||
|
||||
do {
|
||||
timer_value = TIMER;
|
||||
} while (timer_value < start_time + 200000);
|
||||
} while (timer_value < start_time + 2000000);
|
||||
|
||||
printf("Timer: %ld ns\n", timer_value);
|
||||
printf("ticks: %ld\n", ticks);
|
||||
|
||||
if (ticks > 2100) {
|
||||
printf("Test OK!\n");
|
||||
}
|
||||
|
||||
printf("Finish\n");
|
||||
|
||||
asm volatile ("ecall");
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#define LOAD lw
|
||||
#define REGBYTES 4
|
||||
|
||||
|
||||
.align 2
|
||||
TIMER_CMP_INT:
|
||||
/* store execution context on the stack (register content) */
|
||||
addi sp, sp, -REGBYTES * 32
|
||||
|
@ -32,7 +32,7 @@ STORE x31, 30 * REGBYTES(sp)
|
|||
|
||||
/* load interrupt/trap reason and call external C function to handle it */
|
||||
csrr a0, mcause
|
||||
jal timer_ISR
|
||||
jal timer_ISR
|
||||
|
||||
/* re-store the saved context */
|
||||
LOAD x1, 0x0(sp)
|
||||
|
@ -54,4 +54,3 @@ LOAD x30, 29 * REGBYTES(sp)
|
|||
LOAD x31, 30 * REGBYTES(sp)
|
||||
addi sp, sp, REGBYTES * 32
|
||||
mret
|
||||
|
||||
|
|
Loading…
Reference in New Issue