嵌入式Linux学习笔记

2019-07-12 18:09发布

一  嵌入式系统定义: 应用于特定环境的硬件体系。 二  两样非常重要的能力: 1.  掌握各种新概念的能力 2.  调试的能力( 包括软件, 硬件 ) 三  需要的基础知识: 1.  操作系统理论基础 2.  数据结构 3.  C,C++编程语言 4.  汇编语言 5.  Linux基础能力 6.  单片机基础 四  结构框架: 1.  bootloader( 作用:a. 初始化硬件 b. 引导操作系统 ) 2.  kernel 3.  文件系统 它们都置于flash中。 五  flash六大分区: 1.  boot        ---> 引导区 2.  boot param        ---> 引导参数区 3.  my application        ---> 用户程序区 4.  kernel        ---> 内核区 5.  fs_yaffs        ---> 文件系统区( 挂载文件时用 ) 6.  wince        ---> 存放wince操作系统 一            ARM7        vs        ARM9: 流水线    3级                        5级 MMU       无                          有 MMU和流水线级数非常的重要,它们是衡量一个芯片性能的重要参数。 二  ARM开发板上的接口: 1.  单片机类型接口: 串口,LED,按键,红外,温度传感器,蜂鸣器,I2C,SPI ... ... 2.  较高端接口: LCD,CAMARA,IDE,USB,SD卡 ... ... 三  JTAG板: 1.  作用: a.  对内部芯片进行读写控制。 b.  对外设进行间接控制。 c.  往板上的硬件烧录数据或程序。 2.  接口: a.  JTAG接口: 烧写接口( 请小心烧写bootloader,因为每次烧写都将擦除整个flash ) b.  WIGGLE接口:调试接口( 需要搭配H-JTAG代理软件并使用软件AXD进行调试 ) 四  开发板使用注意事项: 1.  使用前先去电( 用手摸一下各金手指部分即可 )。 2.  切记:除了网口,usb口,sd口之外的接口不可带电插拔。   一  方法一( 串口通讯 ): 1.  在PC开发端的linux环境中写好源代码。 2.  使用交叉编译器arm-linux-gcc编译之。 3.  用超级终端或者DNW建立ARM开发板与PC开发端的连接给ARM开发板上电,进入linux系统。 4.  再用上面两种通讯软件之一进行USB文件传输即可。 比起下面即将学习的方法,这种方法显得很笨,因为不利于调试。 二 方法二( 网络文件系统NFS步骤 ): 1.  在PC开发端的linux环境中写好源代码。 2.  在PC开发端的linux环境中使用交叉编译器arm-linux-gcc编译之。 3.  用超级终端或者DNW建立ARM开发板与PC开发端的连接并启动ARM开发板,进入linux系统。 4.  在ARM开发板的linux环境中执行命令"  ifconfig eth0 192.168.0.11  "建立IP。 5.  在PC开发端的linux环境中执行命令"  ifconfig eth0 192.168.0.22 up  "建立IP。 6.  在PC开发端的linux环境中执行命令"  service nfs restart  "启动NFS服务器。 7.  在ARM开发板的linux环境中执行命令"  ping 192.168.0.22  "建立和PC开发端的连接。 8.  在ARM开发板的linux环境中执行命令"  mount -n nolock,rsize=1024,wsize=1024,timeo=15 192.168.0.22:/ /mnt "即可将PC开发端的linux环境中的根目录挂载到ARM开发板的linux环境中的/mnt目录里。 9.  打开ARM开发板下的/mnt目录下就能看到并和PC共享那个根目录。   一 作用:         用之来编译生成bootloader或者裸机程序。 二 说明:         ADS其实就是Arm Develope Suite。主要由armcc,  Code Warrior以及AXD组成。         armcc是编译器,Code Warrior是编辑控制器,AXD是调试器。 三 使用详细步骤:         已在实验中详细学习,可以参考: 四 一个实例ADS程序( 裸机程序 )分析:         该程序实现了让开发板的LED轮流闪烁,故称为跑马灯程序。        1.  汇编部分       
嵌入式Linux学习笔记
       2.  C语言部分:
嵌入式Linux学习笔记
       
嵌入式Linux学习笔记
       
嵌入式Linux学习笔记


五 一般的ADS程序( 裸机程序 )设计步骤:         1.  由开发板原理图确定设备所在引脚。         2.  找到设备对应的寄存器编号。         3.  对控制器里面的寄存器进行写入,从而达到控制设备的目的。    一 两种重要的硬件:             它们的相关参数是衡量一个芯片性能的重要参考对象。维基百科里有更详细的介绍。         1.  MMU:                 定义:属于硬件范畴,能够将操作地址的虚址转换为实址。         2.  cathe:                 定义:属于硬件范畴,为了弥补CPU与内存的速度差而存在,对程序员透明。 二 ARM的工作模式:         1.  用户模式( USR )        ---> 运行应用程序的模式         2.  管理模式( SVC )        ---> 操作系统的保护模式         3.  中断模式( IRQ )        ---> 用于普通中断处理的模式         4.  快速中断模式( FIQ )        ---> 用于支持数据传输或通道处理的模式         5.  数据访问中断模式( ABT )        ---> 指令预取或读取数据错误时的模式         6.  系统模式( SYS )        ---> 特权模式         7.  未定义指令终止模式( UND )       ---> 执行了未定义的指令时进入 四 ARM的重要寄存器:         1.  R13        ---> 栈指针寄存器         2.  R14        ---> 子程序调用时保存PC指针的寄存器         3.  R15        ---> PC指针寄存器( PC是记录下一条指令地址的寄存器 )         4.  CPSR        ---> 当前的程序状态字寄存器         5.  SPSR        ---> 保存程序状态字的寄存器     嵌入式Linux在这里是指跑在嵌入式计算机上的linux系统 ... ... 一 特点:         1.  自由  ( 代码开源,可自行修改 )         2.  稳定  ( 死机率非常低 ) 二 版本识别技巧:         linux内核的版本号类似"  主版本号.次版本号.释出版本号  "。比如对于内核2.6.39来说,2是主版本号,6是次版本号,39是释出版本号。         如果主版本号或次版本号中有一个为奇数,那么这个内核还在测试中,很不稳定;反之,如果主版本号和次版本号都是偶数,那么这个         版本的内核就是稳定版本。释出版本号与内核是否稳定无关。 三 linux内核移植:         1.  定义:                 是指对linux内核源码进行剪裁,使之能最大化的服务于特定硬件体系。         2.  剪裁过程:                 a.  修改内核源码                 b.  将内核源码重新编译                 c.  把生成的内核映像文件拷贝到相应分区         3.  说明:                 内核源码是基于C语言开发完成的。 四 linux内核重要目录:         1.  /arch        ---> 所有和体系结构相关的代码         2.  /drivers        ---> 各种驱动         3.  /fs        ---> 文件系统         4.  /include        ---> 编译核心时用的头文件         5.  /init        ---> 初始化系统所用的代码         6.  /kernel        ---> 进程调度代码 五 大致学习步骤:         初步体验linux  ->  熟悉linux常用命令以及工具  ->  linux应用程序开发  ->  linux驱动程序开发  ->  熟悉kernel之后进入更加深层次的开发。   一 命令行模式:             定义:                 使用全字符的界面进行开发。         特点:                 占用的资源少,稳定。( 图形界面会占用许多资源,在很多种情况下带来不便 )         说明:                 命令其实就是一个程序,参数就是传递给它的变量。 二 常用命令:         ls,  cd,  mkdir  vi,  gcc  ... ... 里所编译的核心是已经移植好了的核心,而不是直接从ww.kernel.org上直接下载得到的核心。 至于如何移植,不属于这个系列视频的学习范畴 ... ...  一 编译步骤:         1.  获取linux内核源码(  已经移植好了的 )。         2.  解压。         3.  打开解压目录,修改makefile文件:                 找到"  CROSS_COMPILE ?= ......  "这行,将......部分替换为"  交叉编译器的目录下的bin目                 录的路径  "          4.  执行命令"  make menuconfig  ",进一步对参数进行配置。( 比如可以选择需要安装的驱动模块              等 )         5.  执行命令"  make  zImage  "。( 'I'确保大写 )         6.  编译完成之后,将在源码解压目录下的/arch目录下的/boot目录里产生一个新的zImage文件,将         它拷贝到开发板的kernel分区即可完成linux操作系统的下载。   一  方法一( 串口通讯 ):             1.  在PC开发端的linux环境中写好源代码。         2.  使用交叉编译器arm-linux-gcc编译之。         3.  用超级终端或者DNW建立ARM开发板与PC开发端的连接给ARM开发板上电,进入linux系统。         4.  再用上面两种通讯软件之一进行USB文件传输即可。         比起下面即将学习的方法,这种方法显得很笨,因为不利于调试。 二 方法二( 网络文件系统NFS步骤 ):         1.  在PC开发端的linux环境中写好源代码。         2.  在PC开发端的linux环境中使用交叉编译器arm-linux-gcc编译之。         3.  用超级终端或者DNW建立ARM开发板与PC开发端的连接并启动ARM开发板,进入linux系统。         4.  在ARM开发板的linux环境中执行命令"  ifconfig eth0 192.168.0.11  "建立IP。         5.  在PC开发端的linux环境中执行命令"  ifconfig eth0 192.168.0.22 up  "建立IP。         6.  在PC开发端的linux环境中执行命令"  service nfs restart  "启动NFS服务器。         7.  在ARM开发板的linux环境中执行命令"  ping 192.168.0.22  "建立和PC开发端的连接。         8.  在ARM开发板的linux环境中执行命令"  mount -n nolock,rsize=1024,wsize=1024,timeo=15 192.168.0.22:/ /mnt          "即可将PC开发端的linux环境中的根目录挂载到ARM开发板的linux环境中的/mnt目录里。                9.  打开ARM开发板下的/mnt目录下就能看到并和PC共享那个根目录。