ARM开发的问题总结

发布者:mancozc最新更新时间:2016-06-30 来源: eefocus关键字:ARM开发  问题总结 手机看文章 扫描二维码
随时随地手机看文章
汇编代码要注意有些要顶格,有些要加空格,否则编译会有问题

 

(一)堆的设置问题

在启动代码 B__mian指令后,程序没有跳到main函数处,而是进入了异常中断。

原因:通过反汇编,可以看到,在执行B__mian指令后,并不是立即跳到main函数处,而是先跳到__main库函数入口,再执行一些堆栈的拷贝等初始化操作,最后跳到main函数处。出现异常,可能是堆或栈的设置有问题。(在一个例子中发现把堆得起始地址改小就可以了)

 

(二)ARM在RAM中调试问题

 

IROM1:0x4000000     0x10000    (必须将IROM1地址设置到RAM空间)

IRAM1:0x4010000      0x8000

 

RAM.ini 文件中

PC = 0x04000000;

 

(三)如何指定某段代码的运行空间

 选择该文件(*.c),鼠标右键(options for File '*.c')---->Memory Assignment 可指定该文件代码运行的空间(可以运行在FLASH,也可以指定在RAM)

 

(四)MDK生成bin文件

可以用ARM自带的fromelf.exe将*.axf文件转换成*.bin文件

 

Options for Target---->user---->run #1----->

 

C:/Keil/ARM/BIN31/fromelf.exe --bin -o ./output/Axf_To_Bin.bin ./output/Axf_To_Bin.axf

 

(四)编译后的代码含义

Program Size: Code=2356 RO-data=32 RW-data=28 ZI-data=1292 

 

================================================================================

    Total RO  Size (Code + RO Data)                 2388 (   2.33kB)
    Total RW  Size (RW Data + ZI Data)              1320 (   1.29kB)
    Total ROM Size (Code + RO Data + RW Data)       2416 (   2.36kB)

================================================================================

 

  Execution Region RW_IRAM1 (Base: 0x04000000, Size: 0x00000528, Max: 0x00018000, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x04000000   0x0000001c   Data   RW           89    .data               main.o
    0x0400001c   0x00000004   PAD
    0x04000020   0x00000508   Zero   RW            1    STACK               str91x.o

 

Code表示程序代码量

RO-data 表示固定常量(const 变量)

RW-data 表示初始化常量(char gloab_test =5)

ZI -data 表示未初始化初始化常量,即是零(char gloab_test =0) 

烧写到FALSH的空间:Code + RO Data + RW Data

RAM空间: RW Data + ZI Data

启动代码中,显然有个RW Data 拷贝过程,其实还应该包括初ZI -data 清零过程,堆和栈的初始化过程,这些应该在B__mian指令后实现,只有通过反汇编可以看到

 

(五) 未对齐的数据指针

 

  C和C++编程标准规定,指向某一数据类型的指针,必须和该类型的数据地址对齐方式一致,所以ARM 编译器期望程序中的 C 指针指向存储器中字对齐地址,因为这可使编译器生成更高效的代码。

  比如,如果定义一个指向 int 数据类型的指针,用该指针读取一个字,ARM 编译器将使用LDR 指令来完成此操作。如果读取的地址为四的倍数(即在一个字的边界)即能正确读取。但是,如果该地址不是四的倍数,那么,一条 LDR 指令返回一个循环移位结果,而不是执行真正的未对齐字载入。循环移位结果取决于该地址向对于字的边界的偏移量和系统所使用的端序(Endianness)。例如,如果代码要求从指针指向的地址 0x8006 载入数据,即要载入 0x8006、0x8007、0x8008 和 0x8009 四字节的内容。但是,在 ARM 处理器上,这个存取操作载入了0x8004、0x8005、0x8006 和 0x8007 字节的内容。这就是在未对齐的地址上使用指针存取所得到的循环移位结果。

  因而,如果想将指针定义到一个指定地址(即该地址为非自然边界对齐),那么在定义该指针时,必须使用 __packed 限定符来定义指针: 例如,

  __packed int *pi; // 指针指向一个非字对其内存地址

  使用了_packed限定符限定之后,ARM 编译器将产生字节存取命令(LDRB或STRB指令)来存取内存,这样就不必考虑指针对齐问题。所生成的代码是字节存取的一个序列,或者取决于编译选项、跟变量对齐相关的移位和屏蔽。但这会导致系统性能和代码密度的损失。

  值得注意的是,不能使用 __packed 限定的指针来存取存储器映射的外围寄存器,因为 ARM 编译程序可使用多个存储器存取来获取数据。因而,可能对实际存取地址附近的位置进行存取,而这些附近的位置可能对应于其它外部寄存器。当使用了位字段(Bitfield)时, ARM 程序将访问整个结构体,而非指定字段。

 

 

(六) Ro Base设置

链接文件选项中,应将映像文件的Ro Base地址设置到映像文件实际运行的起始地址。例如,将Ro Base设置成0x30000000,把它下载到0x0地址开始执行是不正确,必须将该代码复制到0x30000000起始地址处才能开始正确执行,或者将Ro Base 设置到0x0地址

 

(七) __irq关键字

汇编调用C中断函数

 

汇编文件相关代码(*.s)

      IMPORT  IRQ_Handler    ;不能顶格写

 

IRQ_Addr        DCD     IRQ_Handler

 

 

C文件相关代码(*.c)

__irq void IRQ_Handler (void) {
  if (IRQSIG & 0x00000004) {        // Timer 0 Interrupt
    T0CLRI = 1;                     // Clear Timer 0 Interrupt
    T0_Tick++;                      // Increment Timer 0 Tick
  }
}

 

“__irq”专门用来声明IRQ中断服务程序,如果用“__irq”来声明一个函数,那么该函数表示一个IRQ中断服务程序,编译器便会自动在该函数内部增加中断现场保护的代码

关键字:ARM开发  问题总结 引用地址:ARM开发的问题总结

上一篇:STR912--IAP问题
下一篇:ARM空间分段(lst文件夹下map文件)

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

调试前的组网故障问题总结
在每一次调试前,我们要做的工作就是把硬件全部组态正确,网络组建好。此时,才能把程序下载进去进行软硬件的调试。然而,就是这前期的组网问题,往往能够遇到千奇百怪的问题。不管经历过多少的弯路,最终都会把项目调试完成。只不过是顺利不顺利的问题。下面就我经历过的一些小白问题,跟大家分享下。 1、模块已组态,但不可用,预设值/实际值不匹配:(插入的模块和组态的模块类型不同) 期望的型号 ,与当前型号不匹配或是 不可用。  这样的故障最为常见了。那么,很有可能的原因: (1)就是检查组态型号和实际模块型号是否一致。不过这样的原因很小,因为大家做工程都很谨慎, (2)就是硬件上有些模块没能正确连接上,导致故障出现。也会出现此类故障现象。我遇
[嵌入式]
三星获64位ARM晶片设计许可或开发伺服器晶片
    北京时间11月8日下午消息,据美国IT网站Computer World报导,三星已获得ARM首批64位处理器Cortex-A57和Cortex-A53的设计许可。分析师称,三星可能会从智能手机和平板电脑市场扩张到伺服器市场。 ARM目前的32位处理器应用范围一直未能突破嵌入式设备和移动设备。这批64位处理器效能比更高,速度更快,将用于伺服器、高端智能手机和平板电脑。预计首批采用64位ARM处理器的伺服器将于2014年面世。 三星发言人表示不方便谈论公司未来的晶片或伺服器计划。 Mercury Research首席分析师迪恩·麦克卡隆(Dean McCarron)说,如果三星决定开发伺服器晶片,其利润
[手机便携]
基于ARM 内核的SoC已经成为嵌入式处理器的开发实现
ARM是目前全球最大的嵌入式芯片技术的IP提供商,其所拥有的IP已经成为众多芯片设计公司采纳的一种技术标准和开发平台。所以基于ARM 内核的SoC已经成为嵌入式处理器的开发重点,可通过ARM实现LCD控制器来完成对嵌入式LCD屏的控制。如果利用TFT屏支持显示,其图像分辨率存在局限性,因此通过搭建一个FPGA平台实现图像缩放器功能外接LCD显示器,完成ARM信号的扩展显示。同时FPGA也能完成对ARM平台产生的图像信号进行验证和仿真,以测试其功能和时序的正确性。XGA显示器因其显示量大,输出形式多样等特点已经成为目前大多数设计中的常用输出设备,因此本文针对ARM产生的VGA信号通过插值算法对其扩展为XGA标准信号。 1 V
[单片机]
基于<font color='red'>ARM</font> 内核的SoC已经成为嵌入式处理器的<font color='red'>开发</font>实现
ARM裸机开发bootloader时钟初始化ARM跑快了
一、概念解析 1、什么是时钟脉冲信号,起什么作用? 时钟脉冲信号时有一定电压幅度和一定的时间间隔并连续发出的脉冲信号。时钟脉冲信号是时序逻辑的基础,它用于决定逻辑单元中的状态何时更新。数字芯片中的众多晶体管都工作在开关状态,它们的导通和关断动作都是按照时钟信号的节奏进行的。也就是说嵌入式系统是按照时钟来安排CPU的任务。 2、时钟脉冲信号的频率是指单位时间内产生的时钟脉冲个数。 3、如何产生时钟信号? 时钟信号一般有晶振或晶振与PLL产生。 晶振的制造就是用石英晶体经精密切割磨削并镀上电极焊上引线就做成了。这种晶体如果给它通上电,它就会产生机械振荡,其频率和他们的形状,材料,切割方向等密切相关。 由于石英晶体化学性能非常
[单片机]
<font color='red'>ARM</font>裸机<font color='red'>开发</font>bootloader时钟初始化<font color='red'>ARM</font>跑快了
ARM微处理器的指令集概述二——ARM应用系统开发详解笔记
一 跳转指令 跳转指令用于实现程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转: 使用专门的跳转指令。 直接向程序计数器 PC 写入跳转地址值。 ARM 指令集中的跳转指令可以完成从当前指令向前或向后的 32MB 的地址空间的跳转,包括以下 4 条指令: B 跳转指令 BL 带返回的跳转指令 BLX 带返回和状态切换的跳转指令 BX 带状态切换的跳转指令 B B{条件} 目标地址 B指令是最简单的跳转指令。注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对
[单片机]
引用 ARM开发,对entry point的含义
从事了这么久的ARM开发,对entry point的含义一知半解,今日再次拿出一本写得还算不错的ARM教材来翻,书中这一段仅仅是把英文手册单纯翻译成中文,并没有讲到真正的实质。不是ARM公司手册写得不详细,而是多数中文教材的编写采用的方式是: english--华文 mapping,但英文手册是有系列组织的suite,而书本往往翻译自系列中的一篇,容易使得读者管中窥豹。 摘要:ARM link的时候-entry 行标号 选项用于指定程序的入口地址,其实就是ICE把代码load完之后自动跳入的地址,最后的程序中这个工作是由bootloader来完成的,当然bootloader也可以跳到别的入口地址去。几乎所有
[单片机]
SATA测试常见问题总结-2
QUESTION: 在SATA的接收端容限测试中如何使被测件进入环回模式? ANSWER: 主要有两种方法:可以通过芯片厂商提供的控制工具使被测件进入环回模式,也可以通过信号发生器或者协议分析仪通过协商使被测件进入环回模式。 QUESTION: 在SATA的接收端容限测试中的测试时间是依据什么选择的? ANSWER: SATA总线要求的系统误码率要小于1E-12,因此需要累积大量的数据bit才能确保其接收误码率可以达到这个要求,比如测试中如果累积3E+12个数据bit仍然没有误码就可以在95%置信度的情况下保证系统误码率小于1E-12。但是累积大量的数据需要花费大量时间,因此SATA的测试规范对此做了折衷。 QUEST
[测试测量]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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