嵌入式Linux开发

上传人:san****019 文档编号:22681450 上传时间:2021-05-30 格式:PPT 页数:86 大小:1.16MB
返回 下载 相关 举报
嵌入式Linux开发_第1页
第1页 / 共86页
嵌入式Linux开发_第2页
第2页 / 共86页
嵌入式Linux开发_第3页
第3页 / 共86页
点击查看更多>>
资源描述
第6章 嵌入式Linux开发 主 讲 :李 岩 现 在 Linux 广 泛 用 于 各 类 计 算 应 用 ,不 仅 包 括 IBM 的 微 型 Linux 腕 表 、 手 持 设备 ( PDA 和 蜂 窝 电 话 ) 、 因 特 网 装 置 、 瘦客 户 机 、 防 火 墙 、 工 业 机 器 人 和 电 话 基 础设 施 设 备 , 甚 至 还 包 括 了 基 于 集 群 的 超 级计 算 机 。 本 章 主 要 介 绍 了 :怎样应用Linux来进行嵌入式系统的开发。选用Linux操作系统的优势。 Linux的简化版本uClinux相关知识。如内存管理、进程管理、启动过程等。开发工具Hittool的具体应用。 6.1 嵌 入 式 Linux概 况n Linux操作系统开放源代码,可以裁剪内核,并已在x86、 Alpha、 Sparc、 MIPS、 PPC、Motorola、 NEC和ARM等硬件平台上稳定、高效地运行。n Linux操作系统作为一种多任务、稳定可靠、内核可裁剪的系统,是开发嵌入式软硬件产品的优秀软件平台。n嵌入式Linux是一种开放源码、软实时、多任务的嵌入式操作系统。 6.1.1 嵌 入 式 Linuxl在嵌入式开发中,随着微处理器的产生,价格低廉、结构小巧的CPU和外设接口提供了稳定可靠的硬件架构。l高端嵌入式系统要求许多高级的功能,如图形用户界面和网络支持。许多高端RTOS供应商已经提供了这些功能,但其价格也很高,一般人难以接受。lLinux为嵌入式操作系统提供了一个极有吸引力的选择,它是一个类UNIX的、以内核为基础的、有完备内存保护机制的、多任务多进程的操作系统。l由于Linux具有开放性,所以许多人认为Linux非常适合多数Intemet设备。他们认为Linux可以支持不同的设备,支持不同的配置。 6.1.1 嵌 入 式 Linux1. 可 运 行 于 多 种 硬 件 平 台 Linux符合IEEE POSIX.1标准,使应用程序具有较好的可移植性。 Linux内核已经被移植到多种硬件平台上,这对受开销、时间限制的研究与开发项目是很有吸引力的。2. 可 裁 剪 , 性 能 优 异 , 应 用 软 件 丰 富Linux的动态模块加载使Linux的裁剪极为方便,高度模块化的部件使添加非常容易。Linux是一个全面的多任务和真正的32位操作系统。系统运行稳定,功能强大,支持多种硬件平台,应用工具多。3. 使 用 成 本 低 Linux是免费软件,只要遵守GPL(GNU General Public License)的规定,就可以免费获得拷贝,并进行开发和商业发行。 6.1.1 嵌 入 式 Linux4. 强 大 的 网 络 功 能ILinux操作系统最突出的是网络部分,基本上所有的网络协议和网络接口都可以在Linux上找到。ILinux内核对网络协议栈的设计是从简捷实用的角度出发的,它有一整套的网络协议模块。ILinux的网络功能十分强大,更重要的是, Linux的网络功能和协议是以内核可选的模块方式提供的,它允许用户自由地裁剪和优化。5. GUI开 发 支 持G Linux本身有性能优秀的X Window系统,在X Window系统的支持下,能方便地进行图形用户界面的开发。 6.1.1 嵌 入 式 LinuxG X Window是一个在大多数UNIX工作站上使用的图形用户界面。G X Window系统应用于嵌入式系统时,要考虑嵌入式系统的特殊条件。6. 丰 富 的 开 发 技 术 资 源H Linux在这几年中不断成熟,越来越多的人加入了Linux的行列。H这意味着对新硬件的Linux驱动程序甚至比用于其他UNIX系统(如Solaris的驱动程序)还来得及时。H Linux庞大的志愿者网络在生产“补丁”程序方面反应很快。 6.1.2 嵌 入 式 Linux的 组 成最 基 本 的 嵌 入 式 Linux系 统 需 要 3个 基 本 元 素 :O系 统 引 导 程 序 , 用 于 完 成 机 器 加 电 后 的 系 统 定 位 引OLinux系统内核,为嵌入式应用提供一个软件环境,为应用程序完成基本的底层的资源管理工作;O初始化过程,完成基本的初始化。O为使这个最小嵌入式系统具有一定的实用性,还需加上硬件的驱动程序及个或几个应用进程以提供必要的应用功能支持。O如果应用比较复杂,可能还需要添加一个可以在ROM或RAM中使用的文件系统、TCP/IP网络协议栈等。O在PDA领域,还需要加上个GUl支持。 6.1.3 嵌 入 式 Linux的 版 本1.将Linux移植以满足实时要求的实时操作系统,应用于一些关键的控制场合,如Fsmlabs公司的RT Linux,Monta Vista的Hard Hat Linux。2.尽可能保留Linux的强大功能,尽可能地减少其体积,以满足许多嵌入式系统对体积的要求,如uClinux。3.针对特定嵌入式领域采用整合方案,如Lineo,TimeSys,合肥华恒等。接下来,简要介绍常用的两个嵌入式Linux操作系统。 6.1.3 嵌 入 式 Linux的 版 本1. 实 时 Linux(RT Linux)RT Linux是美国新墨西哥州大学计算机系研制开发的。RT Linux实现的内核位于通常的Linux内核之下,这个内核是一个实时内核,它只需要完成底层的任务创建、中断服务程序,并为底层任务、ISR和Linux进程之间进行通信排队。RT Linux的调度方法和用户实时任务的工作是通过Linux的可导入模块的方式进行的。2. uClinuxuClinux是一个GNU的项目,代码完全开放。uClinux的英文解释是Micro Control Linux,可理解为“微控制领域中的Linux系统”。它专门应用于没有MMU的CPU,并专为嵌入式系统做了许多小型化的工作,已支持的微处理器包括Motorola MC68000,MCF5206和 MCF5207ColdFire等。 6.2 uCLinux开 发 介 绍目前,uClinux往往基于两个Linux内核版本,2.0.38 是一个比较成熟的版本,2.4.x是最新的版本Hitool 套件同时提供了对他们的支持。一般uClinux的内核大小在500k左右,如果加上一些基本的应用,也就在900k左右.非常适合于嵌入式系统。uClinux架构如图6-1所示(下页) ,一些重要的模块在下面描述。 6.2.1 启 动 过 程 ( Bootstrap)n启 动 模 块 Bootstrap负 责 用 来 起 动 Linux内 核 ,包 括 Chip Selector初 始 化 , 系 统 堆 栈 的 初 始化 , 把 压 缩 的 Linux映 像 从 Flash中 解 压 到RAM中 , 并 把 控 制 权 交 给 内 核 的 初 始 化 例程 。n这 部 分 工 作 是 与 你 的 硬 件 高 度 相 关 的 , 所以 这 部 分 的 代 码 要 尽 量 精 简 。 6.2.2 内 核 初 始 化 ( Kernel Initialization)6内 核 初 始 化 的 入 口 地 址 是 : start_kernel(在 init/main.c中 )。 6它 初 始 化 内 核 的 其 它 部 分 , 包 括 异 常( trap) 、 中 断 (IRQ)、 内 存 页 ( Page) 、调 度 ( Scheduling) 、 驱 动 程 序 等 等 。 并 启动 “ init”进 程 进 入 多 任 务 环 境 。 6.2.3 系 统 调 用 处 理 /异 常 处 理当“init”程序运行后,内核对整个系统的运行不再进行直接控制,而是通过系统调用给应用程序提供服务和响应外部及内部的异步事件,例如:程序错误,硬件中断等。在ARM中,系统调用采用swi指令所产生的软件异常来实现,如例所示:swi 0 x900004(其中0 x900004表示这个系统调用为sys_write)。00002550 :2550: ef900004 swi 0 x009000042554: e3700a01 cmn r0, #4096 ; 0 x10002558: 2afff6b0 bcs 20 _syscall_error255c: e1a0f00e mov pc, lr 6.2.4 驱 动 程 序 (Device Driver) 驱 动 程 序 是 整 个 Linux内 核 的 主 要 组 成 部 分 ,它 们 控 制 着 操作 系 统 和 外 部 设 备 的 交 互 。 Linux的 驱 动 程 序 是 可 选 的 , 但 是 典 型 的 系 统 应 该 包 括 一个 控 制 台 (Console),一 个 通 用 串 口 驱 动 程 序 ,一 个 块 设 备 (用 来 存 放 根 文 件 系 统 ) 驱 动 程 序 。 当 Linux内 核 起 动 的 时 候 ,需 要 一 个 输 出 调 试 信 息 的 设 备 。这 个 设 备 往 往 通 过 串 口 来 实 现 。 这 个 调 试 终 端 可 以 通 过 register-console 这 个 函 数 来 创 建 。而 所 有 的 调 试 信 息 都 通 过 Printk例 程 通 过 这 个 调 试 终 端 来输 出 。 6.2.5 文 件 系 统 ( File System)y支 持 多 种 文 件 系 统 是 Linux一 个 重 要 的 特 性 , uClinux同 样把 这 一 特 性 带 进 了 嵌 入 式 系 统 中 , 并 针 对 嵌 入 式 系 统 作 了一 些 取 舍 。y在 Hitool for uClinux包 括 了 romfs, Ext2 FS, RAM FS, NFS 。 y其 中 , romfs 是 最 简 单 的 只 读 文 件 系 统 , 所 占 用 的 空 间 最少 , 我 们 用 它 来 做 根 文 件 系 统 ( root file system) 。y根 文 件 系 统 里 存 放 Linux启 动 时 要 用 到 的 设 备 文 件 , 配 置文 件 和 应 用 程 序 。y例 如 : /dev/tty0, /etc/rc , /bin/init ,/bin/sh, 等 等 。 6.2.6 内 存 管 理! uClinux不 能 使 用 处 理 器 的 虚 拟 内 存 管 理 技 术 但 仍 然 采 用存 储 器 的 分 页 管 理 , 系 统 在 启 动 时 把 实 际 存 储 器 进 行 分 页 。在 加 载 应 用 程 序 时 程 序 分 页 加 载 。 但 是 由 于 没 有 MMU管 理 ,所 以 实 际 上 uClinux采 用 实 存 储 器 管 理 策 略 ( 物 理 内 存 ) 。!uClinux系 统 对 于 内 存 的 访 问 是 直 接 的 , ( 它 对 地 址 的 访 问不 需 要 经 过 MMU, 而 是 直 接 送 到 地 址 线 上 输 出 ) , 所 有 程序 中 访 问 的 地 址 都 是 实 际 的 物 理 地 址 。!由 于 应 用 程 序 加 载 时 必 须 分 配 连 续 的 地 址 空 间 , 所 以 开 发人 员 在 开 发 应 用 程 序 时 必 须 考 虑 内 存 的 分 配 情 况 并 关 注 应用 程 序 需 要 运 行 空 间 的 大 小 。!从 内 存 的 访 问 角 度 来 看 , 开 发 人 员 的 权 利 增 大 了 ( 开 发 人员 在 编 程 时 可 以 访 问 任 意 的 地 址 空 间 ) , 但 与 此 同 时 系 统的 安 全 性 也 大 为 下 降 。 6.2.7 进 程 管 理 uClinux 和Linux之间最大的区别在于平面存储器模型。没有虚拟存储器可以提供非常有效的fork 系统调用。由于在使用fork时,内核会将父进程拷贝一份给子进程,但是这样的做法相当浪费时间,因为大多数的情形都是程序在调用fork后就立即调用exec,这样刚拷贝来的进程区域又立即被新的数据覆盖掉。 因此Linux系统提供一个系统调用vfork,vfork假定系统在调用完成vfork后会马上执行exec,因此vfork不拷贝父进程的页面,只是初始化私有的数据结构与准备足够的分页表。这样实际在vfork调用完成后父子进程事实上共享同一块存储器(在子进程调用exec或是exit之前),因此子进程可以更改父进程的数据及堆栈信息,因此vfork系统调用完成后,父进程进入睡眠,直到子进程执行exec。并且在这段时间内,子进程不能更改数据段和堆栈的内容。 6.2.7 进 程 管 理当子进程执行exec时,由于exec要使用被执行程序的数据,代码覆盖子进程的存储区域, 这样将产生写保护错误(do_wp_page)(这个时候子进程写的实际上是父进程的存储区域)。这个错误导致内核为子进程重新分配存储空间。当子进程正确开始执行后,将唤醒父进程,使得父进程继续往后执行。所以,在uClinux中,想让父子进程同时运行同一个程序是不可以的。 6.2.8 运 行 时 间 库 及 应 用 程 序运行时间库提供了用户程序和内核程序的接口。1. 程 序 的 入 口 代 码用户自己写程序一般从main开始,其实程序在运行时真正的进入点是C运行库的一部分。这部分代码执行初始静态数据,例如错误号(errno)以及环境指示符(environ),并且将参数argc 和argv传输到main。参数和环境一般根据宏程序start_thread(定义在include/proc/processer.h) 的调用约定,放在寄存器或者堆栈上。execve 系统调用利用start_thread 建立一个虚拟环境,程序的入口代码因此必须实现把start_thread 所建立的环境恢复出来,并调用_uClibc_main。在_uClibc_main中再调用用户程序的main 。 .text .global _start .global _uClibc_main .type _start,%function .type _uClibc_main,%function.text _start:/* 清帧缓冲区指针 */mov fp, #0/* argc, argv 和 envp 出栈 */ldr r0,sp, #0ldr r1,sp, #4ldr r2,sp, #8/* 运行 uClibc的 main() 函数不应返回 */bl_uClibc_main 6.2.8 运 行 时 间 库 及 应 用 程 序 2. 堆 (heap)分 配_用户程序通过调用malloc从堆中分配内存。在有虚拟存储器的系统中,堆可以使用sbrk调用来扩大。_因为虚拟存储器支持分段存储,所以可以在堆的最高端到堆栈的最底部之间留有很大的虚拟空间来做扩展之用。_但在平面存储器系统中,没有这个空间。所以,堆空间改用mmap调用来分配。在uClibc中,内存分配的算法非常简单直接,存储器的管理完全依靠内核的页机制来完成。见图6-2。 6.2.8 运 行 时 间 库 及 应 用 程 序从 图 6-2中 , 可 以 看 出 另 一 项 区 别 , 因 为 物 理 上 堆 栈 与 静态 数 据 相 连 , 所 以 , 堆 栈 必 须 有 足 够 的 空 间 , 以 防 止 覆 盖静 态 数 据 和 代 码 。在 标 准 Linux程 序 中 的 虚 拟 内 存 允 许 堆 和 堆 栈 之 间 留 有 足够 大 的 空 间 来 让 他 们 扩 展 。 系 统 可 以 监 控 页 的 使 用 情 况 ,防 止 堆 栈 溢 出 。但 在 uClinux中 要 预 留 这 样 大 的 物 理 空 间 是 不 可 能 的 。另 外 , 因 为 在 uClinux中 没 有 内 存 保 护 机 制 来 防 止 堆 栈 溢出 , 在 程 序 链 接 时 要 特 别 小 心 设 定 堆 栈 的 大 小 。 6.2.8 运 行 时 间 库 及 应 用 程 序4. 执 行 文 件 格 式 ( Flat binary format)$uClinux系统使用flat可执行文件格式,可以使用elf2flt工具把ELF格式的可执行文件转化为flat文件。$当用户执行一个应用时,内核的执行文件加载器(fs/binfmt_flat.c)将对flat文件进行进一步处理,主要是对代码段和数据段进行修正。$为什么要修正呢?因为应用程序在连接时并不知道它要在系统的那一段地址上面运行,这样就要求程序在任何地址上都要能运行,也就是说与地址无关(PICposition independent code)。$ 这个特性由针对uClinux的编译器和连接器来提供。在ARM中有一条相对跳转指令: ebxxxxxx bl xxxxx;可以用来实现地址无关的跳转。 6.3 uCLinux启 动 过 程uClinux系 统 的 启 动 可 以 分 为 两 个 步 骤: 1. 运 行 bootloader初 始 化 程 序JSRAM 、SDRAM等存储设备属于挥发性的存储器,掉电以后其中的内容就会全部丢失,所以必须把操作系统的内核镜像存放在Flash等不挥发性存储介质上。J从本质上来讲,bootloader不属于操作系统内核。它采用汇编语言编写,因此针对不同的CPU体系结构,这一部分代码不具有可移植性。J在移植操作系统时,这部分代码必须加以改写。 6.3 uCLinux启 动 过 程具 体 来 讲 , bootloader在 系 统 启 动 时 主 要 完 成 以 下几 项 工 作 :1.将操作系统内核从Flash拷贝到SDRAM中,如果是压缩格式的内核,还要将之解压缩。 2.改写系统的memory map,原先flash起始地址映射为0地址,这时需要将RAM的起始地址映射为0。3.设置堆栈指针并将bss段清零。将来执行C语言程序和调用子函数时要用到。4.改变pc值,使得CPU开始执行真正的操作系统内核。 6.3 uCLinux启 动 过 程2. 运 行 操 作 系 统 内 核%bootloader程序执行完上述的各项工作后,通过一条跳转指令,转而执行init目录下C语言源文件main.c中的函数start_kernel( )。%因为在此之前bootloader已经创建好一个初始化环境,C函数可以开始执行了。 %整个操作系统内核的初始化工作从这里才算是真正开始。这个函数的长度比较短,代码如下: void _init start_kernel(void) char * command_line; unsigned long mempages; extern char saved_command_line; /* * Interrupts are still disabled. Do necessary setups, then * enable them */ lock_kernel(); printk(linux_banner); setup_arch( printk(Kernel command line: %sn, saved_command_line); parse_options(command_line); trap_init(); init_IRQ(); sched_init(); softirq_init(); time_init(); /* * HACK ALERT! This is early. Were enabling the console before * weve done PCI setups etc, and console_init() must be aware of * this. But we do want output early, in case something goes wrong. */console_init(); #ifdef CONFIG_MODULES init_modules(); #endif if (prof_shift) unsigned int size; /* only text is profiled */ prof_len = (unsigned long) prof_len = prof_shift; size = prof_len * sizeof(unsigned int) + PAGE_SIZE-1; prof_buffer = (unsigned int *) alloc_bootmem(size); kmem_cache_init(); sti(); calibrate_delay(); #ifdef CONFIG_BLK_DEV_INITRD if (initrd_start & !initrd_below_start_ok & initrd_start min_low_pfn PAGE_SHIFT) printk(KERN_CRIT initrd overwritten (0 x%08lx 0 x%08lx) - disabling it.n,initrd_start,min_low_pfn 建 立 uClinux的 内 核 开 发 环 境 , 你 需 要 一 个JTAG 仿 真 器 ( PowerProbe 或 JEDI) ,与 开 发 板 和 宿 主 机 相 连 。再 使 宿 主 机 的 串 口 与 开 发 板 的 串 口 相 连 ,并 在 宿 主 机 上 启 动 HyperTerm程 序 , 设 置波 特 率 为 9600。 如 图 6-3所 示 : 6.4.2 开 发 环 境 的 建 立其 中 HyperTerm用 来 作 为 uClinux的 标 准 输入 输 出 。 网 口 可 以 作 为 MDB的 调 试 界 面 ,也可 以 通 过 它 来 使 用 网 络 文 件 系 统 (NFS)。当 所 有 连 接 都 正 确 后 ,启 动 Configuration of Hitool(只 有 在 第 一 次 使 用 时 才 需 要 )。根 据 JTAG仿 真 器 类 型 , 选 择 正 确 的 JTAG 协 议 。 具 体 配 置 可 参 照 Hitool for ARM用 户手 册 或 者 在 线 帮 助 。 6.4.3 调 试 方 法 调 试 主 要 有 三 种 方 法 : JTAG调 试 方 法 ;MDB调 试 方 法 ; FTP调 试 方 法1 JTAG调 试 方 法t首先在uClinux的控制台(PC上的HyperTerm )上执行这个程序。t当这个用户程序被内核加载时,会有一个对话框跳出问你是否想要调试此程序。选择No按钮表示继续此程序,不进行调试。t如果你不希望下次运行此程序时对话框再次跳出,只需选择“Dont show this message again when this program launches”选项。t如果点击Yes按钮, 一个Add Symbol Table对话框将跳出,请你选择下载合适的符号文件(*.elf)。 6.4.3 调 试 方 法 在 对 话 框 最 下 面 的 三 个 编 辑 框 显 示 的 是 这 个 程 序 被 加 载 后 在 RAM中各 个 段 的 位 置 , 请 不 要 改 动 它 们 , 如 图 6-4所 示 。 图64 uClinux应用程序调试对话框 6.4.3 调 试 方 法t在 符 号 文 件 下 载 以 后 , 这 个 程 序 将 被 执 行 到 main函 数 后 停 止 。t这 是 你 可 以 像 普 通 嵌 入 式 程 序 一 样 调 试 它 。t而 且 你 仍 然 可 以 在 内 核 上 设 置 断 点 , 当 程 序 用 到系 统 调 用 或 设 备 驱 动 程 序 时 , 你 可 以 设 断 点 直 接执 行 到 断 点 。 6.4.3 调 试 方 法2. FTP调 试 方 法 关于JFFS/JFFS2文件系统的建立,请读者参考相关技术资料。在此仅描述如何将用户程序通过局域网,从FTP服务器(运行Linux宿主机)上,传输到运行uClinux的目标系统(FTP客户机)并执行的过程:(1)将目标系统与Linux宿主机连接在同一网段中,在宿主机的任意目录下编写应用程序,并用交叉编译工具生成flat格式的文件。 (2)启动目标系统的uClinux,通过超级终端,输入下面的命令: ifconfig eth0 192.168.100.50 ifconfig命令用于配置目标系统的IP地址其中,eth0代表目标系统的网络设备,IP地址192.168.100.50为目标系统的IP地址,此时宿主机的IP地址为:192.1681.100.21。 执行命令: ifconfig all 可以看到目标系统的IP地址已被正确配置 6.4.3 调 试 方 法(3)测试一下与宿主机的连接,键入命令: ping 192.168.100.21 应能得到宿主机的应答信息。(4)当目标系统与宿主机已正确建立连接后,进入目标系统的可写目录/var或/tmp,并登录到宿主机: cd var ftp 192.168.100.21(5)输入宿主机上的合法用户名及密码,便与宿主机建立了FTP连接。为传输二进制文件,键入命令: ftpbinary 200 Type set to I 6.4.3 调 试 方 法注 意 :在用FTP进行文件传输的时候,一定要选好文件传输的模式,FTP默认模式为二进制模式,但是为了保险起见,还是手动把传输模式显式改写为二进制模式。通常的txt、html和绝大多数PS文件都是文本格式的,而其他的可执行文件、压缩文件都是二进制格式。两种格式之间要用ascii和binary命令切换,两者都可以适当缩写。 6.4.3 调 试 方 法(6)传输已编译好的可执行文件(如lednxy)到目标系统并退出FTP服务,键入命令: ftpget lednxy ftpquit (7)此时,可执行文件lednxy已传输至目录/var或/tmp下,但文件的可执行属性未被设置,添加文件的可执行属性,键入命令: chmod 755 lednxychmod是一个文件权限修改的命令,在文件创建的时候会自动设置存取权限,若是这些默认权限无法适合企业环境的需求,就可以利用chmod命令来修改存取权限。通常在权限修改的时候可以用两种方式表示权限类,数字表示法和文字表示法。 6.4.3 调 试 方 法这里我们采用的是数字表示法。就是说将读取(r)、写入(w)和执行(x)分别以4、2、1来代表,没有授予权限的部分就表示值为0,然后再把所授予的权限相加而成。表6-1为读者列出了几个例子。 表6-1 存取权限范例 6.4.3 调 试 方 法 表 中 每 三 位 字 符 为 一 组 , 这 样 权 限 可 以 被 分 为三 组 :第一组表示此文件拥有者的存取权限第二组表示该文件拥有者所属组成员的存取权限最后一组表示该文件拥有者所属组之外的用户存取权限。(8)执行程序lednxy,键入命令: ./lednxy 6.4.3 调 试 方 法3. MDB调 试 方 法 MDB是一个Linux的任务调试监控程序,它本身也是一个Linux的应用程序,这个程序可以作为其他需要调试的程序的父进程,来控制它们的运行。(1)单应用程序MDB调试方法如下: 要使用MDB协议,先要在Startup Configuration里进行设定如下:选择protocol 为MDB 选择Port 为Ethernet,如果你板子上的网口不可以用来做调试,请选择COM1或COM2,并写上相应的IP地址或波特率(9600-57600之间)。在TgtSvr框中,填入运行TargetServer的PC的IP地址,缺省为本地。 6.4.3 调 试 方 法 然后让uClinux在开发板上运行起来,以root 身份进入,密码uClinux 。在控制台上打入MDB :9999 (用网络连接,9999是port)或MDB /dev/ttySx (用串口连接,x为1或2)如果控制台与调试使用同一个串口,请把控制台中断。 运行TargetServer。 启动Hitool, 选择Project|Init Debugger 命令。 现在,可以下载需要调试的文件了。 6-6 uClinux控制台 6.4.3 调 试 方 法(2) 如果要同时调试多个程序,请打开多个Hitool, 一个Hitool只能调试一个程序。你可以用下列命令来开始一个调试过程。 Load image下载一个uClinux可执行文件(flat binary file,*.exe)到目标板。 fork运行一个程序,并把相应的符号文件(*.exe.elf)加到符号表中,使程序停在main函数上。 load image then fork顺序执行load 和 fork。 kill中止当前被调试的进程。 attach 截获一个已经在运行的任务, 并进行调试。 6.4 开 发 工 具 介 绍6.5.1 配 置 内 核 启动Hitool for uClinux 后,会有一个叫做“Linux Kernel”的工具栏出现在屏幕上(如图6-7所示)。图6-7 Linux 工具条 6.5.1 配 置 内 核 请按“Setting”按钮设置Linux相关的源文件路径,内核版本,以及运行时间库的版本。例如,如果你的Linux源结构为:C:uclinuxuClinux-distuserC:uclinuxuClinux-distlinux-2.4.x C:uclinuxuClinux-distlib如图6-8所示 则设置源文件路径为: C:uclinuxuClinux-dist 设置Kernel version为: linux-2.4.x 设置Library为: uClibc(use uC-libc for Samsung4510/44B0) 图6-8 uClinux环境设置 6.5.1 配 置 内 核 当这些参数设定以后,按Config Kernel按钮,就进入了系统配置主窗口(如图6-9所示)。 如果选择yfor“Customize Kerenel Settings” or “Customize Vendor/User Settings”, 会依次出现图6-11和图6-12窗口。 图6-9 uClinux配置主窗口 图6-10 目标配置主窗口 图6-11 内核配置窗口 图6-12 开发板配置窗口 6.5.1 配 置 内 核 你可以根据开发板的参数填入相应的值。 所有的预设值都是为所带的评估板而设定的。 其他配置窗口不再一一赘述。 当配置完成之后,会自动作依赖关系设定。这会需要一段时间。在整个过程中,如果你希望终止至,可以按”stop”按钮。 6.5.2 编 译 内 核$第一步是编译user目录下的一些应用程序,例如 init.exe ,agetty.exe ,sh.exe,mount.exe 等等$第二步是把第一步编好的程序考到romfs目录下,并调用genromfs 命令来生成根文件系统的映像romfs.img。$第三步才是编译内核, 并把romfs.img 连接进去, 产生linux.elf。$第四步是把linux.elf 去掉条是信息,转成linux.bin, 并把它与boot 目录下的启动代码连接在一起, 生成最终的 Flash映像linux_bootrom.bin。 6.6 内 核 的 调 试6.6.1 下 载 uClinx内 核要进行调试, 先执行菜单命令Project | Init Debugger, 使 Hitool与仿真器连接。如果你将要调试的uClinux 内核(linux.elf)已准备好,点击Load按钮将内核下载到开发板的RAM上。这样,你可以调试Linux 内核就像调试一个普通的嵌入式程序。Hitool会帮你处理掉很多和Linux 相关的细节。在Hitool for uClinux中,我们包括了一个预先编译好的Linux 内核,该内核存储于uClinux-dist/linux-2.0.x(for EV40 board) 或者 uClinux-dist/linux-2.4.x/( for 4510B board)中。 6.6.2 几 个 调 试 窗 口1 uClinux源 代 码 结 构 窗 口 和 调 试 符 号窗 口 在调试过程中,有几个窗口会很有帮助,一个是项目窗口中的“Linux SRC” pane,这里会列出uClinux 的源代码的文件结构。另一个是”Symbol” Pane。 你可以通过他们在复杂的Linux源代码中找到需要的信息,如图6-13和如图6-14所示。 图6-13 uClinux源代码结构和调试符号 6.6.2 几 个 调 试 窗 口2 调 试 源 代 码 窗 口 图6-14给出了uClinux调试源代码窗口,行号前的圆点表示设置的断点。 图6-14 uClinux调试源代码窗口 6.6.2 几 个 调 试 窗 口3 uClinux任 务 信 息 窗 口(1)uClinux 进程窗口Hitool为开发者提供了uClinux 中运行的任务的详细的信息。点击工具菜单的Task Info,打开uClinux 窗口,窗口信息如图6-15所示。uClinux 窗口显示了系统的所有进程,它们按照创建顺序排列。对于每一个线程,给出了详细内容如下: Name 程序名; Pid 进程标示符; State 目前进程执行状态, 图6-15 uClinux 进程窗口 进 程 可 处 在 五 个 状 态 中 的 一 个 状 态 下 :Running(运行态): 进程已经在被CPU执行 或者正在等待被 CPU执行。 Interruptiable(可中断态): 进程正在等待某些事件或者资源。可以被一些信号中断。Uninterruptible(不可中断态): 进程正在等待某些事件或者资源,一般情况下,它在等待硬件资源,不可用任何方式中断。Zombie:进程实际上已被中止。但是由于某种原因,进程task_struct 还停留在任务向量表task vector中,这是进程的最后状态。Stopped: 进程被中断,被调试的进程有可能中断。在 Linux中 有 的 Swapping状 态 在 uClinux中 是 不 存 在 的 。 Counter 进程计数器 Priority 进程优先级 Policy 进程的调度算法。FIFO 运行首先创建的进程。RR 按顺序标记完成进程。 这 样 , 直 到 所 有 的 进 程 都 已 完 成 。 Register-所选进程的寄存器 6.6.2 几 个 调 试 窗 口(2)uClinux窗口快捷菜单 当你右击uClinux窗口上部任何地方,会弹出如图6-16的快捷菜单: Identifiers 窗口 这一项弹出如图6-17的Identifiers对话框,显示选中进程标识符,用户标识符和组标识符。 Time窗口如图6-18所示,显示选中进程的时间信息。包括进程的创建时间,在用户态的运行时间,在内核态的运行时间等等。 Timer窗口 Linux 支持以下三种计时器:实时,虚拟,以及检索Profile计时器如图6-19所示,Timer对话框显示着三个计时器的信息。 图6-16 uClinux 任务快捷菜单 图6-18 uClinux 进程时间统计窗口 图6-19 uClinux 进程定时器窗口 6.6.2 几 个 调 试 窗 口 Memory Management窗口 弹出如图6-20所示的存储器管理对话框,显示选中进程的代码段,数据段,以及堆栈段的信息。 Attach窗口 调试一个已经在运行的进程,执行后,会弹出下载符号文件的对话框。 图6-20 uClinux 进程内存管理窗口 6.4 小 结 本章主要介绍了怎样应用Linux来进行嵌入式系统的开发。 首先说明了为什么要选用Linux而不是其它的操作系统。 接着阐述了Linux的简化版本uClinux相关知识。如内存管理、进程管理、启动过程等。 最后介绍了开发工具Hittool的具体应用 练 习 题 :1为什么要选用Linux作为嵌入式开发系统?2uClinux的内存管理跟Linux的内存管理有何异同?3简述用Hitool for uClinux 配置uClinux内核的过程。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!