
ARM技术
文章平均质量分 66
zyboy2000
这个作者很懒,什么都没留下…
展开
-
ARM与51编写程序的区别
测试环境:KEIL (1) int变量 在51 占2个字节;在ARM占4个字节 (2)结构体对齐 在51是按照一个字节对齐; 在ARM是按结构体默认对齐规则对齐 (3)字节在内存的排列顺序 在51是大端 ; 在ARM大多数是小端,但有的可以大小端选择。 在大端存储格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中在小端存储原创 2009-05-20 22:24:00 · 6743 阅读 · 2 评论 -
哈佛结构&冯·诺依曼结构
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。哈佛结构是一种并行体系结构,它的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问。 冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的原创 2012-12-15 13:13:40 · 8274 阅读 · 1 评论 -
MDK(KEIL)中设定变量或数组到指定的位置
定位变量到指定的位置使用定义在头文件 absacc.h中的 __at宏,可以将变量以如下方式定位到绝对地址处:C 例子:#include const char MyText[] __at (0x1F00) = "TEXT AT ADDRESS 0x1F00"; int x __at (0x40003000); // v原创 2011-09-06 09:19:36 · 27217 阅读 · 2 评论 -
ARM开发的问题总结
汇编代码要注意有些要顶格,有些要加空格,否则编译会有问题 (一)堆的设置问题在启动代码 B__mian指令后,程序没有跳到main函数处,而是进入了异常中断。原因:通过反汇编,可以看到,在执行B__mian指令后,并不是立即跳到main函数处,而是先跳到__main库函数入口,再执行一些堆栈的拷贝等初始化操作,最后跳到main函数处。出现异常,可能是堆或栈的设置有问题。(在一个例子原创 2009-06-20 11:50:00 · 2665 阅读 · 0 评论 -
为何一般不建议在中断中喂狗?
在"主程序喂狗论"中,最"强有的理论依据"就是---"程序跑飞了可是中断不一定会死" (中断一般都有自己固定不变的中断向量地址,这样即使主程序飞,中断也能正确地跳入自己的轨道继续运行.) 可如果只在主程序喂狗,由于中断被无意关断,那么主程序实际就只干傻喂狗功能,这种不工作也不死的。 所以建议:最好的办法是主程序和中断相结合的方法喂狗,这个需要根据实际程序中断的特点编写相应的喂狗功能转载 2012-06-14 23:11:26 · 16845 阅读 · 7 评论 -
FLASH 擦写时间比较
【Nand flash的一些典型(typical)特性】 k9f1208x0b1.页擦除时间是200us,有些慢的有800us。 (528)2.块擦除时间是2ms. (528*32) 看了24c512的手册,一个page才128个byte,512/8bit=64k byte总共个500原创 2009-09-01 11:33:00 · 24553 阅读 · 1 评论 -
8位单片机 16位 32位区别?
指CPU处理的数据的宽度,参与运算的寄存器的数据长度? 如果总线宽度与CPU一次处理的数据宽度相同,则这个宽度就是所说的单片机位数。如果总线宽度与CPU一次处理的数据宽度不同:1)总线宽度小于CPU一次处理的数据宽度,则以CPU的数据宽度定义单片机的位数,但称为准多少位。比如著名的Intel 8088,CPU是16位但总线是8位,所以它是准16位。2)总线宽度小于CPU一次处理转载 2012-04-24 22:27:10 · 15528 阅读 · 0 评论 -
KEIL--生成多个工程
KEIL根据配置不同,可以生成多个工程,生成方法 Project-->Manage-->Project Components(或在工程名称右边图标) Project Components-->Project Targets的Tab中添加新的工程 不同工程也可以配置不同文件(Project Components-->file) 不同的工程可以配置不同信息,主要在Opt原创 2009-10-19 19:18:00 · 4460 阅读 · 1 评论 -
MDK下怎样才能让变量在复位时不被初始化
最近一个项目需要保存一下临时数据,而产品容易受干扰而复位。所以需要保存一下数据,那么只有在系统复位时候不再初始化变量即可。对应MDK(keil)来说是一个比较麻烦的问题。通过网络上找了大量资料和测试发现终于可以了。 如果要实现以上要求,必须设置两点,缺一不可:1. 在MDK的选项中设置如下: 2. 必须在程序代码中如下编写:#define __noinit__转载 2013-03-20 11:05:48 · 4856 阅读 · 0 评论 -
ARM如何指定函数运行在RAM--KEIL
两种方法,假设要要运行在RAM的函数统一放在download.c文件中 第一种方法:(采用默认的sct分散文件)将要运行在RAM的函数放在一个文件中。在KEIL右键点击该文件"options for File "*.*", 在Memory Assignment中选择code/const选择RAM空间 第二种方法:(采用自写的sct分散文件)将要运行在RAM的函数放在一个文件原创 2009-07-16 14:02:00 · 7073 阅读 · 2 评论 -
结构体字节对齐
为何要字节对齐? 从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。 MDK 字节对齐关键字 __packedtypedef __packed struct abc{ int a; int b;}st转载 2009-05-09 23:07:00 · 5208 阅读 · 2 评论 -
如何禁止KEIL初始化RAM为零& 如何判断是软复位还是上电复位
笔记:(1)如何禁止KEIL初始化RAM为零? 1. 在KEIL Noinit 打钩 2. 另须对需要热启动保持的变量用__at关键字指定某个区域,否则还是没用 (#include "absacc.h") 或者__attribute__((zero_init)) 关键字 .bss段int te原创 2013-03-18 09:57:18 · 4524 阅读 · 0 评论 -
关于函数返回值为指针类型的分析
我们平时说的堆栈指的是栈(这里谈的不是数据结构的堆栈,俺没研究)1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。转载 2011-11-19 22:34:08 · 1963 阅读 · 0 评论 -
大端模式和小端模式
大端格式:在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中,如图2.1所示: 小端格式:与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。如图2.2所示: 请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1解答:int chec原创 2009-05-13 09:18:00 · 1212 阅读 · 0 评论 -
环形队列串口(发)应用
环形缓冲区的实现原理:环形缓冲区通常有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区。通过移动读指针和写指针就可以实现缓冲区的数据读取和写入。在通常情况下,环形缓冲区的读用户仅仅会影响读指针,而写用户仅仅会影响写指针。如果仅仅有一个读用户和一个写用户,那么不需要添加互斥保护机制就可以保证数据的正确性在设计串口驱动的过程中,要遵循原创 2014-03-20 14:38:07 · 9229 阅读 · 1 评论 -
环形队列串口(收)应用
void CommISR(void) interrupt 4{ if (RI0) { RI0=0; CommRecBuffer[CommRecBufferTail]=SBUF0; //receive data CommRecBufferTail++; if (CommRecBufferTail==DB_RE原创 2014-04-04 12:00:57 · 6564 阅读 · 0 评论 -
论坛各种问题总结--(随时更新)
(-5) 为何现在串口速率比并口速率要快?并行通信的瓶颈:并行数据传输技术向来是提高数据传输率的重要手段,但是,进一步发展却遇到了障碍。首先,由于并行传送方式的前提是用同一时序传播信号,用同一时序接收信号,而过分提升时钟频率将难以让数据传送的时序与时钟合拍,布线长度稍有差异,数据就会以与时钟不同的时序送达,另外,提升时钟频率还容易引起信号线间的相互干扰,导致传输错误。串行通信的优势:串行通原创 2009-07-31 10:57:00 · 6474 阅读 · 0 评论 -
NOR NAND FLASH编程
NandFlash的数据是以bit 的方式保存在memory cell里的,一般来说,一个cell 中只能存储一个bit,这些cell 以8 个或者16 个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device 的位宽。这些Line原创 2013-12-20 10:08:51 · 1860 阅读 · 1 评论 -
空操作NOP指令在ARM和C51的区别
(一)C51调用方法#include _nop_();(二)ARM下调用方法 __asm void nop(void){ NOP}然后在之后的C代码中调用该函数:void main(){...nop();... } 关于NOP指令在MCS-51单片机指令集中NOP的指令码为0x00,而ARM指令集中的NO原创 2012-04-05 18:07:56 · 13427 阅读 · 1 评论 -
非对齐地址访问问题
ARM,DSP,POWERPC等不支持非对齐地址访问,X86支持非对齐地址访问。 为何要字节对齐? 从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。 TCPIP协议栈一直采用的uip,感觉不是很好,想采用网上的原创 2009-06-24 09:54:00 · 5876 阅读 · 1 评论 -
STR912--IAP问题
默认情况下,bank0是映射到地址0x00.考虑到,IAP程序需存储在bank1,而用户程序需存储在bank0.因此须使用CAPS工具,将bank1映射到地址0x00.另外,在IAP程序运行期间,必须在执行用户程序跳转之前,通过程序将bank0重映射到地址0x00(注:IAP程序已经实现了bank0重映射到地址0x00,用户不需要自己来编写代码). ARM处理器产生的地址叫虚拟地址,把这原创 2009-07-07 19:29:00 · 1931 阅读 · 0 评论 -
ARM分散加载文件
(一)原理ARM的连接器提供了一种分散加载机制,在连接时可以根据分散加载文件(.scf文件)中指定的存储器分配方案,将可执行镜像文件分成指定的分区并定位于指定的存储器物理地址。这样,当嵌入式系统在复位或重新上电时,在对CPU相应寄存器进行初始化后,首先执行ROM存储器的Bootloader代码,根据连接时的存储器分配方案,将相应代码和数据由加载地址拷贝到运行地址,这样,定位在RAM存储器的代码原创 2009-06-19 15:13:00 · 9457 阅读 · 1 评论 -
arm7与arm9的区别
一、“ARM7内核三级流水线和冯·诺伊曼结构; ARM9内核是5级流水线 哈佛结构。” arm7和arm9的pipeline设计是一样的,都是Harvard architecture,不过arm9又被叫做modified-Harvard architecture. “arm7没有mmu,arm720T是MMU的;arm9是有mmu的,arm940T只有Memory protec转载 2009-05-13 09:09:00 · 2041 阅读 · 0 评论 -
STR910常见问题解答
问: 我需要在我的固件中做什么特别的设置,以利用ARM9中哈佛结构和五级流水线的优势吗?答:不需要。首先,STR9的ARM966E核心在二进制代码上与ARM7兼容,即ARM7的代码可以不经修改地在STR9上运行。任何第三方的支持STR9的编译器,都可以产生ARM7或ARM966E的代码;当指定STR9(或ARM966E)时,编译器会自动地产生利用了ARM966E的哈佛结构和五级流水线优势的代码。原创 2009-05-10 12:03:00 · 1253 阅读 · 0 评论 -
LPC2xxx启动代码分析
ARM启动代码分析-philips的LPC2xxx系列12006-7-24 14:30:00/***********************************************************************************************File: startup.s*Author:转载 2009-05-10 12:02:00 · 1157 阅读 · 0 评论 -
ARM开发总结的小知识
字节 8位半字 16位字 32位 Code, RO-dataRW-data,ZI-dataCode为程序代码部分RO-data 表示 程序定义的常量 const temp;RW-data 表示 已初始化的全局变量ZI-data 表示 未初始化的全局变量Program Size: Code=18248 RO-data=320 RW-data=260 ZI-data=3952原创 2009-05-10 11:49:00 · 1253 阅读 · 0 评论 -
ARM基础知识教程(二):ARM处理器的寄存器
在ARM体系中通常有以下3种方式控制程序的执行流程:**在正常执行过程中,每执行一条ARM指令,程序计数器(PC)的值加4个字节;每执行一条Thumb指令,程序计数器寄存器(PC)加2个字节。整个过程是按顺序执行。**跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行。其中,B指令用于执行跳转操作;BL指令在执行跳转操作同时,保存子程序的返回地址;BX指令在执转载 2009-05-09 22:42:00 · 1565 阅读 · 0 评论 -
ARM基础知识教程(三):ARM中异常中断的种类
**复位(RESET) **当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。复位异常中断通常用在下面几种情况下:系统加电时;系统复位时;跳转到复位中断向量处执行成为软复位。**未定义的指令**当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断,可以通过改异常中断机制仿真浮点向量运算。**软件中断**这是一个由用户定义的中转载 2009-05-09 22:46:00 · 2367 阅读 · 0 评论 -
ARM基础知识教程(一):ARM简介
ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。 ARM将其技术授权给世界上许多著名的半导体、软件和OEM厂商,每个厂商得到的都是一套独一无二的ARM相关技术及服务。利用这种合伙转载 2009-05-09 22:40:00 · 2549 阅读 · 0 评论 -
Realview MDK中链接脚本详细解析
使用Realview MDK时不可避免的要涉及到链接脚本文件,特别是编译链接那些大的工程文件时更是如此。在链接脚本中可以指定代码的存储布局,可以将代码段、只读数据段、可读写的数据段分别存放,甚至可以精确地指定代码放置的位置,这一点是很关键的,譬如说启动代码就必须放在可知型文件的开始位置。由于链接脚本重要性,开发者必须掌握其编写的方法。Realview MDK链接程序使用了两种方式控制程序转载 2009-05-10 11:52:00 · 1382 阅读 · 0 评论 -
ARM基础知识教程(四):ARM存储系统概述
畅享博客 > 嵌入式新品-arm开发板-arm9开发板-单片机开发板 > [原创]ARM存储系统概述 2008-9-24 11:04:24 [原创]ARM存储系统概述 *********************************************ARM存储系统的体系结构适应不同的嵌入式应用系统的需要差别很大。最简单的存储系统使用平办事的地址映射机制,转载 2009-05-09 22:47:00 · 1478 阅读 · 0 评论 -
ARM基础知识教程(六): ARM映像文件
1.ELF格式文件的结构1.1映像文件组成部分**一个映像文件有一个或多个域组成**每个域包含一个或多个输出段**每个输出段包含一个或多个输入段**各输入段中包含了目标文件中的代码和数据输入段中包含了四类内容:代码、已经初始化的数据、未经初始化的存储区域、内容初始化成0的存储区域。每个输入段有相应的属性,可以为只读的(RO)、可读写的(RW)以及初始化成0的(ZI)。ARM连接器根据转载 2009-05-09 22:49:00 · 1620 阅读 · 0 评论 -
Realview MDK如何bin烧写
因为Realview MDK可以直接下载*.axf或者*.hex格式的文件,但是不能直接下载*.bin格式的文件,所以, 只能先将*.bin格式的文件转换成*.hex格式的文件,例如BIN2HEX工具可以转换(最大的转换容量为64K,如果超过这个容量,必须手动添加线型扩展地址或者找到更好的转换工具突破这个64K的限制).在转换的时候,一定要保证地址正确,否则将导致烧写不成功. 通过这种方法, 可以转载 2009-05-23 20:24:00 · 1663 阅读 · 0 评论 -
JTAG标准
对于ULINK的JTAG(20pin)发现连接到PC机,1脚和20脚电压2点几伏,连接到电路板,会使CPU运行,(1,2脚不接电路板就可以) JTAG(Joint Test Action Group ,联合测试行动小组 ) 是一种国际标准测试协议,主要用于芯片内部测试及对系统进行仿真、调试, JTAG 技术是一种嵌入式调试技术,它在芯片内部封装了专门的测试电路 TAP ( Test Acc转载 2009-08-04 09:40:00 · 5505 阅读 · 0 评论 -
ARM空间分段(lst文件夹下map文件)
对于ARM,堆是向上生长的,栈是向下生长的。 局部变量占用栈(stack)空间。 程序中动态申请的如malloc()和new函数申请的内存空间占用堆(heap)空间。|Image$$RO$$Base| 表示RO输出段运行时起始地址,也可以说是程序代码存放的起始地址,由-ro-base这个参数指定;|Image$$RO$$Limit|表示RO输出段运行时存储区域界限,其值可通过|Imag原创 2009-06-18 20:35:00 · 4369 阅读 · 1 评论 -
ARM工作模式和BOOTLOADER ---好
简单地说,BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对Bo转载 2009-06-15 21:36:00 · 1636 阅读 · 0 评论 -
ARM 中断处理过程
1.寄存器R16用作CPSR(Current Program Status Register,当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。 每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR(Saved Program Status Register,备份的程序状态寄存器),当异常发生时,原创 2009-06-14 16:59:00 · 2357 阅读 · 1 评论 -
常用的ARM汇编指令
MRS (读状态寄存器) MRS r1, CPSR ; CPSR--->r1MSR (写状态寄存器) MSR cpsr_c, #0xD3 ; CPSR[7...0] = 0xD3 STMFD SP! {R8-R9}含义:(1)SP=SP-4字节 (2) R9--->SP (3)SP=SP-4 (4) R8-->SP LDMFD SP! {R8-R9,原创 2009-06-09 09:30:00 · 1713 阅读 · 0 评论 -
ARM中C和汇编混合编程及示例
参数的传递规则. 根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序.这两种子程序的参数传递规则是不同的. 1.参数个数可变的子程序参数传递规则 对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来进行参数传递,当参数超过4个时,还可以使用数据栈来传递参数. 在参数传递时,将所有参数看做是存放在连续的内存转载 2009-06-08 09:33:00 · 2161 阅读 · 0 评论 -
ARM中的RO、RW和ZI
只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW段(ReadWrite);RW段中要被初始化为零的变量被称为ZI段(ZeroInit)。 编译器使用下列符号来记录各段的起始和结束地址: |Image$$RO$$Base| :RO段起始地址 |Image$$RO$$Limit| :RO段结束地址加1|Image$$RW$$Base| :RW段起始地址转载 2009-06-09 09:56:00 · 1183 阅读 · 0 评论