您的位置 首页 知识

arm 2440编译空间组织

问题描述:之前编译的程序,实际功能测试都正常,新加入了一个程序文件编译没有错误,但是实际功能测试中出现一部分功能正常,一部分完全不

问题描绘:之前编译的程序,实践功用测验都正常,新加入了一个程序文件编译没有过错,可是实践功用测验中呈现一部分功用正常,一部分彻底不正常,类似于重启的作用。

可能性判别1:编译生成的main.o没有被彻底从nandflash中copy到sdram中运转。
剖析head.s文件,也即硬件初始化进程,nandflash的4k由硬件主动从nandflash仿制到sram中,然后有一个仿制4k的sram到sdram中,可是nandflash中4k今后的就没人管了哦!!!因而需求一个函数copy nandflash的4k今后的代码到sdram中。

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

首要head.s 代码如下,其他代码能够依据调试信息增加即可难度下降:

@******************************************************************************
@ File: head.S
@ 功用: 设置SDRAM,将程序仿制到SDRAM,然后跳到SDRAM持续履行
@******************************************************************************

.extern main
.text
.global _start
_start:
@******************************************************************************
@ 中止向量,本程序中,除Reset和HandleIRQ外,其它反常都没有运用
@******************************************************************************
b Reset

@ 0x04: 未定义指令间断形式的向量地址
HandleUndef:
b HandleUndef

@ 0x08: 管理形式的向量地址,经过SWI指令进入此形式
HandleSWI:
b HandleSWI

@ 0x0c: 指令预取停止导致的反常的向量地址
HandlePrefetchAbort:
b HandlePrefetchAbort

@ 0x10: 数据拜访停止导致的反常的向量地址
HandleDataAbort:
b HandleDataAbort

@ 0x14: 保存
HandleNotUsed:
b HandleNotUsed

@ 0x18: 中止形式的向量地址
b HandleIRQ

@ 0x1c: 快中止形式的向量地址
HandleFIQ:
b HandleFIQ

Reset:
ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需求设好栈
bl disable_watch_dog @ 封闭WATCHDOG,不然CPU会不断重启
bl clock_init @ 设置MPLL,改动FCLK、HCLK、PCLK
bl memsetup @ 设置存储控制器以运用SDRAM
bl init_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,关于本试验,这是足够了
bl CopyCode2SDRAM @ 调用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:
b halt_loop

HandleIRQ:
sub lr, lr, #4 @ 核算回来地址
stmdb sp!, { 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:
ldmia sp!, { r0-r12,pc }^ @ 中止回来, ^表明将spsr的值仿制到cpsr

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/262904.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部