arm+系统移植笔记

ARM笔记:

学习时间2013/10/30-2013/11/5

1.交叉编译环境的搭建
(1)将交叉编译压缩包在linux系统下非共享目录解压,进入bin目录,记录路径并进行配置;
配置如下:echo export PATH=........bin/:$PATH >>~/.bashrc,然后source ~/.bashrc生效;
(2)设置电脑IP,然后对开发板进行配置,setenv serverip需要同电脑ip(目的是将要从此处下载内核);
setenv ipaddr需要是与电脑同网段的ip(这样pc机与开发板才能识别);
(3)set gatewayip 设置网关;
(4)启用终端,配置相关属性(例如选择串口号、波特率、数据位、停止位、流控、校验等);
(5)开启tftp 服务器,进入执行文件所在目录,并选择服务ip;
(6)下载执行文件即通过tftp *.bin指令,然后执行go 20008000执行程序;
2.keil仿真软件中,标号后不需要加: 这是与linux下的区别;另外如果声明存储器,需要在程序代码最后,
否则会报错,标号需要顶格写(而指令不能),定义字符串使用:标号 DCB 字符串,使用时是ldrb/strb指令;
定义非字符串数组,使用: 标号 DCD 内容;定义存储器是:AREA data DATA,READWRITE
AREA不要顶格,\n 标号 SPACE 多大的存储空间;仿真软件中调用C需要先声明;
3.嵌入式系统的组成:上层是应用软件,中间是操作系统,底层是硬件设备(含处理器、外围设备);
操作系统为应用软件提供接口以访问底层硬件(因为操作系统中的驱动程序可以驱动硬件),这样应用软件不能
直接操作硬件也相对安全;
4.主流的嵌入式处理器有arm、powerpc、mips等;而外设主要是通信设备(RS-232串口、SPI总线接口、以太网接口等)
存储设备(RAM、FLASH、ROM等)、显示设备(显示屏等);
5.嵌入式操作系统主要是linux、vxworks(实时性更好,不开源,成本高,进度慢);
6.嵌入式ARM是RISC,精简的linux内核,经过了8个架构的发展,有几大系列(arm7-arm11,cortex,securcore等);
7.arm主要采用load/store体系结构,即存储器间不能直接访问,需要经过寄存器实现读写(ldr/str等指令);
8.arm的基本数据类型(字节、半字、4个字节),大小端,8种工作模式,正常在用户模式;16个协处理器,协处理器
可以控制MMU、CACHE、时钟、改写异常向量表地址等;基于3级流水线的arm处理器;arm处理器的寄存器使用,
特别是sp、lr、pc的使用;函数调用时,通过sp出入栈,lr保存返回地址,pc保存正在取指的地址;
每个寄存器32位,cpsr、spsr的使用(保存现场/恢复现场);调用函数或异常时处理器自动切换模式以及保存程序状态;
cpsr的标志位以及中断位,处理器状态位的意义及使用;
9.arm汇编指令的使用,特别是mov、ldr、str、ldmfd、stmfd、bl、bic、cmp等,swp是原子操作(即不可打断);
程序状态操作的指令MRS、MSR;协处理器指令使用;每个指令32位(含条件位、是否改变标志位、机器码位、
数据位);
10.arm汇编与C的混合编程,详见参考书;
11.arm体系的7中异常,以及对应的模式;产生异常涉及到异常向量表,其地址与起始地址的关系,一般是低位,
也可以是高位,还可以通过协处理器CP15的c12改变;产生异常时操作是:处理器切换模式并保存当前程序状态,
程序员需要保存寄存器状态以及返回地址,然后跳转到异常向量表,找到地址并跳转到相对应的异常处理函数
(通过MOV、LDR、BL指令跳转)进行处理,处理完成后进行模式切换,恢复程序状态,将原寄存器内容出栈还原,
跳转到原异常产生的位置(是根据异常的类型来返回地址的,处理器会自动调整),还需要注意ARM和THUMB态
调整的偏移量是不同的;
12.硬中断、软中断;软中断通过SWI指令地址获得中断号(低24位),然后根据中断号进行处理;也需要保存、
恢复现场等操作;当汇编调用C时,最多传递4个参数,可以通过入栈到SP指针中传递,C中相应设置为指针;
13.产生中断,编程的原理:需要设置相对应管脚使可以配置,然后对具体的中断源使能开启,注册中断产生的向量
表地址指向(这样产生中断时就可以进入对应处理函数),产生中断时进入某一个地址,处理完中断需要对中断标志清除,
然后对原向量表指向地址清0以防止下次中断重新进入该处理函数;
处理器的操作原理:根据中断源找到对应管脚,进入到对应的TZIC、VIC,改变标志位(默认是开启的),根据注册
的地址去处理,最后返回;
14.UART串口(主要是RS-232),采用异步串行,首先配置管脚,查看UTRSTAT状态寄存器通过UTXH、URXH读取数据;
15.LED操作主要是通过高低电平来实现;
16.PWM蜂鸣器通过3级分频输出指定的频率,频率不一样输出的信号就不一样;一般是通过第3级分频来改变输出频率
17.看门狗也是通过2级分频,通过结合WTDAT、WTCNT寄存器来达到系统的复位或者不复位的功能;
18.RTC主要为系统提供时间支持,主要操作RTC控制寄存器和BCD值寄存器,BCD值寄存器里面含有时间;
19.嵌套中断中,使用BL指令跳转需要将模式设置为system模式,否则原lr地址会被覆盖而导致无法回去;
理解:system模式下可理解为新增1个用户,又为其开辟了1组寄存器,这样就不会影响原寄存器;
20.volatile:表示每次都是从存储器中取值到寄存器,然后进行对比,看是否即时状态有改变,主要是针对
操作硬件时而言;防止硬件改变造成的影响;
21.一般在总线中,数据传输都需要制定协议,例如下降沿读数据,上升沿写数据,开始、结束等的协议,一般是在

时钟线处于低电平的时候开始;相当于在传输之前有一定的缓冲时间,防止数据丢失;


系统移植笔记:

学习时间:2013/11/6-2013/11
***************************************************************************************
裸机:即没有内核和根文件系统,只能执行.bin的二进制文件,一般是开发非裸机驱动;
ARM环境搭建:分为2种情况:(1)研发时(2)出成品时
一般开发板出厂有自带的uboot;
1.研发时,通过网络tftp从linux上下载内核映像文件和根文件系统文件,即设置环境变量
bootcmd(指定下载内核,uboot可以根据网络自动找到相关ip上面的tftp服务器进行下载到20008000并通过
go 20008000(开发板上面的内存地址)执行)和bootargs(指定ip的tftp服务器上下载,并指定启动函数linuxrc);
并注意保存;这种形式即每次都从网络下载内核和文件系统,比从nandflash速度更快,也不会损耗nandflash;
2.出成品时,根据需要烧uboot,zImage,rootfs,在每次进行擦写后需要保存,注意环境变量是否变化;
烧写后,内核和文件系统都写到了开发板上面,设置环境变量以后就从开发板nandflash对应地址读取加载;
如果烧写了uboot,也将原来的uboot更换了;
3.配置交叉编译器,这样编译后的执行文件就可以在开发板上运行;tftp服务器在哪里,开发板上面的
serverip就应该和其相同;
****************************************************************************************
uboot移植:
1.将官方版本解压在相关文件夹下,命名为开发板名/单板名/uboot文件夹;
2.修改顶层makefile内的交叉编译工具以及配置的单板信息(处理器、核、芯片、单板名、开发商);
3.在board文件夹下建立单板信息的.c文件(拷贝原文件基础上在进行修改),并修改本层的makefile,
内部的config.mk文件可以修改单板的ram内存地址;这是依赖于平台的;
4.在include文件夹下的configs配置文件夹下建立开发板相关的.h文件(依赖于开发板),可以配置开发板的名称;
5.common文件夹是通用的uboot函数,可以在此添加函数命令(依照原命令格式);不依赖于平台的;
6.cpu文件夹也是依赖平台的,其内可以修改uboot启动参数,.lds内是其连接脚本;
基本原则就是:拷贝原文件,对依赖平台的文件进行修改配置;
uboot的启动流程:
1.汇编阶段:初始化基本硬件(模式切换、关闭中断以及看门狗等,设置时钟频率),flash、内存初始化,
将uboot搬移至内存(这样速度快,运行效率高),设置堆栈,将第二阶段的代码移植内存,跳至C阶段;
2.C语言阶段:初始化本阶段用到的硬件,检测内存映射,传递内核启动参数,加载内核;
*****************************************************************************************
内核移植:
1.解压官方版内核,修改顶层makefile文件内的交叉编译工具;
2.配置处理器配置文件,与平台相关的arch/arm/configs内的(根据处理器芯片复制后进行修改);
复制名为.config,在内核启动后会根据处理器选择自动更改名字;
3.根据处理器单板芯片配置相关的.c文件(arch/arm/mach-内);如果单板有变动,需要对此.c文件
进行添加更改;
4.如果添加了驱动等,需要在菜单中配置,即在上层的Kconfig中根据原选项进行添加,并修改本层的
makefile文件(这样以后就可以生成相应的.o文件);
5.Kconfig文件有添加,在make menuconfig后就可以看见选项,根据选择会将其配置进顶层.config中;
在make zImage时就会根据顶层的.config文件生成.o文件,并将其加入内核映像文件中;如果是动态加载模块,
需要make modules 生成.ko文件,在需要时动态的编译进内核(mknod先建立设备结点,相当于先给模块
分配一个空间),有了结点号,在插入模块,内核就可以根据结点号对应模块,然后执行文件;
内核阶段执行过程是:先解压内核,然后执行内核汇编部分(检测cpu、机器类型),运行内核C部分start_kernel
 CPU,机器参数的安装setup_arch中断,定时,终端,内存等最基本的初始化;
创建核心进程 kernel_init运行,原父进程空转cpu_ide;然后挂载文件系统;最后运行应用程序;
*******************************************************************************************
根文件系统的制作:
1.通过Busybox进行制作(先通过菜单配置);
2.然后make ,在安装make install;创建相应文件夹;
3.将原版的etc、lib文件夹内容拷贝过来,在进行裁剪;创建终端结点号;


根据需要制作ramdisk(内存中,掉电数据即无)、cramfs(只读)、jffs2(可读写)文件系统,
均是通过mkfs工具制作映像文件;制作好在通过tftp下载,后擦除烧入;另外jffs2文件系统linux无mkfs工具
,需要先制作mkfs工具;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值