2020-02-21 10:06:01 whstudio123 阅读数 3908

写在前面

本文章为我在学习I.MX6ULL ARM Linux时的记录文章,知识来源为《正点原子阿尔法 I.MX6ULL ARM Linux开发板》的视频教程和野火《i.MX Linux开发实战指南》的视频和电子书籍。

学习笔记涉及在学习过程中有关安装,使用,编程,debug的相关知识点和技巧,在一套教程学习完毕后,我将再次整理本笔记,将其中重要的坑点,知识点和一些技巧和问题解决等整理成专栏,敬请大家静待花开,谢谢!

S1:U-Boot

在这里插入图片描述

U-Boot启动界面:(串口)
启动时3秒内按Enter进入U-Boot命令行模式。
在这里插入图片描述
注意:
1.ARM没有PC机中的BIOS,Uboot就类似于BIOS+系统引导程序
2.U-Boot 最重要的功能就是初始化DDR,并将linux镜像和dts设备数拷贝到内存中。
3.大多数的ARM在引导linux之前都需要U-Boot初始化DDR,但有一些ARM的bootROM(就比如I.MX6ULL)会自动初始化DDR,无需U-Boot再初始化了。

S2:正点原子U-Boot编译

在这里插入图片描述
在这里插入图片描述

也可以直接在MakeFile中写好ARCH和CROSS_COMPILE:
在这里插入图片描述

S3:U-Boot基本命令第1讲:help、bdinfo和环境变量命令

1.help命令:?+命令名
例子:

? boot

2.信息查看命令:板子信息

 bdinfo

3.与环境变量有关的命令:

1.setenv(重点):增,删,改环境变量信息
(注意 字符串和带空格的要加单引号把整个串括起来,单纯数字不用引号)
举例:
新增一个名为author 的环境变量,值为whstudio并保存

setenv author 'whstudio'
saveenv

删除一个名为author 的环境变量并保存(将值置为空就是删除)

setenv author
saveenv

修改一个名为author 的环境变量,值为whstudio并保存(环境变量存在就是修改)

setenv author 'whstudio'
saveenv

2.printenv(重点):查环境变量信息
举例:
查看所有环境变量:

printenv

S4:U-Boot基本命令第2讲:内存操作命令

内存操作命令(阅读说明1):

命令 用途 格式 举例 说明
md 显示内存值 md[.b, .w, .l] address [# of objects] md.b 80000000 14 0X80000000 开始的 20 个字节的内存值
nm 修改指定地址的内存值 nm [.b, .w, .l] address nm.l 80000000 以.l 格式修改 0x80000000 地址的数据为 0x12345678(阅读说明2)
mm 修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增 mm [.b, .w, .l] address mm.l 80000000 以.l 格式修改 0x80000000 为起始地址的数据
mw 使用一个指定的数据填充一段内存 mw [.b, .w, .l] address value [count] mw.l 80000000 0A0A0A0A 10 使用.l 格式将以 0X80000000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A
cp 数据拷贝命令 cp [.b, .w, .l] source target count cp.l 80000000 80000100 10 使用.l 格式将 0x80000000 处的地址拷贝到 0X80000100 处,长度为 0x10 个内存块(0x10 * 4=64 个字节)
cmp 比较命令,用于比较两段内存的数据是否相等 cmp [.b, .w, .l] addr1 addr2 count cmp.l 80000000 80000100 10 使用.l 格式来比较 0x80000000 和 0X80000100 这两个地址数据是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节)

说明1:
命令中的[.b .w .l]对应 byte、word 和 long,也就是分别以 1 个字节、2 个字节、4 个字节来显示内存值。address 就是要查看的内存起始地址,[# of objects]表示要查看的数据长度,这个数据长度单位不是字节,而是跟你所选择的显示格式有关。比如你设置要查看的内存长度为20(十六进制为 0x14),如果显示格式为.b 的话那就表示 20 个字节;如果显示格式为.w 的话就表示 20 个 word,也就是 202=40 个字节;如果显示格式为.l 的话就表示 20 个 long,也就是204=80 个字节。另外要注意:
uboot 命令中的数字都是十六进制的!不是十进制的!

说明2:
输入上述命令以后如图 30.4.3.2 所示:
在这里插入图片描述
图 30.4.3.2 nm 命令
在图 30.4.3.2 中,80000000 表示现在要修改的内存地址,ffffff00 表示地址 0x80000000 现在的数据,?后面就可以输入要修改后的数据 0x12345678,输入完成以后按下回车,然后再输入‘q’即可退出,如图 30.4.3.3 所示:
在这里插入图片描述
图 30.4.3.3 修改内存数据
修改完成以后在使用命令 md 来查看一下有没有修改成功,如图 30.4.3.4 所示:
图 30.4.3.4 查看修改后的值
在这里插入图片描述
从图 30.4.3.4 可以看出,此时地址 0X80000000 的值变为了 0x12345678。

S5:U-Boot基本命令第3讲:网络操作命令

要使用网络首先要配置一些环境变量:

环境变量 描述
ipaddr 开发板 ip 地址,可以不设置,使用 dhcp 命令来从路由器获取 IP 地址。
ethaddr 开发板的 MAC 地址,一定要设置。
gatewayip 网关地址。
netmask 子网掩码。
serverip 服务器 IP 地址,也就是 Ubuntu 主机 IP 地址,用于调试代码。

例如:

setenv ipaddr 192.168.1.50 
setenv ethaddr 00:04:9f:04:d2:35 
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.250 
saveenv

注意:
网络地址环境变量的设置要根据自己的实际情况,确保 Ubuntu 主机和开发板的 IP 地址在同一个网段内。

比如我现在的开发板和电脑都在 192.168.1.0 这个网段内,所以设置开发板的 IP 地址为 192.168.1.50,我的 Ubuntu 主机的地址为 192.168.1.250,因此 serverip 就是192.168.1.250。

ethaddr 为网络 MAC 地址,是一个 48bit 的地址,如果在同一个网段内有多个开发板的话一定要保证每个开发板的 ethaddr 是不同的,否则通信会有问题!设置好网络相关的环境变量以后就可以使用网络相关命令了。

命令 用途 格式 举例 说明
ping 是否可以与指定ip进行通信 ping ip ping 192.168.1.250 注意!只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping命令做处理,如果用其他的机器 ping uboot 的话会失败!
dhcp 用于从路由器获取 IP 地址 dhcp dhcp 直接输入 dhcp 命令即可通过路由器获取到 IP 地址
nfs 通过 nfs 可以在计算机之间通过网络来分享资源 nfs [loadAddress] [[hostIPaddr:]bootfilename] nfs 80800000 192.168.1.250:/home/zuozhongkai/linux/nfs/zImage 使用 nfs 命令来将 zImage 下载到开发板 DRAM 的 0X80800000 地址处 (ubuntu系统上要建立并开启nfs服务)
tftp 通过网络下载东西到 DRAM 中 tftpboot [loadAddress] [[hostIPaddr:]bootfilename] tftp 80800000 zImage 将 tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处 (ubuntu系统上要建立并开启tftp服务)

注意点1:
nfs 命令的区别在于,tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可。

注意点2:
在这里插入图片描述
在图 中可以看到“TFTP error: ‘Permission denied’ (0)”这样的错误提示,提示没有权限,出现这个错误一般有两个原因:
①、在 Ubuntu 中创建 tftpboot 目录的时候没有给予 tftboot 相应的权限。
②、tftpboot 目录中要下载的文件没有给予相应的权限。
针对上述两个问题,使用命令“chmod 777 xxx”来给予权限,其中“xxx”就是要给予权限的文件或文件夹。

S6:U-Boot基本命令第4讲:FAT操作命令

S7:U-Boot基本命令第5讲:boot相关操作命令

S8:ubuntu下交叉编译工具与传输环境搭建

安装VScode
VScode其实在linux下可以直接运行,不需要安装
我们要做的是给文件夹找一个合适的位置,然后把开始菜单和桌面的程序图标加进去

第一步:下载VScode
在Visual Studio Code官网下载:
VScode linux 64位

第二步:解压缩文件

tar -xvzf code-stable-1536736541.tar.gz

第三步:移动到/usr/local/ 目录,给可执行的权限, 然后就已经可以运行了

mv VSCode-linux-x64 /usr/local/
chmod +x /usr/local/VSCode-linux-x64/code

第四步:添加到开始菜单和桌面
复制一个VScode图标文件到 /usr/share/icons/ 目录(后面会有用),并且编辑VSCode.desktop

cp /usr/local/VSCode-linux-x64/resources/app/resources/linux/code.png /usr/share/icons/
vim /usr/share/applications/VSCode.desktop

然后这样写:

[Desktop Entry]
Name=Visual Studio Code
Comment=Multi-platform code editor for Linux
Exec=/usr/local/VSCode-linux-x64/code
Icon=/usr/share/icons/code.png
Type=Application
StartupNotify=true
Categories=TextEditor;Development;Utility;
MimeType=text/plain;

保存退出,在开始菜单里面应该就看到VScode了。
如果想要桌面上也存在,就这样:

cp /usr/share/applications/VSCode.desktop ~/桌面位置

安装交叉编译器

通常编译工具链对编译环境有较高的要求,编译复杂的程序时,可能需要巨大的存储空间以及强大的 CPU 运算能力加快编译速度。常见的ARM 架构平台资源有限,无论是存储空间还是 CPU 运算能力,都与 PC 相去甚远,特别是对于 MCU 平台,安装编译器根本无从谈起。有了交叉编译,我们就可以在 PC 上快速编译出针对其他架构的可执行程序。

安装过程非常简单,apt安装即可:

sudo apt install gcc-arm-linux-gnueabihf

安装NFS server和挂载NFS目录

第零步:ubuntu和板子处于一个路由器内,并相互ping成功

第一步:虚拟机设置,实体机请跳过:

网络连接选择桥接并勾选复制物理网络连接状态:
在这里插入图片描述
笔记本中经常会有两个或者两个以上的网卡,根据需要进行如下设置:
在这里插入图片描述
再点击管理员模式:
在这里插入图片描述
在里面选择直通(近似可以这样理解)的网卡即可。

总之,大家的电脑和虚拟机不同,不管如何折腾或者怎么连接,目的就是虚拟机和板子之间可以互相Ping成功
ubuntu ping 板子:
在这里插入图片描述

板子ping ubuntu :
在这里插入图片描述

第二步:安装NFS server和挂载NFS目录

apt安装即可:

sudo apt-get install nfs-kernel-server

查看id:

id

记下uid(用户id) 和gid(组id),接下来要用。

安装 NFS 服务后,会新增一个/etc/exports 文件(即/etc 目录下名字为 exports 的文件),
NFS 服务根据它的配置来运行。
这里我们直接使用shell命令修改一下:

sudo echo "/home/pibot/nfs  *(rw,sync,all_squash,anonuid=????,anongid=????,no_subtree_check)" > /etc/exports
sudo exportfs -arv

别忘了把uid和gid填入问号里面去

这里面的*代表所有ip均可以访问,当然也可以指定ip,把它换成:ip/24即可
把/home/pibot/nfs换成你想要挂上去的文件夹

板子设置:

mkdir /home/root/mountnfs
mount -o vers=4 192.168.0.128:/home/pibot/nfs /home/root/mountnfs


执行过去了,就基本正常了,再去挂载目录下看

在这里插入图片描述
文件过来了,搞定!

2015-11-05 11:17:30 vincentXWC 阅读数 0

最近打算开始学习ARM+Linux方面的东西,一来因为本身是学嵌入式专业的,而ARM在嵌入式方向的应用又十分广,但到目前为止平时用到的都是基于Ateml AVR的一些板子,如Arduino、Atmel Raven,接触到的嵌入式系统也只有QP、Contiki等比较小的系统,所以想学习一下相对复杂、功能更加强大的处理器–ARM。而来,想通过具有ARM平台学习一些Linux的知识,掌握基本的Linux开发。前些天看了一些关于ARM的国嵌视频,在这里对自己动手实践的东西做一下记录,以便以后学习过程中复习查看。
这篇文章主要介绍ARM和linux的开发环境搭建,用于从宿主机传程序到ARM开发板,主要是硬件和网络连接,所使用的软硬件资源如下:

  • FriendlyARM开发平台(S3c2440 CPU)
  • 笔记本一台,装有Ubuntu/Win7双系统,主要使用Ubuntu系统,作为宿主机。
  • 台式机一台,XP系统,主要用于ARM平台之上的Linux的串口调试,由于笔记本没有串口接口,所以使用实验室的台式机用于调试。
  • 交叉网线一根,主要是交叉网线,不是普通的网线。

首先通过串口线将ARM和台式机的串口进行连接,然后在台式机上打开超级终端,设置好串口波特率等参数。将ARM的启动模式掰到Nand Flash模式(ARM中已经烧写了Linux系统),打开电源开关,启动Linux系统,台式机的超级终端显示启动过程的数据,启动完成之后,ARM液晶屏显示界面,超级终端显示Bash,此时可以通过超级终端输入Linux命令,操作ARM上的Linux系统。
然后将ARM和笔记本(宿主机)进行网络连接,通过交叉网线连接ARM和笔记本的网卡,连接完成之后手动配置网络参数,使其在同一网段。打开笔记本网络连接,配置网络参数为:

  • IP:192.168.0.1
  • 子网掩码:255.255.255.0
  • 网关:不填
  • DNS:192.168.0.1

    然后通过台式机的超级终端输入bash命令配置ARM的网络:

  • IP:192.168.0.2

  • 子网掩码:255.255.255.0
  • 网关:不填
  • DNS:192.168.0.1

    配置IP和子网掩码使用命令:ifconfig eth0 192.168.0.2 netmask 255.255.255.0
    设置DNS通过修改/etc/resolv.conf实现,nameserver 192.168.0.1
    设置完成之后,笔记本和ARM可以互相ping通,说明网络连接已经完成。(笔记本使用Win7系统时,配置完成后,笔记本ping ARM正常,ARM ping笔记本没有收到数据,通过在笔记本上用Wireshark检测发现,笔记本能收到ARM发来的请求,但没有回复,可以还需要某些地方的设置吧,已经两台电脑联网也有这样的问题。但笔记本运行Ubuntu后可以互相ping通。)
    这里写图片描述

2013-04-27 09:29:43 wyc09 阅读数 0

ARM Linux特指运行于ARM架构处理器平台的Linux,区别于运行于PC上的X86 Linux。

ARM架构处理器多用在嵌入式系统中,通常被集成到片上系统(SoC)。由于片上系统整合外部设备控制器的多样性,对于任何一片特定的片上系统,需要对ARM Linux进行定制,以使集成在片上系统中的各项功能可用,这个过程称为ARM Linux移植。

ARM Linux移植的主要工作:1)Bootloader移植;2)ARM Linux内核移植;3)根文件系统制作。完成这三项基本工作之后,就可以在运行于片上系统之上的ARM Linux基础上开发针对特定需求的应用,包括推迟到开发阶段的驱动程序、应用程序等。 

1)Bootloader移植。

ARM Linux内核被设计为尽可能平台无关,而Bootloader则负责提供板级支持包(BSP)的功能,在为ARM Linux内核提供基本的运行环境之后,如CPU可用、内存可用,便可加载ARM Linux内核,并将系统控制权完全交给ARM Linux内核。这个过程称为引导ARM Linux内核。一般来讲,Bootloader是特定于硬件平台的,但是由于某些开源Bootloader,如UBOOT的存在,使得开发人员可以对既有Bootloader进行尽可能少量的修改,便可将其用来在特定目标板上引导ARM Linux内核。

UBOOT引导ARM Linux内核的一般流程:初始化CPU环境,如关中断、设定运行模式 --> 初始化DRAM控制器,以使内存可用 --> 如有必要,初始化串口用于输出引导信息,初始化网口用于下载ARM Linux内核镜像 --> 加载ARM Linux内核镜像 --> 为ARM Linux内核准备参数,将控制流转到ARM Linux内核入口。

2)ARM Linux内核移植。

ARM Linux内核接受Bootloader的引导参数,如DRAM大小和起始地址、用作Console的设备的名称、根文件系统的位置。为了使ARM Linux内核能够正常使用片上系统芯片内部及目标板上的各种功能,在这个过程中需要在ARM Linux内核代码中加入平台特定的一些代码,通常将这些代码存放在arch/arm目录下的某个机器特定的目录中。ARM Linux内核中已经包含了大量平台特定的代码,但相比平台的多样性,这些代码还是不够的。 在编译生成ARM Linux内核镜像之前,需要对ARM Linux内核进行必要的配置,使在内核代码中实现的某项功能被加入或不加入ARM Linux内核,如加入对mini2440目标板和smdk2440目标板的支持、加入针对三星SoC串口的驱动、不加入FAT文件系统。需要说明一下,ARM Linux内核可以同时支持多种目标板(或称机器类型),但在启动的时候只会根据Bootloader在R1寄存器中指定的机器码来选定一款支持的机器类型,在执行平台无关代码之前进行与选定机器类型平台相关的初始化工作。在平台相关的初始化工作中可以将目标板上的各种功能都初始化,也可什么都不做,而将这些工作推迟到开发阶段来完成。

3)根文件系统制作。

如果ARM Linux内核启动后不需要访问文件系统,就不需要做这项工作。但是大多数情况下,ARM Linux内核在启动后会从文件系统中读取配置文件,并根据配置文件中的内容完成更多的工作,如启动必要的工作进程,使系统进入到指定的工作状态。在ARM Linux内核的启动参数中,initrd指定ARM Linux内核启动后需要执行的程序,ARM Linux内核从指定的根文件系统中加载这个程序并用其创建init进程。init进程做什么工作则是由这个指定的程序来决定的。可能的工作,如启动一个Shell程序或者打开一个图形用户界面。BusyBox提供了一个用于此目的的程序,名称为linuxrc,可以将linuxrc配置为启动一个类似于Linux中的bash的Shell程序,BusyBox同样提供了这个Shell程序。

2018-07-09 14:04:41 weixin_42647793 阅读数 9382

嵌入式时代已经来临,你还在等什么?

 ---循序渐进学习嵌入式开发技术
最近经常有用人单位给 我打来电话,问我这有没有嵌入式Linux方面的开发人员,他们说他们单位急需要懂得在嵌入式linux环境下的软件开发人员,我回答说,现在每年毕业的 大学生那么多,还招不到合适的软件开发人员吗?他跟我说,毕业大学生虽然多,但大部分都能力不够,不能达到他们的工作的要求。该公司HR的一句话说出来我 们现在的大学教学和大学生就业的现状:一方面每年那么多大学生毕业找不到合适的工作,另一方面很多用人单位和企业又找不到合适的人才。造成这种现象最基本 的原因是学校教育和社会需求的严重脱节。其他的专业和行业我不清楚,但是对于嵌入式专业和嵌入式软件行业来说,通过与多所高校的老师和在校高年级本科生, 研究生交流,我还是有所了解的,高校的嵌入式专业的教学现状我在前一篇文章里仔细分析过,造成很多嵌入式专业的学生在毕业后,还是很难达到用人单位的要求 最主要的原因在于高校在嵌入式教学方面重理论和轻实践,很多嵌入式专业的老师也没有实际的工作经验,这样培养出的学生可能让他讲起来头头是道,但是让他去 真正编写,调试一个应用程序就傻眼了,不知道从何下手,因为他们在学校的学习可能从来就没有老师带着他们实际调试过嵌入式程序,也没有机会让你去调试嵌入 式应用程序,那些看起来非常不错的嵌入式实验箱大部分时间都躺在实验室睡大觉,只有在上实验课的时候搬出来让大家看2眼,摸2下,还没有弄明白怎么回事, 又要收到实验室睡大觉去了。这样的教学模式,如何能培养出一名合格的嵌入式工程师呢?出现企业找不到合适的人,大学毕业生找不到合适的工作也就不奇怪了。
嵌入式专业是一门实践性非常强的学科,只有多动手,多实践,多编程,多调试,多看书,多思考才能真正掌握好嵌入式开发技术。
现 在很多同学也意识到了学校培养模式和社会需求脱节问题,有一部分同学也先行行动起来,开始注重培养自己的实际动手能力,培养自己实际分析问题,解决问题的 问题,培养自己在嵌入式专业实际编程,和调试程序的能力。但是嵌入式专业不同于其他学科,嵌入式专业是一门综合性非常强,涉及知识面非常广的学科,对于初 学者来说,面对那么多教程,课本,那么多知识点,往往不知道从何处下手,不知道哪些是重点,哪些不是重点,这些知识点之间有什么关联,一脸的茫然,然后东 一榔头,西一棒子,折腾了几个月甚至大半年后,还是找不着学习嵌入式的方向,还徘徊在嵌入式开发的大门之外。
那么,如何从零开始学习嵌入式开发技术, 进入嵌入式开发大门呢,笔者根据自己的嵌入式学习经历和多年的嵌入式linux教学经验,谈谈自己对嵌入式学习的一些想法和意见,希望对大家有所帮助。

一、练好基本功
嵌入式系统专业是综合了计算机硬件技术,计算机软件技术以及电子电路技术的一门综合学科,所涉及的内涵和知识非常广泛,包括:数字电路,模拟电路,计算机组成原理,单片机基础,C语言基础,操作系统,数据结构,编译原理,计算机控制,计算机网络等知识。
在真正学习嵌入式开发之前,u。对于C语言,至少能单独编写调试一个3 ~ 500行的程序,能够了解C语言的基本语法规则,基本语句的使用,理解指针概念并能灵活使用各种指针。
计算机组成原理要能理解组成一个计算机系统的几大部件,计算机系统的结构,理解系统总线,理解处理器和计算机外部设备的关系,处理器和计算机外设是如何协调工作完成某一项功能的,计算机软件和硬件是如何分工协作完成某一项任务的,理解软件是通过寄存器来控制硬件的。
数字电路,模拟电路要了解其基本原理个概念,能看懂简单模拟、数字电路原理图。理解数字电路中的寄存器,时序的概念,能看懂芯片手册和时序图。对于其他基础课程,重点要理解其中的一些基本概念,如何使用等等。
对 于电子,自动化,通信,计算机类专业的学生,在大二、大三开设的专业基础或专业课程中基本包含了以上的大部分课程。因为缺乏实践,可能学得不是很深入,但 是一些基本的概念和基本知识应该还是有所了解,针对一些薄弱环节,自己稍微加强学习一下,基本上已经具备了学习嵌入式开发的基础。在嵌入式基本功学习阶 段,最重要的是C语言和单片机基础,最好是能用C语言开发一个小的单片机程序,例如用C语言实现单片机和PC的串口通信,用C语言控制LED等显示,用C 语言控制数码管显示等小程序。在这个期间需要的学习工具就是单片机51学习开发板。推荐飞凌的OK-51学习开发板。详情参考:

二、嵌入式Linux应用开发
嵌 入式开发基础知识学习完后,这时候你已经有了一定的嵌入式开发基础了,可以进行基于单片机的嵌入式系统设计了。单片机编程本身也是属于嵌入式编程,但是在 这里我们只是把单片机开发当作嵌入式系统开发的基础,不把单片机开发作为真正的嵌入式系统开发,在这里我们的嵌入式系统开发是指在带有操作系统的嵌入式平 台上的应用和驱动开发,特别指在嵌入式linux平台上的开发。
单片机开发在很早以前是非常热门的,现在在一些比较简单的系统上单片机也用的非常 广泛,随着硬件的成本不断降低,在一些比较复杂的嵌入式设备一般都采用嵌入式linux操作系统,在嵌入式linux平台上进行开发,这样可以极大的提高 嵌入式开发效率,提高系统的稳定性和可靠性,降低开发成本。由于linux是一个开源的操作系统,你可以通过阅读linux内核来理解内核的实现机制,如 果有需要,你甚至可以通过修改内核源码来提高系统的性能;同时,全球参与linux开发的队伍非常庞大,网上有大量的嵌入式linux开发资料和源代码, 很多你需要实现的功能在网上基本都能找到相关源码,参考一下别人写的源码,这样可以极大的提高自己的工作效率和技术能力,近几年,随着参与linux开发 的人越来越多,linux系统的稳定性、实时性有了很大的提高,linux系统无论在服务器上还是嵌入式设备平台上都应用越来越广泛,现在包括华为、中 兴、朗讯的各大通信巨头都开始把自己设备的底层平台从vxworks操作系统迁移到linux系统,可以说嵌入式linux是嵌入式技术发展一个方向,是 嵌入式技术的一面旗帜。基于以上原因,我的建议是学嵌入式开发,就学嵌入式linux开发,相对于wince等其他的嵌入式平台,你可以真正学到更多的东 西,学到嵌入式技术的精髓,同时他又符合嵌入式产业发展的方向,不容易被日新月异的技术发展所淘汰。
有了嵌入式开发的基础,又知道了我们为什么要学习嵌入式linux开发,那我们就要开始动手开始学习了,那如何开始学习嵌入式linux开发,从哪里开始着手呢?
很 多同学这时候就开始买linux书籍,从图书馆借了一大堆关于linux的书:什么《linux使用基础教程》、《linux源码深度分析》、 《linux情景分析等》、 《linux高级使用指南》等等。结果抱着这些图书看了10天半个月还是不知所云,当初学习的激情慢慢就消退了,最后不了了之,终究没有进入嵌入式开发大 门。究其原因,是因为没有找到合适学习嵌入式开发的方法,做任何事情都有方法可循,找对了学习方法往往就能事半功倍;否则就可能是事倍功半,甚至劳而无 功。接下来我先分析一下同学们的几种常见的嵌入式linux学习误区,然后提出一种比较合适的嵌入式linux学习方法。



误区一、全身投入学习桌面或服务器版本linux系统
很 多想学嵌入式linux 的同学经常问我,我不会linux系统,怎么学习嵌入式linux开发,于是他们就花费了大量的精力和时间去研究学习桌面版本linux系统的使用,什么 redhat 、federo,、ubuntu等等都用过,如何配置linux,linux的各种使用命令都背的滚瓜烂熟,linux各种服务器的配置,还原备份各种操 作非常熟悉,以为这样就学会了嵌入式linux开发。其实这是一个学习嵌入式Linux开发的误区。
Linux桌面环境只是嵌入式linux的一 个开发工具,开发环境而已。我们的目标不是学习linux服务器的配置和使用,linux服务器的高级配置和使用那是另外一个领域,不属于嵌入式 linux讨论的范畴。我们进行嵌入式linux开发,只是把linux桌面环境当作一个工具,在linux桌面环境下运行嵌入式linux开发工具,例 如gcc 编译器,make工具来开发我们的嵌入式linux应用程序而已,对于嵌入式开发工程师来说,没有必要花费那么多的精力和时间去研究linux桌面版和服 务器的应用,只要能了解最基本的操作即可。现在的桌面linux系统的图形化界面做的也相当好,跟window具有相同的易用性能,例如ubuntu很多 操作都可以在图形界面下完成,就没有必要去记每个linux命令了。熟悉linux桌面系统的使用和基本操作命令,安排1~2天时间学习基本就可以掌握 了。

误区二、直接阅读linux内核源代码
 很多想学linux,在连linux是什么东西,一点都还不会使用的情况下去就阅读linux内核源代码,花了大量时间去阅读《linux源码深度分 析》、《linux情景分析等》等书。这样的结果很可能就是看的头昏眼花,不知所云,最后只能放弃了。这也是同学们学习嵌入式linux的一个误区,在有 一定嵌入式linux开发基础后,带着一定的目的去阅读linux源代码,这样可以极大的提高你的技术能力,但是你在没有任何基础,对linux一点都不 了解的情况下就去阅读linux内核源代码,无异于以卵击石,最后只能是撞个头破血流。

以上分析了同学们学习嵌入式linux 开发的2个误区,那么如何正确的嵌入式linux开发呢?

u,学习嵌入式linux也一样。在u, 学习嵌入式linux开发比较适合的切入点是从嵌入式linux应用程序开发开始,即暂时先不去关心嵌入式硬件平台,不去关心linux的底层驱动,先把 精力集中在现有的嵌入式linux平台上进行嵌入式linux应用程序设计开发。学习嵌入式linux开发绝不是看看书就可以学好的,需要多实践,编程调 试;因为嵌入式开发不同于普通的基于PC机或服务器的应用程序开发,嵌入式开发的应用程序是要烧写到嵌入式板卡或开发板上运行的,所以首先你要给自己购买 一块开发板,现在普遍流行的嵌入式开发板都是基于u星的ARM9 CPU S3C2440,性价比极高,在这里我推荐使用飞凌公司FL-2440 高性价比ARM9学习开发板,开发板资源丰富,稳定,同时配有大量的实验源码,视频教程和实验指导书。
 有了开发板后 先后开始学习嵌入式linux开发环境搭建、嵌入式linux开发模型、linux内核移植和文件系统、嵌入式linux应用程序移植、嵌入式linux 多进程,多线程应用程序设计、嵌入式linux网络编程,如果对嵌入式数据库或图形软件开发有兴趣的,可以进一步学习嵌入式linux数据库开发或基于 QT的嵌入式linux图形应用软件设计。每学一章节都要通过相关实验来来验证你从书上学到的东西,同时提高自己编写代码,调试程序的能力。这个过程根据 不同学员的基础不同,大概要花上1 ~ 2个月时间。学完这些课程后,你就有了在现有的嵌入式linux平台上进行应用程序设计开发的能力,到一些嵌入式软件公司去,能够胜任在现有的嵌入式 linux平台上进行上层的应用程序开发工作。但是目前你还不能进行嵌入式linux系统和驱动的开发,也就是说,你现在只能在一个已经构建好的嵌入式 linux平台上进行应用程序开发,而自己还没有能力根据实际需要去重新构建一个嵌入式linux平台。要让自己有能力根据实际需要重新构建一个嵌入式 linux软硬件平台,这时候就需要进行下一阶段的学习了,即嵌入式linux系统和驱动开发。

三、嵌入式Linux系统和驱动开发


有 了嵌入式linux平台上开发应用程序的基础,你已经对linux的功能、linux对应用程序提供的接口和系统调用有了一定的了解,知道如何利用 linux提供的功能来进行应用程序开发,知道如何来使用设备驱动来进行应用程序设计,有了这些知识后,你就可以更深入的去学习Linux系统原理和基于 Linux驱动的开发,Linux内核的裁剪,文件系统构,bootloader等等底层的知识了。
想要更深入学习嵌入式Linux系统和驱动开发,要学的内容非常多包括计算机软件、硬件、操作系统知识。这时候你可以参照以下的学习思路,u包括:ARM体系架构、S3C2440微处理器接口设计、时钟系统、LCD屏接口、存储控制器及系统的存储空间分配、NAND FLASH接口和NOR FLASH接口等。u。 学完这些知识点并通过相关实验验证后,嵌入式Linux系统和驱动的开发就算掌握了差不多了,能够胜任绝大部分基于linux平台的驱动开发工作了。学完 这些知识点,根据学员的不同情况,一般需要花三个月到半年时间。通过这一阶段的学习,你在嵌入式Linux开发领域已经算是有了一定的功底,已经不再被人 称为菜鸟了,已经进入嵌入式linux开发高手行列了。

四、更上一层楼
 深入理解了嵌入式内核和驱动开发,这时候写个什么驱动对你已经没有什么问题了,开发过程中一些基本问题都难不倒你了。这是你可能想优化一下系统的性能,比 如实时性,提高系统的启动速度,或者优化系统的内存管理机制,要达到修改内核核心机制的境界,你就需要去深入去研读linux内核源码了,参考 《linux源码深度分析》、《linux情景分析等》等linux源码分析的书籍,深入理解linux各部分的实现机制和原理,以及可能存在的问题。你 只有在深入理解现有代码和实现机制的基础上,才能提出更好的改进方案。如果你能达到这个境界,那你已经是高手中的高手,可以笑傲群雄了。

以 上是笔者结合自己的嵌入式学习经历和嵌入式培训经验总结的一些嵌入式学习方法和步骤,这只是笔者对嵌入式学习的一些看法,希望对那些有兴趣学习嵌入式 linux又不知道从哪开始学的同学们有所帮助。当然,每个人,每个同学的基础,各方面的情况都不一样,每个人都有自己适合的学习方式,本文章总结的一些 学习方法和思路仅供参考,希望大家能找到适合自己的学习嵌入式开发的方式,早日进入嵌入式开发大门。
万丈高楼平地起,心动不如行动,有志从事嵌入式开发的同学不要再犹豫了,赶紧拿出实际行动,好好学习,为实现自己的伟大梦想而努力奋斗吧
2019-03-01 11:14:17 qq_31877249 阅读数 1471

linux+ARM学习路线

学习步骤如下:
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应用程序
嵌入式系统移植
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 文件系统

 第二篇:

一、ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标: 
(1) 掌握主流嵌入式微处理器的结构与原理(初步定为arm9)
 
(2) 必须掌握一个嵌入式操作系统 (初步定为uclinux或linux,版本待定)
 
(3) 必须熟悉嵌入式软件开发流程并至少做一个嵌入式软件项目。
 
从事嵌入式软件开发的好处是:
 
(1)目前国内外这方面的人都很稀缺。这一领域入门门槛较高,所以非专业IT人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,大多数人无条件接触。
 
(2)与企业计算等应用软件不同,嵌入式领域人才的工作强度通常低一些(但收入不低)。
 
(3)哪天若想创业,搞自已的产品,嵌入式不像应用软件那样容易被盗版。硬件设计一般都是请其它公司给订做(这叫“贴牌”:OEM),都是通用的硬件,我们只管设计软件就变成自己的产品了。
 
(4)兴趣所在,这是最主要的。
 
从事嵌入式软件开发的缺点是:
 
(1)入门起点较高,所用到的技术往往都有一定难度,若软硬件基础不好,特别是操作系统级软件功底不深,则可能不适于此行。
 
(2)这方面的企业数量要远少于企业计算类企业。
 
(3)有少数公司经常要硕士以上的人搞嵌入式,主要是基于嵌入式的难度。但大多数公司也并无此要求,只要有经验即可。
 
(4)平台依托强,换平台比较辛苦。
 
兴趣的由来:
 
1、成功观念不同,不虚度此生,就是我的成功。
 
2、喜欢思考,挑战逻辑思维。
 
3、喜欢

C是一种能发挥思维极限的语言。关于C的精神的一些方面可以被概述成短句如下:
 
相信程序员。
 
不要阻止程序员做那些需要去做的。
 
保持语言短小精干。
 
一种方法做一个操作。
 
使得它运行的够快,尽管它并不能保证将是可移植的。
 
4、喜欢底层开发,讨厌vb类开发工具(并不是说vb不好)。
 
5、发展前景好,适合创业,不想自己要死了的时候还是一个工程师。
 
二、方法步骤:
 
1、基础知识:
 
目的:能看懂硬件工作原理,但重点在嵌入式软件,特别是操作系统级软件,那将是我的优势。
 
科目:数字电路、计算机组成原理、嵌入式微处理器结构。
 
汇编语言、C/C++、编译原理、离散数学。
 
数据结构和算法、操作系统、软件工程、网络、数据库。
 
方法:虽科目众多,但都是较简单的基础,且大部分已掌握。不一定全学,可根据需要选修。
 
主攻书籍:the c++ programming language(一直没时间读)、数据结构-C2。
 

2、学习linux:
 
目的:深入掌握linux系统。
 
   方法:使用linux—〉linxu系统编程开发—〉驱动开发和分析linux内核。先看深,那主讲原理。看几遍后,看情景分析,对照深看,两本交叉,深是纲,情是目。剖析则是0.11版,适合学习。最后深入代码。
 
主攻书籍:linux内核完全剖析、unix环境高级编程、深入理解linux内核、情景分析和源代。
 
3、学习嵌入式linux:
 
目的:掌握嵌入式处理器其及系统。
 
方法:(1)嵌入式微处理器结构与应用:直接arm原理及汇编即可,不要重复x86。
 
   (2)嵌入式操作系统类:ucOS/II简单,开源,可供入门。而后深入研究uClinux。
 
   (3)必须有块开发板(arm9以上),有条件可参加培训(进步快,能认识些朋友)。
 
   主攻书籍:毛德操的《嵌入式系统》及其他arm9手册与arm汇编指令等。
 
4、深入学习: 
   A、数字图像压缩技术:主要是应掌握MPEG、mp3等编解码算法和技术。
 
   B、通信协议及编程技术:TCP/IP协议、802.11,Bluetooth,GPRS、GSM、CDMA等。
 
   C、网络与信息安全技术:如加密技术,数字证书CA等。
 
   D、DSP技术:Digital Signal Process,DSP处理器通过硬件实现数字信号处理算法。
 
    说明:太多细节未说明,可根据实际情况调整。重点在于1、3,不必完全按照顺序作。对于学习c++,理由是c++不只是一种语言,一种工具,她还是一 种艺术,一种文化,一种哲学理念、但不是拿来炫耀得东西。对于linux内核,学习编程,读一些优秀代码也是有必要的。
 
   注意: 要学会举一反多,有强大的基础,很多东西简单看看就能会。想成为合格的程序员,前提是必须熟练至少一种编程语言,并具有良好的逻辑思维。一定要理论结合实践。
 
   不要一味钻研技术,虽然挤出时间是很难做到的,但还是要留点余地去完善其他的爱好,比如宇宙,素描、机械、管理,心理学、游戏、科幻电影。还有一些不愿意做但必须要做的!
 
   技术是通过编程编程在编程编出来的。永远不要梦想一步登天,不要做浮躁的人,不要觉得路途漫上。而是要编程编程在编程,完了在编程,在编程!等机会来了在创业(不要相信有奇迹发生,盲目创业很难成功,即便成功了发展空间也不一定很大)。
 

   嵌入式书籍推荐 
   Linux基础
 
   1、《Linux与Unix Shell 编程指南》
 
   C语言基础
 
   1、《C Primer Plus,5th Edition》【美】Stephen Prata着
 
   2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan David M. Rithie(K & R)着
 
   3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE)
 
   4、《嵌入式Linux应用程序开发详解》
 
   Linux内核
 
   1、《深入理解Linux内核》(第三版)
 
   2、《Linux内核源代码情景分析》毛德操 胡希明著
 
   研发方向
 
   1、《UNIX Network Programming》(UNP)
 
   2、《TCP/IP详解》
 
   3、《Linux内核编程》
 
   4、《Linux设备驱动开发》(LDD) 
 
   5、《Linux高级程序设计》 杨宗德著

   硬件基础 
   1、《ARM体系结构与编程》杜春雷着
 
   2、
S3C2410 Datasheet 
   英语基础
 
   1、《计算机与通信专业英语》
 
   系统教程
 
   1、《嵌入式系统――体系结构、编程与设计》
 
   2、《嵌入式系统――采用公开源代码和StrongARM/Xscale处理器》毛德操 胡希明着
 
   3、《Building Embedded Linux Systems》   

   4、《嵌入式ARM系统原理与实例开发》 杨宗德著
   理论基础 
   1、《算法导论》
 
   2、《数据结构(C语言版)》
 
   3、《计算机组织与体系结构?性能分析》
 
   4、《深入理解计算机系统》【美】Randal E. Bryant David O''Hallaron着
 
   5、《操作系统:精髓与设计原理》
 
   6、《编译原理》
 
   7、《数据通信与计算机网络》
 
   8、《数据压缩原理与应用》
 

   C语言书籍推荐
 
   1. The C programming language 《C程序设计语言》
 
   2. Pointers on C 《C和指针》
 
   3. C traps and pitfalls 《C陷阱与缺陷》
 
   4. Expert C Lanuage 《专家C编程》
 
   
5. Writing Clean Code -----Microsoft Techiniques for Developing Bug-free C Programs 
   《编程精粹--Microsoft 编写优质无错C程序秘诀》
 
   6. Programming Embedded Systems in C and C++ 《嵌入式系统编程》
 
   7.《C语言嵌入式系统编程修炼》
 
   8.《高质量C++/C编程指南》林锐
 
   尽可能多的编码,要学好C,不能只注重C本身。算法,架构方式等都很重.

转载自:https://www.cnblogs.com/alanfeng/p/5253163.html