Refactored exception routine, working trapa handler.
Signed-off-by: imi415 <imi415.public@gmail.com>
This commit is contained in:
parent
782308d696
commit
d8e7b24931
|
@ -0,0 +1,12 @@
|
||||||
|
BasedOnStyle: Google
|
||||||
|
IndentWidth: 4
|
||||||
|
AlignConsecutiveMacros: AcrossEmptyLines
|
||||||
|
AlignConsecutiveDeclarations: AcrossEmptyLines
|
||||||
|
AlignConsecutiveAssignments: AcrossEmptyLinesAndComments
|
||||||
|
AllowShortFunctionsOnASingleLine: None
|
||||||
|
BreakBeforeBraces: Custom
|
||||||
|
BraceWrapping:
|
||||||
|
AfterEnum: false
|
||||||
|
AfterStruct: false
|
||||||
|
SplitEmptyFunction: false
|
||||||
|
ColumnLimit: 120
|
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef SH4_CORE_H
|
||||||
|
#define SH4_CORE_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define __trapa(code) asm volatile("trapa %0" :: "i" (code))
|
||||||
|
|
||||||
|
#endif // SH4_CORE_H
|
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "sh4_core.h"
|
||||||
|
|
||||||
#define __PACKED __attribute__((packed, aligned(1)))
|
#define __PACKED __attribute__((packed, aligned(1)))
|
||||||
#define __IO volatile
|
#define __IO volatile
|
||||||
|
|
||||||
|
|
25
src/main.c
25
src/main.c
|
@ -34,10 +34,12 @@ void uart_init(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void memory_test(void) {
|
static void memory_test(void) {
|
||||||
|
printf("Begin memory test from 0x%08x to 0x%08x\r\n", MEMTEST_START, MEMTEST_END);
|
||||||
|
|
||||||
for (uint32_t i = MEMTEST_START; i < MEMTEST_END; i += 4) {
|
for (uint32_t i = MEMTEST_START; i < MEMTEST_END; i += 4) {
|
||||||
*(uint32_t *)i = i;
|
*(uint32_t *)i = i;
|
||||||
|
|
||||||
if (i % 0x10000 == 0U) {
|
if (i % 0x100000 == 0U) {
|
||||||
printf("Write to 0x%08lx...\r\n", i);
|
printf("Write to 0x%08lx...\r\n", i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,10 +51,12 @@ static void memory_test(void) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i % 0x10000 == 0U) {
|
if (i % 0x100000 == 0U) {
|
||||||
printf("Read from 0x%08lx...\r\n", i);
|
printf("Read from 0x%08lx...\r\n", i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("Memory test finished.\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
|
@ -66,16 +70,7 @@ int main(void) {
|
||||||
|
|
||||||
printf("Hello world\r\n");
|
printf("Hello world\r\n");
|
||||||
|
|
||||||
printf("Size of int: %d\r\n", sizeof(int));
|
__trapa(34); /* TRAPA test code.. */
|
||||||
printf("Size of short: %d\r\n", sizeof(short));
|
|
||||||
printf("Size of char: %d\r\n", sizeof(char));
|
|
||||||
printf("Size of long: %d\r\n", sizeof(long));
|
|
||||||
printf("Size of pointer: %d\r\n", sizeof(uint8_t *));
|
|
||||||
printf("Size of uint8_t: %d\r\n", sizeof(uint8_t));
|
|
||||||
printf("Size of uint16_t: %d\r\n", sizeof(uint16_t));
|
|
||||||
printf("Size of uint32_t: %d\r\n", sizeof(uint32_t));
|
|
||||||
|
|
||||||
delay_ms(5000);
|
|
||||||
|
|
||||||
memory_test();
|
memory_test();
|
||||||
|
|
||||||
|
@ -88,3 +83,9 @@ int main(void) {
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* tra #34 is SysCall.. */
|
||||||
|
int syscall_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) {
|
||||||
|
set_led(LED_RED_GPIO, LED_RED_PIN, 1U);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
#include "stx7105.h"
|
#include "stx7105.h"
|
||||||
|
|
||||||
#define __WEAK __attribute__((weak))
|
#define WEAK_ATTR __attribute__((weak))
|
||||||
#define __IRQ __attribute__((interrupt_handler))
|
#define IRQ_ATTR __attribute__((interrupt_handler))
|
||||||
#define __WEAK_IRQ __attribute__((weak, interrupt_handler))
|
#define WEAK_IRQ_ATTR __attribute__((weak, interrupt_handler))
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
EXP_TYPE_TRAP = 0x160,
|
EXP_TYPE_TRAP = 0x160,
|
||||||
|
@ -13,24 +13,50 @@ typedef enum {
|
||||||
INT_TYPE_TMU_TNUI1 = 0x420,
|
INT_TYPE_TMU_TNUI1 = 0x420,
|
||||||
INT_TYPE_TMU_TNUI2 = 0x440,
|
INT_TYPE_TMU_TNUI2 = 0x440,
|
||||||
INT_TYPE_TMU_TICPI2 = 0x460,
|
INT_TYPE_TMU_TICPI2 = 0x460,
|
||||||
|
INT_TYPE_ASC_UART0 = 0x1160,
|
||||||
|
INT_TYPE_ASC_UART1 = 0x1140,
|
||||||
|
INT_TYPE_ASC_UART2 = 0x1120,
|
||||||
|
INT_TYPE_ASC_UART3 = 0x1100,
|
||||||
} intevt_type_t;
|
} intevt_type_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TRA_TYPE_SYSCALL = 34,
|
TRA_TYPE_SYSCALL = 34,
|
||||||
} tra_type_t;
|
} tra_type_t;
|
||||||
|
|
||||||
|
/* ========================= TMU 0/1/2 Underrun Interrupt Handlers ================================= */
|
||||||
|
|
||||||
__WEAK int tuni0_handler(void) {
|
WEAK_ATTR int tuni0_handler(void) {
|
||||||
/* Does nothing */
|
/* Does nothing */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__WEAK int syscall_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) {
|
WEAK_ATTR int tuni1_handler(void) {
|
||||||
|
/* Does nothing */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__WEAK int trap_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) {
|
WEAK_ATTR int tuni2_handler(void) {
|
||||||
tra_type_t tra = CSP->TRA;
|
/* Does nothing */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================= ASC(UART) 0/1/2 Interrupt Handlers ================================= */
|
||||||
|
|
||||||
|
WEAK_ATTR int asc2_handler(void) {
|
||||||
|
/* Does nothing */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================= Different Trap Code Handlers ================================= */
|
||||||
|
|
||||||
|
WEAK_ATTR int syscall_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================= TRAPA(Trap) Exception Handlers ================================= */
|
||||||
|
|
||||||
|
WEAK_ATTR int trap_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) {
|
||||||
|
tra_type_t tra = (CSP->TRA >> 2U) & 0xFFU; /* TRA[9:2] */
|
||||||
|
|
||||||
switch (tra) {
|
switch (tra) {
|
||||||
case TRA_TYPE_SYSCALL:
|
case TRA_TYPE_SYSCALL:
|
||||||
|
@ -43,7 +69,9 @@ __WEAK int trap_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__WEAK_IRQ int general_exc_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) {
|
/* ========================= System Exception Handlers ================================= */
|
||||||
|
|
||||||
|
WEAK_IRQ_ATTR int general_exc_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) {
|
||||||
expevt_type_t expevt = CSP->EXPEVT;
|
expevt_type_t expevt = CSP->EXPEVT;
|
||||||
switch (expevt) {
|
switch (expevt) {
|
||||||
case EXP_TYPE_TRAP:
|
case EXP_TYPE_TRAP:
|
||||||
|
@ -56,12 +84,23 @@ __WEAK_IRQ int general_exc_handler(uint32_t p1, uint32_t p2, uint32_t p3, uint32
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__WEAK_IRQ int general_int_handler(void) {
|
/* ========================= System Interrupt Handlers ================================= */
|
||||||
|
|
||||||
|
WEAK_IRQ_ATTR int general_int_handler(void) {
|
||||||
intevt_type_t intevt = CSP->INTEVT;
|
intevt_type_t intevt = CSP->INTEVT;
|
||||||
switch (intevt) {
|
switch (intevt) {
|
||||||
case INT_TYPE_TMU_TNUI0:
|
case INT_TYPE_TMU_TNUI0:
|
||||||
return tuni0_handler();
|
return tuni0_handler();
|
||||||
break;
|
break;
|
||||||
|
case INT_TYPE_TMU_TNUI1:
|
||||||
|
return tuni1_handler();
|
||||||
|
break;
|
||||||
|
case INT_TYPE_TMU_TNUI2:
|
||||||
|
return tuni2_handler();
|
||||||
|
break;
|
||||||
|
case INT_TYPE_ASC_UART2:
|
||||||
|
return asc2_handler();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue