adr与ldr区别(Mini2440裸机程序阐述)

Win7 64 ADS1.2 编译弹出Error: L6218E: Undefined symbol sprintf (referred from 2440...) 软硬件平台:WIN7 x64  ADSv1.2 Mini2440 JLink8.0 J-link ARM V4.08l   调试小程序一般不会出现什么问题,但是调试国嵌和友善光盘中的myled...程序会出现问题   Make 和Run Project的时候提示错误,错误信息如下:   Warning : L6301W: Could not find file C:\Program 阅读详情

有关概念

首先arm地址有几个地址概念:编译地址、期望运行物理地址、实际运行物理地址、位置无关、位置相关

编译地址 :编译阶段的生成地址,其是相对地址 ,有些地址还没确定,如调用其他.O文件中的函数或库函数
期望运行物理地址 :链接阶段生成的地址(期望绝对地址 ),会确定编译阶段没有确定的地址,并会根据链接器假设期望的程序烧录运行物理启始地址 ,来分配期望运行物理地址;*1*
实际运行物理地址 :当程序被烧写到系统后,实际加载运行时的地址(实际绝对地址 ),又有一个实际的程序烧录运行物理启始地址,这个时候进行相应的转换得到实际运行物理地址
位置无关 :和实际烧写运行的地址无关
以上转载自http://blog.sina.com.cn/s/blog_76894ccd01014xwm.html

注*1*:这里有点错误:

1)这里如果使用脚本一般会生成运行地址(0xb0004000),不一定是物理地址;因为这个有CPU负责,CPU并不知道是虚拟地址还是物理地址,所以要看开启MMU没有,没有开启就是物理地址,开启之后就要经过MMU经过va->pa的转换,才能正确寻址到正确地址。

 2)另外这里会将程序放到指定的位置(AT(2048)),就是烧到nand后的地址,这个地址是相对于nand而言,跟cpu没有关系,,在nand4k的代码会有片内芯片自动复制到sram中进行执行

如下脚本

SECTIONS {
  firtst    0x00000000 : { head.o init.o }
  second    0xB0004000 : AT(2048) { leds.o }
}

3)一般来说在没有启用MMU时,这时候主要考虑位置相关地址和位置无关地址的指令如何执行

4)在2440使用nand启动的代码执行流程:复制nand中前面4k->片内芯片sram执行4k代码->复制4k代码到SDRAM->从sdram执行

这里面就牵涉到位置相关与位置无关地址的问题,因为在4k代码要保证在任何地方执行,所以使用位置无关的指令,而ldr就是位置相关代码

代码分析

在使用sdram之前,肯定要初始化存储控制器,下面的例子就牵涉这些,看下面代码

这里使用的是adr r0, mem_cfg_val ,反汇编代码对比

这时候r0=0x70,正好指向mem_cfg_val所指向的地址,说明使用adr是正确的

在修改为ldr r0, =mem_cfg_val之后,看如下汇编代码

看到此时r0代码指向地址[0xa8]=ela00000并不是所希望的地址0x70,而是是一条空指令。

这里初次调试没有在意!!,看下面 

这里进过再次调试,发现原来[0xa8]=0x70,汇编指令里就自动生成了这个地址,如下

但是这里调试之后,并不能执行程序中led的点亮,why??,这是因为在程序运行的时候根本无法定位0x30000070这个地址,因为sdram这时候并没有初始化,就无从淡起这个地址0x30000070,所以应该使用无关地址

这里为什么使用的是位置无关指令adrl/adr??

如何界定哪里需要使用相对寻址(位置无关) 与绝对地址(位置相关)??

当我代码在4k之内就跳到sdram时,这时候也可以使用位置无关代码,还是必须使用相对地址, 如ldr这种指令??

在4k之内,比如3096时,此时已经跳到sdram,这时候sdram假设是从30000000+3096时执行,这个时候是否意味只能使用ldr这种绝对地址的指令??

估计以上的问题有几个已经清楚了,下面继续看 

首先从以上代码我就看出来了,adr是基 当前pc+偏移的寻址;而ldr是伪指令,是大范围的地址读取指令,当有“=”时,表示伪指令,就是从那个地址读取数据,否则就是地址读取指令,下面代码会进行阐述

修改为ldr r0, mem_cfg_val,反汇编得到的代码如下

这时候看到是取0x70里面的值,而此时我只是取其地址,所以并不正确

综上所述

1. 4k之内跟地址有关一般使用无关性指令,比如b/bl、adr/adrl...,这是因为要保证任何位置都能执行
2. 使用sdram时(一般都是大于4k),这时候在4k之内有些变量并不一定能执行,因为有些位置相关地址这时候并不一定存在那个地址处, 而adr的寻址空间只有前后4kb,ldr就没有这些要求,当然使用adrl可以>4k(b/bl可以跳转前后32m)
 

韦东山视频实验之Input子系统分析之一 原理阐述:主要有驱动层,input核心层,时间处理层,应用层                  从前往后一直传送到应用层   调试问题: 1. Unspecified device as /devices/virtual/input/input0 在里面初始化的时候,初始name即可 加入 button_dev->name = "mini2440_keys";之类的即可   2. 阅读详情

相关推荐

韦东山视频实验之USB鼠标驱动—OOPS错误分析

先将上节的代码 #if 1  usb_buffer_alloc(usbdev, len, GFP_ATOMIC, &usb_dma_buff_phys_addr);   //初开始没有给bus_buff赋值,导致内核引用出现错误 #else  usb_buff = usb_buffer_alloc(usbdev, len, GFP_ATOMIC, &usb_dma_buff_phys_a

行者 2332

一个实用的MemroyDump函数

自己编写的一个实用方便的查看内存状态的Debug函数。可查看程序内的任意地址的内存状态。 void MemDmp(const void *adr, int len) { const char *hex_ch = "0123456789ABCDEF"; const char *fmt = "[%08X] %.8s %.8s %.8s %.8s * %.16s

Coder in Tokyo 1391

Win 7 64 Mini2440 使用ADS1.2配置步骤和问题解决方法

软硬件环境:Win7 64  Mini2440  JLink8.0   ADS1.2 J-LinkV4.08l  ADS的配置: 1. 新建工程      使用CodeWarrior编译首先要新建工程,然后新建或者添加已有文件将其添加到当前工程或者使用已经存在的工程 2. CodeWarrior设置     打开CodeWarrior,选择Edit菜单,打开DebugRelSetting

行者 2126

ARM的step内存到SDRAM内存代码复制程序调试之罪魁祸首 ADR与LDR

start.S启动的汇编代码#define S3C2440_MPLL_200MHZ ( (0x5C#define MEM_CTL_BASE   0x48000000 .text.global _start_start: /*1关看门狗*/ mov r0,#0x53000000 mov r1,#0 str r1,[r0] /*2设置时钟*/ ldr r0,=0x4C000014 mov r1,#

伍宝哥的专栏 731

韦东山视频实验之USB鼠标驱动

usb 设备主要涉及配置-》接口-》端点,基本上是包含关系 usb设备主要使用接口提供的配置信息,可以当做操作的逻辑设备和传输通道 传输数据采用urb   如何测试 1. make menuconfig去掉原来的USB鼠标驱动 -> Device Drivers   -> HID Devices   2. make uImage 并使用新的内核启动 3. insmod u

行者 2071

韦东山视频实验之虚拟网卡

遇到的问题 1.调试老是弹出以下问题  /home/smb/pro/16th_virtnet/virtnet.c: In function 'emulator_rx_packet': /home/smb/pro/16th_virtnet/virtnet.c:48: error: dereferencing pointer to incomplete type /home/smb/pro/1

行者 1756

c语言读取c盘文件,C语言从磁盘上读取数据解决办法

Assembly code.............;以下读每一个扇区,StartRead:mov ax, [SectAdr]mov es, ax ; es:bx,段地址mov bx, [MemAdr] ; es:bx,偏移地址mov dl, 0h ; 驱动器号mov dh, [BeginSide] ; 读写头号mov ch, [BeginTrack] ...

weixin_39932330的博客 1435

从‘全步’到‘微步’:一张图看懂步进电机细分控制,选对模式让你的项目更丝滑

本文深入解析步进电机细分控制技术,从全步到微步的演进过程,帮助工程师根据项目需求选择最优控制模式。通过对比不同细分等级的性能特点和应用场景,提供3D打印、实验室自动化等领域的黄金配置方案,实现更精准、平稳的电机控制效果。

weixin_29290259的博客 471

ARM的几个地址概念以及adr,ldr寻址

一.首先熟悉几个arm地址相关的概念: 首先arm地址有三个地址概念:编译地址、 期望运行物理地址、实际运行物理地址、相对地址、绝对地址、位置无关 编译地址 :编译阶段的生成地址,其是相对地址 ,有些地址还没确定,如调用其他.O文件中的函数或库函数 期望运行物理地址 :链接阶段生成的地址(期望绝对地址 ),会确定编译阶段没有确定的地址,并会根据链接器假设期望的程序烧录

记录点滴,静心学习 1046

CISP-PTE八套真题详解(侵删)_cisp-pte 考题与答案,万字长文轻松彻底入门Flutter

接下来就是代码审计了isset()函数用于检测变量是否已设置并且非 NULL代码中base64解码出来是一个base64的一句话木马根据代码,需要我们提交一个Hello参数,参数的值为多少都行,然后我们可以通过提交z0参数的base64值进行执行命令先用phpinfo();试一下:发现执行成功那么直接写个查看key文件的系统命令(记得最后要加分号)在源代码中找到key。

2401_83947398的博客 4677

高通9008模式隐藏技巧:不拆机用ADB命令+Diag协议进入EDL

本文深入解析高通EDL模式(紧急下载模式)的技术原理与实战应用,详细介绍了通过ADB命令和Diag协议无需拆机进入EDL的方法。涵盖硬件/软件触发方案、跨平台工具配置、Firehose协议解析及设备救砖流程,为开发者提供从基础到进阶的完整指南。

weixin_29191761的博客 1132

aiku基于mini2440下裸机程序开发《概述与SDRAM运行》

大家好,我是aiku,今天主要跟大家介绍一些 基于mini2440下裸机程序开发《概述与SDRAM运行》 有什么问题:都可以联系我们,谢谢! 我是aiku,本博客主要写一些我们的项目经验与大家分享,如有问题联系我们aiku的qq:1653687969欢迎加入【创科之龙】技术QQ群 234945702 大家一起交流学习嵌入式。      以前开发arm裸机程序都是在ADS1.2开发环境

aiku嵌入式视频教程【独家+原创教学】 950

YOLOv26与其他目标检测算法的对比分析

本文对YOLOv26与其他主流目标检测算法进行了全面对比分析。YOLOv26在COCO数据集上达到96.0% mAP@0.5和79.0% mAP@0.5:0.95,显著优于其他YOLO系列算法,同时保持85FPS的推理速度和35MB的轻量级模型。相比两阶段算法(如Faster R-CNN),YOLOv26在速度、模型大小和内存占用方面优势明显;相比Anchor-free算法(如CenterNet),YOLOv26在速度和模型压缩方面更优。其核心创新包括动态锚框分配、自注意力机制和轻量级设计,使其成为适用于复

一键难忘的博客 997

ARM保存中断时,为什么使用“sub lr, lr, #4”

1.首先要谈流水线,在arm执行过程中一般分为取指,译码,执行阶段   也就是假设当前                                                                      第一条指令在执行阶段                                                               第二条指令在译码阶段

行者 5048

基于STM32、HAL库、I2C接口的姿态传感器/陀螺仪之ICM-42670-P驱动 C语言程序设计

/ 设置加速度计和陀螺仪的工作模式。// 读取加速度计和陀螺仪数据。

corlin6688的博客 1182

X书x-mini-sig_x-mini-mua

X书的tiny风控代码,成功运行x-mini-sig|x-mini-mua

Codeooo 博客 1万+

韦东山视频之LCD驱动(Mini2440 X35)

说起这块屏幕 可真是费劲 原理图跟别人的好多不一样 时序图也是 lcd上vline 和vframe根本没有 只能通过pci和mck两个时钟进行设置 还有就是不知道是uboot的原因还是友善官网提供的原理图有错 vden必须反转才能正常   先贴出自己调试好的代码 #include #include #include #include #include #include #i

行者 4731

Python经典编程习题100例:第25例:求各个阶乘的和

不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 本人初学Python,只为熟悉语法编写,大神请勿理会 点击下面链接 Python经典编程100例习题汇总 题目描述: 求1+2!+3!+…+20!的和。 解题思路: > 调用math模块中的factorial函数 代码: import math sum=0 for i in range(1,21): sum+=math.factorial(i) print(sum) ..

优快云 精品推荐 2736

定时器与中断触发次序

之前在做触摸屏实验的时候,出现定时器几乎可以同时出现,请看我在论坛发的问题 当初考虑的是定时器是由中断来实现的,在今天看过内核后发现这个是错误的 看一年内核的有关实现 asmlinkage void __init start_kernel(void)(linux-2.6.22.6\init\Main.c)        init_IRQ();   //初始化中断        ...

行者 2568

RK3588开发笔记-MIPI-CSI接口视频解码芯片XS9922B调试

Rockchip RK3588 是一款高性能的处理器,支持多种摄像头接口,包括 MIPI(Mobile Industry Processor Interface)接口。MIPI是一种用于移动设备和嵌入式系统中的摄像头、显示器和其他传感器设备的串行接口标准。MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准。CSI-2(Camera Serial Interface 2)是MIPI 联盟定义的另一种高速接口,主要用于摄像模组和处理器之间的连接。

flypig has a dream! 6866

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Mini2440 裸机实验之LED程序、按键、中断

测试平台:Mini2440 Win7 64 ADS开发环境测试   此程序主要考虑按键、LED点亮、中断模式(IRQ)之间的联系 以下为main.c代码部分,其他请参考三星提供的2440用例代码 #define GLOBAL_CLK 1 #include #include #include"def.h" #include"option.h" #include"2440addr.h" #i

行者 2180

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

win7 64 Mini2440 USB驱动、超级终端、上传工具

一般使用Mini2440这块板子对于Win 7 64来说问题较多 通过网上查阅,终于解决了,希望对有些人有些帮助   驱动和上传工具,请从以下地址下载(谷歌下面的一个开源项目,有代码): http://code.google.com/p/supervivi-transfer-tool/ 注:此工具我测试过,没问题,之前网上提供的有bug   超级终端 网上提供的有很多,比如Secu

行者 2008

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

韦东山视频实验之Input子系统分析之二

应用程序如何read? Input子系统分析之一讲过应用程序去open,那么如何read呢? 搜遍input.c 也没有提供read的函数,有一个可惜不是;那read在哪里定义的呢?想到可能在evdev.c里定义的,先看下他的初始化模块 仍以evdev.c (drivers/input/evdev.c)为基础进行说明: static int __init evdev_init(void

行者 1720

韦东山书中MMU内嵌汇编代码

具体有关指令的请看上一文,或者这个链接提供的说明 http://blog.chinaunix.net/uid-26833883-id-3348379.html     unsigned long ttb = 0x30000000; __asm__( //reset coprocessor register "mov r0, #0\n"

行者 1685

浅谈Linux下select/poll模型

在windows,管理I/O套接字的模型有阻塞和非阻塞两类,linux也一样 windows select模型 在widows下提供了众多非阻塞的I/O模型,如select、WSAAsyncSelect、WSAEventSelect、overlapped、completion port 其中IO completion port(IOCP)提供了较好的伸缩性,应用比较广泛, 说明:而sele

行者 1549
上一篇: 作为一个新人,怎样学习嵌入式Linux?(韦东山)
下一篇: ARM嵌入式开发中的GCC内联汇编__asm__
comwise
博客等级 码龄15年 58粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值