arm学习方法(转)

来源:互联网 发布:下好的php文件怎么打开 编辑:程序博客网 时间:2024/05/29 10:59

说明:

(1)前几天下定决心,要学习嵌入式(arm+linux),就在网上看别人的经验,感觉有用的就摘抄下来,留着以后提醒自己。在文件夹里,容易找不到,就贴在csdn里,自己可以看,也可以让和我一样的新手们做个借鉴。

(2)里面不对的地方,大家可以提出来。

(3)由于以前要保存在txt文件里自己看,好多文章未留链接等有关作者的信息。如果里面有那位的文章,请告诉我,我把您的大名和链接补上。

(4)下面有5个部分,重点推荐第2个。

 

(一)、你既然对 ARM 、Linux都有基础,你要买一块试验板(2410或2440),这样才和工作有些接轨,做应用层那就要懂得裁剪、移植,你首先移植u-boot、内核、根文件系统到开发板上,这些技术网上都有,不是很难。既然是做应用层,那你一定一定要会 QT、、、用QT做一个程序,经过交叉编译,然后将目标文件放到根文件系统中,一起进行交叉编译、、、这样一个完整嵌入式程序(ARM + Linux + QT)就能跑动了(你QT应用程序刚开始做一些简单就行,企业就希望招到这样的员工)
http://zhidao.baidu.com/question/116711798.html

(二)、

1、Linux 基础

安装Linux操作系统 
Linux文件系统 
Linux常用命令 
Linux启动过程详解 
熟悉Linux服务
能够独立安装Linux操作系统 
能够熟练使用Linux系统的基本命令 
认识Linux系统的常用服务 安装Linux操作系统 
Linux基本命令实践 
设置Linux环境变量 

定制Linux的服务 Shell 编程基础,使用vi编辑文件 
使用Emacs编辑文件
使用其他编辑器
2、Shell 编程基础
Shell简介 
认识后台程序
Bash编程熟悉Linux系统下的编辑环境 
熟悉Linux下的各种Shell 
熟练进行shell编程熟悉vi基本操作 
熟悉Emacs的基本操作 
比较不同shell的区别 
编写一个测试服务器是否连通的shell脚本程序 
编写一个查看进程是否存在的shell脚本程序 
编写一个带有循环语句的shell脚本程序
3、Linux 下的 C 编程基础
linux C语言环境概述 
Gcc使用方法 
Gdb调试技术 
Autoconf 
Automake 
Makefile 
代码优化 熟悉Linux系统下的开发环境 
熟悉Gcc编译器 
熟悉Makefile规则编写Hello,World程序 
使用 make命令编译程序 
编写带有一个循环的程序 
调试一个有问题的程序
4、嵌入式系统开发基础
嵌入式系统概述 
交叉编译 
配置TFTP服务 
配置NFS服务 
下载Bootloader和内核 
嵌入式Linux应用软件开发流程
熟悉嵌入式系统概念以及开发流程 
建立嵌入式系统开发环境制作cross_gcc工具链 
编译并下载U-boot 
编译并下载Linux内核 
编译并下载Linux应用程序
4、嵌入式系统移植
Linux内核代码 
平台相关代码分析 
ARM平台介绍 
平台移植的关键技术 
移植Linux内核到 ARM平台 了解移植的概念 
能够移植Linux内核移植Linux2.6内核到 ARM9开发板
5、嵌入式 Linux 下串口通信
串行I/O的基本概念 
嵌入式Linux应用软件开发流程 
Linux系统的文件和设备 
与文件相关的系统调用 
配置超级终端和MiniCOM 能够熟悉进行串口通信 
熟悉文件I/O 编写串口通信程序 
编写多串口通信程序
6、嵌入式系统中多进程程序设计
Linux系统进程概述 
嵌入式系统的进程特点 
进程操作 
守护进程 
相关的系统调用了解Linux系统中进程的概念 
能够编写多进程程序 
编写一个守护进程程序 
sleep系统调用任务管理、同步与通信 Linux任务概述
任务调度 
管道 
信号 
共享内存 
任务管理 API 了解Linux系统任务管理机制 
熟悉进程间通信的几种方式 
熟悉嵌入式Linux中的任务间同步与通信
编写一个简单的管道程序实现文件传输 
编写一个使用共享内存的程序
7、嵌入式系统中多线程程序设计
线程的基础知识 
多线程编程方法 
线程应用中的同步问题了解线程的概念 
能够编写简单的多线程程序编写一个多线程程序
8、嵌入式 Linux 网络编程
网络基础知识 
嵌入式Linux中TCP/IP网络结构 
socket 编程 
常用 API函数 
分析Ping命令的实现 
基本UDP套接口编程 
许可证管理 
PPP协议 
GPRS 了解嵌入式Linux网络体系结构 
能够进行嵌入式Linux环境下的socket 编程 
熟悉UDP协议、PPP协议 
熟悉GPRS 使用socket 编写代理服务器 
使用socket 编写路由器 
编写许可证服务器 
指出TCP和UDP的优缺点 
编写一个web服务器 
编写一个运行在 ARM平台的网络播放器
9、GUI 程序开发
GUI基础 
嵌入式系统GUI类型 
编译QT 
进行QT开发熟悉嵌入式系统常用的GUI 
能够进行QT编程使用QT编写“Hello,World”程序 
调试一个加入信号/槽的实例 
通过重载QWidget 类方法处理事件
10、Linux 字符设备驱动程序
设备驱动程序基础知识 
Linux系统的模块 
字符设备驱动分析 
fs_operation结构 
加载驱动程序了解设备驱动程序的概念 
了解Linux字符设备驱动程序结构 
能够编写字符设备驱动程序编写Skull驱动 
编写键盘驱动 
编写I/O驱动 
分析一个看门狗驱动程序 
对比Linux2.6内核与2.4内核中字符设备驱动的不同
Linux 块设备驱动程序块设备驱动程序工作原理 
典型的块设备驱动程序分析 
块设备的读写请求队列了解Linux块设备驱动程序结构 
能够编写简单的块设备驱动程序比较字符设备与块设备的异同 
编写MMC卡驱动程序 
分析一个文件系统 
对比Linux2.6内核与2.4内核中块设备驱动的不同
11、文件系统
虚拟文件系统 
文件系统的建立 
ramfs内存文件系统 
proc文件系统 
devfs 文件系统 
MTD技术简介 
MTD块设备初始化 
MTD块设备的读写操作了解Linux系统的文件系统 
了解嵌入式Linux的文件系统 
了解MTD技术 
能够编写简单的文件系统为 ARM9开发板添加 MTD支持 
移植JFFS2文件系统 
通过proc文件系统修改操作系统参数 
分析romfs 文件系统源代码 
创建一个cramfs 文件系统

(三)

搞嵌入式开发的人有两类:一类是学电子工程、通信工程等偏硬件专业出身的人,他们主要是搞硬件设计,有时要开发一些与硬件关系最密切的最底层软件,如BootLoader、 Board Support Package(像PC的BIOS一样,往下驱动硬件,往上支持操作系统),最初级的硬件驱动程序等。他们的优势是对硬件原理非常清楚,不足是他们更擅长定义各种硬件接口,但对复杂软件系统往往力不从心(例如嵌入式操作系统原理和复杂应用软件等)。另一类是学软件、计算机专业出身的人,主要从事嵌入式操作系统和应用软件的开发。如果学软件的人对硬件原理和接口有较好的掌握,我们完全也可写BSP和硬件驱动程序。嵌入式硬件设计完后,各种功能就全靠软件来实现了,嵌入式设备的增值很大程度上取决于嵌入式软件,这占了嵌入式系统的最主要工作(目前有很多公司将硬件设计包给了专门的硬件公司,稍复杂的硬件都交给台湾或国外公司设计,国内的硬件设计力量很弱,很多嵌入式公司自己只负责开发软件,因为公司都知道,嵌入式产品的差异很大程度在软件上,在软件方面是最有"花头"可做的),所以搞软件的人完全不用担心我们在嵌入式市场上的用武之地,越是智能设备越是复杂系统,软件越起关键作用,而且这是目前的趋势。
如果是希望向嵌入式软件方向发展的话,以下建议希望对您有帮助,
嵌入式软件目前最常见的是嵌入式Linux方向,关于这个方向,我认为大概分3个阶段:
1、嵌入式linux上层应用,包括QT的GUI开发
2、嵌入式linux系统开发
3、嵌入式linux驱动开发
嵌入式目前主要面向的几个操作系统是,LINUX,WINCE、VxWorks等等
Linux是开源免费的,而且其源代码是开放的,更加适合我们学习嵌入式。
所以你可以尝试以下路线:
(1) C语言是所有编程语言中的强者,单片机、DSP、类似ARM的种种芯片的编程都可以用C语言搞定),因此必须非常熟练的掌握。推荐书籍:《The C Programming Language》 这本经典的教材是老外写的,也有中译版本。
(2) 操作系统原理,是必需的,如果你是计算机专业毕业那也就无所谓了,如果是非计算机专业的就必须找一本比较浅显的计算机原理书籍看一看,把啥叫“进程”“线程”“系统调度”等等基本问题搞清楚。
(3) Linux操作系统就是用C语言编写的,所以你也应该先学习下Linux方面的编程,只有你会应用了,才能近一步去了解其内核的精髓。推荐书籍:《UNIX环境高级编程》(第2版)
(4) 了解ARM的架构,原理,以及其汇编指令,我们在嵌入式开发中,一般很少去写汇编,但是最起码的要求是能够看懂arm汇编。
(5) 系统移植的时候,就需要你从最下层的bootloader开始,然后内核移植,文件系统移植等。而移植这部分对硬件的依赖是非常大的,其配置步骤也相对复杂,也没有太多详细资料。
(6) 驱动开发
linux驱动程序设计既是个极富有挑战性的领域,又是一个博大精深的内容。
linux驱动程序设计本质是属于linux内核编程范畴的,因而是对linux内核和内核编程是有要求的。在学习前你要想了解linux内核的组成,因为每一部分要详细研究的话足够可以扩展成一本厚书。
以上只不过是大概的框架,在实际的开发中还会涉及很多东西,比如:交叉编译、makefile、shell脚本等等,所以说学习嵌入式的周期较长,门槛较高,自学的话更是需要较强的学习能力和专业功底。只要能坚持下来一定会取得成功!

(四)

(1)基础学习 —— Linux基础操作、基本服务配置及使用、Shell编程、 C语言、数据结构、(选修)C++、QT

     经典书籍推荐:《鸟哥的 Linux 私房菜-基础学习篇》、《C 程序设计语言》、《C 语言核心技术》、《数据结构与算法分析--C 语言描述》、《C 和指针》、《C 陷阱与缺陷》、《C++ Primer》、《GNU Make》、《C++ GUI Qt4 编程》

  经典学习案例:1、学员成绩管理系统 2、计算器 3、电子词典 4、文件压缩器

(2)基础进阶 —— Linux高级编程、Socket网络编程、TCP/IP

经典书籍推荐:《UNIX 环境高级编程》、《深入理解计算机系统》、《Unix 网络编程》、《TCP/IP 详解》

经典学习案例:
1、串口监听程序 2、图片浏览器 3、MP3 播放器 4、聊天程序 5、 ftp 程序、6、音频广播程序 7、ping 的实现 8、DDos 攻击程序 9、ARP 攻击程序
(3)嵌入式学习
—— 嵌入式汇编、嵌入式体系结构

经典学习案例:
1. ARM 模拟器开发 2. Watchdog 控制程序 3. RTC 时钟控制程序、 4. Uart 控制程序 5. LCD 控制程序 6. 触摸屏控制程序、7. DMA 控制程序 8. 音频控制程序 
        10. 文件系统制作 11. ARM-Linux 移植 
(4)嵌入式晋级提升
——Linux内核、Linux驱动开发

经典书籍推荐:《深入理解 Linux 内核》、《Linux 设备驱动程序》、《Linux 内核设计与实现》、《精通 Linux 驱动程序开发》

经典学习案例:
1. GPIO 驱动 2. RTC 时钟驱动 3. WatchDog 驱动 4. Udev 移植 5. 触摸屏输入设备驱动、6. LCD 显示设备驱动 7. DMA 驱动 8. 音频设备驱动 9. Nand Flash 块设备驱动 10. 网络设备驱动

(1)C 语言指针位操作、限定词多级指针、函数指针内存分配。指针之外,还要学习模块化编译处理、指针与数组、gcc、Makefile、GDB、递归、结构体、宏定义使用等。 

数据结构重点链表、树、排序

而且我们也可以查看一些比较常见的函数(如 strcopy、strcat、printf 等)在内核中是如何实现的,以及编写代码模拟堆栈,这不仅有利于编写代码质量的提高,而且还可以初步了解 Linux 内核精髓,为今后工作打下坚实的基础。

C++、QT 在嵌入式开发领域,上层应用开发及图形界面

(2)Linux 包含了 UNIX 几个典型特性当中最实用的一些功能:

Linux 采用了 SVR4 的进程间通信(IPC)机制:共享内存、消息队列、信号。
Linux 支持 BSD Socket 网络编程接口。
许多 Linux 发行版采用 SysV init 机制,支持运行级别。
进程、线程、信号、文件锁、socket 是这部分内容的重点。TCP/IP

(3)嵌入式汇编 ARM 指令集。有了开发板,我们要下载相对应处理器的 DataSheet 及开发板电路原理图。ARM 体系结构的学习我们是不能完全照抄别人代码的,因为我们自己手中的开发板及处理器与别人是不同的,除非所用的代码是根据你手中的开发板来编写的。
所以,我们要先去看书、看视频资料理解原理及工作方式等,然后根据自己开发板的电路原理图和DataSheet 来编写代码,达到理解外围设备工作原理和操作硬件的目的。

(4)由于 Linux 内核更新速度很快,书籍和视频不可能及时更新,所以我们再看书和视频后,要自己动手下载内核源码包,去看内核中的代码,在这里可以充分检验 C 语言、数据结构等基础知识的掌握程度。而驱动的编写还是要借助外设硬件电路原理图和芯片手册

内核和驱动的知识是让我们根据不同的硬件,编写对应的驱动、合理剪裁内核、制作文件系统,并移植到硬件开发板上。如果手里有 ARM11 6410 及以上的开发板,可以试试在裸板上编写驱动并移植 Android 系统到开发板上吧。

(五)

嵌入式开发的相关领域

目前在嵌入式Linux领域,以下几个方面的人特别难找,一是能将Linux移植到某个新型号的开发版上;二是能写Linux驱动程序的人;三是熟悉Linux内核裁减和优化的人。


搞嵌入式若能熟悉嵌入式应用的一些主要领域,这样的人更受企业欢迎。主要的相关领域包括:

A、数字图像压缩技术:这是嵌入式最重要最热门的应用领域之一,主要是应掌握MPEG编解码算法和技术,如DVD、MP3、PDA、高精电视、机顶盒等都涉及MPEG高速解码问题。

B、通信协议及编程技术:这包括传统的TCP/IP协议和热门的无线通信协议。首先,大多数嵌入式设备都要连入局域网或Internet,所以首先应掌握TCP/IP协议及其编程,这是需首要掌握的基本技术;其次,无线通信是目前的大趋势,所以掌握无线通信协议及编程也是是很重要的。无线通信协议包括无线局域网通信协议802.11系列,Bluetooth,以及移动通信(如GPRS、GSM、CDMA等)。

C、网络与信息安全技术:如加密技术,数字证书CA,以及各种网络安全设备,包括硬件防火墙,入侵检测IDS,还有防毒墙,IPS等,中国在这方面还是没有自己优势的,我们陈院长好象正在往这方面发展.

D、DSP技术:DSP是DigitalSignalProcess数字信号处理的意思,DSP处理器通过硬件实现数字信号处理算法,如高速数据采集、压缩、解压缩、通信等。数字信号处理是电子、通信等硬件专业的课程,对于搞软件的人若能了解一下最好。目前DSP人才较缺。如果有信号与系统、数字信号处理等课程基础,对于学习MPEG编解码原理会有很大帮助。

对于软件工程专业的学生,从事嵌入式软件开发,像数字电路、计算机组成原理、嵌入式微处理器结构等硬件课程是较重要的。另外,汇编语言、C/C++数据结构算法、特别是操作系统等软件基础课也是十分重要的。我们的主要目地是能看懂硬件工作原理,但重点应是在嵌入式软件,特别操作系统级软件,那将是我们的优势。我们的研究生里有些是学电子、通信类专业过来的,有较好的模拟电路和单片机基础,学嵌入式非常合适。嵌入式本身就是从单片机发展过来的,只是单片机不带OS,而现在很多嵌入式应用越来越复杂,以至不得不引入嵌入式操作系统。另外,为追求更高速的信号处理速度,现在在一些速度要求较高场合,有不少公司是将一些DSP算法如MPEG压缩解压缩算法等用硬件来实现,这就涉及到HDL数字电路设计技术及其FPGA/IP核实现技术,这方面的人目前市场上也很缺。


5、学习ARM单片机。

  (1)、细读《ARM微控制器基础与实战》周立工编写(注:即使你不用书中的开发板)

  (2)、细读相关芯片的原版英文文档。如:arm920TE.pdf  S3C2410_1.2.pdf

6、学习uCOS!!操作系统。

  (1)、细读《嵌入式实时操作系统uC/OS-!!》第二版 召贝贝译

   你能把uCOS!!移植到自己的平台上吗?

  (2)、能编写在uCOS!!操作系统环境下运行的针对具体硬件的驱动程序

7、熟悉Linux环境,学习Linux环境编程,学习交叉编程

  (1)、细读《linux命令大全.pdf》

  (2)、细读《GNUMake使用手册(中译版).pdf》

  (3)、学习创建交叉编程环境.

8、学习Linux操作系统。     

  (1)、《UNIX环境高级编程》

  (2)、细读“joyfire笔记”,可在“www.qianrushi.com”网站的好书下载栏目获取

(3)、细读《linux内核完全注释》

  (4)、细读《understandingthe linux kernel 2》

  (5)、利用源代码阅读利器工具"SourceInsight"进行真正的linux内核原码刨析

  (6)、最后进行内核移植,并能编写在linux操作系统环境下运行的针对具体硬件的驱动程序

9、学习Linux设备驱动编写。可参考《Linux设备驱动程序》

10、复习C++,学习用QT进行图形界面编程

  (1)、细读《QT编程宝典》

  (2)、学会通过查看QT电子文档进行QTGUI实地编程

  (3)、学习交叉编程.(其实就是把命令qmake变为tmake)


原创粉丝点击