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编程基础
linuxC语言环境概述G使用方法Gdb调试技术AutoconfAutomakeMakefile代码优化
熟悉Linux系统下的开发环境熟悉G编译器熟悉Makefile规则编写Hello,World程序使用make命令编译程序编写带有一个循环的程序
调试一个有问题的程序
4、嵌入式系统开发基础
嵌入式系统概述交叉编译配置TFTP服务配置NFS服务下载Bootloader和内核
嵌入式Linux应用软件开发流程熟悉嵌入式系统概念以及开发流程建立嵌入式系统开发环境制作cross_g工具链编译并下载U-boot
编译并下载Linux内核编译并下载Linux应用程序
5、嵌入式系统移植
Linux内核代码平台相关代码分析ARM平台介绍平台移植的关键技术移植Linux内核到ARM平台了解移植的概念
能够移植Linux内核移植Linux26内核到ARM9开发板
6、嵌入式Linux下串口通信
串行I/O的基本概念嵌入式Linux应用软件开发流程Linux系统的文件和设备与文件相关的系统调用配置超级终端和MiniCOM
能够熟悉进行串口通信熟悉文件I/O编写串口通信程序编写多串口通信程序
7、嵌入式系统中多进程程序设计
Linux系统进程概述嵌入式系统的进程特点进程 *** 作守护进程相关的系统调用了解Linux系统中进程的概念能够编写多进程程序编写多进程程序
编写一个守护进程程序sleep系统调用任务管理、同步与通信Linux任务概述任务调度管道信号共享内存任务管理API了解Linux系统任务管理机制
熟悉进程间通信的几种方式熟悉嵌入式Linux中的任务间同步与通信编写一个简单的管道程序实现文件传输编写一个使用共享内存的程序
8、嵌入式系统中多线程程序设计
线程的基础知识多线程编程方法线程应用中的同步问题了解线程的概念能够编写简单的多线程程序编写一个多线程程序
9、嵌入式Linux网络编程
网络基础知识嵌入式Linux中TCP/IP网络结构socket编程常用API函数分析Ping命令的实现基本UDP套接口编程许可证管理
PPP协议GPRS了解嵌入式Linux网络体系结构能够进行嵌入式Linux环境下的socket编程熟悉UDP协议、PPP协议熟悉GPRS
使用socket编写代理服务器使用socket编写路由器编写许可证服务器指出TCP和UDP的优缺点编写一个web服务器编写一个运行在
ARM平台的网络播放器
10、GUI程序开发
GUI基础嵌入式系统GUI类型编译QT进行QT开发熟悉嵌入式系统常用的GUI能够进行QT编程使用QT编写“Hello,World”程序
调试一个加入信号/槽的实例通过重载QWidget类方法处理事件
11、Linux字符设备驱动程序
设备驱动程序基础知识Linux系统的模块字符设备驱动分析fs_operation结构加载驱动程序了解设备驱动程序的概念
了解Linux字符设备驱动程序结构能够编写字符设备驱动程序编写Skull驱动编写键盘驱动编写I/O驱动分析一个看门狗驱动程序
对比Linux26内核与24内核中字符设备驱动的不同Linux块设备驱动程序块设备驱动程序工作原理典型的块设备驱动程序分析
块设备的读写请求队列了解Linux块设备驱动程序结构能够编写简单的块设备驱动程序比较字符设备与块设备的异同编写MMC卡驱动程序分析一个文件系统
对比Linux26内核与24内核中块设备驱动的不同
12、文件系统
虚拟文件系统文件系统的建立ramfs内存文件系统proc文件系统devfs文件系统MTD技术简介MTD块设备初始化
MTD块设备的读写 *** 作了解Linux系统的文件系统了解嵌入式Linux的文件系统了解MTD技术能够编写简单的文件系统为ARM9开发板添加MTD支持
移植JFFS2文件系统通过proc文件系统修改 *** 作系统参数分析romfs文件系统源代码创建一个cramfs文件系统
无论选择哪一方向,基本的linux的知识是需要具备的,其他还需要掌握的知识有ARM(最常用的一款嵌入式处理器)和C语言编程,每一方面知识的掌握熟练程度都最终决定了个人进行嵌入式linux开发的综合能力。
嵌入式学习是一个循序渐进的过程,有C语言基础还是比较好的,C++的话不搞上层应用就用不上,如果是希望向嵌入式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脚本等等,所以说学习嵌入式的周期较长,门槛较高,自学的话更是需要较强的学习能力和专业功底。只要能坚持下来一定会取得成功!
其实LZ可以到一些嵌入式培训机构的网站上看一下他们的课程设置,就会在脑子里有个清晰的思路,比如华清远见的官方网站,上面的嵌入式内容很丰富,嵌入式方面的信息更新也很迅速,没事可以去转转。
11嵌入式Linux系统硬件环境
图41开发环境硬件连接
通常基于嵌入式linux系统的开发环境一般由目标机、开发板、交叉编译工具链、远程调试工具和下载机制组成。本课题的工作是在装有linux *** 作系统(RedHat90)的目标机和基于S3C2410a的目标板上进行的。
设置串行接口
串行接口主要是用来目标板发送命令并监测目标板在程序运行过程中的输出信息。
要讲开发板COM1口与PC机的COM口分别用串口线连接好,而在主机端,用minicom与armsys2410用串口线连接好后进行通讯。
首先,设置minicom。用键盘在命令行输入minicom,输入后选定Serialportsetup然后按设置健A健设置SerialDevice,接着输入PC上接入的串行接口号,如果这个系统与串口1相接,相应写入/dev/ttyS0。接着需要设置传输速率,我们需要设置的传输速率为11520,按下E键,设置波特率为11520,设置完成后,没有奇偶校验,没有软件控制流和硬件控制流。设置完成后,选择为默认设置并保存退出。
设置完成后讲开发板复位,这时系统就会显示系统启动打印的信息。
12嵌入式linux系统软件环境
笔者的研究方向主要着重点在于嵌入式linux系统的软件开发层面。嵌入式linux系统可以开发的上层软件多种多样,如果从从软件分析的角度来看大致可以分为四个层次:
一、 *** 作系统的引导。 *** 作系统中要有引入加载程序,主要包括固件(firmware)和Bootloader(引导加载程序)两部分。
二、系统的管控内核。为了更好的分配系统资源,必须要对特定的硬件平台和实际应用移植 *** 作系统linux,这是进程管理的一个重要的部分,这里主要包含了定制内核以及控制内核引导系统的参数。
三、系统文件的引导建立。文件的建立是指文件存在的物理空间,linxu系统中每一个分区都是一个文件系统,都包含自己的目录层次结构,这其中也包括根文件系统(RamDisk)和建立于Flash之上的文件系统。一个系统的 *** 作离不开文的 *** 作,因此要有而且要维护自己的文件系统。
四、软件上的程序用户。经过多年的积累和开发,在自由软件中不断努力的人们为开放源码领域贡献了许多优秀的软件。针对客户的不同需求,为客户量身打造,甚至可以加入图形界面,可以更方便用户的使用。但是嵌入式linux系统不管如何构建,都离不开以下几点:
1)在嵌入的目标机装上交叉编译工具。
2)Bootloader是依赖于开发板硬件而实现编写的。
3)根据客户需求编译嵌入式Linux内核和裁剪冗余。
4)根据客户需要和系统运行的需要来编写设备驱动程序和嵌入式linux应用程序。
5)最后也是最重要的一个部分构建系统文件的目录。
嵌入式驱动开发需要学以下:
一:C语言
嵌入式Linux工程师的学习需要具备一定的C语言基础,C语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解C语言的基础编程以及高级编程知识。包括:基本数据类型、数组、指针、结构体、链表、文件 *** 作、队列、栈等。
二:Linux基础
Linux *** 作系统的概念、安装方法,详细了解Linux下的目录结构、基本命令、编辑器VI ,编译器GCC,调试器GDB和 Make 项目管理工具, Shell Makefile脚本编写等知识,嵌入式开发环境的搭建。
三:Linux系统编程
重点学习标准I/O库,Linux多任务编程中的多进程和多线程,以及进程间通信(pipe、FIFO、消息队列、共享内存、signal、信号量等),同步与互斥对共享资源访问控制等重要知识,主要提升对Linux应用开发的理解和代码调试的能力。
四:Linux网络编程
计算机网络在嵌入式Linux系统应用开发过程中使用非常广泛,通过Linux网络发展、TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、Web编程开发等方面入手,全面了解Linux网络应用程序开发。
重点学习网络编程相关API,熟练掌握TCP协议服务器的编程方法和并发服务器的实现,了解>
五:数据结构与算法
数据结构及算法在嵌入式底层驱动、通信协议、及各种引擎开发中会得到大量应用,对其掌握的好坏直接影响程序的效率、简洁及健壮性。
此阶段的学习要重点理解数据结构与算法的基础内容,包括顺序表、链表、队列、栈、树、图、哈希表、各种查找排序算法等应用及其C语言实现过程。
六:C++ 、QT
C++是Linux应用开发主要语言之一,本阶段重点掌握面向对象编程的基本思想以及C++的重要内容。图形界面编程是嵌入式开发中非常重要的一个环节。
由于QT具有跨平台、面向对象、丰富API、支持2D/3D渲染、支持XML、多国语等强大功能,在嵌入式领域的GUI开发中得到了广范的应用,在本阶段通过基于QT图形库的学习使学员可以熟练编写GUI程序,并移植QT应用程序到Cortex-A8平台。
包括IDE使用、QT部件及布局管理器、信息与槽机制的应用、鼠标、键盘及绘图事件处理及文件处理的应用。
Linux as an Embedded Operating System Linux有用作嵌入式 *** 作系统的潜力吗?本文讨论了Linux的特点 健壮 性 局限以及最重要的一点 它的实时特性 近年来 PC硬件使用的增加是高端嵌入式系统最重要的发展之一 这种 趋势造成高端系统硬件造价的大大跌落 从而使那些以前由于使用非P C结构的嵌入式硬件价格过高而不能做的项目成为可行的 但是嵌入式 PC平台上可选择的软件并不像硬件那样有诱惑力 你可以选择DOS 有 众所周知的局限性 微软Windows 缺乏实时性能 或者某种高端实时 *** 作系统 昂贵 专用 大多是不可移植的 Linux *** 作系统提供了另 外的有吸引力的选择 并且没有上面那些缺陷 Linux先前只是狂热的 Unix迷们闲时专门在台式电脑上使用 后来发展成为必须认真对待的高 级的 稳定的 *** 作系统 最近的发展之一是引入了实时性能 从而使L inux完成了重要的转变 即从爱好者的玩具成为适合嵌入式系统设计者 的有价值的工具 当然 其实时性能还没有那些高端RTOS那么高级 并 且Linux永远不会适合需要最小化RAM和ROM的系统 但是 对很多应用 来说 Linux的优势胜过了不足 现在 大家都知道在嵌入式系统中使用PC硬件的好处 与很多专为嵌入 式市场设计的硬件比较 PC硬件是大规模生产的 容易获得并且便宜 为VME总线设计的接口板价格是PC总线的两倍多 比如模拟和数字I/O板 网络接口 图像采集与处理板等 随着高性能PCI总线应用的增加 吞吐量不再是影响使用PC平台的问题 但是 *** 作系统功能上已经发生革命性的变化 在要求硬件价格降低的同 时 高端嵌入式系统要求更多高级的功能 如图形用户界面和网络支持 很多高端RTOS供应商已经提供了这些功能 一般是作为花更高价钱才 能得到的可选件 微软Windows也有这些功能 却不具备大多数嵌入式 系统要求的实时性能 也许有人想以DOS为基础用单独的第三方工具拼 凑一个系统 但这种努力将是白费并且不存在对这种系统的技术支持 现在需要的是一个便宜 成熟并且提供高端嵌入式系统所必须特性的 *** 作系统 因此 Linux *** 作系统近来开始吸引大家的注意 许多台式PC用户被它 的特点和健壮性所吸引 并且获得它只需支付通过FTP下载的网络费用 Linux带有Unix用户熟悉的完善的开发工具 几乎所有的Unix系统和 应用软件都已移植到了Linux上 Linux还提供了TCP/IP网络协议以及I nternet客户和服务器软件 还有可选择多种窗口管理器的X Windows C C++ Java和其他语言的编译器也可得到 用户会发现这些比Windo ws提供的更成熟 更完善 更易于使用 许多公司至少会有一位Linux 的热衷者 当出现用Windows解决不了的问题时(比如设置一台PC为拨 号服务器)会说 瞧 我们要是用Linux 现在 讨论Bill Gates是否有所担心是有些杂志的一个话题 重要的是 不属于任何一家公司的Linux开始被台式电脑用户接受 其中许多人并 不能被认为是电脑迷 这一方面是因为Linux的成熟 另一方面也因为 这几年Internet的盛行 Linux用户遇到问题时可以通过Internet新闻 组和邮件列表向网上成千上万的在线用户请教 你遇到的问题别人以前 肯定碰到过 一般他们都乐于帮忙 根据我的经验 通常使用网络资源 能比依赖RTOS技术支持部门更快地解决问题 你可能需要从十几条新闻 组其他成员回答的相关信息中搜寻 但至少有一个回答应该是有用的 相比较而言 你从技术支持部门仅得到一个回答 如果是错的 你不得 不重新开始整个过程 另外 致力于提供Linux支持的公司也已经出现 给那些觉得传统的技术支持手段更舒服的用户一个选择 并且所有L inux是提供源代码的 这使最困难的问题也有办法解决 某些嵌入式系统设计者会发现Linux本来的样子就很有用 对于没有实 时要求的应用 或者有实时要求但可以用一定的硬件或协处理器满足的 应用 Linux提供了Windows和DOS之外的选择 但是那样的应用几乎没 有 因此 用Linux实现一个实时 *** 作系统才是真正需要的 并且为了 用它实现高端嵌入式应用已经做了充分的工作 总的来说 有两条途径 来实现实时Linux 在此称之为POSIX路线和低层路线 POSIX和Linux POSIX是标准化类Unix *** 作系统必须具有的特征和接口的运动 POSIX的 思想是为了促进为Unix编写的软件的可移植性 使Unix程序员的工作更 容易 有些实时性的扩展 象POSIX b或IEEE b已经加入到标准 中 这些扩展中包括一些工具 比如信号灯 内存锁定 时钟和计数器 消息队列以及优先级抢先调度 以POSIX为基础来标准化实时 *** 作系统已经受到指责 这个标准又大又 笨 包含了许多适合台式Unix工作站但无助于嵌入式系统的特征 因而 显得很臃肿 标准制定群体被工作站制造商控制 他们不愿对RTOS供应 商和用户让步 还有 POSIX系统调用反映了Unix系统调用的复杂和笨 重 在VxWorks或pSOS+中仅需一两个调用即可完成的 *** 作可能需要十几 个POSIX调用 Unix程序员已经习惯了这种麻烦事 但是嵌入式系统程 序员却觉得很难受 许多Linux开发者正在为了在Linux中实现POSIX b的特征工作 这个活 动已经初见成效并且仍在继续 POSIX内存锁定工具和决定调度算法的 函数已经实现 另外 计数器函数和POSIX b信号仍未完成 也许最糟 糕的是 对任何真正的RTOS都至关重要的信号灯和消息队列也未实现 定义于POSIX c(或IEEE C)中的POSIX线程保证会为POSIX路线 的Linux开发实现 一个进程内可以有多个线程 共享相同的地址空间 这很符合我们熟悉的嵌入式系统中任务的概念 Linux已经部分实现 了POSIX线程 虽然POSIX路线对实现一个实时Linux做了保证 当前和可预见的将来只 有 软 实时的应用能用POSIX b函数来实现 移植POSIX b函数到L inux上时要面对的根本问题是Linux的内核是不可抢先的 因此 要想 不对内核大动干戈而实现 硬 实时特性恐怕是不可能的 通向实时Linux的低层路线 Low level Approach to Real time Linux 比POSIX路线更有意思的是实现硬实时Linux的努力 其中最有前途的要 数新墨西哥技术学院的实时Linux(RT Linux)项目 注意到Linux是一 个为台式电脑用户设计的 *** 作系统 研究者们断定 要想把实时功能移 植到为分时设计的OS上是不会有好结果的 取而代之的是 他们在 *** 作 系统的下面实现了一个简单的实时内核 而Linux本身也仅作为那个内 核上的一个任务来运行 Linux运行的优先级最低 随时可以被更高优 先级的任务抢先 RT Linux的设计理念是 对Linux作最小的改动 仅提供为了实现实时 应用必不可少的东西 这样就使RT Linux比较容易移植到新版本的Lin ux上 同时 RT Linux依赖于Linux来提供所需的几乎所有服务 而RT Linux仅提供低层任务创建 安装中断服务例程 并为低层任务 ISR 和Linux进程之间的通信排队 这种设计的结果之一是 一个RT Linux应用可以看作有两个域 实时和 非实时 放在实时域的函数能满足其实时要求 但是它们必须比较简单 因为可用资源很受限制 另一方面 非实时功能可以利用整个Linux 资源 但不能有任何实时要求 两个域之间的通信工具已提供 但是使 用RT Linux之前 嵌入式系统设计者必须确保所有需要实现的功能适合 两个域之一 使用RT Linux并不能变戏法似的使已经存在的Linux功能 具有实时性 例如 假设设计者有一个串口的Linux驱动程序 当串口 接收一个字节序列之后 在一个固定时间内 由实时任务打开并口输出 一行 这个驱动程序不能用 因为在非实时域内你不知道什么时候串口 驱动程序会唤醒实时任务驱动并口完成工作 因此 串口和并口驱动都 必须在实时域内 这就要求重新设计串口驱动程序 RT Linux的任务处理工具是基本的 rt_task_init()用来创建并开始一 个任务 能指定堆栈的大小和优先级 Linux本身以一个最低优先级的 实时任务运行 rt_task_make_periodic()以一定间隔周期性地设置任 务运行 rt_task_wait()阻塞任务 使用简单的抢先调度运行任务 实时任务与Linux进程之间通信的主要方法是FIFO rtf_create()创建 一个一定大小的FIFO 用rtf_put()将数据送入FIFO 如果FIFO满则返 回一个错误 类似地 rtf_get()从FIFO中取出数据 如果FIFO空则返 回一个错误 FIFO最显著的应用是数据流 例如 在一个数据采集应用中 可以用r t_task_init()和rt_task_make_periodic()设置实时任务使其以固定的 间隔从I/O板采样 这个任务用rtf_put()将数据发送到Linux进程 该 Linux进程应该是一个循环 不断从FIFO读出数据 也许还要写数据到 磁盘 或者通过网络发送 或者显示在一个X窗口中 FIFO象一个缓冲 因此Linux进程不必非有实时性不可 实现数据流系统看起来成为RT Linux设计者的主要动机 但是FIFO机制 提供了一个实现信号灯的很好方法 两态信号灯可以通过创建一个大小 为 的FIFO来实现 V *** 作即为rtf_put() 数据内容无所谓 同时忽略 返回的错误 P *** 作为rtf_get() 计数信号灯可以通过创建大小足够容 纳所期望V *** 作个数的FIFO简单地实现 由此可见 FIFO机制提供了实 时应用中任务同步所需的大部分功能 当前的实现在RTOS用户习惯的某 些功能上仍有欠缺 比如优先级禁止(防止优先级反转)和任务安全删 除 但是仔细设计几乎总能避免这些问题 此外 虽然FIFO *** 作可以在 没有数据(读FIFO)或没有空间(写FIFO)时阻塞 语法却相当复杂 阻塞能力看来不是设计的重点 然而 至少有一个提供FIFO阻塞 *** 作简 单语法的努力正在进行 同时还实现了阻塞超时 这是许多嵌入式应用 的重要特征 RT Linux简单 开放的设计允许用户相当容易地实现类似 的附加功能 RT Linux的一个有趣的方面是设计者使Linux内核 lishixinzhi/Article/program/Oracle/201311/17916
以上就是关于嵌入式开发如何入门全部的内容,包括:嵌入式开发如何入门、学习嵌入式linux流程、关于嵌入式Linux系统等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)