app开发者平台在数字化时代的重要性与发展趋势解析
808
2022-10-14
嵌入式学习-mini2440启动相关
mini2440启动模式:
Nor Flash启动:Supervivi (类似于BIOS程序)
Nand Flash启动:Supervivi + Kernel + RootFS
JLink烧写文件到开发板:1.JLink烧写Nor Flash 2.JLink烧写Nand Flash
JLink烧写Nor Flash
1.开发板跳线打到Nor,接上JLINK,插在底板的JTAG插座上,JLINK另一头接PC的USB接口,开发板上电。
2.打开J-Flash ARM工具(开始->SEGGER->J-Link ARM V4.02->J-Flash ARM)
3.File->Open Project,打开s3c2440a_embedclub.jflash
4.Options->Project settings...
5.Target->connect
6.File->open 打开需要-的映像文件,比如u-boot.bin,但是这里需要注意,这里支持的格式为.bin,所以如果-supervivi-128M,需要修改后缀为supervivi-128M.bin(注意这里的supervivi请一定使用橙色光盘Mini2440光盘中的\images\linux\supervivi-128M,直接改名为supervivi-128M.bin)
7.Target->Program
弹出-对话框,直接输入:0,后面确认即可(先擦除再烧写)
8.烧写成功,断电,取消JLINK,再重新上电,在超级终端中将显示打印信息
-u-boot.bin后打印信息:
JLink烧写Nand Flash
JLink的JTAG排线插上开发板的JTAG插座上,注意排线的方向。JLink另一端,可以通过USB延长线,连接到PC的USB插口上。开发板上电。使用的文件为init.bin、u-boot.bin_openjtag、u-boot.bin
0.打开J-Link Commander
具体方法:开始->所有程序->SEGGER->J-Link ARM V4.02->j-Link Commander
在J-Link Commander命令行中,依次执行下面步骤:
1.在J-Link Commander命令行中输入:r
//这一步为了避免提示CPU is not halted!的错误,正确找到CPU,可以多输入几次r,回车
2. speed 12000 //设置TCK为12M,提高-速度
3.-并运行init.bin,用来初始化SDRAM
如果准备烧写Nand Flash,则将跳线打到Nand Flash
loadbin e:\init.bin 0
//这个是Jlink特制的初始化SDRAM的代码,-到Nand Flash前4KB处
setpc 0
//设置pc值为0
g
//运行
4.-u-boot.bin_openjtag至SDRAM并运行
h
loadbin e:\u-boot.bin_openjtag 0x33f80000
//u-boot.bin_openjtag为JLink特制的u-boot.bin
setpc 0x33f80000
g
//运行
这个时候,u-boot.bin_openjtag已经在SDRAM中的0x33f80000开始运行了
在超级终端可以看到u-boot.bin_openjtag启动消息
5.-u-boot.bin至SDRAM
在J-Link Commander命令行中输入:h
loadbin e:\u-boot.bin 0x30000000
g
//u-boot.bin被加载到SDRAM的0x30000000中
//图中u-boot.bin_utu2440为杨创开发板提供的u-boot.bin
6.通过u-boot.bin_openjtag将u-boot.bin烧写到Nand Flash
在超级终端输入:
nand scrub //擦除整个Nand Flash
输入y,按下回车键,确认擦除
//nand erase 0 30000 //擦除从0地址开始的大小为0x30000(192KB)的Nand Flash 扇区
//nand write.jffs2 30000000 0 30000 //把前面-到0x30000000的程序烧写Nand Block 0 --》手册上教程
按照图片上的步骤是正确的
安装BootLoader程序至Nor Flash -->使用JLink烧写Supervivi到Nor Flash
1.打开J-Flash ARM工具(开始->SEGGER->J-Link ARM V4.02->J-Flash ARM)
2.File->Open Project...,打开打开s3c2440a_embedclub.jflash
4.Options->Project settings...
5.Target->connect
6.File->open 打开需要-的映像文件,比如supervivi-128M.bin,但是这里需要注意,这里支持的格式为.bin,所以如果-supervivi-128M,需要修改后缀为supervivi-128M.bin
7.Target->Program
弹出-对话框,直接输入:0,后面确认即可(先擦除再烧写)
8.烧写成功,断电,取消JLINK,再重新上电,在超级终端中将显示打印信息
ARM裸机程序--> -2440test.bin至SDRAM
SuperVivi-USB-Transfer-Tool + USB- + Supervivi(d选项)
1.Supervivi(d选项) -运行
2.USB连接,打开SuperVivi-USB-Transfer-Tool ,通过SuperVivi-USB-Transfer-Tool 上传文件
起始地址:0x30000000
-Linux系统
使用Supervivi安装Linux系统
1.Supervivi(f选项) :格式化nand flash
2.Supervivi(v选项):通过SuperVivi-USB-Transfer-Tool-Supervivi
3.Supervivi(k选项):通过SuperVivi-USB-Transfer-Tool-内核
4.Supervivi(y选项):通过SuperVivi-USB-Transfer-Tool-根文件系统
5..Supervivi(b选项):启动系统 或跳线跳到nand flash启动模式
等待学习
串口传输文件
-WinCE
-Android
裸机开发:
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
通过JLink实现MDK工程搭建与在线调试章节:
创建工程->工程路径->选择设备(samsung S3C2440A)->不拷贝startup code->向工程中添加源文件
输入源文件asm.s->保存后输入文件名asm.s->将asm.s添加到工程中->对工程进行配置
AREA asm,CODE,READONLYENTRYstartMOV R0,#10MOV R1,#10ADD R0, R0, R1NOPEND
切换到Output标签下->项目输出文件夹设置为当前工程目录下的obj文件中,和JTAG调试时配置文件有关联,见下文Ext_RAM.ini文件
切换到Linker标签下->取消勾选Use Memory Layout from Dialog
注:Scatter File也可以用于指定R/O Base和R/W Base参数值。在该工程中用默认值,删去Scatter File的指定的文件
使用仿真器:Debug选项->Use Simulator -> 编译
使用JTAG:连接好硬件->使用J-Link Commander查看硬件状态
配置工程-> Linker标签下->删除R/O Base和R/W Base的值,并在Scatter File加入RuninRAM.sct文件->Debug标签下->Use J-LINK/J-TRACE并去除Update Target before Debugging的勾选
Utilities标签->使用J-LINK/J-TRACE
RuningRAM.sct文件
; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* ; Run in RAM LR_ROM1 0x30000000 { ; load region 加载地址0x30000000->SDRAM的地址 ER_ROM1 0x30000000 0x0800000 { ; load address = execution address 执行地址0x30000000 大小0x0800000 *.o (asm, +First) //asm是汇编代码段 *(InRoot$$Sections) .ANY (+RO) } RW_RAM1 0x30800000 0x0800000 { ; RW data .ANY (+RW +ZI) } RW_IRAM1 0x40000000 0x00001000 { .ANY (+RW +ZI) }
}
Ext_RAM.ini添加到Debug的Initialization File中
/******************************************************************************/ /* Ext_RAM.INI: External RAM (SDRAM) Initialization File */ /******************************************************************************/ // <<< Use Configuration Wizard in Context Menu >>> // /******************************************************************************/ /* This file is part of the uVision/ARM development tools. */ /* Copyright (c) 2005-2008 Keil Software. All rights reserved. */ /* This software may only be used under the terms of a valid, current, */ /* end user licence from KEIL for a compatible version of KEIL software */ /* development tools. Nothing else gives you the right to use this software. */ /******************************************************************************/ FUNC void SetupForStart (void) { //
axf是arm的调试文件,一般在针对arm调试过程中使用的文件, 不过通过专门工具也能直接将其中的真正代码部分(即axf中除了前后调试部分信息外的部分)烧写到flash中。 所以,有时候axf也称为镜像文件。
1).axf文件=调试信息+.bin文件
Axf文件由ARM编译器产生,除了包含bin的内容之外,还附加其他调试信息, 这些调试信息加在可执行的二进制数据之前。 调试时这些调试信息不会-到RAM中,真正-到RAM中的信息仅仅是可执行代码。 因此,如果ram的大小小于axf文件的大小,程序是完全有可能在ram中调试的, 只要axf除去调试信息后文件大小小于ram的大小即可。
调试信息有以下作用: 1.可将源代码包括注释夹在反汇编代码中,这样我们可随时切换到源代码中进行调试。 2.我们还可以对程序中的函数调用情况进行跟踪(通过Watch & Call StackWindow查看)。 3.对变量进行跟踪(利用Watch & Call Stack Window)。
调试信息虽然有用,但程序功能实现后,在目标文件和库中减少调试信息却是非常有益的。 减少调试信息可减少目标文件和库大小、加快链接速度、减小最终镜象代码。 以下几种方法可用来减少每个源文件产生的调试信息: 1.避免在头文件中条件性使用#define,链接器不能移除共用的调试部分,除非这些部分是完全一样的。 2.更改C/C++源文件,使#included包含的所有头文件有相同顺序。 3.尽量使用数量较多的小头文件而不是较大的单一头文件,这有利于链接器获取更多的通用块。 4.程序中最好只包含必须用到的头文件。避免重复包含头文件,可使用编译器选项–remarks来产生警告信息;
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
汇编与C混合编程
;汇编程序调用C函数 ;汇编程序调用C程序g()计算5个整数i, 2*i, 3*i, 4*i, 5*i的和 ;本程序使用5个参数,分别使用寄存器R0存储第一个参数,R1、R2、R3分别存储第二、三、四个参数,第五个参数利用堆栈传送 ;函数返回值保持在R0中
工程配置和汇编程序一样
/********************************************************************************************** File: casm_test2.c* Author: Hanson * 嵌入式家园 embedclub.com* 上海嵌入式家园-开发板商城 Desc: c code call asm code example* History: May 16th 2011* *********************************************************************************************/ //C程序g()返回5个整数的和int g(int a, int b, int c, int d, int e){ return (a+b+c+d+e);}
; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* ; Run in RAM
LR_ROM1 0x30000000 { ; load region ER_ROM1 0x30000000 0x0800000 { ; load address = execution address *.o (CAsm_Test2, +First) 代码段名称 *(InRoot$$Sections) .ANY (+RO) } RW_RAM1 0x30800000 0x0800000 { ; RW data .ANY (+RW +ZI) } RW_IRAM1 0x40000000 0x00001000 { .ANY (+RW +ZI) } }
/******************************************************************************/ /* Ext_RAM.INI: External RAM (SDRAM) Initialization File */ /******************************************************************************/ // <<< Use Configuration Wizard in Context Menu >>> // /******************************************************************************/ /* This file is part of the uVision/ARM development tools. */ /* Copyright (c) 2005-2008 Keil Software. All rights reserved. */ /* This software may only be used under the terms of a valid, current, */ /* end user licence from KEIL for a compatible version of KEIL software */ /* development tools. Nothing else gives you the right to use this software. */ /******************************************************************************/
FUNC void Init (void) {
_WDWORD(0x4A000008, 0xFFFFFFFF); // Disable All Interrupts
_WDWORD(0x53000000, 0x00000000); // Disable Watchdog Timer // Clock Setup // FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz _WDWORD(0x4C000000, 0x0FFF0FFF); // LOCKTIME _WDWORD(0x4C000014, 0x0000000F); // CLKDIVN _WDWORD(0x4C000004, 0x00043011); // MPLLCON _WDWORD(0x4C000008, 0x00038021); // UPLLCON _WDWORD(0x4C00000C, 0x001FFFF0); // CLKCON
// Memory Controller Setup for SDRAM _WDWORD(0x48000000, 0x22000000); // BWSCON _WDWORD(0x4800001C, 0x00018005); // BANKCON6 _WDWORD(0x48000020, 0x00018005); // BANKCON7 _WDWORD(0x48000024, 0x008404F3); // REFRESH _WDWORD(0x48000028, 0x00000032); // BANKSIZE _WDWORD(0x4800002C, 0x00000020); // MRSRB6 _WDWORD(0x48000030, 0x00000020); // MRSRB7
_WDWORD(0x56000000, 0x000003FF); // GPACON: Enable Address lines for SDRAM }
// Reset chip with watchdog, because nRST line is routed on hardware in a way // that it can not be pulled low with ULINK
_WDWORD(0x40000000, 0xEAFFFFFE); // Load RAM addr 0 with branch to itself CPSR = 0x000000D3; // Disable interrupts PC = 0x40000000; // Position PC to start of RAM _WDWORD(0x53000000, 0x00000021); // Enable Watchdog g, 0 // Wait for Watchdog to reset chip
Init(); // Initialize memory LOAD obj\CAsm_Test2.axf INCREMENTAL // Download program PC = 0x30000000; // Setup for Running
//g, main // Goto Main
;C 语言调用 汇编程序
通过C语言程序调用汇编子程序字符串拷贝函数
公共文件
inc文件夹包括2440addr.h、2440lib.h、2440slib.h、Def.h、Memcfg.inc、Option.h
src文件夹包括2440init.s、2440lib.c、2440slib.s、S3C2440A.s
ReadMeCommon文件内容:
============================================================================================= 调试命令文件(INI)用于使用软件仿真和联机测试时,以下是几个常用的命令,用户可以根据调试需要来写自己的调试命令文件. pc=0x30000000 令PC指向0x30000000处;(例程在RAM中运行时可指向0x30000000,如果在Flash中运行则指向0x000) map 0x4c000000, 0x53000020 READ WRITE exec 指定某段存储区域的属性为可读,可写,可执行; Go startaddr, stopaddr 程序从startaddr开始执行,到stopaddr处停止;起始地址都可以缺省. 也可用函数名表示地址例如 G , main
============================================================================================== 分散加载文件(sct)用于加载映像文件到存储空间中,MDK可根据存储设置自动生成,复杂应用程序则需要自行编写. 以下是在RAM中运行程序的SCT文: LR_ROM1 0x30000000 { ; load region 程序加载区域 ER_ROM1 0x30000000 0x0800000 { ; load address = execution address 程序执行地址 *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_RAM1 0x30800000 0x0800000 { ; RW data .ANY (+RW +ZI) } RW_IRAM1 0x40000000 0x00001000 { .ANY (+RW +ZI) } }
以下是在Flash中运行程序的SCT文件:
LR_ROM1 0x00000000 { ; load region 程序加载区域 ER_ROM1 0x00000000 0x0200000 { ; load address = execution address 程序执行地址 *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_RAM1 0x30000000 0x4000000 { ; RW data .ANY (+RW +ZI) } RW_IRAM1 0x40000000 0x00001000 { .ANY (+RW +ZI) } }
本工程配置
ScatterFile选择:common\RuninRAM.sct
; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* ; Run in RAM
LR_ROM1 0x30000000 { ; load region ER_ROM1 0x30000000 0x0800000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_RAM1 0x30800000 0x0800000 { ; RW data .ANY (+RW +ZI) } RW_IRAM1 0x40000000 0x00001000 { .ANY (+RW +ZI) } }
Initization File选择:\common\Ext_RAM.ini
/******************************************************************************/ /* Ext_RAM.INI: External RAM (SDRAM) Initialization File */ SDRAM初始化文件 /******************************************************************************/ // <<< Use Configuration Wizard in Context Menu >>> // /******************************************************************************/ /* This file is part of the uVision/ARM development tools. */ /* Copyright (c) 2005-2008 Keil Software. All rights reserved. */ /* This software may only be used under the terms of a valid, current, */ /* end user licence from KEIL for a compatible version of KEIL software */ /* development tools. Nothing else gives you the right to use this software. */ /******************************************************************************/
FUNC void Init (void) {
_WDWORD(0x4A000008, 0xFFFFFFFF); // Disable All Interrupts
_WDWORD(0x53000000, 0x00000000); // Disable Watchdog Timer // Clock Setup // FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz _WDWORD(0x4C000000, 0x0FFF0FFF); // LOCKTIME _WDWORD(0x4C000014, 0x0000000F); // CLKDIVN _WDWORD(0x4C000004, 0x00043011); // MPLLCON _WDWORD(0x4C000008, 0x00038021); // UPLLCON _WDWORD(0x4C00000C, 0x001FFFF0); // CLKCON
// Memory Controller Setup for SDRAM _WDWORD(0x48000000, 0x22000000); // BWSCON _WDWORD(0x4800001C, 0x00018005); // BANKCON6 _WDWORD(0x48000020, 0x00018005); // BANKCON7 _WDWORD(0x48000024, 0x008404F3); // REFRESH _WDWORD(0x48000028, 0x00000032); // BANKSIZE _WDWORD(0x4800002C, 0x00000020); // MRSRB6 _WDWORD(0x48000030, 0x00000020); // MRSRB7
_WDWORD(0x56000000, 0x000003FF); // GPACON: Enable Address lines for SDRAM }
// Reset chip with watchdog, because nRST line is routed on hardware in a way // that it can not be pulled low with ULINK
_WDWORD(0x40000000, 0xEAFFFFFE); // Load RAM addr 0 with branch to itself CPSR = 0x000000D3; // Disable interrupts PC = 0x40000000; // Position PC to start of RAM _WDWORD(0x53000000, 0x00000021); // Enable Watchdog g, 0 // Wait for Watchdog to reset chip
Init(); // Initialize memory LOAD obj\casm_test1.axf INCREMENTAL // Download program PC = 0x30000000; // Setup for Running
g, main // Goto Main
/********************************************************************************************** File: casm_test1.c* Author: Hanson * 嵌入式家园 embedclub.com* 上海嵌入式家园-开发板商城 Desc: c code call asm code example* History: May 16th 2011* *********************************************************************************************/#include "def.h"#include "option.h"#include "2440addr.h" //#include "2440lib.h"#include "2440slib.h" //void MMU_EnableDCache(); //================================void Isr_Init(void);void HaltUndef(void);void HaltSwi(void);void HaltPabort(void);void HaltDabort(void);void dely(U32 tt){ U32 i; for(;tt>0;tt--) { for(i=0;i<10000;i++){} }} int main(int argc, char **argv){ int i; U8 key; U32 mpll_val=0; i = 2 ; //hzh, don't use 100M! //boot_params.cpu_clk.val = 3; switch ( i ) { case 0: //200 key = 12; mpll_val = (92<<12)|(4<<4)|(1); break; case 1: //300 key = 13; mpll_val = (67<<12)|(1<<4)|(1); break; case 2: //400 key = 14; mpll_val = (92<<12)|(1<<4)|(1); break; case 3: //440!!! key = 14; mpll_val = (102<<12)|(1<<4)|(1); break; default: key = 14; mpll_val = (92<<12)|(1<<4)|(1); break; } //init FCLK=400M, so change MPLL first ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3); ChangeClockDivider(key, 12); //MMU_EnableICache(); //MMU_EnableDCache(); //MMU_DisableICache(); //MMU_DisableDCache(); // Port Init Port_Init(); // ISR init //Isr_Init(); Uart_Init(0,115200); Uart_Select(0); Uart_Printf("\n C code call asm code Test!!!\n"); casm_test1(); while(1);}//===================================================================void Isr_Init(void){ pISR_UNDEF = (unsigned)HaltUndef; pISR_SWI = (unsigned)HaltSwi; pISR_PABORT = (unsigned)HaltPabort; pISR_DABORT = (unsigned)HaltDabort; // rINTMOD = 0x0; //All=IRQ mode //rINTMSK = BIT_ALLMSK; //All interrupt is masked. rINTMOD = 0x0; // All=IRQ mode rSRCPND = rSRCPND; // clear all interrupt rINTPND = rINTPND; // clear all interrupt rINTMSK = BIT_ALLMSK; // All interrupt is masked. rINTSUBMSK = BIT_SUB_ALLMSK; // All sub-interrupt is masked.// External interrupt will be falling edge triggered. rEXTINT0 = 0x22222222; // EINT[7:0] rEXTINT1 = 0x22222222; // EINT[15:8] rEXTINT2 = 0x22222222; // EINT[23:16] // pISR_URXD0=(unsigned)Uart0_RxInt; // rINTMSK=~(BIT_URXD0); //enable UART0 RX Default value=0xffffffff //pISR_FIQ,pISR_IRQ must be initialized // rINTSUBMSK = BIT_SUB_ALLMSK; //All sub-interrupt is masked. <- April 01, 2002 SOP// rINTSUBMSK = ~(BIT_SUB_RXD0); //Enable Rx0 Default value=0x7ff// rINTMSK = ~(BIT_UART0); //Enable UART0 Default value=0xffffffff // pISR_UART0=(unsigned)RxInt; //pISR_FIQ,pISR_IRQ must be initialized}//===================================================================void HaltUndef(void){ Uart_Printf("Undefined instruction exception!!!\n"); while(1);}void HaltSwi(void){ Uart_Printf("SWI exception!!!\n"); while(1);}void HaltPabort(void){ Uart_Printf("Pabort exception!!!\n"); while(1);}void HaltDabort(void){ Uart_Printf("Dabort exception!!!\n"); while(1);}
S3C2440A.s位于Project栏下的Startup目录,是启动文件。其中 AREA RESET, CODE, READONLY 代码段名为RESET,需要加入到srt文件中,如图中的所示。给出了一些芯片相关的宏定义和中断向量表和中断服务代码。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
windows启动和linux的比较:
u-boot编译:
对u-boot进行打补丁:
++是指添加的代码,--是指删除的代码
@@ -34,6 +34,8 @@ 指的是原代码的第34行往下的6行代码改为下面的8行代码,图中没有+开始的为原代码,有+的表示添加的代码
patch -p1 < ../u-boot-1.1.6_jz2440.patch
../u-boot-1.1.6_jz2440.patch 指定了补丁的路径。-p1 由于当前我们在u-boot源码目录下,而补丁文件(如上图蓝色高亮)写明了u-boot-1.1.6这个文件夹,我们需要省略该路径,-p1用于忽略第一个/前面的路径名。(这样路径名就正确了)
配置
编译:book@book-desktop:/work/system/u-boot-1.1.6# make
产生u-boot.bin,即可用于烧写
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~