深入分析S3C2440启动代码中大小端问题

发布者:advancement4最新更新时间:2016-03-03 来源: eefocus关键字:S3C2440  启动代码  大小端 手机看文章 扫描二维码
随时随地手机看文章

一、ADS1.2中关于大小端的设置以及对编译后的代码的影响

下面是一段代码在线段模式下编译,生成的二进制文件的内容
大端模式下编译,生成二进制文件的内容
根据上面的内容可以看出:它们的字节序是相反的,也就是说,ADS1.2中对大小端的设置会影响最终生成的二进制文件的字节序。

二、S3C2440启动代码中与大小管相关的代码

Option.inc中相关代码

 

[plain] view plain copy
 
 print?
  1. GBLL    ENDIAN_CHANGE  
  2. NDIAN_CHANGE    SETL    {FALSE}  
  3.     GBLA    ENTRY_BUS_WIDTH  
  4. NTRY_BUS_WIDTH  SETA    16  

 


2440init.s中相关代码
[plain] view plain copy
 
 print?
  1.     AREA    Init,CODE,READONLY  
  2.   
  3.     ENTRY  
  4.       
  5.     EXPORT  __ENTRY  
  6. __ENTRY  
  7. ResetEntry  
  8.     ;1)The code, which converts to Big-endian, should be in little endian code.  
  9.     ;2)The following little endian code will be compiled in Big-Endian mode.  
  10.     ;  The code byte order should be changed as the memory bus width.  
  11.     ;3)The pseudo instruction,DCD can not be used here because the linker generates error.  
  12.     ASSERT  :DEF:ENDIAN_CHANGE  
  13.     [ ENDIAN_CHANGE  
  14.         ASSERT  :DEF:ENTRY_BUS_WIDTH  
  15.         [ ENTRY_BUS_WIDTH=32  
  16.             b   ChangeBigEndian     ;DCD 0xea000007  
  17.         ]  
  18.   
  19.         [ ENTRY_BUS_WIDTH=16  
  20.             andeq   r14,r7,r0,lsl #20   ;DCD 0x0007ea00  
  21.         ]  
  22.   
  23.         [ ENTRY_BUS_WIDTH=8  
  24.             streq   r0,[r0,-r10,ror #1] ;DCD 0x070000ea  
  25.         ]  
  26.         |  
  27.         b   ResetHandler  
  28.     ]  
  29.     b   HandlerUndef    ;handler for Undefined mode  
  30.     b   HandlerSWI  ;handler for SWI interrupt  
  31.     b   HandlerPabort   ;handler for PAbort  
  32.     b   HandlerDabort   ;handler for DAbort  
  33.     b   .       ;reserved  
  34.     b   HandlerIRQ  ;handler for IRQ interrupt  
  35.     b   HandlerFIQ  ;handler for FIQ interrupt  
  36.   
  37. ;@0x20  
  38.     b   EnterPWDN   ; Must be @0x20.  
  39. ChangeBigEndian  
  40. ;@0x24  
  41.     [ ENTRY_BUS_WIDTH=32  
  42.         DCD 0xee110f10  ;0xee110f10 => mrc p15,0,r0,c1,c0,0  
  43.         DCD 0xe3800080  ;0xe3800080 => orr r0,r0,#0x80;  //Big-endian  
  44.         DCD 0xee010f10  ;0xee010f10 => mcr p15,0,r0,c1,c0,0  
  45.     ]  
  46.     [ ENTRY_BUS_WIDTH=16  
  47.         DCD 0x0f10ee11  
  48.         DCD 0x0080e380  
  49.         DCD 0x0f10ee01  
  50.     ]  
  51.     [ ENTRY_BUS_WIDTH=8  
  52.         DCD 0x100f11ee  
  53.         DCD 0x800080e3  
  54.         DCD 0x100f01ee  
  55.     ]  
  56.     DCD 0xffffffff  ;swinv 0xffffff is similar with NOP and run well in both endian mode.  
  57.     DCD 0xffffffff  
  58.     DCD 0xffffffff  
  59.     DCD 0xffffffff  
  60.     DCD 0xffffffff  
  61.     b ResetHandler  
我们可以看到,在Option.inc将ENDIAN_CHANGE设置FALSE,程序将直接运行b ResetHandler,S3C2440默认是处于小端模式,ADS1.2中的设置默认也是小段模式,一切风平浪静。
现在,我们在ADS1.2中设为打断模式,并把ENDIAN_CHANGE设置FALSE设为TURE,现在问题就来了,请看下面的分析。
在编译程序时,根据ENTRY_BUS_WIDTH宏会将下面三条指令的之一放在0地址处
b ChangeBigEndian     ;DCD 0xea000007
andeq r14,r7,r0,lsl #20   ;DCD 0x0007ea00
streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea
其实这三条指令的功能都是一样,只是根据数据带宽调整了字节序,都是跳转到0x24处的ChangeBigEndian执行,ChangeBigEndian的作用就是通过协处理CP15中的寄存器C1来改变S3C2440的大小端模式。
先来看一下这三条指令。因为我们已经在ADS中设置为大端模式,所以这些指令是以大端模式进行编译的,而S3C2440此时还是小端模式,S3C2440怎么能执行大端模式下的指令呢,比如b ChangeBigEndian     ;DCD 0xea000007???
原因如下:
如果一个基于 ARM 芯片将存储器系统配置为其中一种存储器格式(如小端) ,而实际连接的存储器系统配置为相反的格式(如大端) ,那么只有以字为单位的指令取指、数据装载和数据保存能够可靠实现。其它的存储器访问将出现不可预期的结果。也就就是说在32位模式下,大小端模式对指令取指、数据装载和数据保存没有影响。(注意:如果实际的存储器格式与芯片的存储器格式不符时,只有以字为单位的数据存取才正确,否则将出现不可预期的结果。)
b ChangeBigEndian在大端模式下机器码是0xea000007,这是32位模式下,其四个字节从低到高分别是:07 00 00 ea。那没b ChangeBigEndian这条指令在8位模式下,要被小端模式的S3C2440执行,就要人为的修改为0x070000ea。在存储器中存储的顺序:从低地址到高地址分别是 07 00 00 ea,S3C2440按小端模式取指令时,取得是0xea000007。
b ChangeBigEndian这条指令在16位模式下,要被小端模式的S3C2440执行,就要人为的修改为 0x0007ea00。在存储器中存储的顺序:从低地址到高地址分别是 0007 ea00,S3C2440按小端模式取指令时,取得是0xea000007。
后面修改协处理CP15中的寄存器C1的代码时类似的。
关键字:S3C2440  启动代码  大小端 引用地址:深入分析S3C2440启动代码中大小端问题

上一篇:S3C2440启动代码中应用程序执行环境的初始化
下一篇:对S3C2440裸板程序设计(无操作系统)的抽象

推荐阅读最新更新时间:2024-03-16 14:46

s3c2440 触摸屏(sony x35)
1、触摸屏种类、分别应用在哪里、屏和OS怎么配合使用? 从技术原理来区别触摸屏,可分为5类: 1.电阻式触摸屏 2.电容式触摸屏 3.红外线技术触摸屏 4.表面声波技术触摸屏 5.矢量压力传感技术触摸屏 红外线式和感应电容式触摸屏能够支持多点触控。多点触控带来了更多的选择,抓取、拖曳、缩放、旋转。 屏要和系统搭配才能体现优势。IPHONE和android系统支持多点触控。Windows mobiles不支持多点触控。 2、 触摸屏实现原理 》》电阻屏 》》电容屏 3、从规格书: A/D精度 10bit ,8-channel input; 最大转换率500KSPS 链接触摸屏时,x
[单片机]
<font color='red'>s3c2440</font> 触摸屏(sony x35)
1.2__S3C2440时钟简介
S3C2440的时钟和电源管理模块由三个部分构成:时钟控制,USB控制和电源控制。 有两个锁相环,一个用来提供FCLK,HCLK和PCLK,另一个则用于USB时钟。其中,FCLK的最大频率达到400MHz,HCLK的最大频率达到136MHz,PCLK的最大频率达到68MHz。 这些时钟为CPU和外设的正常运行提供时钟信号,其中CPU使用的是FCLK,外设使用的是PCLK,还有一部分使用高速总线HCLK。 要想程序按计划运行,时钟的选择和设置至关重要,下图为S3C2440的时钟发生器块图。 首先,S3C2440的时钟源可以选择外部晶振或外部时钟信号,一般情况下我们都使用的是外部晶振。时钟源的选择是通过设置OM 来进行
[单片机]
1.2__S3C2440时钟简介
s3c2440的DMA应用
DMA(Direct Memory Access,直接内存访问)是一种不经过CPU而直接从内存存取数据的数据交换模式。在需要进行大量数据交换的场合,用好DMA,可以大大提高系统的性能,因为DMA操作几乎不占用CPU资源。 s3c2440提供了4个通道的DMA,它们不仅可以实现内存之间的数据交换,还可以实现内存与外设,以及外设与外设之间的数据交换。要用好s3c2440的DMA,关键是配置好它的源、目的寄存器,和必要的控制寄存器。寄存器DISRCn是初始DMA源寄存器,它是用于设置DMA数据传输的源基址,而寄存器DIDSTn是初始DMA目的寄存器,它是用于设置DMA数据传输的目的基址。初始DMA源控制寄存器DISRCCn的第1
[单片机]
S3C2440运行裸机小程序需烧录到NAND Flash
对于韦东山的S3C2440开发板,当运行LED等简单的小程序时,必须烧录到NAND Flash,原因如下: (1)NOR Flash虽然可以向内存一样进行读操作,但不可以像内存一样进行写操作,所以假如要从NOR Flash启动,一般先在代码的开始部分使用汇编指令初始化外接的内存器件(外部RAM),然后将代码复制到外存中,最后跳转到外存中继续执行。(这段初始化代码比较复杂,需要后面再学习)。 (2)S3C2440中有称为“Steppingstone”的4KB内存RAM,当选择从NAND Flash启动CPU时,CPU会通过内部的硬件将NAND Flash开始的4KB字节数据复制到这4KB的内部RAM中(此时内部RAM的起始地址为
[单片机]
基于S3C2440和嵌入式Linux的扩展串口设计
随着计算机网络的发展,以及现场总线等技术的广泛使用,串口通讯在各种场合的应用越来越广泛。在集中控制系统中,需要在多个串口间进行通信,而在一般计算机上,只有1~3个串口,为了实现对多点的控制,需要对串口进行扩展。 ARM芯片是目前在嵌入式系统中应用比较广泛的一种芯片,由于可以运行操作系统,以及拥有包括LCD、串口通讯、网络通讯、存储芯片等大量外围接口芯片的支持,使得ARM广泛应用于检测、通讯、控制等领域。 本文以ARM 920T核的S3C24449芯片作为微控制器,在TQ2440开发板进行串口扩展,利用开发板上的系统总线接口和通用输入输出接口分别与扩展串口相连,达到同时与多台串口设备并行通信的目标。 1 硬件介绍 1.1
[单片机]
基于<font color='red'>S3C2440</font>和嵌入式Linux的扩展串口设计
基于S3C2440嵌入式系统的以太网接口电路设计方案
文章主要介绍了一个基于三星ARM9芯片S3C2440嵌入式系统的以太网接口电路设计方案,采用了工业级以太网控制器DM9000AEP成功实现了嵌入式系统网络数据交换。论文在重点阐述了网络接口电路基础之上,对Windows CE系统控制软件部分DM9000AEP的驱动程序和注册表项进行了具体分析。 随着微电子技术和计算机技术的发展,嵌入式技术得到广阔的发展,已成为现代工业控制、通信类和消费类产品发展的方向。以太网在实时操作、可靠传输、标准统一等方面的卓越性能及其便于安装、维护简单、不受通信距离限制等优点,已经被国内外很多监控、控制领域的研究人员广泛关注,并在实际应用中展露出显着的优势。本文提出了一种基于DM9000AE网络接口
[单片机]
基于<font color='red'>S3C2440</font>嵌入式系统的以太网接口电路设计方案
S3C2440驱动TFT屏(24bit显示模式)
/******************************************************************** * 文件名:TFT.h * 功能:定义TFT控制器参数,声明驱动TFT屏的相关函数 * 作者:jianqi * 版本:v1.0 ********************************************************************/ #ifndef __TFT_H__ #define __TFT_H__ #include def.h #define TFT35 1 #define TFT43 2 #define
[单片机]
ARM-Linux s3c2440 之UART分析(三)
回顾一下上文,s3c2440串口底层驱动围绕三个数据结构展开: UART特定的驱动程序结构定义:struct uart_driver s3c24xx_uart_drv; UART端口结构定义: struct uart_port s3c24xx_serial_ops; UART相关操作函数结构定义: struct uart_ops s3c24xx_serial_ops; 实现了这三个数据结构体,基本完成了驱动操作函数的实现,紧接着需要对串口设备及设备驱动进行初始化,首先是模块初始化module_init(s3c24xx_serial_modinit): static int __inits3c24xx_serial
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved