s5pv210中断问题

carl_wang_123 2015-12-29 12:14:41
不论是友善,还是其他开发板的中断都是要和DDR相关,
_start:
ldr sp, =0x40000000 @设置栈,以便调用c函数
mov r0, #0x53 @进入SVC模式,开中断(把I位设为1)
msr CPSR_cxsf, r0
其中0x40000000是DDR上的地址,为什么要使用这个地址,谁都没有说过为什么,为什么不能使用iram中的剩余地址,我就将sp =0xD002A000 然后调用main的C语言,理论上的C栈应该是不会影响到异常向量表的,但是这个却无法运行。
...全文
3169 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
carl_wang_123 2015-12-29
  • 打赏
  • 举报
回复
1.无法运行指的是中断上不来,但是前期的关于串口初始化,中断初始化,led初始化都是可以的。 2.sram就是用的是三星210的iram,96KB 3.这里需要添点代码了(原始的代码,可以使用的):

.global _start
.global IRQ_handle

_start:		
	ldr sp, =0x40000000	 		@设置栈,以便调用c函数
	mov r0, #0x53				@进入SVC模式,开中断(把I位设为1)
	msr CPSR_cxsf, r0	
	
	bl main						@调用main函数

IRQ_handle:
	ldr sp, =0xD0037F80
	sub lr, lr, #4				@计算返回地址
	stmfd sp!, {r0-r12, lr}		@保存现场
	bl	irq_handler				@跳转到中断处理函数
	ldmfd sp!, {r0-r12, pc}^	@恢复现场
这个是原来的代码,前面设置堆栈0x40000000,这个地址是DDR2上的地址,按照这样的做法,这个生成的bin文件要拷贝到DDR上。 makefile
%.o : %.S	
	arm-linux-gcc -o $@ $< -c
%.o : %.c	
	arm-linux-gcc -o $@ $< -c	

int.bin: start.o main.o irq.o led.o clock.o uart.o	
	arm-linux-ld -Ttext 0x30000000 -o int.elf $^
	arm-linux-objcopy -O binary int.elf $@	
	arm-linux-objdump -D int.elf > int.dis
	gcc -o mktools mktools.c	
	
	./mktools $@ new_int.bin
clean:	
	rm *.o *.elf *.bin *.dis mktools
load:
	dd iflag=dsync oflag=dsync if=new_int.bin of=/dev/sdb seek=1
这个makefile指定了链接地址为0x30000000。 但是我做了如下修改,将链接地址改成了0,将ldr sp, =0x40000000 改为了 ldr sp,=0xD002A000,这个实际上我是看了生成的bin文件,理论上这个地址不会覆盖掉在iram中的bin文件。
猪头三小队长 2015-12-29
  • 打赏
  • 举报
回复
无法运行的现象是什么,直接挂掉还是过一阵再死?你的SRAM肯定是比较小的,运行时间长了,当栈生长到一定程度,SRAM应该是不够用了,各种错误都可能发生。

1,025

社区成员

发帖
与我相关
我的任务
社区描述
Linux /Unix kernel支持不同的硬件体系,X86, ARM, MIPS, 等等
社区管理员
  • CPU和硬件区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧