新闻中心

EEPW首页>嵌入式系统>设计应用> arm 2440编译空间安排

arm 2440编译空间安排

作者: 时间:2016-11-21 来源:网络 收藏
问题描述:之前编译的程序,实际功能测试都正常,新加入了一个程序文件编译没有错误,但是实际功能测试中出现一部分功能正常,一部分完全不正常,类似于重启的效果。

可能性判断1:编译生成的main.o没有被完全从nandflash中copy到sdram中运行。
分析head.s文件,也即硬件初始化过程,nandflash的4k由硬件自动从nandflash拷贝到sram中,然后有一个拷贝4k的sram到sdram中,但是nandflash中4k以后的就没人管了哦!!!因此需要一个函数copy nandflash的4k以后的代码到sdram中。

本文引用地址://m.amcfsurvey.com/article/201611/319262.htm

解决办法1: 将nandflash初始化函数和nandflash读函数都固化进init.c中,调试。搞定

主要head.s 代码如下,其他代码可以根据调试信息增添即可难度降低:

@******************************************************************************
@ File: head.S
@ 功能: 设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
@******************************************************************************

.externmain
.text
.global _start
_start:
@******************************************************************************
@ 中断向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用
@******************************************************************************
bReset

@ 0x04: 未定义指令中止模式的向量地址
HandleUndef:
bHandleUndef

@ 0x08: 管理模式的向量地址,通过SWI指令进入此模式
HandleSWI:
bHandleSWI

@ 0x0c: 指令预取终止导致的异常的向量地址
HandlePrefetchAbort:
bHandlePrefetchAbort

@ 0x10: 数据访问终止导致的异常的向量地址
HandleDataAbort:
bHandleDataAbort

@ 0x14: 保留
HandleNotUsed:
bHandleNotUsed

@ 0x18: 中断模式的向量地址
bHandleIRQ

@ 0x1c: 快中断模式的向量地址
HandleFIQ:
bHandleFIQ

Reset:
ldr sp, =4096@ 设置栈指针,以下都是C函数,调用前需要设好栈
bldisable_watch_dog@ 关闭WATCHDOG,否则CPU会不断重启
blclock_init@ 设置MPLL,改变FCLK、HCLK、PCLK
blmemsetup@ 设置存储控制器以使用SDRAM
blinit_nandflash@ 初始化NAND Flash
@ 复制代码到SDRAM中
ldr r0, =0x30000000@ 1. 目标地址 = 0x30000000,这是SDRAM的起始地址
mov r1, #4096@ 2. 源地址= 4096,运行地址在SDRAM中的代码保存在NAND Flash 4096地址开始处
mov r2, #64*1024@ 3. 复制长度 = 16K,对于本实验,这是足够了
blCopyCode2SDRAM@ 调用C函数CopyCode2SDRAM

msr cpsr_c, #0xd2@ 进入中断模式
ldr sp, =0x31000000@ 设置中断模式栈指针

msr cpsr_c, #0xdf@ 进入系统模式
ldr sp, =0x34000000@ 设置系统模式栈指针,

ldr lr, =ret_initirq@ 设置返回地址
ret_initirq:
msr cpsr_c, #0x5f@ 设置I-bit=0,开IRQ中断

ldr lr, =halt_loop@ 设置返回地址
ldr pc, =main@ 调用main函数
halt_loop:
bhalt_loop

HandleIRQ:
sub lr, lr, #4@ 计算返回地址
stmdbsp!,{ r0-r12,lr }@ 保存使用到的寄存器
@ 注意,此时的sp是中断模式的sp
@ 初始值是上面设置的4096

ldr lr, =int_return@ 设置调用IRQ_Handle函数后的返回地址
//ldr pc, =Timer0_Handle@ 调用中断服务函数,在interrupt.c中
//ldr pc, =IRQ_Handle@ 调用中断分发函数,在interrupt.c中
//ldr pc, =EINT_Handle@ 调用中断分发函数,在interrupt.c中
int_return:
ldmiasp!,{ r0-r12,pc }^@ 中断返回, ^表示将spsr的值复制到cpsr



关键词:arm2440编译空

评论


技术专区

关闭