当前位置:文档之家› linux arm 移植手册(分享)

linux arm 移植手册(分享)

linux arm 移植手册(分享)
linux arm 移植手册(分享)

Linux系统移植

目 录

第一部分 前言 (8)

1 硬件环境 (8)

1.1主机硬件环境 (8)

1.2 目标板硬件环境 (8)

1.3工具介绍 (8)

2软件环境 (8)

2.1主机软件环境 (8)

2.1.1 Windows 操作系统 (8)

2.1.2 Linux操作系统 (8)

2.1.3 目标板最后运行的环境 (9)

2.2 Linux下工作用户及环境 (9)

2.2.1 交叉工具的安装 (9)

2.2.2 u-boot移植工作目录 (9)

2.2.3 内核及应用程序移植工作 (9)

2.3 配置系统服务 (10)

2.3.1 tftp服务器的配置 (10)

2.4 工具使用 (12)

2.4.1 minicom的使用 (12)

3 作者介绍 (13)

3.1 策划, 组织, 指导, 发布者 (13)

3.2 ADS bootloader部分 (13)

3.3 交叉工具部分 (13)

3.4 uboot部分 (13)

3.5 内核部分 (13)

3.6 应用程序部分 (13)

3.7 网卡驱动部分 (13)

3.8 Nand Flash 驱动部分 (13)

第二部分 系统启动bootloader的编写(ADS) (14)

1 工具介绍 (14)

1.1 ADS 命令行命令介绍 (14)

1.1.1 armasm (14)

1.1.2 armcc, armcpp (14)

1.1.3 armlink (14)

2 基本原理 (15)

2.1 可执行文件组成及内存映射 (15)

2.1.1 可执行文件的组成 (15)

2.1.3 启动过程的汇编部分 (17)

2.1.4 启动过程的C部分 (17)

3 AXD的使用以及源代码说明 (18)

3.1 源代码说明 (18)

3.1.1 汇编源代码说明 (18)

3.1.2 C语言源代码说明 (23)

3.1.3 源代码下载 (23)

3.2 AXD的使用 (23)

3.2.1 配置仿真器 (23)

3.2.2 启动AXD 配置开发板 (23)

第三部分 GNU交叉工具链 (25)

1 设置环境变量,准备源码及相关补丁 (25)

1.1 设置环境变量 (25)

1. 2 准备源码包 (25)

1.2.1 binuils (25)

1.2.2 gcc (25)

1.2.3 glibc (25)

1.2.4 linux kernel (26)

1.3 准备补丁 (26)

1.3.1 ioperm.c.diff (26)

1.3.2 flow.c.diff (26)

1.3.3 t-linux.diff (26)

1.4 编译 GNU binutils (26)

1.5 准备内核头文件 (26)

1.5.1 使用当前平台的gcc编译内核头文件 (26)

1.5.2 复制内核头文件 (27)

1.6 译编glibc头文件 (27)

1.7 编译gcc第一阶段 (27)

1.8 编译完整的glibc (27)

1.9 编译完整的gcc (28)

2 GNU交叉工具链的下载 (28)

2.1 ARM官方网站 (28)

2.2 本文档提供的下载 (28)

3 GNU交叉工具链的介绍与使用 (29)

3.1 常用工具介绍 (29)

3.2.1 arm-linux-gcc的使用 (29)

3.2.2 arm-linux-ar 和 arm-linux-ranlib的使用 (30)

3.2.3 arm-linux-objdump的使用 (30)

3.2.4 arm-linux-readelf的使用 (31)

3.2.6 arm-linux-copydump的使用 (32)

4 ARM GNU常用汇编语言介绍 (32)

4.2 ARM GNU专有符号 (33)

4.3 操作码 (33)

5 可执行生成说明 (33)

5.1 lds文件说明 (33)

5.1.1 主要符号说明 (33)

5.1.2 段定义说明 (34)

第四部分 u-boot的移植 (35)

1 u-boot的介绍及系统结构 (35)

1.1 u-boot介绍 (35)

1.2 获取u-boot (35)

1.3 u-boot体系结构 (35)

1.3.1 u-boot目录结构 (35)

2 uboot的启动过程及工作原理 (36)

2.1 启动模式介绍 (36)

2.2 阶段1介绍 (36)

2.2.1 定义入口 (36)

2.2.2 设置异常向量 (37)

2.2.3 设置CPU的模式为SVC模式 (37)

2.2.4 关闭看门狗 (37)

2.2.5 禁掉所有中断 (37)

2.2.6 设置以CPU的频率 (37)

2.2.7 设置CP15 (37)

2.2.8 配置内存区控制寄存器 (38)

2.2.9 安装U-BOOT使的栈空间 (38)

2.2.10 BSS段清0 (38)

2.2.11 搬移Nand Flash代码 (39)

2.2.12 进入C代码部分 (39)

2.3 阶段2的C语言代码部分 (39)

2.3.1调用一系列的初始化函数 (39)

2.3.2 初始化网络设备 (41)

2.3.3 进入主UBOOT命令行 (41)

2.4 代码搬运 (41)

3 uboot的移植过程 (42)

3.1 环境 (42)

3.2 步骤 (42)

3.2.1 修改Makefile (42)

3.2.2 在board子目录中建立crane2410 (42)

3.2.3 在include/configs/中建立配置头文件 (42)

3.2.4 指定交叉编译工具的路径 (42)

3.2.5 测试编译能否成功 (42)

3.2.6 修改lowlevel_init.S文件 (43)

3.2.9 把u-boot烧入flash (45)

4 U-BOOT命令的使用 (46)

4.1 U-BOOT命令的介绍 (46)

4.1.1 获得帮助信息 (46)

4.2 常用命令使用说明 (47)

4.2.1 askenv(F) (47)

4.2.2 autoscr (47)

4.2.3 base (47)

4.2.4 bdinfo (47)

4.2.5 bootp (47)

4.2.8 tftp(tftpboot) (48)

4.2.9 bootm (48)

4.2.10 go (48)

4.2.11 cmp (48)

4.2.12 coninfo (48)

4.2.13 cp (48)

4.2.14 date (49)

4.2.15 erase(F) (49)

4.2.16 flinfo(F) (49)

4.2.17 iminfo (49)

4.2.18 loadb (49)

4.2.19 md (49)

4.2.20 mm (50)

4.2.21 mtest (50)

4.2.22 mw (50)

4.2.23 nm (50)

4.2.24 printenv (50)

4.2.25 ping (51)

4.2.26 reset (51)

4.2.27 run (51)

4.2.28 saveenv(F) (51)

4.2.29 setenv (51)

4.2.30 sleep (51)

4.2.31 version (51)

4.2.32 nand info (51)

4.2.33 nand device (51)

4.2.34 nand bad (51)

4.2.35 nand read (52)

4.2.36 nand erease (52)

4.2.37 nand write (52)

5 参考资料 (53)

第五部分 linux 2.6内核的移植 (53)

1 内核移植过程 (53)

1.1 下载linux内核 (53)

1.2 修改Makefile (53)

1.3 设置flash分区 (54)

1.3.1指明分区信息 (54)

1.3.2 指定启动时初始化 (56)

1.3.3 禁止Flash ECC校验 (56)

1.4 配置内核 (56)

1.4.1 支持启动时挂载devfs (56)

1.4.2配置内核产生.config文件 (57)

1.4.3编译内核 (58)

1.4.4 下载zImage到开发板 (58)

2 创建uImage (61)

2.1 相关技术背景介绍 (61)

2.2 在内核中创建uImage的方法 (61)

2.2.1 获取mkimage工具 (61)

2.2.2 修改内核的Makefile文件 (61)

3追加实验记录 (62)

3.1移植linux-2.6.15.7 (62)

3.2移植linux-2.6.16.21 (62)

3.3 移植linux-2.6.17 (62)

4 参考资料 (62)

第六部分 应用程序的移植 (63)

1构造目标板的根目录及文件系统 (63)

1.1 建立一个目标板的空根目录 (63)

1.2 在my_rootfs中建立Linux目录树 (63)

1.3 创建linuxrc文件 (63)

2 移植Busybox (64)

2.1 下载busybox (64)

2.3 编译并安装Busybox (65)

3 移植TinyLogin (66)

3.1 下载 (66)

3.2 修改tinyLogin的Makefile (66)

3.3 编译并安装 (66)

4 相关配置文件的创建 (66)

4.1 创建帐号及密码文件 (66)

4.2 创建profile文件 (67)

4.5 创建inetd.conf配置文件 (67)

5 移植inetd (67)

5.1 inetd的选择及获取 (67)

5.1.1 获取inetd (67)

5.2 编译inetd (67)

5.2.1 修改configure文件 (67)

5.2.2 编译 (68)

5.3 配置inetd (68)

5.3.1 拷贝inetd到根文件系统的usr/sbin目录中 (68)

6 移植thttpd Web服务器 (69)

6.1 下载 (69)

6.2 编译thttpd (69)

6.3 配置 (69)

6.3.1 拷贝thttpd二进制可执行文件到根文件系统/usr/sbin/目录中 (69)

6.3.2 修改thttpd配置文件 (69)

6.3.3 转移到根文件系统目录,创建相应的文件 (69)

7 建立根目录文件系统包 (70)

7.1 建立CRAMFS包 (70)

7.1.1 下载cramfs工具 (70)

7.1.2 制作cramfs包 (70)

7.1.3 写cramfs包到Nand Flash (70)

8 参考资料 (70)

第七部分 Nand flash驱动的编写与移植 (71)

1 Nand flash工作原理 (71)

1.1 Nand flash芯片工作原理 (71)

1.1.1 芯片内部存储布局及存储操作特点 (71)

1.1.2 重要芯片引脚功能 (71)

1.1.3 寻址方式 (71)

1.1.4 Nand flash主要内设命令详细介绍 (72)

1.2 Nand Flash 控制器工作原理 (72)

1.2.1 Nand Flash控制器特性 (72)

1.2.2 Nand Flash控制器工作原理 (72)

1.3 Nand flash 控制器中特殊功能寄存器详细介绍 (72)

1.4 Nand Flash 控制器中的硬件ECC介绍 (73)

1.4.1 ECC产生方法 (73)

1.4.2 ECC生成器工作过程 (74)

1.4.3 ECC的运用 (74)

2 在ADS下flash烧写程序 (74)

2.1 ADS下flash烧写程序原理及结构 (74)

2.2 第三层实现说明 (74)

2.1.1 特殊功能寄存器定义 (74)

2.1.2 操作的函数实现 (74)

2.3 第二层实现说明 (75)

2.3.1 Nand Flash 初始化 (75)

2.3.3 获取Nand flash ID (75)

2.3.4 Nand flash写入 (76)

2.3.5 Nand flash读取 (77)

2.3.6 Nand flash标记坏块 (78)

2.3.7 Nand Flash检查坏块 (79)

2.3.8 擦除指定块中数据 (79)

2.4 第一层的实现 (80)

3 在U-BOOT对Nand Flash的支持 (82)

3.1 U-BOOT对从Nand Flash启动的支持 (82)

3.1.1 从Nand Flash启动U-BOOT的基本原理 (82)

3.1.2 支持Nand Flash启动代码说明 (82)

3.2 U-BOOT对Nand Flash命令的支持 (84)

3.2.1 主要数据结构介绍 (84)

3.2.2 支持的命令函数说明 (85)

4 在Linux对Nand Flash的支持 (87)

4.1 Linux下Nand Flash调用关系 (87)

4.1.1 Nand Flash设备添加时数据结构包含关系 (87)

4.1.2 Nand Flash设备注册时数据结构包含关系 (87)

4.2 Linux下Nand Flash驱动主要数据结构说明 (88)

4.2.1 s3c2410专有数据结构 (88)

4.2.2 Linux 通用数据结构说明 (89)

4.3.1 注册driver_register (94)

4.3.2 探测设备probe (94)

4.3.3 初始化Nand Flash控制器 (94)

4.3.4 移除设备 (94)

4.3.5 Nand Flash芯片初始化 (94)

4.3.6 读Nand Flash (95)

4.3.7 写Nand Flash (95)

第八部分 Cs8900a网卡驱动的编写与移植 (95)

1 Cs8900a工作原理 (95)

2 在ADS下cs8900a的实现 (95)

2.1 在cs8900a下实现的ping 工具 (95)

3 在u-boot下cs8900a的支持 (96)

3.1 u-boot下cs8900a的驱动介绍 (96)

3.2 u-boot下cs8900a的移植说明 (96)

4 在linux下cs8900a驱动的编写与移植 (96)

4.1 Linux下cs8900a的驱动说明 (96)

4.2 Linux 下cs8900a的移植说明 (96)

4.2.1 为cs8900a建立编译菜单 (96)

4.2.2 修改S3C2410相关信息 (97)

该文档的目的是总结我们在工作中的一些经验,并把它们分享给喜欢ARM和Linux的朋友, 如有错误之处,请大家多多指点. 同样, 我们也希望更多人能把自己的工作经验和体会加入该文档,让大家共同进步.

该文档是一份交流性文档, 只供个人学习与交流,不允许公司和企业用于商业行为.

第一部分 前言

1 硬件环境

1.1主机硬件环境

开发机:Pentium-4 CPU

内存: 512MB

硬盘: 60GB

1.2 目标板硬件环境

CPU: S3C2410

SDRAM: HY57V561620

Nand flash: K9F1208U0B(64MB)

以太网芯片:CS8900A (10M/100MB)

1.3工具介绍

仿真器:Dragon-ICE

电缆:串口线,并口线

2软件环境

2.1主机软件环境

2.1.1 Windows操作系统

ADS编译工具:ADS1.2

仿真器软件: Dragon-ICE daemon程序

2.1.2 Linux操作系统

GNU交叉编译工具:

2.95.3:

作用:编译u-boot

3.3.2, 3.

4.4:

tree工具:

作用:查看文件目录树

下载:从ftp://https://www.doczj.com/doc/328641393.html,/linux/tree/下载编译

2.1.3 目标板最后运行的环境

启动程序:

u-boot-1.1.4

内核:

linux-2.6.14.1

应用程序:

1. busybox-1.1.3

2. TinyLogin-1.4

3. Thttpd-2.25

2.2 Linux下工作用户及环境

2.2.1 交叉工具的安装

工具链的编译过程请参考第三部分.

1. 下载交叉工具

2.95.3 下载地址:ftp://https://www.doczj.com/doc/328641393.html,/pub/armlinux/toolchain/cross-

2.95.

3.tar.bz2

3.3.4 下载地址:

2. 编译交叉工具

[root@localhost ~]mkdir /usr/local/arm

[root@localhost ~]cd /usr/local/arm

把cross-2.95.2.tar.bz2, cross-3.4.4.tar.gz 拷贝到/usr/local/arm目录中。解压这两个包。[root@localhost ~]tar -xjvf cross-2.95.2.tar.bz2

[root@localhost ~]tar -xzvf cross-3.4.4.tar.gz

2.2.2 u-boot移植工作目录

1. 添加工作用户

[root@localhost ~]#useradd -G root -g root -d/home/uboot uboot

2. 建立工作目录

[uboot@localhost ~]$mkdir dev_home

[uboot@localhost ~]$cd dev_home

[uboot@localhost dev_home]$mkdir doc mybootloader uboot

.

|-- doc

|-- mybootloader

`-- uboot

3. 建立环境变量

[uboot@localhost ~]vi ~/.bashrc

export PATH=/usr/local/arm/2.95.3/bin:$PATH

2.2.3 内核及应用程序移植工作

1. 添加工作用户

[root@localhost ~]#useradd -G root -g root -d/home/arm arm

[arm@localhost arm]$mkdir dev_home

[arm@localhost arm]$cd dev_home

[arm@localhost arm]$mkdir bootldr btools debug doc images kernel localapps \ rootfs sysapps tmp tools

[arm@localhost arm]$tree -L 1

.

|-- bootldr

|-- btools

|-- debug

|-- doc

|-- images

|-- kernel

|-- localapps

|-- rootfs

|-- sysapps

|-- tmp

`-- tools

可以看到如上树形结构。

注:tree命令

3. 建立环境变量设置脚本

[arm@localhost arm]$vi env_sh

#!/bin/bash

PRJROOT=~/dev_home

KERNEL=$PRJROOT/kernel

ROOTFS=$PRJROOT/rootfs

LAPP=$PRJROOT/localapps

DOC=$PRJROOT/doc

TMP=$PRJROOT/tmp

export PRJROOT KERNEL LAPP ROOTFS

export PATH=/usr/local/arm/3.4.4/bin:$PATH

4. 登陆时启动环境变量

[arm@localhost arm]$vi ~/.bashrc

. ~/dev_home/env_sh

重新登陆arm用户,环境变量生效

[arm@localhost arm]$su arm

2.3 配置系统服务

2.3.1 tftp服务器的配置

如果用下面一条命令能够看到服务已经启动, 则不用安装, 否则需要按1或2点安装tftp-server服务器. [arm@localhost arm]#netstat -a | grep tftp

udp 0 0 *:tftp *:*

1. 从RPM包安装tftp-server

从对应Linux操作系统版本的安装光盘上找到tftp-server的安装包.

下面tftp-server-0.32-4.i386.rpm包为例,把rpm包拷贝到dev_home/btools/下.

[arm@localhost arm]#cp tftp-server-0.32-4.i386.rpm /home/arm/dev_home/btools/ [arm@localhost arm]#su root

[root@localhost arm]#rpm -q tftp-server

如果没有安装tftp-server,就要用下面命令安装,否则,直接进入第2步配置服务.

建立tftp的主工作目录

[root@localhost btools]#mkdir /tftpboot

2. 修改配置文件并启动服务

备份配置文件

[root@localhost btools]#if [ -f /etc/xinetd.d/tftp ]

> then

> cp /etc/xinetd.d/tftp /etc/xinetd.d/tftp.old

> fi

修改配置文件

[root@localhost btools]#vi /etc/xinetd.d/tftp

service tftp

{

disable = no

socket_type = dgram

protocol = udp

wait = yes

user = root

server = /usr/sbin/in.tftpd

server_args = -s /tftpboot

per_source = 11

cps = 100 2

flags = IPv4

}

检查tftp服务是否打开

[root@localhost btools]#chkconfig --list

如果tftp的服务没有打开,则用下面命令打开tftp服务开关

[root@localhost btools]#chkconfig tftp on

重启服务

#/etc/init.d/xinetd restart

#netstat -a | grep tftp

udp 0 0 *:tftp *:*

2.3.2 NFS服务器的配置

1. 安装NFS服务器

[root@localhost btools]#rpm -q nfs-utils

如果没有安装,从对应Linux操作系统版本的安装光盘上找到nfs-utils的安装包.Fedora 5中的安装包名称为nfs-utils-1.0.8.rc2-4.FC5.2.i386.rpm。下面以该安装包为例说明:

[root@localhost btools]#rpm -ivh nfs-utils-1.0.8.rc2-4.FC5.2.i386.rpm

2. 配置NFS服务器

[root@localhost btools]#vi /etc/exports

#加入要允许被另外计算机mount的目录:

#/home/arm/dev_home/tmp 为被另外计算机mount的目录

#192.168.1.134 允许另外计算机mount的IP

#rw,sync,no_root_squash表示访问限制,更详细说明见相关手册.

/home/arm/dev_home/tmp 192.168.1.134(rw,sync,no_root_squash)

3. 启动NFS服务器

第一启动NFS服务器时用下面命令.

[root@localhost btools]#/etc/init.d/nfs start

4. 测试NFS服务器

[root@localhost btools]#netstat -a | grep nfs

5. 显示被export出的目录列表

[root@localhost btools]#exportfs

2.4 工具使用

2.4.1 minicom的使用

1.切换到root用户.

[root@localhost btools]#su -

2. 查找有效的串设备.

[root@localhost ~]#cat /proc/devices

...

4 ttyS

...

188 ttyUSB

...

如果是普通串口设备, 设备名前缀为ttyS, 第一串口为ttyS0, 第二串口为ttyS1,依次类推.

如果是USB转串口的设备, 设备名前缀为ttyUSB, 第一串口为ttyUSB0.

3. 配置ttyUSB设备

[root@localhost ~]#minicom -s ttyUSB0

会出现一个configuration窗口,

┌──[configuration]────┐

│Filenames and paths │

│File transfer protocols │

│Serial port setup │

│Modem and dialing │

│Screen and keyboard │

│Save setup as ttyUSB0 │

│Save setup as.. │

│Exit │

│Exit from Minicom │

└───────────────┘

选择Serial port setup配置. 会出现如下窗口:

┌────────────────────────────────────────────┐

│A - Serial Device : /dev/ttyUSB0 │

│B - Lockfile Location : /var/lock │

│C - Callin Program : │

│D - Callout Program : │

│E - Bps/Par/Bits : 115200 8N1 │

│F - Hardware Flow Control : No │

│G - Software Flow Control : No │

││

│Change which setting? │

└───────────────────────────────────────────┘

我的设置如上所示, 设置完成后, Change which setting?项上按回车退出当前窗口, 回到第一个窗口.按Save setup as ttyUSB0保存设置. 再按Exit from Minicom退出Minicom.

4. 启动minicom

3 作者介绍

3.1 策划, 组织, 指导, 发布者

刘勇

email: littlegenius2008@https://www.doczj.com/doc/328641393.html,

如果您有新的内容,请发到这个电子邮件,我们会把您的内容加入文档,并在作者列表中加入您的名字.

3.2 ADS bootloader部分

作者:刘勇

email: littlegenius2008@https://www.doczj.com/doc/328641393.html,

3.3 交叉工具部分

作者:孙贺

email: msunhe@https://www.doczj.com/doc/328641393.html,

3.4 uboot部分

作者:聂强

email: wolfwind9779@https://www.doczj.com/doc/328641393.html,

作者:孙贺

email: msunhe@https://www.doczj.com/doc/328641393.html,

3.5 内核部分

作者:聂大鹏

email:dozec@https://www.doczj.com/doc/328641393.html,

作者:牛须乐(8900a网卡移植部分)

email:clizniu@https://www.doczj.com/doc/328641393.html,

3.6 应用程序部分

作者:聂大鹏

email:dozec@https://www.doczj.com/doc/328641393.html,

3.7 Nand Flash 驱动部分

作者:孙磊,刘勇

email:sunlei3448@https://www.doczj.com/doc/328641393.html,

4 支持企业

4.1 尚观科技

为我们提供统许多套远峰公司的ARM开发板, 才能让我们做出统一的文档.

第部分 系统启动bootloader的编写(ADS) 1 工具介绍

1.1 ADS 命令行命令介绍

1.1.1 armasm

1. 命令:armasm [选项] -o 目标文件 源文件

2. 选项说明

-Errors 错误文件名;指定一个错误输出文件

-I 目录[,目录] ;指定源文件搜索目录

-PreDefine 预定义宏;指定预定义的宏

-NOCache ;编译源代码时禁止使用Cache进行优化

-MaxCache ;编译源代码时使用Cache进行优化

-NOWarn ;关闭所有的警告信息

-G ;输出调试表

-keep ;在目标文件中保存本地符号表

-LIttleend ;生成小端(Little-endian) ARM代码

-BIgend ;生成大端(Big-endian) ARM代码

-CPU ;设立目标板ARM核类型,如: arm920t.

-16 ;建立16位的thumb指令.

-32 ;建立32位的ARM指令.

3. 编译一个汇编文件

c:\adsloader>armasm -LIttleend -cpu ARM920T -32 bdinit.s

把汇编语言编译成小端, 32位, ARM920T CPU.

1.1.2 armcc, armcpp

1. 命令:armcc [选项] 源文件1 源文件2 ... 源文件n

2. 选项说明

-c ;编译但是不连接

-D ;指定一个编译时使用的预定义宏常量

-E ;仅仅对C源文件做预处理

-g ;产生调试信息表

-I ;指头文件的搜索路径

-o ;指定一个输出的目标文件

-O[0/1/2] ;指定源代码的优化级别

-S ;输出汇编代码来代替目标文件

-CPU ;设立目标板ARM核类型,如: arm920t.

3.编译一个C程序

c:\adsloader>armcc -c -O1 -cpu ARM920T bdisr.c

编译不连接, 二级优化, ARM920T CPU.

1.1.3 armlink

1. 命令:armlink [选项] 输入文件

2. 选项说明

-Output 文件 ;指定输出文件名

-scatter 文件 ;按照指定的文件为可执行文件建立内存映射

-ro-base 地址值;只读代码段的起始地址

-rw-base 地址值;RW/ZI段的起始地址

3. 把多个目标文件合并成一个目标文件

c:\adsloader>armlink -partial bdmain.o bdport.o bdserial.o bdmmu.o bdisr.o -o bd.o

4. 把几个目标文件编译一个可执地文件

c:\adsloader>armlink bd.o bdinit.o -scatter bdscf.scf -o bd.axf

1.1.4 fromelf

1. 命令:fromelf [选项] 输入文件

2. 选项说明

-bin 二进制文件名;产生的二进制文件

-elf elf文件名;产生一个elf文件

-text text文件名;产生text文件

3. 产生一个可执行的二进制代码

c:\adsloader>fromelf bd.axf -bin -o bd.bin

2 基本原理

2.1 可执行文件组成及内存映射

2.1.1 可执行文件的组成

在ADS下,可执行文件有两种,一种是.axf文件,带有调试信息,可供AXD调试工具使用.另一种是.bin 文件,可执行的二进制代码文件。我们重点是讲描.bin文件的组成。

我们把可执行文件分为两种情况:分别为存放态和运行态。

1. 存放态

存放态是指可执行文件通过fromelf产生后,在存储介质(flash或磁盘)上的分布. 此时可执行文件一般由两部分组成:分别是代码段和数据段。代码段又分为可执行代码段(.text)和只读数据段(.rodata),数据段又分为初始化数据段(.data)和未初始化数据段(.bss)。可执行文件的存放态如下:+-------------+-----------

| .bss |

+-------------+-- 数据段

| .data |

+-------------+-----------

| .rodata |

|_____________| 代码段

| .text |

+-------------+-----------

2. 运行态

可执行文件通过装载过程, 搬入到RAM中运行, 这时候可执行文件就变成运行态。在ADS下对可执行代码各段有另一个名称:

| ... |

+-------------+-----------

| .bss | ZI 段

| .data | RW 段

+-------------+-----------

| .rodata |

|_____________| 代码段(RO 段)

| .text |

+-------------+-----------

| ... |

装载前

当可执行文件装载后, 在RAM中的分布如下:

| ... |

+-------------+-- ZI段结束地址

| ZI 段 |

+-------------+-- ZI段起始地址

| 保留区2 |

+-------------+-- RW段结束地址

| RW 段 |

+-------------+-- RW段起始地址

| 保留区1 |

+-------------+-- RO段结束地址

| RO 段 |

+-------------+-- RO段起始地址

| ... |

装载后

所以装载过程必须完成把执行文件的各个段从存储介质上搬到RAM指定的位置。而这个装载过程由谁来完成呢?由我们的启动程序来完成.

2.1.2 装载过程

在ADS中,可以通过两种方式来指定可执行代码各段在RAM中的位置,一个是用armlink来指定,一种是用scatter文件来指定.RAM区的起始地址:0x30000000.

1. armlink指定代码段地址

我们通常的代码,只用指定两个段开始地址, RO段的起始地址和RW段的起始地址, ZI段紧接在RW段之后.示例见该部分的1.1.3.

2. scatter指定代码段地址

我们也可以通过scatter文件指定可执行文件各段的详细地址. Scatter文件如下:

MYLOADER 0x30000000

;MYLOADER: 为可执行文件的名称, 可自定义

;0x3000000: 起始地址

{

RO 0x30000000

;RO 只读代码段的名称

;0x30000000: 只读代码段的起始地址

{

init.o (Init, +First)

; Init代码段为可执行文件的第一部分.

* (+RO) ;所有其它的代码段和只读数据段放在该部分

}

RW +0

;RW: RW段的名称

;+0: 表示RW段紧接着RO段

{

* (+RW) ;所有RW段放在该部分

}

ZI +0

;ZI: ZI段的名称

;+0: 表示ZI段紧接着RW段

{

*(+ZI) ;所有ZI段放在该部分

}

}

3. ADS产生的各代码段宏

|Image$$RO$$Base| /* RO代码段起始地址 */

|Image$$RO$$Limit| /* RO 代码段结束地址 */

|Image$$RW$$Base| /* RW代码段起始地址 */

|Image$$RW$$Limit| /* RW 代码段结束地址 */

|Image$$ZI$$Base| /* ZI 代码段起始地址 */

|Image$$ZI$$Limit| /* ZI 代码段结束地址 */

注意:在两个$$之间的名称, 与scatter中指定的段的名称相同.

4. 装载过程说明

当从NorFlash启动时, 要把flash芯片的首地址映射到0x00000000位置, 系统启动后, 启动程序本身把自己从flash中搬到RAM中运行. 搬移后的各段起始地址, 由以上宏来确定.

当从NandFlash启动时, S3C2410会自动把前NandFlash的前4k搬到S3C2410的内部RAM中,并把内部RAM的首地址设为0x00000000,CPU从0x00000000开始执行. 所以, 在nandFlash的前4k程序中,必须包含从NandFlash把BootLoader的其余部分装入RAM的程序.

2.1.3 启动过程的汇编部分

当系统启动时, ARM CPU会跳到0x00000000去执行。一般BootLoader都包括如下几个部分:

1. 建立中断向量异常表

2. 显示的切换到SVC且32指令模式

3. 关闭S3C2410的内部看门狗

4. 禁止所有的中断

5. 配置系统时钟频率和总线频率

6. 设置内存区的控制寄存器

7. 初始化中断

8. 安装中断向表量

9. 把可执行文件的各个段搬到运行态的各个位置

10. 跳到C代码部分执行

2.1.4 启动过程的C部分

1. 初始化MMU

2.初始化外部端口

3. 中断处理程序表初始化

5. 其它部分初始化(可选)

6. 主程序循环

3 AXD的使用以及源代码说明

3.1 源代码说明

3.1.1 汇编源代码说明

;=============================================================================== ; 引用头文件

;=============================================================================== get bdinit.h

;=============================================================================== ; 引用标准变量

;=============================================================================== IMPORT |Imag e$$RO$$Base| ; Base address o f RO section

IMPORT |Imag e$$RO$$Limit| ; End address of RO section

IMPORT |Imag e$$RW$$Base| ; Base address o f RW section

IMPORT |Imag e$$RW$$Limit| ; End address of RW section

IMPORT |Imag e$$ZI$$Base| ; Base address o f ZI section

IMPORT |Imag e$$ZI$$Limit| ; End addresss of ZI section

IMPORT bdmain ; The entry function of C program

;=============================================================================== ; 宏定义

;=============================================================================== ; macro HANDLER

MACRO

$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

sub sp,sp,#4 ;Decremen t sp (to store jump address)

stmfd sp!,{r0} ;PUS H the work register to stack

ldr r0,=$Han dleLabel;Load the address of HandleXXX to r0

ldr r0,[r0] ;Lo ad the contents(service routine start address) of HandleXXX str r0,[sp,#4] ;S tore the contents(ISR) of HandleXXX to stack

ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

MEND

;=============================================================================== ; 汇编语言的入口代码

;=============================================================================== AREA Init,CODE,READONLY

CODE32

ENTRY

;=====================

; 建立中断向量表

b reset_handler ;0x00000000: Reset (SVC)

b undef_handler ;0x00000004: Un defined instruction (Undef)

b swi_handler ;0x00000008: S oftware Interrupt (SVC)

b iabr_handler ;0x0000000C: In struction Abort (Abort)

b dabr_handler ;0x00000010: Dat a Abort (Abort)

b no_handler ;0x00000014:

b irq_handler ;0x00000018: IRQ (IRQ)

b fiq_handler ;0x0000001C: FIQ (FIQ)

LTORG

undef_handler HANDLER HandleUndef

swi_handler HANDLER HandleSWI

iabr_handler HANDLER HandlePabort

dabr_handler HANDLER HandleDabort

no_handler HANDLER HandleReserved

irq_handler HANDLER HandleIRQ

fiq_handler HANDLER HandleFIQ

;=============================

; 复位时运行的主程序

;=============================

reset_handler

;Set the cpu to SVC32 mode

mrs r0,cpsr

bic r0,r0,#0x1f

orr r0,r0,#0x d3

msr cpsr_cx sf,r0

;Turn off watchdog

ldr r0,=WTCON

ldr r1,=0x0

str r1,[r0]

;Disable all the first level interrupts

ldr r0,=INTMSK

ldr r1,=0xffffffff

str r1,[r0]

;Disable all the second level interrupts

ldr r0,=INTSUBMSK

ldr r1,=0x7ff

str r1,[r0]

;Configure MPLL

ldr r0,=MPLLCON

ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=12MHz,Fout=200MHz str r1,[r0]

;Set FCLK:HCLK:PCLK = 1:2:4

ldr r0, =CLKDIVN

mov r1, #3

str r1, [r0]

;Set memory control registers

ldr r1,=BWSCON

add r2, r0, #52;End address of SMRDATA

ldr r3, [r0], #4

str r3, [r1], #4

cmp r2, r0

bne%B0

;Initialize stacks

bl InitStacks

;Setup IRQ handler

ldr r0,=HandleIRQ;This routine is needed

ldr r1,=IsrIRQ

str r1,[r0]

;Copy RW/ZI sect ion into RAM

ldr r0, =|Image$$RO$$Limit|;Get pointer to ROM data

ldr r1, =|Image$$RW$$Base| ;an d RAM copy

ldr r3, =|Image$$ZI$$Base|

cmp r0, r1; Check that they are differen t

beq%F2

1

cmp r1, r3; Copy init data

ldrcc r2, [r0], #4;--> LDRCC r2, [r0] + ADD r0, r0, #4

strcc r2, [r1], #4;--> STRCC r2, [r1] + ADD r1, r1, #4

bcc%B1

2

ldr r1, =|Image$$ZI$$Limit| ; Top of zero init segment

mov r2, #0

3

cmp r3, r1; Zero init

strcc r2, [r3], #4

bcc%B3

bl bdmain;Jump to the main function

;Dead loop

1

nop

b%B1

;=============================================================================== ; 初始中断处理程序

;=============================================================================== IsrIRQ

sub sp,sp,#4 ;reserved fo r PC

stmfd sp!,{r8-r9}

ldr r9,=INTOFFSET

ldr r9,[r9]

ldr r8,=HandleEINT0

add r8,r8,r9,lsl #2

【最新文档】移植法案例word版本 (5页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除! == 本文为word格式,下载后可方便编辑和修改! == 移植法案例 篇一:发明创造技巧——移植法.doc 龙源期刊网 .cn 发明创造技巧——移植法 作者:银月 来源:《发明与创新(学生版)》201X年第06期 把大家已经知道的原理,已有的物品或方法等,移植运用(来自:WwW. : 移植法案例 )到自己的发明上,得到一项新的发明,这种方法叫做移植法。这种技术 性移植是发明创造的一条重要途径。下面例举两个利用了移植法的小发明; 充气太阳灶 太阳能对人们极有吸引力,但目前的太阳灶造价高,工艺复杂,又笨重(50千 克左右),调节也麻烦,野外工作和旅游时携带不方便。发明者在调查研究的基 础上,明确了主攻方向:简化太阳灶的制作工艺,减轻重量,减少材料消耗, 降低成本,获取最大的功率。他们首先把两片圆形塑料薄膜边缘粘结,充气后 就膨胀成一个抛物面,再在反光面上贴上真空镀铝涤纶不干胶片。用打气筒向 内打气,改变里面气体压强,随着打气的多少,上面一层透明膜向上凸起,反 光面向下凹,可以达到自动会聚反射光线的目的。这种“无基板充气太阳灶” 只有4千克重,拆装方便,便于携带。 该发明实际上是多种移植的结果:发明者把充气玩具的技术,日常商品商标的 不干胶贴片,凸透镜似的抛物面结构,移植到新的太阳灶上来,把光学、流体 力学的原理等知识,移植到太阳灶的设计上,从而成功地完成了小发明。 蜡烛灯 蜡烛是人们常用的一种照明工具,但烛焰怕风,烛体不易固定,亮度不能控制。怎样改进这些缺点呢?湖北监利中学的柳国弘同学先考虑固定烛体与防风,他将蜡烛插在一个铁筒中,罩上一个玻璃罩。他联想到卡口式灯泡的固定方式,并 借用到蜡烛灯上,安了个弹簧以使烛焰保持在灯罩的最佳中心位置。

arm-linux下usb转串口移植手册

arm-linux下usb转串口移植手册: 讲述在嵌入式平台上,移植usb转串口的步骤: 1、配置Kernel 2、文件系统配置等。 Kernel:在配置内核时:加入usb转串口的支持、加入usb转串口器件的支持。 不同厂家的usb转串口工具需要的驱动可能不一样。 Device Drivers ---> USB support ---> --- USB port drivers USB Serial Converter support ---> <*> USB Serial Converter support [*] USB Serial Console device support [*] USB Generic Serial drivert < > USB AIRcable Bluetooth Dongle Driver (EXPERIMENTAL) <*> USB FTDI Single Port Serial Driver (EXPERIMENTAL) 本次实验才用的是FTDI的usb转串口工具 在配置Kernel时,还可以加入对其他厂家的驱动支持。 文件系统: 1、在/dev目录下建立设备文件/dev/ttyUSB0 mknod /dev/ttyUSB0 c 188 0 2、在运行/sbin/getty登陆命令之前要先设置好:usb转串口对应端口的波特率、停止位等。int usb_to_serial_init(viod) { iUSBTORS232 = open( "/dev/ttyUSB0", O_RDWR); if (iUSBTORS232 iRS232 < 0) { printf("Can't open device dev/ttyUSB00"); return -1; } set_speed(iUSBTORS232 iRS232,BAUDRA TE); set_Parity(iUSBTORS232 iRS232,8,1,'n'); close(iRS232); } 3、在/etc/inittab 加入如下命令。同时用consel和usb转串口工具登陆。 # Example of how to put a getty on a serial line (for a terminal) ::respawn:/sbin/getty -L ttyS0 115200 vt100 ::respawn:/sbin/getty -L ttyUSB0 115200 vt100

i.MX6UL -- Linux系统移植过程详解(最新的长期支持版本)

i.MX6UL -- Linux系统移植过程详解(最新的长期支持版本) ?开发平台:i.MX 6UL ?最新系统: u-boot2015.04 + Linux4.1.15_1.2.0 ?交叉编译工具:dchip-linaro-toolchain.tar.bz2 源码下载地址: U-Boot: (选择rel_imx_4.1.15_1.2.0_ga.tar.bz2) https://www.doczj.com/doc/328641393.html,/git/cgit.cgi/imx/uboot-imx.git/ Kernel: (选择rel_imx_4.1.15_1.2.0_ga.tar.bz2) https://www.doczj.com/doc/328641393.html,/git/cgit.cgi/imx/linux-2.6-imx.git/ 源码移植过程: 1、将linux内核及uBoot源码拷贝到Ubuntu12.04系统中的dchip_imx6ul目录下; 2、使用tar命令分别将uboot和kernel解压到dchip_imx6ul目录下; 3、解压后进入uboot目录下,新建文件make_dchip_imx6ul_uboot201504.sh,且文件内容如下: ################################################################### # Build U-Boot.2015.04 For D518--i.MX6UL By FRESXC # ################################################################### #!/bin/bash export ARCH=arm export CROSS_COMPILE=/dchip-linaro-toolchain/bin/arm-none-linux-gnueabi - make mrproper # means CLEAN make mx6ul_14x14_evk_defconfig make2>&1|tee built_dchip_imx6ul_uboot201504.out 4进入kernel目录下,新建文件make_dchip_imx6ul_linux4115120.sh,且文件内容如下: ###################################################################

MMS&WAP移植文档

MMS&WAP移植报告 本次在6219平台上移植的是移软的MMS&WAP。在正式开始移植之前我们先确定了移植移软的MMS&WAP所要求的硬件和软件资源,进行了可行性分析、需求分析,然后进入设计阶段,最后是测试阶段,整个过程严格的按照软件工程的迭代模型来执行。 第一步,创建TASK 在custom_config.h里面定义TASK ID ----INDX_CUSTCMS,这里创建的task数不能大于16,定义三个模块附属于这个TASK,三个模块分别为MOD_CMSMMS、MOD_CMSWAP、MOD_CMSMAP(用户定义的模块数也不能大于16)。 在custom_config.c里面 完成task到模块id的映射,并实现创建task的函数,给定任务优先级212。const comptask_info_struct custom_comp_config_tbl[ MAX_CUSTOM_TASKS ] = { /* INDX_CUSTOM1 */ {"CUST1", "CUST1 Q", 210, 1024, 10, 0, #ifdef CUSTOM1_EXIST custom1_create, KAL_FALSE}, #else NULL, KAL_FALSE}, #endif /* INDX_CUSTOM2 */ {"CUST2", "CUST2 Q", 211, 1024, 10, 0, #ifdef CUSTOM2_EXIST custom2_create, KAL_FALSE}, #else NULL, KAL_FALSE}, #endif //Jo++ 05-05-16 added the Index_CustCMS /* INDX_CUSTCMS */ {"CUSTCMS", "CUSTCMS Q", 212, 1024, 30, 100, #ifdef CUSTCMS_EXIST //Jo++ 需事先定义 customCMS_create, KAL_FALSE}, #else NULL, KAL_FALSE}, #endif //Jo-- }; 第二步,修改makefile,在原mtk工程中添加进去wap mms模块。

成功移植OpenSSH到ARM Linux开发板

成功移植OpenSSH到ARM Linux开发板 概述 如果是用到一些没有SSH的开发板,对于部分的应用开发来说,会受到影响,比如使用ARM DS-5进行RSE远程管理操作时,就会出现错误。下面就具体如何进行OPENSSH移植进行详细介绍。 步骤 1.下载源码包如下,下载 openssh、openssl 和 zlib 三个包。 openssh ?本地下载:openssh-6.6p1.tar.gz(1.22 MB, 下载次数: 2470) ?官网下载:https://www.doczj.com/doc/328641393.html,/portable.html openssl ?本地下载:openssl-1.0.1h.tar.gz(4.27 MB, 下载次数: 2647) ?官方下载:https://www.doczj.com/doc/328641393.html,/source zlib ?本地下载:zlib-1.2.8.tar.gz(557.71 KB, 下载次数: 3499) ?官方下载:https://www.doczj.com/doc/328641393.html,/ 2.部署工作目录创建用户主目录下创建工作目录: 3.解压并编译

注意:openssh不需要make install 4.操作目标板 b)从PC机上将以下文件拷贝到目标板Linux系统中 PC机 /home/gary/work/openssh-6.6p1/ 目录下的 ?scp sftp ssh sshd ssh-add ssh-agent ssh-keygen ssh-keyscan 共8个文件拷

贝到目标板 /usr/local/bin ? moduli ssh_config sshd_config 共3个文件拷贝到目标板 /usr/local/etc ? sftp-server ssh-keysign 共2个文件拷贝到目标板 /usr/libexec c )生成Key 文件 将生成的 ssh_host_*_key 这4个文件copy 到目标板的 /usr/local/etc/ 目录下。其中 ssh_host_ed25519_key 是SSH 第二版协议用到的key ,放到开发板之后,要 d )修改目标板passwd 文件。 5.测试 如果开发板的 root 用户还没有密码,键入以下命令然输入两次密码来修改,否可以用 ps 命令查看sshd 是否在工作 如果运行的过程中有提示缺少动态连接库,可以在主机上搜索相应文件,拷贝到目标板/lib/目录下面,注意创建软连接! OK !不出意外的话可以成功,

嵌入式Linux系统移植试题

嵌入式Linux系统移植试题(时间:1个半小时) 一、选择题(每题2分,共50分,包括单选和多选,多选、少选均不得分) 1.嵌入式linux系统软件部分一般包括() [A] bootloader[B] linux内核[C] 根文件系统[D]用户应用程序 2.一般情况下,在搭建嵌入式linux开发环境时主机需要安装的软件有() [A] 串口通信软件[B] tftp服务器[C] nfs服务器[D]usb 3.下列选项中符合gcc的编译流程的是( ) [A] 预处理->编译->汇编->连接[B] 预处理->汇编->编译->连接[C] 编译->预处 理->汇编->连接[D预处理->连接->汇编->编译 4.gcc使用下列哪个选项可以查看编译的详细过程() [A] -o[B] -v [C] -E [D] -g 5.下列二进制工具哪个是丢弃目标文件的全部或者特定符号,减少文件体积的() [A] size[B] as [C ] nm [D ] strip 6.下列二进制工具哪个是用来反汇编的() [A] nm[B] objdump [C ] objcopy [D ] string 7.下列二进制工具哪个是用来进行目标格式转换的() [A] nm[B] objdump [C ] objcopy [D ] string 8.下列二进制工具哪个是用来把程序地址转换为文件名和行号的() [A] nm[B] objdump [C ] objcopy [D ] addr2line 9.下列二进制工具哪个是用来将目标文件生成静态库的() [A] ar[B]nm [C ] objcopy [D ] objdump 10.FS2410开发板如果从nand flash启动,启动后()访问到nor flash;如果从nor flash 启动,启动后()访问nand flash。 [A] 可以[B] 不可以 11.SMDK2410开发平台上,linux要求bootloader将内核参数存储在什么位置() [A] 0x30008000 [B] 0x30000100 [C ] 0x30004000 [D ] 0x33f80000 12.SMDK2410开发平台上,linux要求bootloader将平台号保存在() [A] r0[B] r1 [C ] r2 [D ] r3 13.SMDK2410开发平台上,linux要求bootloader在运行内核前,让系统进入何种模式() [A] user[B] svc [C ] system 14.u-boot所支持的命令中,哪个是来设置环境变量的() [A] setenv [B] mm [C ] mtest [D ] bootm 15.u-boot支持的命令中,哪个是擦除nor flash的命令() [A] nand erase[B] protect [C ] erase [D ] cp 16.在内核配置时,哪个关键词是来包含下一级Kconfig( ) [A] menu endmenu[B] source [C ] choice endchoice [D ]depends on 17.内核启动过程中,如果终端出现”Error:a”错误,可能出现的原因是()

eMwin 移植 文档飞利浦 恩智浦

uC/GUI(emWin)的应用与移植 当你开始使用emWin进行编程时,通常遵循以下的步骤: 第1步:配置emWin 第一步通常是通过修改头文件LCDConf.h来配置emWin。LCDConf.h中的宏定义描述了LCD显示部分硬件特性;根据你的具体情况修改这些宏定义(例如显示屏的长、宽,每像素点用几位表示,LCD控制器的类型等参数)。 第2步:定义LCD的底层驱动函数 底层函数包括对LCD(控制器)的初始化函数,LCD显示缓冲区的读写函数等,完成对LCD显示硬件的直接操作。 对于映射在系统存储器上的LCD,对显示缓冲区的操作仅需要在LCDConf.h中进行定义就可以了。但对于采用I/O端口/缓冲区操作的LCD,就必须定义相应的接口函数了。 第3步:编译,链接和测试例子代码 emWin对于单任务和多任务环境下的应用都提供了例子代码。在编程之前,对这些例子代码进行编译、链接和测试,使你能够初步了解这些代码的使用。 第4步:修改例子程序 对例子代码作少量的修改。逐步添加一些额外的指令,例如显示不同大小的文字,显示多行等等,从而进一步理解代码的应用。 第5步:emWin的多任务应用,加入到你的操作系统中 如果你的系统有可能多个任务同时对显示进行操作,这时就要用到GUITask.C文件中的GUI_MAXTASK 和GUI_OS宏。 第6步:采用emWin编写你自己的应用 到这一步你应该对怎样使用emWin有一个清楚的了解了。考虑如何采用emWin提供的函数来构建你的应用,并通过阅读手册来获得各函数更详细的功能和使用上的信息。 emWin的移植 移植是指对emWin进行配置和修改,使它能够在你的目标系统上运行。参考第3.4节中的第一步和第二步,移植工作主要是针对配置头文件中的宏定义进行修改。 这些宏包括: 1. LCD宏,定义了显示的尺寸和一些可选择的特性(例如镜像,等等)

ARMLinux移植基本概念

ARM的嵌入式Linux移植体验之基本概念 日前,笔者作为某嵌入式ARM(硬件)/Linux(软件)系统的项目负责人,带领项目组成员进行了下述工作: (1)基于ARM920T内核S3C2410A CPU的电路板设计; (2)ARM处理下底层软件平台搭建: a.Bootloader的移植; b.嵌入式Linux操作系统内核的移植; c.嵌入式Linux操作系统根文件系统的创建; d.电路板上外设Linux驱动程序的编写。 本文将真实地再现本项目开发过程中作者的心得,以便与广大读者共勉。第一章将简单地介绍本ARM开发板的硬件设计,第二章分析Bootloader的移植方法,第三章叙述嵌入式mizi Linux的移植及文件系统的构建方法,第四章讲解外设的驱动程序设计,第五章给出一个已构建好的软硬件平台上应用开发的实例。 如果您有嵌入式系统的开发基础,您将非常容易领会本文讲解地内容。即便是您从来没有嵌入式系统的开发经历,本文读起来也不会生涩。您可以通过如下email与作者联系:21cnbao@https://www.doczj.com/doc/328641393.html,。 2.ARM体系结构 作为一种RISC体系结构的微处理器,ARM微处理器具有RISC体系结构的典型特征。还具有如下增强特点:

(l)在每条数据处理指令当中,都控制算术逻辑单元(ALU)和移位器,以使ALU和移位器获得最大的利用率; (2)自动递增和自动递减的寻址模式,以优化程序中的循环; (3)同时Load和Store多条指令,以增加数据吞吐量; (4)所有指令都条件执行,以增大执行吞吐量。 ARM体系结构的字长为32位,它们都支持Byte(8位)、Halfword(16位)和Word(32位)3种数据类型。 ARM处理器支持7种处理器模式,如下表: 大部分应用程序都在User模式下运行。当处理器处于User模式下时,执行的程序无法访问一些被保护的系统资源,也不能改变模式,否则就会导致一次异常。对系统资源的使用由操作系统来控制。 User模式之外的其它几种模式也称为特权模式,它们可以完全访问系统资源,可以自由地改变模式。其中的FIQ、IRQ、supervisor、Abort和undefined 5种模式也被称为异常模

嵌入式linux系统移植试题 - 答案

嵌入式Linux系统移植试题(时间:60分钟) 一、单项选择题(每题2分,共40分) 1.嵌入式linux系统移植不包括(D) [A] bootloader[B] linux内核[C] 根文件系统[D] 应用程序 2.下列选项中符合gcc的编译流程的是(A ) [A] 预处理->编译->汇编->连接[B] 预处理->汇编->编译->连接[C] 编译->预处 理->汇编->连接[D] 预处理->连接->汇编->编译 3.下列二进制工具哪个是丢弃目标文件的全部或者特定符号,减少文件体积的(D ) [A] size[B] as [C] nm [D] strip 4.下列二进制工具哪个是用来反汇编的(B) [A] nm[B] objdump [C] objcopy [D] string 5.下列二进制工具哪个是用来进行目标格式转换的(C ) [A] nm[B] objdump [C] objcopy [D] string 6.下列二进制工具哪个是用来把程序地址转换为文件名和行号的(D) [A] nm[B] objdump [C] objcopy [D] addr2line 7.FS4412开发平台上,uImage被解压到什么地址(B) [A] 0x40000000 [B] 0x40008000 [C] 0x41000000 [D] 0x43e00000 8.编译Linux内核设备树文件使用什么命令(D) [A] make dtbi[B] make tags [C] make dtb [D] make dtbs 9.linux要求bootloader在运行内核前,让系统进入何种模式(B) [A] user[B] svc [C] system 10.u-boot的命令中存放自启动命令的环境变量是(D) [A] ipaddr [B] bootargs [C] bootm [D] bootcmd 11.u-boot的命令中,设置环境变量的命令是(A) [A] setenv [B] printenv [C] tftp [D] bootm 12.u-boot中存放内核启动参数的环境变量是(C)

白桦的移植技术-最新文档资料

白桦的移植技术 随着现代城市对景观环境的不断提高,大树移植以其优化城市绿地结构,改善城市绿地景观等特点逐渐被采用。白桦枝叶扶疏,姿态优美,尤其是树干修直,洁白雅致,十分引人注目,是园林绿化的优选树种。这几年,我们在移植白桦的过程时总结了以下几个技术要点。 、前期准备 1)掌握白桦特性、生态习性及苗木地、种植地的土壤等 环境因素。 2)准备好必须的机械设施(如吊车,运输车等)、人力 及辅助材料,运输路线,并制定合理的起运栽植方案。 3)号苗及苗木处理:选择生长强健,无病虫害的、符合 绿化设要求的苗木,预先进行疏枝及修剪,修剪时剪口必须平滑,截面尽量缩小,修剪2 公分以上的枝条,剪口应涂沫防腐剂(涂白调和漆或石灰乳)。 4)白桦栽植穴的处理:如白桦树穴除考虑土坨大小外, 还要预留出人工坑内作业空间,树穴基部土壤保持水平。新换的土,一定要将虚土夯实并用水下沉,以防止土壤不平白桦放入后发生倾斜。 二、起运栽植 1、时间

栽植白桦的时间根据北方的气候条件选在3 月20日到4 月 10 日。此时白桦还在休眠,树液尚未流动。白桦移植应做到随 2、起苗 这次移栽的白桦树胸径在距地面一米三处达到20 厘米左右,按着技术规定,根系要保证不小于胸径的10-12 倍,这次我们起的树坨直径是2 米,土坨的高度为直径的0.6 倍。土坨要完好、平整。土坨形似苹果,底部不超过土坨直径的三分之一。起挖前以白桦树干为中心,按规定尺寸划出圆圈,在圈外挖60-80 厘米的操作沟,至规定深度,挖时先去表土,见表土为准,再行下挖,挖时遇粗根必须用锯锯断再削平,不得硬铲,以免造成散 坨。修坨,用铣将所留土坨修成上大下小呈截头圆锥型的土球。 收底,土球底部不应留的过大,一般为土球直径的1/3 左右。土球修成圆形之后,立即用预先湿润的草包将土球围住,并用湿润的草绳横腰绕, 7-10 圈,捆紧。将围腰草绳捆好后就开始包扎土球,一般需要2-3 人同时操作。用草绳包土球时,将双股草绳的一头系在树干基部,然后从土球上部往下绕过土球底部,从土球的对面再绕上去,将草绳每隔5-8 绕1 圈,这样从上绕到下,再从下绕到上,反复缠绕,就能将整个土球包住。拉草绳的人每拉一次草绳就用小木锤顺着草绳前进的方向锤好土球肩部的草绳,使草绳紧紧套住底部。土球包好以后,将草绳拴绕在树干的根基处,并在土球腰部密集绕捆草绳 10-14 圈,在腰箍上打成

Linux C语言 socket编程 聊天室 可移植到arm开发板

sockets聊天室 1.1介绍 包括一个客户端和一个服务器。可实现多人聊天和两人一对一单独聊天。 1.2开发环境和工具 Linux gcc 1.3程序设计 服务器: 1. 声明一个client结构体,包含用户自己的socket描述符mid,自己的用户名name以及 与自己聊天对象的Socket描述符fid(默认是-1,即公共聊天室)。并定义一个结构体数组。 2. 服务器新建一个socket设置默认的ip为自动获取,调用bind()函数绑定服务器socket 与ip。 3. 开启listen()监听客户端的连接请求。 4. 在while循环里,用accept()等待连接,连接成功后,把accept()返回的socket描述 符存入client结构体数组中。 5. 每成功新建一个连接,就创建一个对应的子线程,接收并转发消息。 6. 定义void rec_snd(int n)这个函数,用于接收和转发消息。可选择公共聊天室和私聊, 私聊需要正确输入对方的名字。连接建立以后就可以发送消息。当接收的消息为bye 时,断开当前连接,如果是一对一私聊,一方断开另一方自动转入公共聊天室。 客户端: 1.新建一个socket,并与ip,端口进行绑定。 2.调用connect连接服务器。连接成功后新建一个线程用于发送消息, 主线程在while中调用read()接收服务器消息。 3.Snd()函数用于向服务器发送消息。 4._select()函数用于选择功能。 1.4应用演示 服务器端成功开启等待连接:

当有客户端连接时,会显示ip端口,socket标识符信息。客户端成功连接上服务器时会收到提示输入用户名: 输入姓名后会提示选择功能:

系统移植方案

文档作者:cyt2005 提交时间:2007年7月06日 系统移植方案 Mysql的版本是mysql-5.1.19-win32 操作系统是WINXP2 移植过程中重点问题 数据类型差异 ORACLE数据库和MYSQL数据库在数据类型方面差异比较大,而且数据类型也是一个数据库存储数据的基础,所以找到数据类型之间的对应是整个系统进行移植的基础。以下给出了ORACLE →MYSQL数据类型的对应关系。b5E2RGbCAP 数值类型: NUMBER → DECIMAL,精度刻度都不变 注:如果是序列用BIGINT 字符串类型: VARCHAR2 → VARCHAR长度不变。 LONG → LONGTEXT 这里有可能遇到的问题是超过主键key长度的问题,根据实际情况适当修改,如果是TEXT类型也需要指名长度,否则建立key会报错p1EanqFDPw 日期类型: DATE→DATETIME

TIMESTAMP(N> TIMESTAMP SQL语法差异 SEQUENCE: MYSQL没有ORACLE中的SEQUENCE对象,我们在迁移的时候需要特别注意,一般SEQUENCE有两种用途:DXDiTa9E3d 1、作为表中自增字段的序列号。 2、程序中获得自动编号。 MYSQL数据类型中存在 AUTO_INCREMENT为自增数据类型。我们可以利用该数据类型变通一下来满足我们现有系统中的SEQUENCE功能。RTCrpUDGiT 对于ORACLE中SEQUENCE作为表的自增列一般是通过与触发器绑定实现的,在MYSQL中我们可以直接利用MYSQL的AUTO_INCREMENT类型来实现。5PCzVD7HxA ORACLE开发的应用程序中直接SELECT SEQUENCT来获得自动编号,对于这个功能我们也可以利用MYSQL的AUTO_INCREMENT类型来实现。jLBHrnAILg 首先介绍一个函数,我们可以利用如下函数查询最后一个序列号的值: mysql> SELECT LAST_INSERT_ID(>。 +------------------+ | LAST_INSERT_ID(> | +------------------+

linux arm 移植手册(分享)

Linux系统移植 目 录 第一部分 前言 (8) 1 硬件环境 (8) 1.1主机硬件环境 (8) 1.2 目标板硬件环境 (8) 1.3工具介绍 (8) 2软件环境 (8) 2.1主机软件环境 (8) 2.1.1 Windows 操作系统 (8) 2.1.2 Linux操作系统 (8) 2.1.3 目标板最后运行的环境 (9) 2.2 Linux下工作用户及环境 (9) 2.2.1 交叉工具的安装 (9) 2.2.2 u-boot移植工作目录 (9) 2.2.3 内核及应用程序移植工作 (9) 2.3 配置系统服务 (10) 2.3.1 tftp服务器的配置 (10) 2.4 工具使用 (12) 2.4.1 minicom的使用 (12) 3 作者介绍 (13) 3.1 策划, 组织, 指导, 发布者 (13) 3.2 ADS bootloader部分 (13) 3.3 交叉工具部分 (13) 3.4 uboot部分 (13) 3.5 内核部分 (13) 3.6 应用程序部分 (13) 3.7 网卡驱动部分 (13) 3.8 Nand Flash 驱动部分 (13) 第二部分 系统启动bootloader的编写(ADS) (14) 1 工具介绍 (14) 1.1 ADS 命令行命令介绍 (14) 1.1.1 armasm (14) 1.1.2 armcc, armcpp (14) 1.1.3 armlink (14) 2 基本原理 (15) 2.1 可执行文件组成及内存映射 (15) 2.1.1 可执行文件的组成 (15)

2.1.3 启动过程的汇编部分 (17) 2.1.4 启动过程的C部分 (17) 3 AXD的使用以及源代码说明 (18) 3.1 源代码说明 (18) 3.1.1 汇编源代码说明 (18) 3.1.2 C语言源代码说明 (23) 3.1.3 源代码下载 (23) 3.2 AXD的使用 (23) 3.2.1 配置仿真器 (23) 3.2.2 启动AXD 配置开发板 (23) 第三部分 GNU交叉工具链 (25) 1 设置环境变量,准备源码及相关补丁 (25) 1.1 设置环境变量 (25) 1. 2 准备源码包 (25) 1.2.1 binuils (25) 1.2.2 gcc (25) 1.2.3 glibc (25) 1.2.4 linux kernel (26) 1.3 准备补丁 (26) 1.3.1 ioperm.c.diff (26) 1.3.2 flow.c.diff (26) 1.3.3 t-linux.diff (26) 1.4 编译 GNU binutils (26) 1.5 准备内核头文件 (26) 1.5.1 使用当前平台的gcc编译内核头文件 (26) 1.5.2 复制内核头文件 (27) 1.6 译编glibc头文件 (27) 1.7 编译gcc第一阶段 (27) 1.8 编译完整的glibc (27) 1.9 编译完整的gcc (28) 2 GNU交叉工具链的下载 (28) 2.1 ARM官方网站 (28) 2.2 本文档提供的下载 (28) 3 GNU交叉工具链的介绍与使用 (29) 3.1 常用工具介绍 (29) 3.2.1 arm-linux-gcc的使用 (29) 3.2.2 arm-linux-ar 和 arm-linux-ranlib的使用 (30) 3.2.3 arm-linux-objdump的使用 (30) 3.2.4 arm-linux-readelf的使用 (31) 3.2.6 arm-linux-copydump的使用 (32) 4 ARM GNU常用汇编语言介绍 (32)

NB-IoT协议SDK移植说明文档docx.docx

NB-IOT 协议接入说明文档 Version: 1.0

1、资源模型介绍 1.1协议介绍 OneNET提供了采用LWM2M+CoAP协议接入设备的说明文档,用户可以下载学习相关的具体内容,其中包括: LWM2M协议的介绍 LWM2M是OMA组织制定的轻量化的M2M协议。LwM2M定义了三个逻辑实体: ?LWM2M Server 服务器; ?LWM2M Client 客户端,负责执行服务器的命令和上报执行结果; ?LWM2M 引导服务器Bootstrap Server,负责配置LWM2M客户端。 在这三个逻辑实体之间有4个逻辑接口: ?Device Discovery and Registration:客户端注册到服务器并通知服务器客户端所支持的能力; ?Bootstrap:Bootstrap Server配置Client; ?Device Management and Service Enablement:指令发送和接收; ?Information Reporting:上报其资源信息。 图1-1 LWM2M协议栈 ?LWM2M Objects:每个对象对应客户端的某个特定功能实体。LWM2M 规范定义

了以下标准Objects,比如 o urn:oma:lwm2m:oma:2; (LWM2M Server Object); o urn:oma:lwm2m:oma:3; (LWM2M Access Control Object); o每个object下可以有很多resource,比如Firmware object可以有Firmware版本号,size等resource; o Vendor可以自己定义object。 LWM2M Protocol:定义了一些逻辑操作,比如Read, Write, Execute, Discover or Observe等。 LWM2M协议的具体内容和消息格式可以参考OMA的网站 https://https://www.doczj.com/doc/328641393.html,/wiki/OMA_LWM2M CoAP协议的说明 CoAP(Constrained Application Protocol)协议是IETF提出的一种面向网络的协议,采用了与HTTP类似的特征,核心内容为资源抽象、REST式交互以及可扩展的头选项等。CoAP协议基于REST构架,REST是指表述性状态转换架构,是互联网资源访问协议的一般性设计风格。为了克服HTTP对于受限环境的劣势,CoAP既考虑到数据报长度的最优化,又考虑到提供可靠通信。一方面,CoAP提供URI,REST式的方法如GET、POST、PUT和DELETE,以及可以独立定义的头选项提供的可扩展性。另一方面,CoAP基于轻量级的UDP协议,并且允许IP多播。为了弥补UDP传输的不可靠性,CoAP定义了带有重传机制的事务处理机制。并且提供资源发现机制,并带有资源描述。

ARM9上的嵌入式Linux系统移植

《自动化技术与应用》2009年第28卷第6期 Techniques of Automation & Applications | 43 1 引言 嵌入式系统是以应用为中心,以计算机技术为基础,且软硬件可裁减,是对功能、可靠性、成本、功耗有严格要求的专用计算机系统。它一般由以下几部分组成: 嵌入式微处理器、外围硬件设备、嵌入式操作系统、及特定的应用程序。 当前,人类进入信息爆炸的时代,各类信息极度丰富,数字信息技术和网络技术的高速发展,只有借助于各种计算机,才能够对各类信息进行处理,它们已不再局限于以前的PC,而是由形态各异、性能千差万别的嵌入式系统来完成。而嵌入式操作系统主要有:嵌入式Linux 、WindowsCE 、Vxworks 、uC/OS-II 等[1]。本文主要研究嵌入式Linux 在嵌入式系统中的应用。 2 嵌入式Linux 操作系统及特点 将Linux 应用于嵌入式环境,是基于其具有以下特点:(1)Linux 操作系统是层次结构,并且内核源代码完全开放。不同领域和不同层次的用户可以根据自己应用的需要,对内核进行修改,能够低成本的开发出满足自己需要的嵌入式系统。(2)其具有强大的网络支持功能。Linux 诞生于因特网时代,并具有 ARM9上的嵌入式Linux 系统移植 邹颖婷,李绍荣 (电子科技大学光电信息学院,四川 成都 610054) 摘 要:Linux 操作系统在各个嵌入式领域有着越来越广泛的应用。主要研究了在ARM9体系结构上,嵌入式Linux 系统的移植。介 绍了嵌入式Linux 操作系统、移植目标平台SBC2410、及Linux 内核源代码的目录结构。然后详细讲述了在SBC2410硬件平台上实现Uboot 移植的过程,及概要介绍了Linux 操作系统内核移植的过程。最后将嵌入式Linux 系统成功移植上SBC2410平台。 关键词:ARM9;嵌入式Linux;Uboot 移植;内核移植 中图分类号:TP311.54 文献标识码:B 文章编号:1003-7241(2009)06-0043-03 Transplant of the Linux System on ARM9 ZOU Ying-ting, LI Shao-rong ( School of Opto-Electronic Information, University of Electronic Science and Technology of China, Chengdu 610054 China )Abstract: Linux OS has been more and more widely applied in many embedded areas. This paper introduces the transplantation of the Embedded Linux System on the ARM9. The Embedded Linux OS, the SBC2410 board, and the directory structure of the Linux kernel are introduced. The transplant process of the Uboot and of the Linux kernel are also discussed. Key words: ARM9; embedded Linux; transplantation of Uboot; transplantation of the Linux kernel 收稿日期:2009-01-04 Unix 的特性,这保证了它支持所有标准因特网协议,并且可以利用Linux 的网络协议栈,将其开发成为嵌入式的TCP/IP 网络协议栈。此外,Linux 还支持ext2、fat16、fat32、romfs 等文件系统,为嵌入式系统应用开发打下了很好的基础。(3)Linux 具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,可以跨越嵌入式系统开发中仿真工具的障碍。而且,Linux 也符合IEEE POSIX.1标准,使应用程序具有较好的可移植性[2]。 3 SBC2410硬件平台介绍 SBC2410是一款基于三星公司ARM9处理器S3C2410A,支持ARM-Linux 、WindowsCE 等操作系统的嵌入式硬件平台。平台的主要硬件资源有:一片64M SDRAM,一片64M Nand Flash,一片1M Nor Flash,一个串口 COM0,一个USB Host A 型接口,一个USB Slave B 型接口,一个标准JTAG 接口,等等。平台支持Linux2.4.18内核版本。 4 嵌入式Linux 系统移植 移植主要包括引导加载程序Uboot 的移植和Linux2.4.18内 计算机应用 Computer Applications

移植树木请示文档3篇

移植树木请示文档3篇Request document for transplanting trees

移植树木请示文档3篇 小泰温馨提示:请示报告是机关、事业和企业单位在公文往来中经常用到的重要评议体之一。主要用于向上级机关请求指示、请示批准某一事项的报告。本文档根据请示报告内容要求展开说明,具有实践指导意义,便于学习和使用,本文下载后内容可随意修改调整及打印。 本文简要目录如下:【下载该文档后使用Word打开,按住键盘Ctrl键且鼠标单击目录内容即可跳转到对应篇章】 1、篇章1:移植树木请示文档 2、篇章2:移植树木请示文档 3、篇章3:移植树木请示文档 规划先行,重点工程铺开,树木逐步移栽。移植树木的请示该怎么写?下文是移植树木请示,欢迎阅读! 篇章1:移植树木请示文档 汲取6.6南山火灾教训,根据电力线路规程的要求,需将南山电杆、线路附近的树木全部移植或裁剪,共计处理树木1668余颗;其中110kv进线区的178颗柏树和35kv出线处190颗松柏要求修剪到1米高度,剩余的要求裁剪或移植。(树木数量详见附表:南山站周边树木明细表),本请示报告,已于

六月十三日上报绿化办,因资金问题,一直未能解决,请上级领导协助督促处理为盼。 篇章2:移植树木请示文档【按住Ctrl键点此返回目录】小组,因县乡规划自然沙洲退洲返田,原来沙洲一些零星树木(包括花果树、人工栽培樟树、)尽快移植,为加强生态文明建设,合理保护资源,恳请贵局批复XXX组xxx有限公司)。 篇章3:移植树木请示文档【按住Ctrl键点此返回目录】东花园提升改造工程已于20XX年4月2日正式开工,今年园区铺开的主要基础设施工程为:打通西口学府街通往园区内的360米施工道路;开挖400亩生态如意形水系;形成园区4.8公里内8字形主干道路基工程;6000米左右的排污管网铺设,百亩绿化示范区建设等工程,计划完成投资额1亿元人民币。 按照规划先行,重点工程铺开,树木逐步移栽的原则,施工单位并云湖工程部反复调查,递交了《关于花园提升改造工程并涉及树木移栽情况报告》见附件。

我来说linux移植过程

我对linux移植过程的整体理解 首先,要开始移植一个操作系统,我们要明白为什么要移植。因为我们要在另外一个平台上用到操作系统,为什么要用操作系统,不用行不行?这个问题的答案不是行或不行来回答。单片机,ARM7都没有操作系统,我们直接对寄存器进行操作进而实现我们需要的功能也是可以。但是,一些大型的项目设计牵涉很多到工程的创建,单纯对裸机进行操作会显得杂乱庞大这时候需要一个操作系统。 操作系统的功能能。我们用到操作系统,一方面可以控制我们的硬件和维护我们的硬件,另一方面可以为我们得应用程序提供服务。呵呵,这样说还是很抽象,具体到项目中就可以感受到操作系统的好处。 Linux操作系统的移植说白了总共三大部分:一,内核的重新编译。二,bootloader的重新编译。三,文件系统的制作。在这里要解释这些名词也很不好说的明白,首先,一个完整的操作系统是包括这三大部分的,内核、Bootloader、文件系统。我们知道Linux有很多版本,不同的版本只是文件系统不一样而内核的本质都是一样的。 那么,我们开始进行移植。首先是内核。1.我们需要下载一个内核源码,这个在网上很好下载,下载后,保存下。2.把这个压缩包复制到ubuntu(我用的版本)里,一般复制到/home/dong/SoftEmbed(我的目录,呵呵),然后呢,我们需要对这个内核进行修改重新编译,为什么要这样做,因为我们要让内核为我们的ARM服务,所以需要修改一些东西的。至于具体如何修改,我已经写在另外一个文档里了。3.修改的内容主要是 Makefile(设置体系架构为arm,设置交叉编译器)、时钟频率(我们板子的频率)、内核配置(进入内核配置主要是设置一些选项以适合我们的开发板)。具体设置步骤我会另加说明。4.设置好后我们需要重新编译内核,用的是make zImage命令。编译后就生成了我们自己编译好的内核,呵呵。 接下来,进行文件系统的移植。我们需要一个Yaffs2文件系统压缩包。1.复制这个压缩包到/home/dong/SoftEmede(我自己在ubuntu里建的目录,呵呵),2.解压,会生成一个文件夹。3.给内核打补丁,通过执行 ./patsh-ker.sh c /内核目录。呵呵4.进入 make menuconfig中配置选项,要选择对yaffs2的支持,具体怎么设置我写在另一个文档。 接下来,我们进行根文件制作,需要一个制作工具 mkyaffs2image.taz.还是复制到我自己的目录下,解压,安装。接着,我们需要对Busybox的移植、配置,具体移植、配置步骤我另写,呵呵。最后是构建我们自己的文件系统,到此我们已经完成了内核移植和文件系统的制作。准备移植,呵呵。今天先写到这里,累了。

相关主题
文本预览
相关文档 最新文档