我正试图从零开始为中断程序编写自己的代码。我使用的是zynq7000,它由两个ARM皮层A9处理器组成。
我使用SDK将用C编写的程序连同在FSBL
中生成的PlanAhead和位文件一起加载到闪存中。当我的程序开始运行时,处理器进入用户模式。在用户模式中,禁用IRQ
和FIQ
。我试图使用SWI
指令进入主管模式,以启用IRQ
和FIQ
中断。当我调试时,它显示当我调用SIGTRAP
指令时,它会遇到SWI
。
那么,我如何在C中生成自己的代码,它可以启用中断并运行我的ISR
,即使在处理器启动(FSBL
)并启动之后也是如此?
谢谢
发布于 2014-03-19 15:26:06
vectors.s
.globl _start
_start:
ldr pc,_reset_handler
ldr pc,_undefined_handler
ldr pc,_swi_handler
b hang
b hang
b hang
b hang
b hang
_reset_handler: .word reset
_undefined_handler: .word hang
_swi_handler: .word swi
reset:
mov sp,#0xD6000000
add sp,sp,#0xC000
bl notmain
hang: b hang
.globl PUT32
PUT32:
str r1,[r0]
bx lr
.globl GET32
GET32:
ldr r0,[r0]
bx lr
swi:
ldr r0,[lr,#-4]
mov r1,#0x00FFFFFF
and r0,r0,r1
movs pc,lr
.globl switest
switest:
stmdb r13!,{lr}
swi #0x23
ldmia r13!,{lr}
bx lr
链接器脚本
MEMORY
{
ram : ORIGIN = 0x00000000, LENGTH = 0x4000
}
SECTIONS
{
.text : { *(.text*) } > ram
}
notmain.c
extern void uart_init ( void );
extern void uart_putc ( unsigned char );
extern unsigned int switest ( void );
void hexstrings ( unsigned int d )
{
unsigned int rb;
unsigned int rc;
rb=32;
while(1)
{
rb-=4;
rc=(d>>rb)&0xF;
if(rc>9) rc+=0x37; else rc+=0x30;
uart_putc(rc);
if(rb==0) break;
}
uart_putc(0x20);
}
void hexstring ( unsigned int d )
{
hexstrings(d);
uart_putc(0x0D);
uart_putc(0x0A);
}
int notmain ( void )
{
uart_init();
hexstring(0x12345678);
hexstring(switest());
return(0);
}
以上是一个很小的swi工作示例中的相关部分。请注意,这只适用于arm模式下的svc/swi指令,而不是拇指或thumb2,如果您想在所有模式下进行通用操作,我建议您不要立即使用svc,而是在寄存器中传递一些内容。
此示例不启用中断,它只展示了如何进行svc/swi调用以及如何实现异常处理程序。这些知识已经在arm架构参考手册中有了很多年的记录。
https://stackoverflow.com/questions/22474840
复制相似问题