当在S3C6410跑操作系统的时候,我们不太会注意S3C6410的内存使用情况,但是,当我们做裸板测试时,该处理器的8K的片内内存的使用就不得不注意,一旦编写的程序大小超过了片内内存的大小,我们就不能得到正确的结果,究其原因,我们先看一下S3C6410的启动过程。
本文引用地址:http://www.eepw.com.cn/article/203124.htm
S3C6410如果选用NANDflash启动,在我们烧写裸板程序是,先将程序烧写至NANDflash中,S3C6410通过硬件将NANDflash中前8K的程序完整复制到S3C6410片内内存中。若裸板程序较小,程序可以正常运行,若果程序超过了8K,那么裸板测试程序不能完整的复制到片内内存,使得程序出现未知的结果。这时,我们需要关注S3C6410的各种内存的使用情况了。
我们知道,在一个程序文件中,拥有代码段、数据段和bss段,而一个程序的bin文件中是没有bss段,因此,在程序的bin文件中主要完成:
①硬件的初始化
②DDR的初始化
③S3C6410程序的重定位
④拷贝程序至DDR中
⑤清除DDR中bss段
⑥程序链接至DDR中
为进一步说明启动过程,现在进行详细的说明:
S3C6410为NANDflash启动,同时S3C6410外挂DDR,这样,就能解决程序超过8K之后的正常运行。三者之间的连接示意图如下图所示:
我们知道,S3C6410启动的时候,将NANDflash中前8K的程序完整拷贝至S3C6410片内内存中,在这8K程序中,必须完成硬件初始化、DDR初始化和程序从NANDflash中拷贝到DDR中,这样才能保证S3C6410cpu程序可以跳转到DDR,保证程序的顺利进行。在这过程中会涉及到程序的链接地址和程序的重定位方面的知识,如果你对这方面知识不熟悉,请查阅该方面的知识。
三者之间的操作步骤如下:
1、系统上电,S3C6410为NANDflash启动,硬件自动将NANDflash中前8k的程序复制到S3C6410片内内存中;
2、系统从S3C6410片内内存0地址开始执行,此时程序需要完成DDR初始化、将bin程序从S3C6410片内内存或者NANDflash拷贝到DDR链接地址起始位置;
3、将NANDflash程序拷贝到DDR中,通过程序重定位和链接到DDR链接地址开始位置(此时注意,在程序的编写中需要用位置无关跳转指令进行编写,否则程序会因为跳转后找不到链接起始地址和变量而出现错误)
4、当系统完成以上操作后,通过位置相关指令将PC值链接到DDR重定位位置,完成程序的运行(注意此时应使用位置相关指令完成PC值的跳转,若使用位置无关指令,则程序一直循环在S3C6410片内内存中)。
注意:
s3c6410启动时自动拷贝nand flash前4页的内容到片内内存执行,而且拷贝时只拷每页中的前2KByte好像是为了兼容2k页的 所有copy2ddr函数中不要把所有数据全部照搬过去,只搬每页的前2k到ddr连接起来 。可以参考“百问网6410第1期Nand flash的问题”修改nand_read函数!
关键字:OK6410 启动分析
引用地址:
OK6410启动分析
推荐阅读最新更新时间:2024-03-16 16:15
UCC2870初级控制反激式电源控制器启动性能分析
UCC2870 0器件是一款初级控制反激式 电源控制器 ,支持恒压与恒流调整。该器件不仅可针对电压及电流调整提供高分辨率,而且还具有极低的无负载功耗以及良好的启动性能,非常适合低功耗适配器及辅助电源应用。与同类竞争产品相比, UCC2870 0器件不仅具有更好的性能,而且所需的VDD电容器容量更小。客户可能遇到过 UCC2870 0器件无法启动恒流满负载、但可启动电阻满负载的情况。其真正的原因是VDD电容器的值不够,而且初级峰值电流设计得太小。本文将探讨初级峰值电流和VDD电容器的设计,并将用实验结果验证理论分析。 1.介绍 UCC28700是一款恒压、恒流反激式控制器,无需使用光耦合器便可实现一
[电源管理]
ARM启动代码的分析
估计以后会忘记,所以记下来。 一上电,硬件自动把NandFlash中的前4K数据拷贝进片内的SRAM。开始执行指令 @************************************************************************* @ File:head.S @ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行 @************************************************************************* .equ MEM_CTL_BASE, 0x48000000 @定义存储控制器的起始地址 .e
[单片机]
OK6410按键中断点亮lED
首先理清楚要准备的几个方面 1.LED初始化 2.按键初始化 3.中断初始化 4.中断处理程序 首先初始化LED,以前说过了,不说 按键初始化,这里既然要用到中断,就不用传统的延时消抖的办法了,直接用中断。 只要把对应的位设置成10,就是外部中断了 这里用XEINT0和XEINT5,有理由的,为什么选这两个后面会说 void button_init() { *(GPNCON)=0x802; //配置按键位外部中断 } 接下来中断初始化,一下说的比较清楚了,寄存器的名字直接在s3c6410里面查找就可以了,为什么选XEINT0和XEINT5的原因在注释最长的那一行里面
[单片机]
LPC2114启动代码分析
LPC2114启动代码的编写主要包括: 1.异常向量表的建立 2.MCU各种模式堆栈的初始化 3.系统基本的初始化工作 下面分别进行介绍. (一)ARM相关指令及伪指令 LDR PC,ResetAddr 将ResetAddr标号地址所指的内容传送给PC寄存器 LDR PC,=ResetAddr 将ResetAddr标号地址传送给PC寄存器 ResetAddr DCD ResetInit 为ResetAddr分配一个字的地址空间,以ResetInit初始化,即ResetAddr地址所指的内容为ResetInit标号地址 SvcStackSpace Space SVC_S
[单片机]
s3c2410汇编启动代码与中断跳转分析
最开始的代码,大家都很熟悉 ,最基本的中断跳转 b ResetHandler b HandlerUndef ;handler for Undefined mode b HandlerSWI ;handler for SWI interrupt b HandlerPabort ;handler for PAbort b HandlerDabort ;handler for DAbort b . ;reserved b HandlerIRQ ;handler for IRQ interrupt b HandlerFIQ ;handler for FIQ interrupt 跳转的标号是一系列的宏 LTORG HandlerFIQ
[单片机]
从STM32F4的库函数分析如何实现点亮一个LED(代码启动)(二)
这部分的启动代码,主要是将堆栈进行初始化,中断向量表以及中断函数进行定义。 这里将启动文件拆分出来进行理解。 Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp 这里将申请一段栈空间,AREA意思为申请的空间名为STACK,不对其进行初始化,可读可写,以三字节进行偏移,栈大小为 0x400 ; h Heap Configuration ; o Heap Size (in Bytes) 0x0-0xFFFFFFFF:8 ;
[单片机]
stm32调试模式下运行正常,上电自启动后运行不正常排查分析
最近用到STM32F103的芯片,芯片单步正常,直接上电不能正常工作,加上程序中里面有点bug.然后就各种莫名奇妙。 后面,单步状态把bug找完之后,理论上上电就可以正常跑了。但是总会出现莫名其面的问题。 比如,①单步正常,直接跑就异常。 ② 异常指的是程序不是死机或者hardfault而是不按照预想的逻辑,但是还是看似正常的运行。 ③用镊子复位,其可以正常起来, 百度了一下:https://blog.csdn.net/weibo1230123/article/details/80664466 多数是查时钟复位电源,但是无效。最后发现是外设启动慢导致的。 首先,明白一个道理,单步逻辑对的,那么程序就是对的
[单片机]
ARM多核处理器启动过程分析
说明: 该流程图按照代码执行时间顺序划分为4部分: 1. Bootloader在图片上半部,最先启动; 2. Kernel在图片下半部,由bootloader引导启动; 3.CPU0执行流程在图片左半部,bootloader代码会进行判断,先行启动CPU0; 4. Secondary CPUs在图片右半部,由CPU唤醒 具体启动流程如下: 1. 在bootloader启动时,会判断执行代码的是否为CPU0,如果不是,则执行wfe等待CPU0发出sev指令唤醒。如果是CPU0,则继续进行初始化工作。 mrs x4,mpidr_el1 tst x4,#15
[单片机]