新手一定要看的ARM开发学习笔记
- 格式:docx
- 大小:17.08 KB
- 文档页数:5
arm学习笔记五(cc++与arm汇编混合编程)混合编程常见⽅式:1 在c/c++程序中嵌⼊汇编指令语法格式:__asm{汇编语⾔程序}2 在汇编程序中访问c/c++定义的全局变量⽰例代码如下:test.c#include <stdio.h>int gVar_1=12;extern asmDouble(void)int main(void){printf("original value of gVar_1 is %d",gVar_1);admDouble();printf("modified value of gVar_1 is %d",gVar_1);return 0;}test.sAREA asmfile,CODE,READONLYEXPORT asmDouble;声明全局引⽤标号IMPORT gVar_1;引⽤asmDoubleldr r0,=gVar_1ldr r1,[r0]mov r2,#2mul r3,r1,r2str r3,[r0]mov pc,lrEND3 在c/c++程序中调⽤汇编函数⽰例代码如下:test1.sAREA asmfile,COCE,READONLYEXPORT asm_strcpy;声明全局引⽤标号asm_strcpy;函数名loop:ldrb r4,[r0],#1cmp r4,#0beq overstrb r4,[r1],#1b loopover:mov pc,lr;⽤于函数返回ENDtest1.c#include <stdio.h>extern void asm_strcpy(const char *src,char *dest);int main(){const char *s ="hello world";char d[32];asm_strcpy(s,d);printf("source:%s",s);printf("destination: %s",d);return 0;}上⾯程序jni的味道有⽊有?4 汇编程序中调⽤c/c++函数⽰例代码如下:test2.cint cFun(int a,int b,int c){return a+b+c;}test2.sEXPORT asmfileAREA asmfile,CODE,READONLY IMPORT cFun;引⽤函数ENTRY;指定应⽤程序⼊⼝mov r0,#11mov r1,#22mov r2,#33BL cFun;返回END。
ARM 的异常处理学习笔记转贴ARM的异常处理这部分比较不好理解。
当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。
当异常中断处理程序执行完成后,程序返回到发生中断指令的下条指令处执行。
在进入异常中断处理程序时,要保存被中断程序的执行现场,从异常中断处理程序退出时,要恢复被中断程序的执行现场。
1、引起异常的原因(1)、指令执行引起的异常软件中断、未定义指令(包括所要求的协处理器不存在是的协处理器指令)、预取址中止(存储器故障)、数据中止。
(2)、外部产生的中断复位、FIQ、IRQ。
2、ARM中异常中断的种类(1)、复位(RESET)a、当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行,包括系统加电和系统复位。
b、通过设置PC跳转到复位中断向量处执行称为软复位。
(2)、未定义的指令当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断,可以通过改异常中断机制仿真浮点向量运算。
(3)、软件中断这是一个由用户定义的中断指令(SWI)。
可用于用户模式下的程序调用特权操作指令。
在实时操作系统中可以通过该机制实现系统功能调用。
(4)、指令与取终止(Prefech Abort)如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当被预取的指令执行时,处理器产生指令预取终止异常中断。
(5)、数据访问终止(DATAABORT)如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问终止异常中断。
(6)、外部中断请求(IRQ)当处理器的外部中断请求引脚有效,而且CPSR的寄存器的I控制位被清除时,处理器产生外部中断请求异常中断。
系统中个外设通过该异常中断请求处7)、快速中断请求(FIQ) 理服务。
(当处理器的外部快速中断请求引脚有效,而且CPSR的F控制位被清除时,处理器产生外部中断请求异常中断。
ARM 课程考试相关知识点主要:●嵌入式系统的五个特性包括:专用性,可剪裁性,可靠性,低功耗性和实时性。
●嵌入式系统的特点:专用性强,可剪裁性好,实时性和可靠性好,功耗低●嵌入式操作系统的特点:微型化,可裁剪性,实时性,高可靠性,易移植性●嵌入式系统设计过程的主要步骤(5个):⏹1、系统需求分析⏹2、体系结构设计⏹3、硬件/软件设计⏹4、系统集成⏹5、系统测试●ARM处理器的五个系列:(体系架构是否是冯诺依曼)ARM7和ARM9的体系架构?⏹ARM7(冯诺依曼结构)⏹ARM9(哈佛体系结构)⏹ARM9E(哈佛体系结构)⏹ARM10E⏹SecurCore冯诺依曼结构指数据空间和地址空间不分开;哈佛结构数据空间和地址空间是分开的●操作系统指令执行的三个阶段⏹1、获得指令⏹2、分析指令⏹3、执行指令●代码密度:就是处理完成一个完整的操作,需要的指令条数,按字节计算越少效率越高●MMU(Memory Management Unit):存储器管理单元。
P176存储器管理单元MMU主要完成以下工作:虚拟存储空间到物理存储空间的映射;存储器访问权限的控制;设置虚拟存储空间的缓冲的特征。
MMU可以将某些地址变换条目锁定在快表【TLB(translation lookasidebuffer)】中,从而使得进行与该地址变换条目相关的地址变换速度保持很快。
MMU可以将整个存储空间分为最多16个域。
功能:将虚拟地址映射为物理地址;提供硬件机制的内存访问授权。
●ARM的寻址方式⏹立即数寻址⏹寄存器寻址⏹寄存器移位寻址⏹寄存器间接寻址⏹多寄存器寻址⏹基址变址寻址⏹相对寻址⏹堆栈寻址⏹块拷贝寻址●嵌入式系统/操作系统?主要由哪几部分组成嵌入式系统的组成部分:⏹嵌入式处理器(ARM,MIPS,PowerPC)⏹外围设备(存储器接口)⏹嵌入式操作系统⏹应用软件●ARM的最小系统,画出框图,并说明。
1. ARM芯片。
2. 电源电路、复位电路,晶振电路。
Arm学习笔记芯片内BootLoader版本号:2.2RDP除能次数:0RDP使能次数:0芯片PID:00000410 Medium-density芯片FLASH容量为128KB芯片SRAM容量为65535KB(此信息仅供参考,新版本芯片已不包含此信息)96位的芯片唯一序列号:[49FF6B064966505047540887][066BFF49 50506649 87085447]读出的选项字节:A55AFF00FF00FF00FF00FF00FF00FF001.普通IO的的使用首先、通过RCC_APB2PeriphClockCmd()函数是设置外设时钟。
ARM与C51单片机不同的是,不用外设的时候,如IO口、ADC、定时器等等,都是禁止时钟的,以达到节能的目的,只有要用到的外设,才开启它的时钟。
因此在需要用到GPIOB和GPIOD 的时候,我们需要先开启它的时钟,具体用到的是函数库里面的函数:void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)其中,第一个参数需要指示要开启什么端口的时钟,RCC_APB2Periph_GPIOx就是开启GPIOx 的时钟,第二个参数需要指示是开启还是关闭,ENABLE/DISABLE。
开启外设时钟之后,然后就开始对GPIO的配置寄存器进行设置了,本文代码为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);然后初始化相关参数,通过命令GPIO_InitTypeDef GPIO_InitStructure; /* Configure the LED0 pin */初始化结构体GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //选择管脚,是你想用到的管脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输入输出的8种模式,这要根据外电路和作用选择GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//选择速度可选2M 10M 50MGPIO_Init(GPIOA, &GPIO_InitStructure);最后,就可以通过io口的相关命令对于io口进行操作。
经过一段时间对ARM的学习,在这里跟大家说一些前期的学习经验,另外仅以一个例子说明一下ADS的开发过程,因为这也是初学,可能有的地方说的不太好,望大家谅解,另外可以找其它参考资料来学习。
第一部分:ARM前期学习经验个人认为,要想学好ARM应该首先对ARM的整体框架(包括ARM体系结构,ARM开发过程,及ARM程序框架及执行过程等)有一个了解。
这里这就不多说了,这些东西我也只是刚刚开始学习,还没有很好的掌握,就只说一些个人想法吧。
呵呵,因为时间比较紧张,本来说是一个星期搞定ARM,至少拿着书本可以一点点的做着,可是经过上一个星期,到最后,哇,真的快疯了。
刚开始拿到实验箱,以为和NIOS一样,多跑一些DEMO应该就差不多会玩了,没想到一开始就碰到一个大问题,ARM实验箱里边带了几本教材和实验指导书,拿着实验指导书做了几个DEMO就做不下去了,因为前两个DEMO还比较简单,就只是用汇编语言写了几条对ARM寄存器操作的语句,学过汇编语言的很快就可以理解了。
可是往后就不一样了,因为刚开始学,不太了解ARM程序的框架,实在是看不懂了,为什么每个全程里边都有用到44b.h ,44blib.h ,44blib.c还有一个44binit.s文件?前边三个还容易理解,玩过单片机的很容易就能看出来44b.h 里边定义了一些在S3C44B0X内部的寄存器,44blib.h和44blib.c定义了一些有关初始化的函数,而44binit.s呢?看不懂,到这里我的ARM程序就没法往下做了,只有在网上再找资料,看这个函数到底是干什么用的,原来这就是以前经常听说的“bootloader”或着说是“启动代码”,或着说是“ARM的引导程序”,就是处理器在启动的时候执行的一段代码,主要任务是初始化处理器模式,设置堆栈,初始化变量等等.由于以上的操作均与处理器体系结构和系统配置密切相关,所以一般由汇编来编写(关于这方面的内容大家可以查看相关资料)。
chapterI 介绍ARMv7 A:用于高性能的“开放应用平台”——越发接近电脑R:用于高端嵌入式系统,尤其是那些带有实时要求的——既要快又要实时M:用于深度嵌入的、单片机风格的系统中Chapter II CORTEX-M3概览哈佛结构拥有独立的指令总线和数据总线,但这两条总线共享一个存储器空间CM3拥有R0~R15的寄存器组,其中R13作为堆栈指针SP。
SP有两个,但在同一时刻只能看到一个,这就是所谓的"banked"寄存器。
1.R0~R12是32位通用寄存器,用于数据操作。
!!:绝大多数16位的thumb指令只能访问R0~R7,而32位的thumb指令可以访问全部寄存器。
2.banked R13:两个堆栈指针主堆栈指针(MSP):复位后默认使用进程堆栈指针(PSP):由用户的应用程序代码使用堆栈指针的最低两位永远是0,这意味着堆栈总是4字节对齐的。
实际上,R13的最低两位被硬线连接到0。
3.R14:连接寄存器:当调用一个子程序时,由R14存储返回地址4.R15:程序计数寄存器:只向当前程序地址5.特殊功能寄存器:程序状态子寄存器组(PSR)中断屏蔽寄存器组(primask,faultmask,besepri)控制寄存器(control)还支持两级特权操作:特权级和用户级在CM3运行主应用程序时(thread mode),既可以使用用户特权级,也可以使用用户级;但是异常服务例程必须在特权级下执行。
复位后,默认进入thread mode,特权级访问。
在特权级下,程序可以访问所有范围的存储器(如果有MPU,则必须在MPU规定范围之外),并且可以执行所有指令。
一旦进入用户级,想要进入特权级必须:执行一条系统调用指令(SVC),这会出发SVC异常,然后由异常服务例程接管,如果批准进入,则异常服务例程修改control寄存器,才能在用户级的thread mode 下重新进入特权级。
这两天参加了一个编写操作系统的项目,因为要做很多底层的东西,而且这个操作系统是嵌入式的,所以开始学习ARM汇编,发现ARM汇编和一般PC平台上的汇编有很多不同,但主要还是关键字和伪码上的,其编程思想还是相同的。
现将一些学习感悟部分列出来,希望能给有问题的人一点帮助。
1、ARM汇编的格式:在ARM汇编里,有些字符是用来标记行号的,这些字符要求顶格写;有些伪码是需要成对出现的,例如ENTRY和END,就需要对齐出现,也就是说他们要么都顶格,要么都空相等的空,否则编译器将报错。
常量定义需要顶格书写,不然,编译器同样会报错。
2、字符串变量的值是一系列的字符,并且使用双引号作为分界符,如果要在字符串中使用双引号,则必须连续使用两个双引号。
3、在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同样的,当src变量代表一个数组时,需要将r0寄存器指向src 则需要这样赋值:LDR r0,=src 当格式是LDR r0,[r2],则第二个参数表示寄存器,我的理解是[]符号表示取内容,r2本身表示一个寄存器地址,取内容候将其存取r0这个寄存器中。
4、在语句:CMP r0,#numBHS stop书上意思是:如果r0寄存器中的值比num大的话,程序就跳转到stop标记的行。
但是,实际测试的时候,我发现如果r0和num相等也能跳转到stop 标记的行,也就是说只要r0小于num才不会跳转。
下面就两个具体的例子谈谈ARM汇编(这是我昨天好不容易看懂的,呵呵)。
第一个是使用跳转表解决分支转移问题的例程,源代码如下(保存的时候请将文件后缀名改为s):AREA JumpTest,CODE,READONLYCODE32num EQU 4ENTRYstartMOV r0, #4MOV r1, #3MOV r2, #2MOV r3, #0CMP r0, #numBHS stopADR r4, JumpTableCMP r0, #2MOVEQ r3, #0LDREQ pc, [r4,r3,LSL #2]CMP r0, #3MOVEQ r3, #1LDREQ pc, [r4,r3,LSL #2]CMP r0, #4MOVEQ r3, #2LDREQ pc, [r4,r3,LSL #2]CMP r0, #1MOVEQ r3, #3LDREQ pc, [r4,r3,LSL #2]DEFAULTMOVEQ r0, #0SWITCHENDstopMOV r0, #0x18LDR r1, =0x20026SWI 0x123456JumpTableDCD CASE1DCD CASE2DCD CASE3DCD CASE4DCD DEFAULTCASE1ADD r0, r1, r2B SWITCHENDCASE2SUB r0, r1, r2B SWITCHENDCASE3ORR r0, r1, r2B SWITCHENDCASE4AND r0, r1, r2B SWITCHENDEND程序其实很简单,可见我有多愚笨!还是简要介绍一下这段代码吧。
Arm 的软件安装使用我的开发板是TQ2440,操作系统是win7的,以下的文字都是我在调试开发板的点滴,共享出来希望对大家有用,最起码希望看了我的文档能少走些弯路。
我也是刚入门的,希望能和大家交流,一起进步!我的QQ是:644933989。
1、设置超级终端为了通过PC 的串口和TQ2440 开发板进行交互,需要使用一个终端程序,基本所有的类似软件都可以使用,由于使用的是win7操作系统,没有超级终端,使用serial crt软件,在绿盟下载的绿色版。
下面就图解设置超级终端:双击快捷方式如图:协议选择:serial,端口选择:com1(com3是使用USB转串口)波特率115200数据位8奇偶校验位none停止位1流控XON/XOFF点连接。
选项菜单->会话选项选串行将串行中断长度由100改成1300(100特别快,进入不了UBOOT提示!)2、设置DNW 软件在光盘的“Windows 平台工具\DNW”目录下面可以找到DNW 软件,双击即可打开它:Step 1、点击“Configuration”菜单的“Options”选项,出现“UART/USB Options”配置单:设置Download address :0x3020000(下载时候先下载到内存,在由内存拷贝到nand flash 中)。
内存地址从(0x30000000-0x34000000)3、安装GIVEIO 驱动当要使用Jtag 软件SJF2440.exe 烧写u-boot 时,需要安装驱动把并口虚拟成IO 口使用。
下面是图解安装GIVEIO 驱动的步骤:1、找到光盘里面提供的giveio 的驱动,路径是“Windows 平台工具\GIVEIO”,复制giveio.sys 到您的系统盘符的“WINDOWS\system32\drivers”目录下面:2、右键计算机->属性->设备管理3、DVD/CD-ROM驱动器->右键扫描检测硬件改动,IDE ATA/ATAPI 控制器->右键扫描检测硬件改动操作->添加过时硬件下一步安装我手动从列表选择的硬件->下一步在硬件列表中找到“端口(COM 和LPT)”选项,然后点击“下一步”继续:选从磁盘安装->浏览然后定位到刚才的GIVEIO 目录下面,找到“GIVEIO.inf”文件,点击“确定”继续:点型号giveio->下一步出现如下界面,点下一步安装完成后出现如下界面:点完成。
ARM汇编⼊门指南本篇⽂章的⽬的是希望以⼀个例⼦的⽅式,能够不那么枯燥的的给⼤家简单介绍⼀下Android或iOS这些移动终端上ARM架构的CPU是如何执⾏ARM汇编指令的。
如果说程序员在学习任何⼀门语⾔的起点都是从学习写helloworld程序开始的,那么本篇⽂章希望的就是成为你学习ARM汇编的那第⼀篇⼊门教程,⼿把⼿的带着你⽤ARM汇编⼿写⼀个helloworld程序。
Hello, ARM⾸先我们这⾥是准备⽤GNU ARM汇编来⼿写⼀个ARM64架构的helloworld程序,那么需要先准备如下⼏个东西:⼀个⽂本编辑器,这⾥我们⽤vim .⼀个ARM64的编译器,这⾥我们⽤的是Android NDK⾥⾯⾃带的clang.伪指令以上准备好了,我们就可以开始新建⼀个⽂件名为main.S的纯⽂本⽂件,然后⽤任意⾃⼰最⼼爱的⽂本编辑器( 对于我⽽⾔它永远是vim) 来打开它,咱们先来起个头:.text.file 'main.c'.globl main // -- Begin function main.p2align 2这⾥我们使⽤是GNU ARM汇编,其中以.开头的是汇编指令 (Assembler Directive ) ⼜或被称为伪指令( Pseudo-operatio),因为它们不属于ARM指令,因此被称为伪指令,这⾥我们先尽量忽略它们,因为我们的主要学习⽬的是学习真正的ARM汇编指令,⽽不是这些伪东西,如果想了解它们可以参考⽂末的附录(伪指令参考表),这⾥只需要看懂其中的⼀句伪指令即可:.globl main这⼀句伪指令它定义了最重要的事情:在我们这个⽂件⾥⾯有⼀个叫做main名称的导出函数,它就是我们helloworld程序的⼊门函数。
main函数然后我们就可以来书写我们的helloworld程序的main函数:.typemain,@functionmain: // @main// %bb.0:subsp, sp, #32 // =32stpx29, x30, [sp, #16] // 16-byte Folded Spilladdx29, sp, #16 // =16movw8, wzrsturwzr, [x29, #-4]adrpx0, .L.straddx0, x0, :lo12:.L.strstrw8, [sp, #8] // 4-byte Folded Spillblprintfldrw8, [sp, #8] // 4-byte Folded Reloadmovw0, w8ldpx29, x30, [sp, #16] // 16-byte Folded Reloadaddsp, sp, #32 // =32ret在GNU ARM汇编⾥⾯所有以:结尾的都会视为标签 ( label ),在这⾥我们定义⼀个叫做main的标签,并且使⽤.type伪指令定义这个标签的类型是⼀个函数(function),到此我们就定义了我们的main函数。
目录第1章 ARM微处理器概述 51.1 ARM-Advanced RISC Machines 51.2 ARM微处理器的应用领域及特点 51.2.1 ARM微处理器的应用领域 51.2.2 ARM微处理器的特点 61.3 ARM微处理器系列 61.3.1 ARM7微处理器系列 61.3.2 ARM9微处理器系列 71.3.3 ARM9E微处理器系列 71.3.4 ARM10E微处理器系列 71.3.5 SecurCore微处理器系列 81.3.6 StrongARM微处理器系列 81.3.7 Xscale处理器 81.4 ARM微处理器结构 81.4.1 RISC体系结构 81.4.2 ARM微处理器的寄存器结构 91.4.3 ARM微处理器的指令结构 91.5 ARM微处理器的应用选型 101.6 本章小节10第2章 ARM微处理器的编程模型 112.1 ARM微处理器的工作状态 112.2 ARM体系结构的存储器格式 112.3 指令长度及数据类型 122.4 处理器模式 122.5 寄存器组织 132.5.1 ARM状态下的寄存器组织 132.5.2 Thumb状态下的寄存器组织 152.5.3 程序状态寄存器 162.6 异常(Exceptions) 182.6.1 ARM体系结构所支持的异常类型 182.6.2 对异常的响应 182.6.3 从异常返回 192.6.4 各类异常的具体描述 192.6.5 异常进入/退出小节 202.6.6 异常向量(Exception Vectors) 202.6.7 异常优先级(Exception Priorities) 212.6.8 应用程序中的异常处理 212.7 本章小节21第3章 ARM微处理器的指令系统 223.1 ARM微处理器的指令集概述 223.1.1 ARM微处理器的指令的分类与格式 223.1.2 指令的条件域 233.2 ARM指令的寻址方式 233.2.1 立即寻址 243.2.2 寄存器寻址 243.2.2 寄存器间接寻址 243.2.3 基址变址寻址 243.2.4 多寄存器寻址 253.2.5 相对寻址 253.2.6 堆栈寻址 253.3 ARM指令集 253.3.1 跳转指令 253.3.2 数据处理指令 263.3.3 乘法指令与乘加指令 303.3.4 程序状态寄存器访问指令 323.3.5 加载/存储指令 323.3.6 批量数据加载/存储指令 343.3.7 数据交换指令 353.3.8 移位指令(操作) 353.3.9 协处理器指令 363.3.10 异常产生指令 383.4 Thumb指令及应用 383.5 本章小节39第4章 ARM程序设计基础 404.1 ARM汇编器所支持的伪指令 404.1.1 符号定义(Symbol Definition)伪指令 404.1.2 数据定义(Data Definition)伪指令 414.1.3 汇编控制(Assembly Control)伪指令 434.1.4 其他常用的伪指令 454.2 汇编语言的语句格式 484.2.1 在汇编语言程序中常用的符号 494.2.2 汇编语言程序中的表达式和运算符 494.3 汇编语言的程序结构 524.3.1 汇编语言的程序结构 524.3.2 汇编语言的子程序调用 524.3.3 汇编语言程序示例 534.3.4 汇编语言与C/C++的混合编程 554.4 本章小节56第5章应用系统设计与调试 575.1 系统设计概述 575.2 S3C4510B概述 585.2.1 S3C4510B及片内外围简介 585.2.2 S3C4510B的引脚分布及信号描述 615.2.3 CPU内核概述及特殊功能寄存器(Special Registers) 675.2.4 S3C4510B的系统管理器(System Manager) 725.3 系统的硬件选型与单元电路设计 825.3.1 S3C4510B芯片及引脚分析 825.3.2 电源电路 835.3.3 晶振电路与复位电路 835.3.4 Flash存储器接口电路 855.3.5 SDRAM接口电路 895.3.6 串行接口电路 935.3.7 IIC接口电路 945.3.8 JTAG接口电路 955.3.9 10M/100M以太网接口电路 965.3.10 通用I/O接口电路 1005.4 硬件系统的调试 1015.4.1 电源、晶振及复位电路 1015.4.2 S3C4510B及JTAG接口电路 1025.4.3 SDRAM接口电路的调试 1035.4.4 Flash接口电路的调试 1055.4.5 10M/100M以太网接口电路 1055.5 印刷电路板的设计注意事项 1055.5.1 电源质量与分配 1055.5.2 同类型信号线的分布 1065.6 本章小节 106 第6章部件工作原理与编程示例 1076.1 嵌入式系统的程序设计方法 1076.2 部件工作原理与编程示例 1086.2.1 通用I/O口工作原理与编程示例 1086.2.2 串行通讯工作原理与编程示例 1116.2.3 中断控制器工作原理与编程示例 1206.2.4 定时器工作原理与编程示例 1236.2.5 GDMA工作原理与编程示例 1276.2.6 IIC总线控制器工作原理 1336.2.7 以太网控制器工作原理 138主要特性139MAC功能模块 140 带缓冲DMA接口(Buffered DMA Interface) 144以太网控制器特殊功能寄存器(Ethernet Controller Special Registers) 147MAC寄存器(Media Access Control(MAC)Register) 154以太网控制器的操作(Ethernet Controller Operation) 160发送一个帧(Transmitting a Frame) 162接收一个帧(Receiving a Frame) 1626.2.8 Flash存储器工作原理与编程示例 1626.3 BootLoader简介 1676.4 本章小节 167 第7章嵌入式uClinux及其应用开发 1687.1 嵌入式uClinux系统概况 1687.2 开发工具GNU的使用 1707.2.1 GCC编译器 1707.2.2 GNU Make 1727.2.3 使用GDB调试程序 1777.3 建立uClinux开发环境 1807.3.1 建立交叉编译器 1817.3.2 uClinux针对硬件的改动 1847.3.3 编译uClinux内核 1857.3.4 内核的加载运行 1877.4 在uClinux下开发应用程序 1887.4.1 串行通信 1907.4.2 socket编程 1957.4 .3 添加用户应用程序到uClinux 2027.4.4 通过网络添加应用程序到目标系统 2057.5 本章小结 207 第8章ARM ADS集成开发环境的使用 2098.1 ADS集成开发环境组成介绍 2098.1.1 命令行开发工具 2098.1.2 ARM运行时库 2188.1.3 GUI开发环境(Code Warrior和AXD) 2198.1.4 实用程序 2218.1.5 支持的软件 2218.2 使用ADS创建工程 2228.2.1 建立一个工程 2228.2.2 编译和链接工程 2258.2.3 使用命令行工具编译应用程序 2298.3 用AXD进行代码调试 2308.4 本章小结 233第1章 ARM微处理器概述本章简介ARM微处理器的一些基本概念、应用领域及特点,引导读者进入ARM技术的殿堂。
一首先说说ARM的发展可以用一片大好来形容,翻开各个公司的网站,招聘里面嵌入式占据了大半工程师职位。
广义的嵌入式无非几种:传统的什么51、AVR、PIC称做嵌入式微控制器;ARM是嵌入式微处理器;DSP; FPGA。
客观的讲,工作需求量上DSP的需求比ARM要多,而ARM和FPGA差不多。
DSP因为数字处理与通信领域的空前发展而火暴,小到MP3射象头,大到我们军品里的控制器,应用面很广。
FPGA的兄弟一般做ANSIC (特殊芯片设计,好象是这么翻译的)。
而ARM单纯说来并不比一个单片机强多少,但是它的独特就在于不断下降的价格和提升的性能。
这完全依靠于ARM公司的战略,厉害!!很佩服他们的战略眼光!!值得注意的是:在找工作中,企业(著名的,小的不算)对单纯的ARM硬件开发工程师并不比单片机重视,很少有大企业的职位里写从事过ARM开发优先”。
写的多的是什么?嵌入式LINUX”到这相信大家看岀来了吧,需要的是硬件中的[ur匸]软件[/url]。
二ARM是硬件还是软件很难说,ARM是硬件,LINUX是软件。
ARM的硬件多半已经模块化了,像我这样把板子改成这样的就算动的多的了,这同样是ARM公司的战略,再次佩服。
实际中的LINUX的开发工作更多,更耗时。
从这方面说ARM应该算是软件了。
在找工作中更是这样,举个例子,联想里和ARM最接近的是“ BIOS X程师”是软件,MOTO里接近的是嵌入式LINUX工程师是软件。
而其他很多公司把嵌入式产品开发归为硬件。
所以,不要讨论这个,好好玩转自己的板子才是关键。
实在不爽你就把自己叫嵌入式开发工程师”三要不要买开发板买哪家我的答案是在你个人的学习方* ”,但是如果看家是需要看这骗笔记的水平,个人推荐还是买现成的。
1买买板子可以把注意力集中在软件开发上,软件开发(尤其是驱动)可以不必担心自己硬件上的问题,我就是以便调试一边写驱动和程序,每次写驱动前就要先确认硬件没问题。
另外,买板子更省钱和时间,我自己做的板子,原理图PCB花了2周以上!制版又15天,回来以后焊接44B0 160个脚!那叫一个麻烦~~花了多少钱呢?2层板,制版费就300块!当然我把接口都外引了,还做了个20X18的LCD背板,板子比较大。
总体下来元件+ LCD屏+PCB=11XX块!够2410的了。
再有就是买的资料相对来说比较全,但是不要指望有技术支持!都是骗人的,卖你之后就不会理你。
2做自己做可以更了解底层硬件,可以按照自己的要求加东西,比如我就加了GPS模块、GPRS模块、SD卡模块,扩了个IIC的35个键子的键盘、把LCD接口按照买的LCD改装了,可以用FPC线直接连接。
做的很爽的。
玩一把吗。
当然,你可以有策略的做,比如像我一样,把RAM和ROM,[url=]网络[/url]都保持和某现成的板子一样,这样他们的资料你就可以拿过来直接用,给自己留个退路。
其他的如SD了什么的自己做。
都达到了〜〜就是费钱,费时间。
再有就是给做的朋友几点建议:尽量拿到现成的板子,尽量多搜集其他板子的全套资料,一定要拿到一张没问题的原理图。
网上流传的原理图多数是龚俊03 年画的,再这里对龚俊表达一下我的敬意!!牛人!但是那个图有个小BUG,我指的是03版的,后来的没这问题了。
8019那地址线和地址有问题。
还有人仿照他的PDF图画的SCH,更是漏洞百岀!谴责!顺便谴责把龚俊板子偷卖的人。
3 买哪家个人感觉分3 类吧1)首先是ZLG 的,资料非常的全,感觉他是真正想教你怎么开发ARM ,而不是像有的公司自己技术都没做好就做个板子岀来卖钱。
但是最大的不利就是价格太贵!而且主要是PHILIP 的,货源比较麻烦〜〜可能有人说21XX系列的不贵啊,那是总线不外扩的,只能跑UCOS,不能跑UCLINUX。
但是说是话,21XX 系列才是ARM7 的价格性能结合点。
ARM7 最适合做工业控制,ARM 普及,销量都是怎么来的?都是ARM7 来的,而44B0 是典型的商业片子。
但是,这里如果你看中的是为工作做准备,还是选能跑UCLINUX 的吧。
但是仍然作为第一个推荐,因为菜鸟时期,合适的资料太重要了!!在这里被ZLG 的务实*感动!你看人家那代码写的。
2)感觉立宇泰的44B0 不错硬件没别的,就是资料比较全的说,不像有些家,原理图直接拿人家的,还错的〜〜3)找个最便宜的好象最便宜的有卖350 的吧?也是没别的,就是即省了钱还省时间搜集资料,至于资料全不全,别计较了〜〜硬件肯定好使就行吧。
四要不要有51 AVR 等单片机基础有更好,但没有也无所谓。
两个月以前,我只是看别人做,耳濡目染〜〜,本科学过单片机,从来没做过。
我们这的技术主干做AVR 和51 ,我就跟他们调过C 语言程序。
你看岀来了?我是个不折不扣的菜鸟吧?但是做这个之前我特意找了ZLG 的两本书,看了里面的例子和原理图,这很重要。
例程里有汇编有C,都看懂了就OK,不用自己现写五开发都需要学习哪些软件总结起来最主要的有以下几个吧1ADS 调试用确切的说是ADS+AXD。
ADS里包含AXD。
原来都用SDT后来ARM公司停止对SDT支持了,改支持ADS 了,还是用ADS 吧。
有的人的程序发布的仍然是SDT 版本的,但基本都可以找到相应ADS 的,新人在这里不要发蒙。
ADS 是编译器,AXD 是调试器。
便宜成AXF 以后再在ARM 的RAM 里调试。
2PLASHPGMFLASH 烧写的软件。
AXD 在RAM 里调试,掉电就没有了,方便程序修改。
调试好的程序再下到FLASH 里,上电直接运行。
同类的软件还有很多,什么FLUTED 了、FLSHP 了都是,但FLASHPGM最好,要是有人还问FLASH 不支持BIN 格式文件的问题就要看我写的PLASHPGM 使用了。
3BANYANT 调试代理(不知道名对不,起这么个难记的,我一般都叫它“半羊”因为知道它那几天刚吃了烤羊)调试代理就是用它帮你使用更简单的JTAG(便宜啊)来实现原本1K才卖的JTAG仿真器的大部分功能。
JTAG调试原理看我另一篇笔记。
简单的就可以把他理解为你自己做的JTAG的驱动就行了。
调试代理还有很多种,什么H-JTAG 了、ARM7 了(不知道具体叫什么,就记得可执行文件叫ARM7.EXE )都是,BANYANT 比较好。
需要注意的是,没种调试代理安装方*虽然都简单但都不一样,需要看说明。
而且AXD调试之前都要运行。
省钱了,就别怕麻烦了。
4ARM-ELF-TOOLS 工具链里面是UCLINUX开发用的工具比如ARM-ELF-GCC只类的。
工具链就是把很多工具打包在一起发布的方便你开发的东西。
具体安装方*看我另一篇笔记。
另外如果你开发LINUX就要用ARM-LINUX-TOOLS,不一样,不通用。
5U-BOOT大名鼎鼎的BOOTLOADER生成工具,同类的好象还有VIVI (名字很暧昧~~)生成的BOOTLOADER烧到FLASH里,然后就可以用BOOTLOADER下载烧写其他了有了BOOTLOADER才能下UCLINUX。
BOOTLOADER就像电脑上的BIOS。
当然UCOS的不用这个,用什么我不知道:)最新版本是1.1.4具体使用方*看我另一篇笔记吧。
6UCLINUX 包UCLINUX的源码包,不用多说了吧?建议大家用现成的先体会一下,然后再自己编译,裁剪。
因为单独UCLINUX的编辑技术上比较简单,但涉及的方面还是比较广的。
7VMWARE老牌的虚拟机软件,在一个机器上虚拟岀一个机器装LINUX (PC上用的),省得你来回开关机了。
记得装VMWARE-TOOLS,安装方*在我另一篇笔记里。
六有哪些书推荐主要推荐ZLG的三本书,有这3本再加网络就不用别的书了,其中主要推荐前2本,3是介绍体系结构的,也不错1ARM嵌入式LINUX系统构建与驱动开发,北航版驱动写的很详细,前期开发介绍也很好2ARM嵌入式系统实验教程(二),北航版有ZLG2200的原理图,实验程序和注释,了解人家是怎么开发的。
3ARM嵌入式系统基础教程最重要的是体系结构,汇编部分介绍,[url=]看看[/url]吧,增加理论素质。
444B0数据手册写在这里是强调它的重要。
不推荐ZLG早期岀的红色皮的ARM什么体系结构〜只类的写的太多,看烦了。
其他的书没了几本,没看见好的,大家有看过的推荐吧。
七选UCOS?UCLINUX ?LINUX ?VXWORKS ?还是当单片机用1搞开发,工程设计,用UCOS ,小巧,多进程,简单,体现了ARM7 的精髓。
2 LINUX 正根的嵌入式系统,LINUX 消费与通信领域用的比较多,但缺点是必须ARM9 才能跑,ARM9 的板子自己做就不行了,6 层板太贵。
买开发板1K 达底吧。
但是还是推荐选ARM9+LINUX3 UCLINUX 算投机嵌入式系统:)ARM7 上可以跑,由有LINUX 近亲,学好好可以比较方便的转向LINUX ,像我一样的穷鬼用吧,呵呵4VXWORKS 学好后可以找到高薪工作,但工作机会本身并不比LINUX 好找。
5当单片机用不推荐,虽然我景仰的ZLG 一直号召这么干。
因为对于学习来说多进程的系统设计才是ARM7 的玩头,至少你也要整个UCOS 啊:)有朋友问我先学这个当基础不行吗?那当然可以~~但我当时就用了1 周搞定,就是我先的ADS 在RAM 中调试的笔记。
后来我清空FLASH 用的小段程序还是当时写的LED 闪烁程序呢。
另外1 周里其中还因为自己过于菜,没把OM 设置好导致晶阵不阵哈哈。
这个是必须做的,但一带而过。
目标放的远一点。
八学习要用多长时间我从菜鸟到现在两个多月,中间被打扰数次。
仍然搞定了PCB 设计与制版,RAM 调试,FLASH 下载,UBOOT 移植和下载UCLINUX (没剪裁,用现成的),LCD 驱动。
再次坦诚的说:我确实比较菜,说这些不是让大家羡慕,只是告诉你们“你们应该比这个更好” 我相信良好的态度+合适的方*+ 及时的总结=成绩九ARM 都玩什么就几点1 硬件设计2系统移植3驱动开发4应用开发没了。
其中推荐把注意力放在后两个上,3 有难度,4 比较灵活,最重要的是都是找工作的砝码。
十我用的什么板子很多人问我这个问题,我特意写过一个的。
再说一次吧。
我是自己做的,RAM、ROM、8019 等比较麻烦而当时的自己不理解的都按照龚俊的做的。
保持其他不便的情况下做了如下改动。
1 加了串口通信的GPS 模块、GPRS 模块一个UART0 ,一个UART1 ,当与要用超级终端时用跳线切换。
2 SD 卡,和7843 触摸屏同时挂在SPI总线上,因为SPI只能挂一个设备,同时还做了I/O模拟的准备,把两个设备又通过跳线挂在4 个IO 上。
3 扩了个IIC 的35 个键子的键盘用的ZLG的7290,不占用CPU,最大支持64个键子,只上了35个,其他留接口。