① 如何学习ARM
学习必备条件:
1、一块开发板——现在淘宝上有很多开发板,建议初学者不要去购买那些ARM9体系结构的,因为作为初学者来说ARM9体系的东西是很复杂的,买块ARM7的就可以了(先入门,然后再提高);
2、学习必备书籍
《Pointer on C》中文名字叫《C和指针》(美)里科|译者:徐波 前提你的了解C指针吧(这本书时非常经典的书籍,完全可以看中文版的,作者翻译的非常到位)
《嵌入式实时操作系统μCOS-II(第二版)》--邵贝贝翻译的(不能不承认邵贝贝是一个非常好的翻译者)
《μC/OS-Ⅱ标准教程》--杨宗德
对于英文不好的朋友可以购买《ARM体系结构与编程》--杜春蕾(该书其实还是有很多翻译错误的,大家在看的时候要注意一下,但是不可否认的是这本书到目前为止算得上是我见过最好的讲解关于ARM体系结构的书籍了)
对于英文过关的兄弟姐妹可以直接看《ARM+Architecture+Reference+Manual(2nd+Edition)》
3、有条件的兄弟姐妹可以选购一个仿真器 JLINK V8全功能版(这个的感谢中国的优秀工程师,是他们把原价1999多的JLINK变成了几十元钱的东西
4、开发环境--MDK350或者IARARM
如果要熟悉这些开发环境,就需要好好读一些这些开发环境的手册资料,不好意思,这个就只有英文的了。以上4个条件具备下来,可能也不会超过500元钱。下面来讲讲我的学习经历: 我刚开始学习的时候,自己走了不少弯路,这里就省略不说了。
第一步:在开发板上跑跑简单程序
因为你有开发板,所以你就先在网上找一下对应开发板上的ARM芯片的datasheet,你都不先搞懂芯片的手册,又谈何让自己实现很多功能呢。
熟读数据手册后,就尽可能的在开发板上实现芯片对应的每个功能,像GPIO实验,UART通讯,I2C,ADC,DAC,PWM,RTC,SPI等等。自己写自己的程序,然后在开发板上好好实践一下。
当每个功能模块都实现以后,建议你让你的开发板实验一下多个功能复合使用,比如用UART打印出ADC的值什么的。
第二步:学习uCOS
鉴于你已经购买了《嵌入式实时操作系统μCOS-II(第二版)》,除开以下三个文件:
1、OS_CPU_C.c
2、OS_CPU.H,
3、OS_CPU_A.asm(这个是MDK环境下的汇编文件)或OS_CPU_A.a(这个是IAR开发环境下的汇编)
这三个文件的处理机制暂时可以不用先了解怎么做的,怎么移植的,以后再说
第一次读这本书时,搞清楚什么是任务,什么是前后台,为什么要在系统中加入嵌入式操作系统。
第二次读这本书时,详细了解他的TCB(Task Control Block)和ECB(Event Control Block)的数据结构,搞清楚整个uCOS的实现机制(这里不要先就去看uCOS的移植,这样只会让你云里雾里的)
第三次读这本书是,详细了解信号量,互斥信号量、消息队列、邮箱和时间标志组
鉴于你又购买了《μC/OS-Ⅱ标准教程》,你 可以想在VC++ 6.0开发环境下实现对信号量,互斥信号量、消息队列、邮箱和事件标志组的上机实验代码。
如果还是不能了解uCOS怎么工作的,建议你多看几遍(我可是足足看了6、7遍了,书都翻得脱页了。汗说明我很笨,希望各位看官都比我聪明,呵呵)
第三步:建立对uCOS的初步认识
在网上下载对应你的开发板ARM芯片移植好了文件OS_CPU_C.c,OS_CPU.H,OS_CPU_A.asm(当然有的开发板已经提供了这样的基础实验)
在你的开发板上跑跑uCOS,建立起自己对于uCOS在ARM7开发板上的认识。
在你所购买的ARM7开发板上编写一个自己跑uCOS得任务(这里先不要去搞中断,初学者对于uCOS下的中断程序设计根本就搞不清楚)
第四步:熟悉ARM体系结构
因为是基于ARM7的移植,建议英文不好的去看看这本书《ARM体系结构与编程》(虽然这本书的作者在翻译时有很多操作,但是还是建议初学者去购买来好好 看看),对于英文好的直接在网上下载《ARM+Architecture+Reference+Manual(2nd+Edition)》看就可以了
在看这个《ARM体系结构与编程》或《ARM+Architecture+Reference+Manual(2nd+Edition)》时,务必注意多看几次,了解以下几个方面的知识:
1、ARM模式下的指令集
2、Thumd模式下的指令集
3、异常模式及进入异常时ARM如何处理
4、一定能熟悉ARM中的汇编指令
5、熟悉CPSR,R0-R7,R8-R14,R15及在各个模式下,这些寄存器的映射。
熟悉以后,再来自己做uCOS的移植了。
第五步:uCOS移植
当然在自己编写代码做移植uCOS之前,有必要看看别人的移植代码。
其实对于uCOS的移植,我们只需要编写关键的三个文件,文件如下:
1、OS_CPU_C.c(堆栈初始化操作OSTaskStkInit函数)
2、OS_CPU.H:完成在该芯片下的数据定义,比如什么unsigned char 之类的,注意一下OS_STK和OS_CPU_SR的定义,定义下关中断和开中断的方式,有三个只能选择1个,ARM芯片一般是定义为第三种方式
3、OS_CPU_A.asm(这个是MDK环境下的汇编文件)或OS_CPU_A.a(这个是IAR开发环境下的汇编),这个文件的内容就多了,要做以下几个函数的重写:
1、OSStartHighRdy函数
2、任务级的任务切换函数OSCtxSw,
3、中断级的任务切换OSIntCtxSw,其实只要写好了OSCtxSw,OSIntCtxSw自然就一下就完了(的时候记者要把保存当前任务的寄存器去掉就可以了。
第六步:测试自己的uCOS移植代码
第七步:在自己写的uCOS移植代码中跑跑任务。
转自Tony嵌入式论坛,地址: http://www.cevx.com/bbs/thread-26073-1-1.html
② 嵌入式开发要学哪些课程
嵌入式开发的必学课程:C语言,C++,操作系统,计算机组成原理,linux编程,51单片机,arm,硬件编程语言,模拟电路&数字电路。
嵌入式培训分几个阶段的学习,从基础到实战的练习,一点一点学习和掌握这门技术。学习的课程内容包含:嵌入式高级C语言、嵌入式设备及GUI开发、嵌入式Linux高级程序设计、Linux高级网络程序设计、数据库开发、面向对象高级语言程序设计、物联网、CotexA53 Linux平台驱动开发及真实的企业实战项目。
想要学好嵌入式技术,嵌入式软件开发工程师,从事领域很宽泛,特别是工业控制、消费电子与通信设备三大领域,因为就业面很大,所以人才需求也大。现在智能硬件也比较火,这方面的发展也会大大拓展嵌入式软件开发工程师的就业机会。再者,嵌入式硬件工程师,需求没有嵌入式软件开发工程师大,但因为做硬件门槛会高些,所以这个方向如果做的比较专业,薪资绝对不会低。
③ ARM处理器裸机开发实战:机制而非策略的目录
第1篇 基础篇
第1章 ARM处理器简介
1.1 处理器工作模式
1.2 寄存器介绍
1.2.1 堆栈指针寄存器R13和链接寄存器R14
1.2.2 程序计数器R15
1.2.3 程序状态寄存器
1.3 工作状态
1.4 数据长度
1.5 存储系统
1.5.1 ARM地址空间
1.5.2 ARM存储器的格式
1.6 天嵌TQ2440开发板硬件资源概述
1.7 本章小结
1.8 扩展阅读之CISC处理器和RISC处理器简介
第2章 ADS集成开发环境及程序下载具体流程
2.1 ADS 1.2集成开发环境简介
2.1.1 CodeWarrior for ARM
2.1.2 AXD调试器的启动
2.2 工程的编辑与修改
2.2.1 建立一个新工程
2.2.2 建立一个源文件
2.2.3 添加源文件到工程
2.2.4 编译与链接工程
2.2.5 打开已有的工程
2.3 工程的调试
2.3.1 装载映像文件
2.3.2 调试工具条的使用
2.4 H-JTAG的安装与调试
2.4.1 H-JTAG的安装
2.4.2 H-JTAG的设置
2.5 使用U-Boot下载裸机程序
2.6 本章小结
第3章 ARM指令集及汇编语言基础
3.1 ARM指令集介绍
3.1.1 ARM指令集
3.1.2 ARM寻址方式
3.1.3 ARM伪操作和伪指令介绍
3.2 ARM汇编基础知识
3.3 ARM汇编程序的基本结构
3.3.1 编写汇编程序基本的格式规范
3.3.2 程序入口和程序结束
3.3.3 段
3.3.4 标号(标志符)
3.3.5 外部标号
3.3.6 文件包含
3.4 用AXD调试ARM汇编程序实验
3.4.1 建立工程并添加源文件
3.4.2 工程的设置
3.4.3 编译源文件
3.4.4 启动AXD调试器
3.4.5 手把手调试汇编程序
3.5 常用汇编语言程序子模块实例分析
3.5.1 特殊功能寄存器的访问
3.5.2 内存数据复制
3.5.3 批量加载与存储
3.5.4 堆栈操作
3.5.5 实现查表功能
3.6 本章小结
3.7 扩展阅读之内存和I/O地址、前序寻址和后序寻址
第4章 ARM C语言基础
4.1 数据类型基础
4.1.1 用typedef和#define定义类型
4.1.2 用signed和unsigned修饰数据类型
4.1.3 volatile和强制类型转换
4.2 深入理解位运算符和位运算
4.2.1 按位与运算符(&)
4.2.2 按位或运算符(|)
4.2.3 按位取反运算符(~)
4.2.4 左移和右移运算符(<>)
4.2.5 位运算应用实例分析
4.3 控制结构
4.3.1 选择结构
4.3.2 循环结构
4.4 防止文件重复包含技巧
4.5 ARM编译器对C语言的扩展
4.5.1 __irq声明中断处理函数
4.5.2 __swi声明软中断
4.5.3 __asm内嵌汇编
4.5.4 __inline定义内联函数
4.6 本章小结
4.7 扩展阅读之高速缓存基础知识
第5章 ARM汇编语言和C语言混合编程基础
5.1 一个混合编程实例的实现
5.2 APCS规则概述
5.2.1 寄存器的使用
5.2.2 参数传递
5.2.3 函数的返回值
5.3 本章小结
第6章 GPIO编程实验
6.1 GPIO概述
6.1.1 GPIO引脚介绍
6.1.2 GPIO特性分析
6.1.3 GPIO相关寄存器
6.1.4 GPIO应用实例
6.2 基础实验:第一个裸机程序——流水灯
6.2.1 硬件电路分析
6.2.2 建立工程并添加启动代码
6.2.3 添加源文件
6.2.4 编辑源文件
6.2.5 工程设置、编译、链接
6.2.6 下载程序到开发板运行
6.2.7 由点亮LED引发的思考
6.2.8 再议点亮LED实验
6.2.9 将点亮一个LED扩展到流水灯
6.3 GPIO扩展实验
6.3.1 按键实验
6.3.2 蜂鸣器实验
6.4 本章小结
6.5 扩展阅读之模块化编程、NAND FLASH和 NOR FLASH概述
第2篇 提高篇
第7章 启动代码分析
7.1 从开发板硬件讲起
7.1.1 TQ2440核心板芯片功能介绍
7.1.2 从NAND FLASH和NOR FLASH启动流程分析
7.2 启动代码详解
7.3 启动代码主要功能模块分析
7.3.1 建立中断向量表
7.3.2 初始化各个模式的堆栈
7.3.3 初始化系统硬件
7.3.4 初始化应用程序的执行环境并跳转到主程序执行
7.3.5 跳转到C语言主程序执行
7.4 本章小结
7.5 本章附录——完整版启动代码
第8章 系统时钟和定时器
8.1 S3C2440时钟系统概述
8.1.1 系统时钟初始化
8.1.2 FCLK、HCLK和PCLK与Fin的关系
8.2 定时器原理与应用
8.2.1 定时器原理
8.2.2 定时器相关的寄存器
8.2.3 定时器基础实验代码详解及测试
8.2.4 定时器扩展实验之PWM实验
8.3 本章小结
第9章 存储器控制器
9.1 S3C2440地址空间
9.2 操作实例:SDRAM实例分析
9.2.1 SDRAM工作原理
9.2.2 SDRAM接口电路设计
9.2.3 SDRAM初始化过程详解
9.2.4 回顾启动代码中的SDRAM初始化
9.3 本章小结
第10章 通用异步收发器(UART)
10.1 UART概述
10.2 S3C2440处理器UART工作原理
10.3 引脚描述及相关寄存器
10.4 UART基础实验
10.4.1 硬件电路分析
10.4.2 程序设计及代码详解
10.4.3 实例测试
10.4.4 UART基础实验分析
10.5 UART高级实验——可变参数函数在UART中的应用
10.5.1 程序设计及代码详解
10.5.2 实例测试
10.6 本章小结
第11章 中断控制系统
11.1 S3C2440中断系统概述
11.1.1 深入理解CPU的工作模式
11.1.2 中断控制器
11.2 外部中断实验
11.2.1 硬件电路分析
11.2.2 程序分析
11.2.3 中断执行流程详解
11.2.4 中断处理流程引发的思考
11.2.5 实例测试
11.2.6 为什么进入不了中断
11.3 定时器中断实验
11.3.1 程序代码分析
11.3.2 实例测试
11.4 串口中断原理及实验
11.4.1 如何正确使用中断
11.4.2 程序代码分析
11.4.3 实例测试
11.5 ARM中断之高级应用:软中断原理及实验
11.5.1 程序代码分析
11.5.2 实例测试
11.5.3 软中断所用到的启动代码
11.6 本章小结
第12章 NAND FLASH原理与实验
12.1 FLASH概述
12.1.1 NAND FLASH的基本结构
12.1.2 NAND FLASH接口电路
12.1.3 如何访问NAND FLASH
12.1.4 S3C2440 NAND FLASH控制器
12.1.5 使用宏代替简单的函数
12.2 NAND FLASH基础实验
12.2.1 NAND FLASH基本操作函数分析
12.2.2 NAND FLASH基础实验之页读写
12.2.3 页读写实例测试
12.2.4 NAND FLASH基础实验之读ID
12.2.5 读ID实例测试
12.3 NAND FLASH高级实验
12.3.1 随机读、写实验代码详解
12.3.2 随机读、写实例测试
12.4 回顾启动代码中的NAND FLASH读取函数
12.5 本章小结
第13章 LCD控制器原理与实验
13.1 LCD和LCD控制器工作原理
13.1.1 LCD概述
13.1.2 LCD接口信号
13.1.3 LCD显示原理
13.1.4 LCD操作时序详解
13.1.5 S3C2440 LCD控制器
13.1.6 LCD 控制寄存器初始化
13.2 LCD基础实验
13.2.1 硬件电路分析
13.2.2 程序代码分析
13.2.3 实例测试
13.3 LCD基础实验之单像素显示
13.3.1 程序代码分析
13.3.2 实例测试
13.4 LCD基础实验之图片显示
13.4.1 如何将图片转换为C语言数组
13.4.2 程序代码分析
13.4.3 实例测试
13.5 LCD高级实验之汉字显示
13.5.1 两种常见的汉字编码
13.5.2 LCD汉字显示原理
13.5.3 程序代码分析
13.5.4 实例测试
13.5.5 LCD显示高级技巧——可变参函数Lcd_Printf的实现
13.5.6 可变参函数Lcd_Printf测试
13.5.7 汉字区位码的思考
13.5.8 实例测试
13.6 本章小结
第14章 ADC原理与实验
14.1 ADC原理
14.1.1 ADC相关寄存器
14.1.2 ADC初始化
14.2 ADC实验
14.2.1 ADC实验代码详解
14.2.2 ADC实验测试
14.3 本章小结
第3篇 典型项目分析
第15章 综合实战
15.1 实战1:数据采集系统实现
15.1.1 功能描述
15.1.2 模块划分
15.1.3 代码实现
15.1.4 实例测试
15.1.5 实验总结
15.2 实战2:串口控制实验
15.2.1 功能描述
15.2.2 模块划分
15.2.3 代码实现
15.2.4 实例测试
15.2.5 实验总结
15.3 实战3:制作电子相册
15.3.1 功能描述
15.3.2 模块划分
15.3.3 代码实现
15.3.4 实例测试
15.3.5 实验总结
第4篇 理论知识扩展
第16章 嵌入式系统电源设计和Linux内核开发基础
16.1 直流稳压电源分类
16.1.1 普通线性稳压器工作原理
16.1.2 低压差线性稳压器工作原理
16.1.3 电容式开关电源的工作原理
16.1.4 电感式开关电源的工作原理
16.1.5 嵌入式系统设计中的电源芯片选型
16.1.6 设计实例分析
16.2 Linux内核基础实验
16.2.1 实验一:修改调度算法实验
16.2.2 实验二:添加内核模块实验
参考文献