家の桜の枝から引出しのつまみを作る練習をしてみた。やはりゲージを作らな
いと。思ったような形にするのが意外に難しい。これを27個作る予定。

SH2A続き。例外処理。h8sxの時は例外と割り込みを分けるかどうか迷ったけれど、
やっぱり分けない方がよさそう。ということで今回はこう。
void null_handler_main (int);
#define NULL_HANDLER(x) \
void null_handler ## x (void) __attribute__ ((interrupt_handler)); \
void \
null_handler ## x () \
{ \
null_handler_main (x); \
}
#define VECTOR_DECL(handler, vector) \
NULL_HANDLER (vector) \
void handler (void) __attribute__ ((weak, alias ("null_handler" #vector)))
VECTOR_DECL (invalid_instruction, 4);
VECTOR_DECL (invalid_instruction_slot, 6);
VECTOR_DECL (address_error_cpu, 9);
VECTOR_DECL (address_error_dma, 10);
VECTOR_DECL (nmi, 11);
VECTOR_DECL (fpu, 13);
VECTOR_DECL (udi, 14);
VECTOR_DECL (bank_overflow, 15);
VECTOR_DECL (bank_underflow, 16);
VECTOR_DECL (div_zero, 17);
VECTOR_DECL (div_overflow, 18);
extern void start (void);
extern void stack_start(void); // XXX kludge hack
const interrupt_handler_t vector_table[]
__attribute__ ((section (".vectors"))) =
{
[0] = (const interrupt_handler_t)start,
[1] = (const interrupt_handler_t)stack_start,
[2] = (const interrupt_handler_t)start,
[3] = (const interrupt_handler_t)stack_start,
[4] = invalid_instruction,
[6] = invalid_instruction_slot,
[9] = address_error_cpu,
[10] = address_error_dma,
[11] = nmi,
[13] = fpu,
[14] = udi,
[15] = bank_overflow,
[16] = bank_underflow,
[17] = div_zero,
[18] = div_overflow,
};
void
null_handler_main (int vector)
{
iprintf ("null_handler: %d\n", vector);
while (/*CONSTCOND*/1)
;
// NOTREACHED
}
__attribute__ ((interrrupt_handler))を設定すると(lib/gcc/sh-elf/4.3.2/m2aのlibgcc.aをリンクする必要あり)、このようにお膳立てしてくれる。
1c001fd8 <_null_handler4>:
1c001fd8: 4f 62 sts.l fpscr,@-r15
1c001fda: d1 16 mov.l 1c002034 <_null_handler4+0x5c>,r1 ! 1c002574 <___fpscr_values>
1c001fdc: 71 04 add #4,r1
1c001fde: 41 66 lds.l @r1+,fpscr
1c001fe0: 71 fc add #-4,r1
1c001fe2: ff 0b fmov fr0,@-r15
1c001fe4: ff 2b fmov fr2,@-r15
1c001fe6: ff 4b fmov fr4,@-r15
1c001fe8: ff 6b fmov fr6,@-r15
1c001fea: ff 8b fmov fr8,@-r15
1c001fec: ff ab fmov fr10,@-r15
1c001fee: 4f 02 sts.l mach,@-r15
1c001ff0: 4f 12 sts.l macl,@-r15
1c001ff2: 4f 52 sts.l fpul,@-r15
1c001ff4: 2f 06 mov.l r0,@-r15
1c001ff6: 2f 16 mov.l r1,@-r15
1c001ff8: 2f 26 mov.l r2,@-r15
1c001ffa: 2f 36 mov.l r3,@-r15
1c001ffc: 2f 46 mov.l r4,@-r15
1c001ffe: 2f 56 mov.l r5,@-r15
1c002000: 2f 66 mov.l r6,@-r15
1c002002: 2f 76 mov.l r7,@-r15
1c002004: 4f 22 sts.l pr,@-r15
1c002006: d1 0c mov.l 1c002038 <_null_handler4+0x60>,r1 ! 1c001bd0 <_null_handler_main>
1c002008: 41 0b jsr @r1
1c00200a: e4 04 mov #4,r4
1c00200c: 4f 26 lds.l @r15+,pr
1c00200e: 67 f6 mov.l @r15+,r7
1c002010: 66 f6 mov.l @r15+,r6
1c002012: 65 f6 mov.l @r15+,r5
1c002014: 64 f6 mov.l @r15+,r4
1c002016: 63 f6 mov.l @r15+,r3
1c002018: 62 f6 mov.l @r15+,r2
1c00201a: 61 f6 mov.l @r15+,r1
1c00201c: 60 f6 mov.l @r15+,r0
1c00201e: 4f 56 lds.l @r15+,fpul
1c002020: 4f 16 lds.l @r15+,macl
1c002022: 4f 06 lds.l @r15+,mach
1c002024: fa f9 fmov @r15+,fr10
1c002026: f8 f9 fmov @r15+,fr8
1c002028: f6 f9 fmov @r15+,fr6
1c00202a: f4 f9 fmov @r15+,fr4
1c00202c: f2 f9 fmov @r15+,fr2
1c00202e: f0 f9 fmov @r15+,fr0
1c002030: 00 2b rte
1c002032: 4f 66 lds.l @r15+,fpscr
1c002034: 1c 00 mov.l r0,@(0,r12)
1c002036: 25 74 mov.b r7,@-r5
1c002038: 1c 00 mov.l r0,@(0,r12)
1c00203a: 1b d0 mov.l r13,@(0,r11)
こんな感じで例外を起こして例外ハンドラが呼ばれるのまで確認。
uint32_t
e (int32_t argc, const char *argv[])
{
int i = -1;
if (argc > 1)
i = atoi (argv[1]);
printf ("test=%d\n", i);
switch (i)
{
default:
break;
case 0:
__asm volatile (".long 0xffffffff");
break;
case 1:
__asm volatile ("resbank");
break;
}
return 0;
}
SH7262 Simple Monitor Build Jun 6 2010 16:50:45
mon> l
CCR1=0 CCR2=0
~>Local file name? a.mot
1036 lines transferred in 6 seconds
!
Read 24266 byte. success
Start address: 0x1c0012d8
mon>
mon> test
mon> g
0x1c0140000012d8
RAM data: 0x1c0024a8-0x1c0024dc 52byte
bss: 0x1c0024dc-0x1c00257c 160byte
VBR: 0x1c000000 (0x1c000000)
user> test
intc_priority: fffe081a:12 0->8
FRQCR=104
PLL: x12, Internal x1/1, Peripheral x1/6
Ick=144MHz, Pck=24MHz, Bck=48MHz
STBCR2: ........ [0x0] 0
STBCR3: ......|. [0x2] 2
STBCR4: ........ [0x0] 0
STBCR5: ...|.... [0x10] 16
STBCR6: ........ [0x0] 0
STBCR7: ..|.|.|. [0x2a] 42
STBCR8: ........ [0x0] 0
1c001f74
user> e 0
test=0
null_handler: 4
SH7262 Simple Monitor Build Jun 6 2010 16:50:45
mon>
最近のコメント