上一次把引导的汇编看完,已经准备C的运行环境,下面就开始学习C的源程序,从start.S文件里到跳文件
lib_arm/board.c里运行.
/*
引导程序从汇编start.S里跳到这里执行。
蔡军生 2005/07/19
*/
void start_armboot (void)
{
/* 声明一个全局指针,它是指向一个数据结构,用于保存参数。
并且它占用r8寄存器,用它来保存内存地址,达到全局使用目的。
*/
DECLARE_GLOBAL_DATA_PTR;
ulong size;
init_fnc_t **init_fnc_ptr;
char *s;
#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
unsigned long addr;
#endif
/* gd指针可写,因为已经分配一个寄存器给它作为变量。
这里就相当于把后面算出来的地址保存到r8寄存器.
*/
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
/* 下面一句是阻止3.4以上版本的GCC进行代码优化,把后面的代码删除掉。 */
__asm__ __volatile__('': : :'memory');
/* 清空gd指向的结构 */
memset ((void*)gd, 0, sizeof (gd_t));
/* */
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
memset (gd->bd, 0, sizeof (bd_t));
monitor_flash_len = _bss_start - _armboot_start;
这一段准备好保存参数的全局变量区.
后面就是一系列的初始化和获取正确的参数.
关键字:ARM开发 汇编 运行环境
引用地址:
学习ARM开发(9)
推荐阅读最新更新时间:2024-11-14 11:24
ARM 常用汇编指令
ARM 汇编程序的框架结构 .section .data 初始化的数据 .section.bss 未初始化的数据 .section .text .global _start _start: 汇编代码 注意: 一般是将上面结构进行简化 .text .global _start _start: 汇编代码 寄存器操作指令: 算术和逻辑指令: MOV :用于将一个寄存器或被移位寄存器或一个立即数移动到目的寄存器 MOV r1 ,#8 (注意:#+数,表示一个十进制数,#+0b数,表示一个二进制数,#+0x数,表示一个十六进制数) MVN :对源操作数取反再赋值给目的寄存器 MOV R1,#8
[单片机]
ARM汇编指令集4
协处理器cp15操作指令: mcr & mrc •mrc用于读取CP15中的寄存器 •mcr用于写入CP15中的寄存器 什么是协处理器? •SoC内部另一处理核心,协助主CPU实现某些功能,被主CPU调用执行一定任务。 •ARM设计上支持多达16个协处理器,但是一般SoC只实现其中的CP15.(cp:coprocessor) •协处理器和MMU、cache、TLB等处理有关,功能上和操作系统的虚拟地址映射、cache管理等有关。 MRC & MCR的使用方法 •mcr{ cond } p15, opcode_1 , Rd , Crn , Crm , { opcode_2 } •opcode_1:对于cp15永远为0 •R
[单片机]
ARM裸机开发bootloader内存初始化
一、从内部看内存 内存由于其访问速度快,访问方式简单成为PC机与嵌入式设备不可缺少的部件。 1、内存的分类 内存分为DRAM和SRAM,其中DRAM又包含SDRAM、DDR、DDR2。 DRAM:它的基本部件是小电容,电容可以再两个极板上保留电荷,但是需要定期的充电(刷新),否则数据就好丢失。缺点:要进行不断的刷新才能保持数据,存取速度较慢。 SRAM:它是一种具有静止存取功能的内存,不需要定期刷新电路就能保持它们内部存储的数据。其优点:存取的速度快;但是缺点是:功耗大,成本高。常用于存储容量不高,但存取速度快的场合,比如stepping stone。 DRAM的分类:在嵌入式系统中,除了CPU内部的垫脚石采用SRAM外,
[单片机]
LED的使用纯汇编和C语言的点亮
概述 我们通过观察原理图可以发现LED灯有四个分别连接在GPM4_1, GPM4_2, GPM4_3 GPM4_4上面,这时候我们去查询我们板子4412的说明书,去寻址寄存器的配置 初始化的时候我们需要将他配置为输出模式,同时我们观察下面的电路可以发现,他需要输出低电平,来使led亮 #define GPM4BASE 0x11000000 #define GPM4CON 0x02E0 #define GPM4DAT 0x02E4 #define UDELAY 0x43e2647c #define N 5000000 .text .align 2 .global _start _start: mo
[单片机]
影响CPSR状态寄存器的ARM汇编指令总结
最近学习了ARM寄存器寻址方式和ARM指令,现在总结如下: 1、影响CPSR状态寄存器的ARM汇编指令 (1)、带S的指令有 MOVS-- 数据传送指令(只能用在寄存器和寄存器之间) MVNS-- 数据传送指令(和mov区别是,不仅进行数据传输,还进行数据取反) ADDS-- 加法指令 SUBS-- 减法指令 MULS-- 乘法指令 ANDS-- 逻辑与指令(相同是1,不同是0,区别 按位与TST 指令) ORRS-- 逻辑或指令(不同是0,相同是1,区别 按位与TST 指令) BICS-- 设置某一位为1 (2)、另外两个指令 CMP-- 比较指令 TST-- 安位与指令
[单片机]
学习ARM反汇编工具objdump和一个简单实例
1、反汇编的原理&为什么需要反汇编 arm-linux-objdump -D led.elf led_elf.dis objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf 格式的可执行程序,来反过来得到汇编源代码。 -D表示反汇编。 左边的是ELF的可执行程序(反汇编时候的原材料) 右边的是反汇编生成的反汇编程序。其实就是一个汇编语言。 一般情况下我们写一个源代码 类似于我们WINDOW里面是EXE的格式,PE格式是官方的名字。 2、为什么我们需要进行反汇编,我们要的就是可执行程序。 反汇编的原因有以下: 1、逆向破解 你想盗版的原来的程序,最终得到程序的源代码。 2、调式程序的时候
[单片机]
单片机电子密码锁程序设计(汇编语言)显示*号
制作出来的电子密码锁实物图如下: 电路原理图如下: (1)本设计为了防止密码被窃取要求在输入密码时在LCD屏幕上显示*号。 (2)设计开锁密码位六位密码的电子密码锁。 (3)能够LCD显示在密码正确时显示PASSWORD OK,密码错误时显示PASSWORD ERROR,输入密码时显示INPUT PASSWORD。 (4)实现输入密码错误超过限定的三次电子密码锁定。 (5)4×4的矩阵键盘其中包括0-9的数字键和A-F的功能键 (6)本产品具备报警功能,当输入密码错误时蜂鸣器响并且LED灯亮。 (7)密码可以由用户自己修改设定(只支持6位密码),修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。 单
[单片机]
基于Proteus的SPI接口的设计与实现
引 言 现在,人们生活中的每个角落都有嵌入式设备的存在,比如DVD、移动电话、MP3及掌上电脑等等。这些嵌入式设备多采用32位RISC嵌入式处理器作为核心部件。其中基于ARM核的嵌入式处理器独占鳌头,在32位RISC处理器中占据超过75%的市场份额。因而越来越多的电子爱好者都加入了学习ARM的队伍中。通过和一般单片机系统开发过程的比较不难发现,嵌入式系统的设计包括硬件设计和软件设计两个方面,其调试过程包括软件调试、硬件测试、系统调试3个过程。软件调试一般比较容易进行,但是硬件测试和系统调试则比较麻烦,因为要进行这两个过程必须在 PCB制作、元器件焊接完毕之后才能进行;而PCB的制作、元器件的焊接是非常费时费力的,如果能采用仿真工
[单片机]