第7章 嵌入式uClinux及应用开发
- 格式:pdf
- 大小:562.31 KB
- 文档页数:44
如何使用C语言进行嵌入式系统开发第一章:引言嵌入式系统是一种专门设计用于特定应用领域的计算机系统,它通常由硬件平台和软件系统组成。
C语言作为一种高级编程语言,广泛应用于嵌入式系统开发中。
本文将介绍如何使用C语言进行嵌入式系统开发。
第二章:了解嵌入式系统在使用C语言进行嵌入式系统开发之前,我们需要了解嵌入式系统的基本概念和特点。
嵌入式系统通常运行在资源受限的环境中,因此需要对系统资源的管理和利用进行精确控制。
嵌入式系统的开发过程需要考虑实时性、可靠性、功耗等因素。
第三章:基础知识在使用C语言进行嵌入式系统开发之前,我们需要掌握一些基础知识。
首先是C语言的基本语法和特性,包括数据类型、运算符、控制语句等。
其次是嵌入式系统开发中常用的硬件知识,例如芯片架构、外设接口等。
还需要了解一些常用的嵌入式开发工具,如编译器、调试器等。
第四章:选择适合的开发平台嵌入式系统开发需要选择适合的开发平台。
常见的开发平台包括单片机、嵌入式Linux系统、实时操作系统等。
根据具体应用需求选择合适的开发平台,同时要考虑开发工具的可用性和便利性。
第五章:编写嵌入式系统应用程序使用C语言进行嵌入式系统开发的核心是编写应用程序。
在编写应用程序时,需要根据系统需求设计合适的算法和数据结构,实现功能模块。
同时要考虑资源的合理利用和性能的优化,以保证系统的稳定运行。
第六章:调试和测试嵌入式系统开发过程中,调试和测试是至关重要的环节。
通过调试和测试可以发现和解决系统中的问题,保证系统的可靠性和稳定性。
在调试和测试过程中,可以使用一些专业的嵌入式开发工具,如JTAG、Logic Analyzer等,来辅助分析和调试。
第七章:性能优化嵌入式系统通常具有资源受限的特点,因此性能优化是非常重要的。
通过代码优化、算法改进、资源管理等手段,可以提高系统的实时性、运行速度和功耗效率。
在进行性能优化时,需要仔细分析系统的瓶颈和热点,针对性地进行优化操作。
嵌入式Linux操作系统是一种针对嵌入式设备设计和优化的Linux操作系统。
它在嵌入式系统中发挥着关键作用,为嵌入式设备提供了丰富的功能和灵活性。
以下是嵌入式Linux操作系统的原理和应用方面的概述:嵌入式Linux操作系统原理:内核:嵌入式Linux操作系统的核心是Linux内核,它提供了操作系统的基本功能,包括处理器管理、内存管理、设备驱动程序、文件系统和网络协议栈等。
裁剪:为了适应嵌入式设备的资源限制,嵌入式Linux操作系统通常经过裁剪和优化,只选择必要的功能和驱动程序,以减小内存占用和存储空间,并提高性能和响应速度。
交叉编译:由于嵌入式设备通常具有不同的硬件架构和处理器,所以嵌入式Linux操作系统需要通过交叉编译来生成适用于目标设备的可执行文件和库。
设备驱动:嵌入式Linux操作系统需要适配各种硬件设备,因此需要编写和集成相应的设备驱动程序,以使操作系统能够正确地与硬件进行通信和交互。
嵌入式Linux操作系统应用:嵌入式设备:嵌入式Linux操作系统广泛应用于各种嵌入式设备,如智能手机、平板电脑、家用电器、工业控制系统、车载设备等。
物联网(IoT):随着物联网的快速发展,嵌入式Linux操作系统被广泛应用于连接的嵌入式设备,用于数据采集、通信、远程控制和智能化管理。
嵌入式开发板:嵌入式Linux操作系统在开发板上提供了丰富的开发环境和工具链,用于嵌入式软件开发和调试。
自定义嵌入式系统:开发者可以基于嵌入式Linux操作系统构建自定义的嵌入式系统,根据特定需求进行定制和开发,实现各种功能和应用。
嵌入式Linux操作系统的原理和应用非常广泛,它为嵌入式设备提供了灵活性、可定制性和强大的功能支持,使得开发者能够构建高度定制化和功能丰富的嵌入式系统。
嵌入式linux开发课程设计一、课程目标知识目标:1. 理解嵌入式Linux系统的基本概念、原理和架构。
2. 掌握嵌入式Linux开发环境的搭建与使用。
3. 学习嵌入式Linux内核配置、编译与移植方法。
4. 掌握常见的嵌入式Linux设备驱动编程技术。
技能目标:1. 能够独立搭建嵌入式Linux开发环境。
2. 熟练运用Makefile、交叉编译工具链进行代码编译。
3. 能够编写简单的嵌入式Linux设备驱动程序。
4. 学会分析并解决嵌入式Linux开发过程中的常见问题。
情感态度价值观目标:1. 培养学生对嵌入式系统开发的兴趣,提高学习积极性。
2. 培养学生的团队协作意识,增强沟通与表达能力。
3. 培养学生勇于克服困难,面对挑战的精神。
分析课程性质、学生特点和教学要求:本课程为高年级专业课程,要求学生具备一定的C语言基础和计算机硬件知识。
课程性质为理论与实践相结合,注重培养学生的实际动手能力。
针对学生特点,课程目标设定了明确的知识点和技能要求,旨在使学生能够掌握嵌入式Linux开发的基本方法,为后续项目实践和职业发展奠定基础。
课程目标分解为具体学习成果:1. 学生能够阐述嵌入式Linux系统的基本概念、原理和架构。
2. 学生能够自主搭建嵌入式Linux开发环境,并进行简单的程序编译与运行。
3. 学生能够编写简单的嵌入式Linux设备驱动程序,并实现相应的功能。
4. 学生能够针对嵌入式Linux开发过程中遇到的问题,提出合理的解决方案,并进行实际操作。
二、教学内容1. 嵌入式Linux系统概述- 嵌入式系统基本概念- 嵌入式Linux的发展历程- 嵌入式Linux系统的特点与优势2. 嵌入式Linux开发环境搭建- 交叉编译工具链的安装与配置- 嵌入式Linux文件系统制作- 常用开发工具的使用(如Makefile、GDB)3. 嵌入式Linux内核与驱动- 内核配置与编译- 内核移植方法- 常见设备驱动编程(如字符设备、块设备、网络设备)4. 实践项目与案例分析- 简单嵌入式Linux程序编写与运行- 设备驱动程序编写与调试- 分析并解决实际问题(如系统性能优化、故障排查)教学内容安排与进度:1. 嵌入式Linux系统概述(2课时)2. 嵌入式Linux开发环境搭建(4课时)3. 嵌入式Linux内核与驱动(6课时)4. 实践项目与案例分析(8课时)本教学内容基于课程目标,结合教材章节内容,注重理论与实践相结合,旨在培养学生的实际动手能力和解决问题的能力。
《嵌入式系统开发与应用》教学教案一、教学目标1. 了解嵌入式系统的概念、特点和应用领域。
2. 掌握嵌入式系统的基本组成和开发流程。
3. 学习嵌入式操作系统的基本原理和常用操作系统。
4. 掌握嵌入式系统编程方法和常用编程工具。
5. 培养学生的嵌入式系统设计和开发能力。
二、教学内容1. 嵌入式系统概述1.1 嵌入式系统的定义1.2 嵌入式系统的特点1.3 嵌入式系统的应用领域2. 嵌入式系统的基本组成2.1 硬件平台2.2 软件系统2.3 中间件和驱动程序3. 嵌入式系统开发流程3.1 需求分析3.2 硬件选型和系统设计3.3 软件开发3.4 系统集成与测试3.5 产品发布与维护4. 嵌入式操作系统原理4.1 嵌入式操作系统的概念4.2 嵌入式操作系统的分类4.3 嵌入式操作系统的特点4.4 常用嵌入式操作系统介绍5. 嵌入式系统编程方法5.1 嵌入式编程语言5.2 嵌入式系统编程工具5.3 嵌入式系统编程规范5.4 嵌入式系统编程实例三、教学方法1. 讲授法:讲解嵌入式系统的基本概念、原理和开发流程。
2. 案例分析法:分析实际项目中的嵌入式系统设计和开发案例。
3. 实验法:动手实践,掌握嵌入式系统编程方法和工具。
4. 小组讨论法:分组讨论,培养团队合作能力。
四、教学资源1. 教材:《嵌入式系统开发与应用》2. 课件:教学PPT3. 实验设备:嵌入式开发板、编程器、仿真器等4. 在线资源:相关论文、博客、教程、论坛等五、教学评价1. 课堂参与度:观察学生在课堂上的发言和讨论情况。
2. 作业完成情况:评估学生作业的质量和完成速度。
3. 实验报告:评估学生在实验过程中的操作能力和解决问题的能力。
4. 期末考试:测试学生对嵌入式系统开发与应用知识的掌握程度。
六、教学内容6. 嵌入式系统硬件平台6.1 微控制器(MCU)6.2 应用处理器(AP)6.3 系统级芯片(SoC)6.4 硬件选型的考虑因素7. 嵌入式系统软件系统7.1 固件编程7.2 嵌入式操作系统7.3 中间件与驱动程序开发7.4 软件开发工具与环境8. 嵌入式系统中间件与驱动程序8.1 中间件的概念与作用8.2 常用中间件介绍8.3 驱动程序的概念与开发8.4 设备驱动程序的框架9. 嵌入式系统项目开发流程9.1 需求分析与规格说明书编写9.2 硬件设计与选型9.3 软件设计与开发9.4 系统集成与测试9.5 项目管理与迭代10. 嵌入式系统案例分析与实践10.1 案例选择与分析10.2 系统设计与开发过程10.3 项目实施与调试10.4 项目报告与评审七、教学方法1. 案例分析法:通过分析具体的嵌入式系统项目案例,使学生了解项目开发的实际过程。
嵌入式linux开发教程pdf嵌入式Linux开发是指在嵌入式系统中使用Linux操作系统进行开发的过程。
Linux作为一种开源操作系统,具有稳定性、可靠性和灵活性,因此在嵌入式系统中得到了广泛的应用。
嵌入式Linux开发教程通常包括以下内容:1. Linux系统概述:介绍Linux操作系统的发展历程和基本原理,包括内核、文件系统、设备驱动等方面的知识。
了解Linux系统的基本结构和工作原理对后续的开发工作至关重要。
2. 嵌入式开发环境搭建:通过搭建开发环境,包括交叉编译器、调试器、仿真器等工具的配置,使得开发者可以在本机上进行嵌入式系统的开发和调试。
同时,还需要了解各种常用的开发工具和调试技术,如Makefile的编写、GDB的使用等。
3. 嵌入式系统移植:嵌入式系统往往需要根据不同的硬件平台进行移植,以适应各种不同的硬件环境。
这个过程包括引导加载程序的配置、设备驱动的移植和内核参数的调整等。
移植成功后,就可以在目标硬件上运行Linux系统。
4. 应用程序开发:在嵌入式Linux系统上进行应用程序的开发。
这包括编写用户空间的应用程序,如传感器数据采集、数据处理、网络通信等功能。
还需要熟悉Linux系统提供的各种库函数和API,如pthread库、socket编程等。
5. 系统优化和性能调优:在开发过程中,经常需要对系统进行调优和优化,以提高系统的性能和稳定性。
这包括对内核的优化、内存管理的优化、性能分析和调试等。
只有深入了解和熟练掌握这些技术,才能使得嵌入式系统运行得更加高效和稳定。
嵌入式Linux开发教程PDF通常会结合理论和实践相结合的方式进行教学,通过实际的案例和实践操作,帮助开发者快速掌握嵌入式Linux开发的技术和方法。
同时还会介绍一些常见的开发板和硬件平台,以及开源项目等,帮助开发者在实际项目中应用所学的技术。
总之,嵌入式Linux开发教程PDF提供了系统而详细的指导,帮助开发者快速入门嵌入式Linux开发,掌握相关的技术和方法,以便更好地进行嵌入式系统的开发工作。
uCLinux开发介绍严永红Linux是当前一种非常受欢迎的操作系统,它与UNIX系统兼容,并开放源代码。
它包含所有现代操作系统所具有的一切特性,包括多任务,虚拟内存,代码共享,按需载入,内存管理,以及TCP/IP网络。
并且,它遵循POSIX标准,只要是遵循POSIX API的应用程序很容易被移植。
目前,随着嵌入式系统的蓬勃发展。
Linux也已对嵌入式系统的开发产生具大影响。
大多数流行的CPU都被移植上去,ARM, PowerPC , MIPS, 68K, SPARC, Alpha, SH 等等. 这些CPU都含有一种叫做内存管理单元(MMU)的硬件,来支持标准Linux所需要的虚拟内存。
但在嵌入式世界里,还有很多CPU是没有MMU的,象ARM7、68328等等。
uClinux 正是为了解决这种没有MMU的CPU而产生的。
在uCLinux这个英文单词中,u表示Micro,小的意思,C表示Control,控制的意思,连起来就是Micro-Control-Linux, ―运行在微控制器上的Linux.‖针对这种没有MMU的CPU架构,uCLinux采用了一种平板式(Flat)的内存模型来去除对MMU的依赖, 并且改变了用户程序的加载方式,开发了运用于uCLinux的C函数库--uCLibc. 由于这些变化,一般的Linux开发工具(例如GDB)在开发uCLinux时会碰到一些困难,包括内核的移植,驱动程序及应用程序的调试。
针对这样状况。
Hitool System公司开发了Hitool for uClinux开发套件,来帮助用户开发基于uClinux的系统。
Hitool for uClinux与其它的Linux开发工具相比,有几个优点:A.整个开发过程只在Windows环境下完成,包括内核的配臵、编译,应用程序的编译,文件系统的生成,内核的调试,用户程序的调试。
B.可以采用多种调试方式,既可以采用JTAG方式来调试,也可通过网口用Hitool自己的监控程序(MDB)来调试。
目录第1章 ARM微处理器概述 51.1 ARM-Advanced RISC Machines 51.2 ARM微处理器的应用领域及特点 51.2.1 ARM微处理器的应用领域 51.2.2 ARM微处理器的特点 61.3 ARM微处理器系列 61.3.1 ARM7微处理器系列 61.3.2 ARM9微处理器系列 71.3.3 ARM9E微处理器系列 71.3.4 ARM10E微处理器系列 71.3.5 SecurCore微处理器系列 81.3.6 StrongARM微处理器系列 81.3.7 Xscale处理器 81.4 ARM微处理器结构 81.4.1 RISC体系结构 81.4.2 ARM微处理器的寄存器结构 91.4.3 ARM微处理器的指令结构 91.5 ARM微处理器的应用选型 101.6 本章小节10第2章 ARM微处理器的编程模型 112.1 ARM微处理器的工作状态 112.2 ARM体系结构的存储器格式 112.3 指令长度及数据类型 122.4 处理器模式 122.5 寄存器组织 132.5.1 ARM状态下的寄存器组织 132.5.2 Thumb状态下的寄存器组织 152.5.3 程序状态寄存器 162.6 异常(Exceptions) 182.6.1 ARM体系结构所支持的异常类型 182.6.2 对异常的响应 182.6.3 从异常返回 192.6.4 各类异常的具体描述 192.6.5 异常进入/退出小节 202.6.6 异常向量(Exception Vectors) 202.6.7 异常优先级(Exception Priorities) 212.6.8 应用程序中的异常处理 212.7 本章小节21第3章 ARM微处理器的指令系统 223.1 ARM微处理器的指令集概述 223.1.1 ARM微处理器的指令的分类与格式 223.1.2 指令的条件域 233.2 ARM指令的寻址方式 233.2.1 立即寻址 243.2.2 寄存器寻址 243.2.2 寄存器间接寻址 243.2.3 基址变址寻址 243.2.4 多寄存器寻址 253.2.5 相对寻址 253.2.6 堆栈寻址 253.3 ARM指令集 253.3.1 跳转指令 253.3.2 数据处理指令 263.3.3 乘法指令与乘加指令 303.3.4 程序状态寄存器访问指令 323.3.5 加载/存储指令 323.3.6 批量数据加载/存储指令 343.3.7 数据交换指令 353.3.8 移位指令(操作) 353.3.9 协处理器指令 363.3.10 异常产生指令 383.4 Thumb指令及应用 383.5 本章小节39第4章 ARM程序设计基础 404.1 ARM汇编器所支持的伪指令 404.1.1 符号定义(Symbol Definition)伪指令 404.1.2 数据定义(Data Definition)伪指令 414.1.3 汇编控制(Assembly Control)伪指令 434.1.4 其他常用的伪指令 454.2 汇编语言的语句格式 484.2.1 在汇编语言程序中常用的符号 494.2.2 汇编语言程序中的表达式和运算符 494.3 汇编语言的程序结构 524.3.1 汇编语言的程序结构 524.3.2 汇编语言的子程序调用 524.3.3 汇编语言程序示例 534.3.4 汇编语言与C/C++的混合编程 554.4 本章小节56第5章应用系统设计与调试 575.1 系统设计概述 575.2 S3C4510B概述 585.2.1 S3C4510B及片内外围简介 585.2.2 S3C4510B的引脚分布及信号描述 615.2.3 CPU内核概述及特殊功能寄存器(Special Registers) 675.2.4 S3C4510B的系统管理器(System Manager) 725.3 系统的硬件选型与单元电路设计 825.3.1 S3C4510B芯片及引脚分析 825.3.2 电源电路 835.3.3 晶振电路与复位电路 835.3.4 Flash存储器接口电路 855.3.5 SDRAM接口电路 895.3.6 串行接口电路 935.3.7 IIC接口电路 945.3.8 JTAG接口电路 955.3.9 10M/100M以太网接口电路 965.3.10 通用I/O接口电路 1005.4 硬件系统的调试 1015.4.1 电源、晶振及复位电路 1015.4.2 S3C4510B及JTAG接口电路 1025.4.3 SDRAM接口电路的调试 1035.4.4 Flash接口电路的调试 1055.4.5 10M/100M以太网接口电路 1055.5 印刷电路板的设计注意事项 1055.5.1 电源质量与分配 1055.5.2 同类型信号线的分布 1065.6 本章小节 106 第6章部件工作原理与编程示例 1076.1 嵌入式系统的程序设计方法 1076.2 部件工作原理与编程示例 1086.2.1 通用I/O口工作原理与编程示例 1086.2.2 串行通讯工作原理与编程示例 1116.2.3 中断控制器工作原理与编程示例 1206.2.4 定时器工作原理与编程示例 1236.2.5 GDMA工作原理与编程示例 1276.2.6 IIC总线控制器工作原理 1336.2.7 以太网控制器工作原理 138主要特性139MAC功能模块 140 带缓冲DMA接口(Buffered DMA Interface) 144以太网控制器特殊功能寄存器(Ethernet Controller Special Registers) 147MAC寄存器(Media Access Control(MAC)Register) 154以太网控制器的操作(Ethernet Controller Operation) 160发送一个帧(Transmitting a Frame) 162接收一个帧(Receiving a Frame) 1626.2.8 Flash存储器工作原理与编程示例 1626.3 BootLoader简介 1676.4 本章小节 167 第7章嵌入式uClinux及其应用开发 1687.1 嵌入式uClinux系统概况 1687.2 开发工具GNU的使用 1707.2.1 GCC编译器 1707.2.2 GNU Make 1727.2.3 使用GDB调试程序 1777.3 建立uClinux开发环境 1807.3.1 建立交叉编译器 1817.3.2 uClinux针对硬件的改动 1847.3.3 编译uClinux内核 1857.3.4 内核的加载运行 1877.4 在uClinux下开发应用程序 1887.4.1 串行通信 1907.4.2 socket编程 1957.4 .3 添加用户应用程序到uClinux 2027.4.4 通过网络添加应用程序到目标系统 2057.5 本章小结 207 第8章ARM ADS集成开发环境的使用 2098.1 ADS集成开发环境组成介绍 2098.1.1 命令行开发工具 2098.1.2 ARM运行时库 2188.1.3 GUI开发环境(Code Warrior和AXD) 2198.1.4 实用程序 2218.1.5 支持的软件 2218.2 使用ADS创建工程 2228.2.1 建立一个工程 2228.2.2 编译和链接工程 2258.2.3 使用命令行工具编译应用程序 2298.3 用AXD进行代码调试 2308.4 本章小结 233第1章 ARM微处理器概述本章简介ARM微处理器的一些基本概念、应用领域及特点,引导读者进入ARM技术的殿堂。
せ7』 uClinux ⩗ゴҢ ϔϾ䩜 S3C4510B⹀ӊ ⱘ uClinux ㋏㒳 Ϟ䖯㸠 ⫼ ⱘ ˈ䗤ℹ䆆䗄 ԩ Linux⦃ ϟ㓪 ⫼ ⫼ ⱘ ⊩ ℹ偸ˈ Ў❳ Windows ㋏㒳ⱘ⫼ ҟ㒡 䖭⾡ ПϞˈՓ⫼ԩ⾡ 㓪 㓪䆥㞾 ⱘ ⫼DŽ䗮䖛 ゴⱘ дˈ䇏㗙 ҹ uClinux ϔ ⱘњ㾷ˈ Ϩ Linux Windows ϟ ㋏㒳 ⫼ ⱘ ⊩DŽゴЏ㽕 ˖ˉ uClinux㋏㒳ὖˉ GNUⱘՓ⫼ˉ ゟuClinux ⦃ˉ uClinuxϟ ⫼7.1 uClinux㋏㒳ὖPC Ϟ ⫼ ⱘ⫼ 䛑Ӯ 䖭ḋⱘ 㾝ˈPC ⱘ ㋏㒳 կ ⫼ ˄API˅ˈ ⱘ ⫼ ҹⳈ ㋏㒳Ϟ䖤㸠DŽ㱑✊ ㋏㒳ⱘ ⫼ ҹ 㻌 Ϟ䖤㸠ˈԚЎњՓ㋏㒳 ӏ ㅵ⧚ǃ ㅵ⧚ǃ ㅵ⧚ǃ䌘⑤ㅵ⧚ǃџӊㅵ⧚ǃ㋏㒳ㅵ⧚ǃ⍜ ㅵ⧚ǃ䯳 ㅵ⧚ Ё ⧚ⱘ㛑 ˈ կ ӏ ⧚ˈ ⱘ 䜡㋏㒳䌘⑤ⱘ 㛑ˈ⫼ 䳔㽕䩜 㞾 ⱘ⹀ӊ 䰙 ⫼䗝 䗖 ⱘ ㋏㒳˄Embedded Operating Systemˈҹϟㅔ⿄EOS˅DŽ 㡖 㒧 к 䇜 ⱘ⹀ӊ S3C4510Bˈҟ㒡ϔ⾡䩜 ϡ MMUⱘARM ⧚ ⱘ ㋏㒳uClinuxDŽuClinux ϔϾ ヺ GNU/GPL 㑺ⱘ ㋏㒳ˈ ҷⷕˈ⦄ ⬅Lineo 㓈 DŽuClinuxⱘ ䷇ Āyou-see-linuxā, ⱘ 㞾Ѣ 㜞 ↡Āmuā 㣅 ↡ĀCāⱘ㒧 DŽĀmuāҷ㸼Ā āП ˈ ↡ĀCāҷ㸼Ā āˈ ҹҢ 䴶Ϟ ҹⳟ ⱘ Нˈ Ā 乚 ЁⱘLinux㋏㒳āDŽЎњ䰡Ԣ⹀ӊ 䖤㸠 㗫ˈ ϔ㉏CPU 䆒䅵Ё ⍜њ ㅵ⧚ ˄Memory Management Unitˈҹϟㅔ⿄MMU˅ 㛑 DŽ ˈ䖤㸠Ѣ䖭㉏≵ MMUⱘCPUПϞⱘ䛑 ϔѯ ㅔ ⱘ ӏ ㋏㒳ˈ 㗙 ㅔ ⱘ ˈ⫮㟇ḍ ≵ ㋏㒳㗠Ⳉ 䖤㸠 ⫼ DŽ 䖭⾡ ϟˈ㋏㒳 ⊩䖤㸠 ⱘ ⫼ ˈ 㗙 ⥛ Ԣˈ㗠Ϩˈ ⱘ ⫼ 䳔㽕䞡 ˈ 㽕∖ њ㾷⹀ӊ⡍ DŽ䖭ѯ䛑䰏њ ⫼Ѣ䖭㉏CPU ПϞⱘ ѻ ⱘ䗳 DŽ✊㗠ˈ䱣ⴔuClinuxⱘ䆲⫳ˈ䖭ϔ 䛑 њDŽuClinuxҢLinux 2.0/2.4 Ḍ⌒⫳㗠 ˈ⊓㺁њЏ⌕Linuxⱘ㒱 䚼 ⡍ DŽ ϧ䮼䩜 ≵ MMUⱘCPUˈ ϨЎ ㋏㒳 њ䆌 ⱘ DŽ䗖⫼Ѣ≵ 㰮 ㅵ⧚ ˄MMU˅ⱘ ⧚ ˈ՟ ARM7TDMIDŽ 䗮 ⫼Ѣ Flash ⱘ ㋏㒳DŽuClinux Ўњ ≵ MMUⱘ ⧚ 㗠 Linux ⱘ ℷDŽ ⬭њ ㋏㒳ⱘ ⡍ ˈЎ⹀ӊ ⱘ䖤㸠 ⾡ կњ 䆕DŽ GNU䗮⫼ 䆌 䆕˄GNU GPL˅ⱘ 䆕ϟˈ䖤㸠uClinux ㋏㒳ⱘ⫼ ҹՓ⫼ Т ⱘLinux API ˈϡӮ Ў≵ MMU㗠 DŽ⬅ѢuClinux ⱘLinux ⸔Ϟ䖯㸠њ䗖 ⱘ㺕 Ӭ ˈ њϔϾ催 Ӭ ⱘǃҷⷕ㋻ ⱘ Linuxˈ㱑✊ ⱘԧ⿃ ˈuClinux ҡ✊ ⬭њLinuxⱘ ⱘӬ⚍˖〇 ǃ㡃 ⱘ⿏ỡ ǃӬ⾔ⱘ㔥㒰 㛑ǃ ⱘ ⾡ ӊ㋏㒳ⱘ ǃҹ Є ⱘAPIㄝDŽ 7.1ЎuClinuxⱘ DŽ7.1uClinuxⱘBoot Loader˖䋳䋷Linux Ḍⱘ ˈ ⫼Ѣ ㋏㒳䌘⑤ˈ SDRAMDŽ䖭䚼 ҷⷕ⫼Ѣ ゟLinux Ḍ䖤㸠⦃ ҢFlashЁ㺙䕑 ramdiskDŽḌ ˖Linux Ḍⱘ ⚍ start_kernel˄˅ DŽ Ḍⱘ Ҫ䚼 ˈ 㦋ˈIRQ䗮䘧ˈ䇗 ˈ䆒 偅 ˈ 䖳 ⦃ˈ 䞡㽕ⱘ 㛑 forkĀinitā䖯ˈҹ Ͼ ӏ ⦃ DŽ㋏㒳䇗⫼ / 㦋 ˖ 㸠 Āinitā ˈ Ḍ ⌕ϡ Ⳉ ⱘ ˈℸ ˈ ⱘ⫼ҙҙ ⧚ ℹџӊ(՟ ⹀ӊЁ ) Ў㋏㒳䇗⫼ կ䖯DŽ䆒 偅 ˖䆒 偅 њLinux Ḍ 䚼 DŽ Ҫ ㋏㒳ϔḋˈ䆒 偅 Ў Ӏ ⱘ⹀ӊ䆒 ㋏㒳 կ DŽӊ㋏㒳˖Linux 䞡㽕ⱘ⡍ Пϔ ⾡ ӊ㋏㒳ⱘ DŽ䖭⾡⡍ Փ Linux Ҫ ㋏㒳 DŽ ӊ㋏㒳ⱘὖ Փ ⫼ 㛑 ⳟ 䆒 Ϟⱘ ӊ 䏃 㗠 乏㗗㰥 䰙⠽⧚䆒 ⱘ ӊ㋏㒳㉏ DŽLinux䗣 ⱘ 䆌 ϡ ⱘ ӊ㋏㒳ˈ ⾡ 㺙ⱘ ӊ ӊ㋏㒳ҹϔϾ ⱘ㰮 ӊ㋏㒳ⱘ ⦄㒭⫼ DŽϟ䴶ҟ㒡ϔѯ uClinuxⳌ ⱘⶹ䆚DŽ1ǃ MMU(内存管理单元)和VM(虚拟内存)䆌 ⧚ 䛑⬅Ѣ≵ MMU㗠ϡ 㰮 DŽ≵ ㅵ⧚ ⱘ ㅔ њ㢃⠛䆒䅵ˈ䰡Ԣњѻ DŽ⬅Ѣ ⱘ 䆒 ≵ ⺕Ⲭ 㗙 䰤ⱘ ぎ䯈ˈ ҹ 䳔 ⱘ ㅵ⧚ DŽԚ ⬅Ѣ≵ MMUⱘㅵ⧚ˈ ㋏㒳 ぎ䯈 ≵ ⱘˈ 䆓䯂ⱘ 䛑 䰙⠽⧚ DŽԚҢ ㋏㒳ϔ㠀䛑 ⦄ ⾡⡍ 㛑ⱘ㾦 㗗㰥ˈ Ѣ ㅵ⧚ⱘ㽕∖ ҹ⬅ Ҏ 㗗㰥DŽ2、实时性的支持uClinux 䑿 ϡ ˈⳂ ϸ⾡ϡ ⱘ Ḝ կuClinux ⱘ ˈ Ӏ RTLinux(RTL) RTA I(Real Time A pplication Interface)DŽ њ䖭ϸ⾡ ḜˈuClinux ҹ ⫼ 㽕∖䕗催ⱘ DŽ3、平台支持uClinuxⱘ 䫒˖uClinux䗮 ⫼ ⱘGNU 䫒DŽ㒣䖛 ⱘ 䫒 ϔѯ催㑻⡍ ˈ↨ XIP(Execute-In-Place) ˈ ѿ ㄝDŽuClinux 䗖⫼ⱘ ˖uClinux䗖⫼Ѣ 㔫 ⱘColdFire/DragonballˈARM㋏ (՟ Atmel, TI, Samsungㄝ⫳ѻⱘ㢃⠛)ˈIntel i960, Sparc (՟ MMUⱘLEON), NEC v850ˈ⫮㟇 ⱘ 㓐 ( CLPD )ⱘCPUḌˈ↨ OPENcoreDŽ4、与标准Linux的兼容性uClinux䰸њϡ㛑 ⦄fork()㗠 Փ⫼vfork() ˈ ԭuClinuxⱘAPI Ϣ Linux ⱘ Ⳍ DŽ䖭 ϡ ⴔuClinuxϡ㛑 ⦄ 䖯ˈ 䰙ϞuClinux 䖯ㅵ⧚ 䗮䖛vfork() ⦄ⱘˈ 㗙 䖯ҷ ⠊䖯 㸠ˈⳈ 䖯䇗⫼exit() 䗔 ˈ 㗙 䖯䇗⫼exec() 㸠ϔϾ ⱘ䖯DŽ ⱘLinux ⫼ ҢLinux ㋏㒳⿏ỡ uClinux㋏㒳 ˈ Тϡ⫼ ҔМ ⱘ ˈ ҹ 䖒 ϔϾ ⫼ ⱘ㽕∖(՟ ⧚ⱘ䌘⑤Փ⫼)DŽuClibc libc( ⫼Ѣ Linuxⱘ ) њ ЎuClinux կњ Ў㊒ㅔⱘ ⫼ DŽ5、网络的支持uClinux ϔϾ ⱘTCP/IP 䆂ˈ 䖬 䆌 Ҫ㔥㒰 䆂DŽuClinux Ѣ ㋏㒳 䇈 ϔϾ㔥㒰 ⱘ ㋏㒳DŽ6、应用领域uClinux ⊯ ⫼Ѣ ㋏㒳Ёˈ՟ VPN䏃⬅ /䰆☿ ˈ ⫼ 㒜ッˈ 䆂䕀 ˈIP⬉䆱ˈ Ϯ ˈInternet ˈPDA䆒 ㄝDŽuClinux њϔϾ ℹ䅸䆚П ˈ 㽕 䇏㗙ҟ㒡 Ё Ў 䘡Փ⫼ⱘ㓪䆥 GNU GCCDŽ7.2 GNUⱘՓ⫼GCC(gcc)ⱘϡ Փ䆌 Ϯ㓪䆥 䛑Ⳍ 㾕㒠ˈGCC⬅GNU ҎRichard Stallman佪 ˈ GNUⱘ ѻ ˈ⬅ѢUNIX ⱘ催 ⿏ỡ ˈGCC Т ⾡ 㾕ⱘUNIX Ϟ䛑 ˈ Փ Win32/DOSг GCCⱘ⿏ỡDŽ↨ 䇈SUNⱘSolaris ㋏㒳䜡㕂ⱘ㓪䆥 GNUⱘGCCDŽGNU䕃ӊ C㓪䆥 GCCˈC++㓪䆥 G++ˈ∛㓪 ASˈ䫒 LDˈѠ䖯 䕀 (OBJCOPYˈOBJDUMP)ˈ䇗䆩 (GDBˈGDBSERVERˈKGDB) Ѣϡ ⹀ӊ ⱘ DŽ GNU GCC ϟ⫼ ҹՓ⫼⌕㸠ⱘC/C++䇁㿔 ⫼ ˈ⒵䎇⫳ 催 ⥛䖤㸠ҷⷕǃ ⱘ㓪䇁㿔ⱘ⫼ 䳔∖DŽ䖭ѯ 䛑 GPL⠜ ˈӏԩҎ ҹҢ㔥Ϟ㦋 䚼ⱘ⑤ҷⷕˈ 䳔Փ⫼ӏԩ䌍⫼DŽ ѢGNU 䆌 䆕 䆂ⱘ䆺㒚䌘 ˈ䇏㗙 ҹ ⳟGNU㔥キⱘҟ㒡ˈ/home.htmlDŽGNU 䛑 䞛⫼ Ҹ㸠ⱘ ˈ⫼ 䍋 Ⳍ ↨䕗 䲒ˈϡ ѢWindows ㋏㒳ⱘ ⫼ˈԚ GNU ⱘ ⬅Ѣ 䌈䖥㓪䆥 ㋏㒳ⱘ ˈ կњ ⱘ♉⌏ DŽϔ д њⳌ ˈ њ㾷њ㋏㒳䆒䅵ⱘ ⸔ⶹ䆚DŽ䖤㸠ѢLinux ㋏㒳ϟⱘ㞾⬅䕃ӊGNU gcc㓪䆥 ˈϡҙ ҹ㓪䆥Linux ㋏㒳ϟ䖤㸠ⱘ ⫼ ˈ䖬 ҹ㓪䆥Linux Ḍ 䑿ˈ⫮㟇 ҹѸ 㓪䆥ˈ㓪䆥䖤㸠Ѣ CPUϞⱘ DŽ ҹˈ 䖯㸠 ㋏㒳 ⫼ ˈ䖭ѯ њ Ⲟ ⊯ⱘ ⫼DŽ7.2.1 GCC㓪䆥GCC GNU㒘㒛ⱘ 䌍C㓪䆥 ˈLinuxⱘ 㔎ⳕ 㺙ⱘ 䖭⾡DŽ ⌕㸠ⱘ㞾⬅䕃ӊ⑤ҷⷕ 䛑㛑 GCC㓪䆥 ϟ㓪䆥䖤㸠DŽ ҹ GCC㓪䆥 ⱘՓ⫼ 䆎 Ѣ㓪䆥㋏㒳 Ḍ䖬 㞾 ⱘ ⫼ 䛑 ⱘDŽϟ䴶䗮䖛ϔϾ ԧⱘ՟ ˈ д ԩՓ⫼GCC㓪䆥 DŽLinux ㋏㒳Ёˈ ϔϾ⫼ C䇁㿔 ⱘ⑤ 䖯㸠㓪䆥ˈ㽕Փ⫼GNUⱘgcc 㓪䆥 DŽ՟ ϟ䴶ϔϾ䴲 ㅔ ⱘHello⑤ (hello.c)˖/******************************************************** Institute of Automation, Chinese Academy of Sciences* File Name˖hello.c* Description˖introduce how to compile a source file with gccNie* Author˖Xueyuan* Date˖*******************************************************/void main(){printf("Hello the world\n")˗}㽕㓪䆥䖭Ͼ ˈ Ӏ 㽕 Linuxⱘbash ⼎ヺϟ䕧 Ҹ˖$gcc -o hello hello.cgcc 㓪䆥 Ӯ⫳ ϔϾhelloⱘ 㸠 ӊDŽ hello.cⱘ Ⳃ ϟ 㸠./hello ҹⳟ ⱘ䕧 㒧 ˈ Ϟ ĀHello the worldāⱘ ヺІ DŽҸ㸠Ё gcc㸼⼎ ⫼gcc 㓪䆥⑤ ˗-o outputfilename䗝乍㸼⼎㽕∖㓪䆥 ⫳ ӊ Ўoutputfilenameⱘ 㸠 ӊˈ ϡ -o䗝乍ˈ 㔎ⳕ ӊ a.outDŽ 䖭䞠⫳ ӊ Ўhelloⱘ 㸠 ӊˈ㗠hello.c Ӏⱘ⑤ ӊDŽgcc ϔϾ Ⳃ ⱘ DŽgcc ⱘ⫼⊩ ˖gcc [options] file... ˈЁⱘoption ҹ- ⱘ ⾡䗝乍ˈfile Ⳍ ⱘ ӊ DŽ Փ⫼gccⱘ ˈ 乏㽕㒭 㽕ⱘ䗝乍 ӊ DŽgccⱘ Ͼ㓪䆥䖛ˈ 䋼Ϟ ℹ䖯㸠ⱘˈ↣ϔℹ ϔϾ⡍ ⱘ ˈ䖭 ℹ ˖乘 ⧚ˈ㓪䆥ˈ∛㓪 䫒 DŽ ԧ ϔℹˈ ⬅gcc 䴶ⱘ 䗝乍 ӊ㉏ ⱘDŽ⏙Ἦⱘ 㓪䆥 䖲 䞡㽕ⱘDŽ㓪䆥 Փ⫼⑤ ӊ㓪䆥ѻ⫳ ⾡ ⱘⳂ ӊ(object files)DŽ 䖭Ͼ䖛Ёˈ 䚼ⱘヺ ⫼ ≵ 㹿㾷䞞 ˈ✊ ӀՓ⫼䫒 䫒 䖭ѯⳂ ӊ ϔѯ ⱘ ӊˈ ⫳ ϔϾ 㸠 ӊDŽ 䖭Ͼ䖛ЁˈϔϾⳂ ӊЁ ⱘ ӊЁⱘヺ ⱘ ⫼㹿㾷䞞ˈ ϡ㛑㹿㾷䞞ⱘ ⫼ˈϔ㠀 ҹ䫭䇃 ⱘ DŽgcc㓪䆥 䆌 䗝乍ˈԚ Ѣ 䗮⫼ 䇈 㽕ⶹ䘧 Ё ⫼ⱘ Ͼ њDŽ 䖭䞠Ў䇏㗙 Ͼ ⫼ⱘ䗝乍˖-o䗝乍㸼⼎㽕∖㓪䆥 ⫳ ӊ ⱘ 㸠 ӊ˗-c䗝乍㸼⼎ 㽕∖㓪䆥 䖯㸠㓪䆥ˈ㗠ϡ㽕䖯㸠䫒 ˈ⫳ ҹ⑤ ӊⱘ ӊ Ԛ㓔⬅.c .cc .oⱘⳂ ӊ˗-g䗝乍㽕∖㓪䆥 㓪䆥ⱘ կҹ 䖯㸠䇗䆩ⱘ ˗-E䗝乍㸼⼎㓪䆥 ⑤ ӊ 䖯㸠乘 ⧚ ℶˈ㗠ϡ 㓪䆥ˈ∛㓪 䫒 ˗-S䗝乍㸼⼎㓪䆥 䖯㸠㓪䆥ˈ㗠ϡ ∛㓪 䫒 ˗-O䗝乍 㓪䆥 կⱘ㓪䆥Ӭ 䗝乍ˈ 㓪䆥ⱘ Փ⫼䆹䗝乍ˈ ҹՓ⫳ ⱘ 㸠 ӊⱘ 㸠 ⥛ 催˗-Wall䗝乍 ѻ⫳ 䚼ⱘ䄺 DŽԴⱘ⑤ҷⷕЁ ѯ ˈ 㓪䆥ⱘ 㽕䫒 ⹂ ⱘ ˈ↨ ҷⷕЁ њ ѯ ˈ LinuxϟˈЎњՓ⫼ ˈ 乏 䫒 ˈЎℸ㽕 -lm 䗝乍DŽг䆌 䇏㗙Ӯ䯂ˈ 䴶䙷Ͼ՟ Փ⫼printf ⱘ Ўԩ≵ 䫒 ˛ gccЁ Ѣϔѯ ⫼ ⱘ ⦄ˈgcc㓪䆥 Ӯ㞾 䫒 ϔѯ ⫼ ˈ䖭ḋ⫼ ≵ 㽕㞾 њDŽ 㓪䆥 ⱘ 䖬㽕 ⱘ䏃 ˈ䖭Ͼ 㽕⫼ 㓪䆥 ⱘ-L䗝乍 䏃 DŽ↨ 䇈 Ӏ ϔϾ /home/hoyt/mylibϟˈ䖭ḋ Ӏ㓪䆥ⱘ 䖬㽕 Ϟ-L/home/hoyt/mylibDŽ Ѣϔѯ 䇈ˈ≵ 㽕 䏃 DŽ 㽕 Ӏ 䍋㔎ⳕ ⱘ䏃 ϟ ҹњˈgcc 䫒 ⱘ Ӯ㞾 䙷ѯ ⱘDŽGNU㓪䆥 ⫳ ⱘⳂ ӊ㔎ⳕḐ Ўelf(executive linked file)Ḑ ˈ䖭 Linux㋏㒳 䞛⫼ⱘ 㸠䫒 ӊⱘ䗮⫼ ӊḐ DŽelfḐ ⬅㢹 ↉(section)㒘 ˈ ≵ ⡍ ˈ⬅ c⑤ҷⷕ⫳ ⱘⳂ ӊЁ ҹϟ↉˖.text(ℷ ↉) ⱘ Ҹҷⷕˈ.data( ↉) ⱘ ˈ 䞣ˈ ヺІㄝˈ.bss( ↉) ⱘ 䞣 㒘ㄝDŽ䇏㗙㢹 ⶹ䘧 ⱘ䗝乍 ⫼⊩ˈ ҹ ⳟgccⱘ ḷˈ䙷䞠 䆌 䗝乍ⱘ䆺㒚䇈 DŽњ⑤ ӊhello.c ˈ䳔㽕䞡 㓪䆥 ˖$gcc -c hello.c✊ 䞡 䫒 ⫳ ˖$gcc –o hello.oѢ ՟ˈ Ў ϔϾ⑤ ӊˈ ҹ њ⑤ⷕ ˈ䖯㸠䞡 ⱘ㓪䆥䫒 ⱘ䖛 ϡ 㐕⧤ˈԚ ˈ ϔϾ Ё њ㢹 ⱘ⑤ⷕ ӊˈ㗠䖭ѯ⑤ⷕ ӊЁⱘ Ͼ Ͼ 㹿 Ҫ⑤ⷕ ӊ ˈ䙷Мˈ ϔϾ ӊ㹿 ˈ ⱘ䙷ѯ⑤ ӊ䛑㽕䖯㸠䞡 㓪䆥䫒 ˈ 䞣 㗠ⶹⱘDŽ 䖤ⱘ ˈGNU կњՓ䖭Ͼℹ偸 ㅔ ⱘ ˈ ϟ䴶㽕ҟ㒡㒭 ⱘGNU Make DŽ7.2.2 GNU Makemake 䋳䋷Ң乍Ⳃⱘ⑤ҷⷕЁ⫳ 㒜 㸠 ӊ Ҫ䴲⑤ҷⷕ ӊⱘ DŽmake Ҹ 䑿 ⾡ ˖ ǃ Нǃ 䗄 ӊ Ⳃ ӊ DŽ Ў˖make [flags] [macro definitions] [targets]Unix㋏㒳ϟ ԡflags䗝乍 НЎ˖-f file file ӊЎ 䗄 ӊˈ file Ў '-' ヺˈ䙷М 䗄 ӊ 䕧 DŽ ≵ '-f' ˈ ㋏㒳 咬䅸 Ⳃ ϟ Ўmakefile 㗙 ЎMakefileⱘ ӊЎ 䗄 ӊDŽ LinuxЁˈ GNU make Ⳃ Ё ✻GNUmakefileǃmakefileǃMakefileⱘ乎 ㋶ makefile ӊDŽ-i ⬹ Ҹ 㸠䖨 ⱘ 䫭 DŽ-s≝咬 ˈ 㸠П ϡ䕧 Ⳍ ⱘ Ҹ㸠 DŽ-r⽕ℶՓ⫼䱤 㾘 DŽ-n䴲 㸠 ˈ䕧 㸠 ҸˈԚ ϡ 㸠DŽ-t Ⳃ ӊDŽ-q make ḍ Ⳃ ӊ 㒣 䖨 "0" 䴲"0"ⱘ⢊ DŽ-p䕧 Н Ⳃ ӊ 䗄DŽ-d Debug ˈ䕧 ӊ Ẕ⌟ 䯈ⱘ䆺㒚 DŽLinuxϟmake ԡⱘ ⫼䗝乍ϢUnix㋏㒳Ё ϡ ˈϟ䴶 њϡ 䚼 ˖-c dir 䇏 makefile П ⱘⳂ dirDŽ-I dir Ҫ makefile ӊ ˈ ⫼䆹䗝乍 ㋶Ⳃ DŽ-h help ˈ ⼎ ⱘmake䗝乍DŽ-w ⧚ makefile П П ˈ䛑 ⼎ Ⳃ DŽ䗮䖛 Ҹ㸠 Ёⱘtarget ˈ make㽕㓪䆥ⱘⳂ ˈ Ϩ 䆌 Н㓪䆥 ϾⳂ ˈ ✻Ң ⱘ乎 ձ㓪䆥target䗝乍Ё ⱘⳂ ӊDŽ Ҹ㸠Ё≵ Ⳃ ˈ ㋏㒳咬䅸target 䗄 ӊЁϔϾⳂ ӊDŽmake ԩ ⦄ ⑤ҷⷕⱘ 䗮䖛ϔϾ㹿⿄ПЎmakefileⱘ ӊ ⱘˈ ϟ䴶ⱘ 㡖䞠ˈЏ㽕 䇏㗙ҟ㒡ϔϟmakefileⱘⳌ ⶹ䆚DŽ7.2.2.1 makefile 㒧GNU Make ⱘЏ㽕 䇏ϔϾ ӊ makefileDŽmakefile ⫼bash䇁㿔 ⱘˈbash 䇁㿔 BASIC䇁㿔ⱘϔ⾡ Ҹ㾷䞞䇁㿔DŽ䖭Ͼ ӊ䞠Џ㽕 䗄њ ѯⳂ ӊ Ң ѯձ䌪 ӊЁѻ⫳ⱘˈ ⫼ԩ⾡ Ҹ 䖯㸠䖭Ͼѻ⫳䖛ⱘDŽ њ䖭ѯ ˈ make ӮẔ ⺕Ⲭⱘ ӊˈ Ⳃ ӊⱘ ( 䆹 ӊ⫳ ⱘ )㟇 ↨ ⱘϔϾձ䌪 ӊ ⱘ䆱ˈmake Ӯ 㸠Ⳍ ⱘ Ҹˈҹ Ⳃ ӊDŽmakefileϔ㠀㹿⿄Ў“makefile” “Makefile”DŽ䖬 ҹ make ⱘ Ҹ㸠Ё ⱘ ӊ DŽ ≵ ⡍ ⱘ䆱ˈmake Ӯ “makefile” “Makefile”ˈ ҹЎњㅔ 䍋㾕ˈ 䆂䇏㗙Փ⫼䖭ϸ DŽ 㽕Փ⫼ Ҫ ӊЎ makefileˈ ⫼㉏Ԑϟ䴶ⱘ make Ҹ䗝乍 makefile ӊ˖$ make -f makefilenameϔϾ makefile Џ㽕 ϔ㋏ ⱘ㾘 ˈ ϟ˖Ⳃ ӊ : ձ䌪 ӊ(tab䬂) Ҹϔ㸠⿄ПЎ㾘 ˈѠ㸠 㸠㾘 ⱘ Ҹˈ 乏㽕ҹtab䬂 DŽϟ䴶ВϔϾㅔ ⱘmakefileⱘ՟ DŽexecutable : main.o io.ogcc main.o io.o -o executablemain.o : main.cgcc -Wall -O -g -c main.c -o main.oio.o : io.cgcc -Wall -O -g -c io.c -o io.o䖭 ϔϾ ㅔ ⱘ makefileˈmakeҢϔ 㾘 ˈexecutable makefile 㒜㽕⫳ ⱘⳂ ӊDŽ㒭 ⱘ㾘 䇈 executableձ䌪ѢϸϾⳂ ӊmain.o io.oˈ 㽕executable ↨ ձ䌪ⱘ ӊЁⱘӏԩϔϾ ⱘ䆱ˈϟϔ㸠ⱘ Ҹ Ӯ㹿 㸠DŽԚ ˈ Ẕ ӊ main.o io.o ⱘ П ˈ Ӯ ϟ 䙷ѯ main.o io.o ЎⳂ ӊⱘ㾘 DŽmake њ Ѣ main.o ⱘ㾘 ˈ䆹Ⳃ ӊⱘձ䌪 ӊ main.cDŽmakefile 䴶ⱘ ӊЁ гϡ ⫳ 䖭Ͼձ䌪 ӊⱘ㾘 њDŽℸ ˈmake Ẕ ⺕ⲬϞ䖭Ͼձ䌪 ӊⱘ ˈ 䖭Ͼ ӊⱘ ↨main.o ⱘ䆱ˈ䙷М䖭Ͼ㾘 ϟ䴶ⱘ Ҹgcc -c main.c –o main.o Ӯ 㸠ˈҹ ӊ main.o DŽ ḋmake ӊio.o ㉏ԐⱘẔ ˈ ⱘձ䌪 ӊ io.cˈ io.oⱘ ⧚ main.o㉏ԐDŽ⦄ ˈ ϔϾ㾘 ˈ ϸϾ㾘 ЁⱘӏԩϔϾ㹿 㸠ˈ 㒜ⱘⳂ ӊexecutable䛑䳔㽕䞡 ( Ўexecutable ձ䌪ⱘ ЁϔϾ .o ӊ Ӯ↨ )ˈ ℸ䫒 Ҹ Ӯ㹿 㸠DŽњmakefileˈ ӏԩϔϾ⑤ ӊ䖯㸠 ˈ ձ䌪Ѣ䆹 ӊⱘⳂ ӊ䛑Ӯ㹿䞡 㓪䆥( Ў.o ӊձ䌪Ѣ.c ӊ)ˈ䖯㗠 㒜 㸠 ӊӮ㹿䞡 䫒 ( Ў ձ䌪ⱘ.o ӊ㹿 њ)ˈ гϡ⫼ ϔϾϾ њDŽ7.2.2.2㓪 makeǃ Нmakefile 䞠ⱘ ⱘˈϔ㠀䛑Փ⫼ ↡DŽ Ӏ Т ҹҢӏԩ 㹿 ⫼ˈ ҹҷ㸼 ㉏ ˈ՟ ҹ ӊ 㸼ˈ 㸠 ӊ 㓪䆥 ㄝDŽ㽕 НϔϾ ˈ makefileЁˈӏ ϔ㸠ⱘ ϟ䆹 ˈ 䴶䎳ϔϾㄝ ˈㄝ 䴶 㽕䆒 ⱘ䖭Ͼ ⱘ DŽ ҹ 㽕 ⫼ 䆹 ˈՓ⫼ $ ( )ˈ 㗙 ${ }ˈ⊼ ϔ 㽕 㢅 П DŽ Ϟϔ 㡖 Вⱘ՟ ˈ⫼ ⱘ ⊩ˈ ҹ ϟ䴶ⱘ ˖OBJS = main.o io.oCC = gccCFLAGS = -Wall -O -gexecutable: $(OBJS)$(CC) $(OBJS) -o executablemain.o : main.c$(CC) $(CFLAGS) -c main.c -o main.oio.o : io.c$(CC) $(CFLAGS) -c io.c -o io.o䖭ϾmakefileЁ њϝϾ Нˈ ҹ 䖭ѯ Ёⱘ ѯ ⫳ ˈ 㗙 䳔 㽕 ⱘ ˈ Ў㽕∖ⱘ ˈmakefileЁ⫼ 䖭ѯ ⱘ Ӯ㞾 DŽ makeЁ䖬 ϔѯ 㒣 Н ⱘ 䚼 䞣ˈ Ͼ䕗 ⫼ⱘ 䞣 $@ˈ $< ˈ$?ˈ$*, $^ (⊼ ˖䖭ѯ 䞣ϡ䳔㽕 ԣ)DŽ$@ Ў 㾘 ⱘⳂ ӊ ˗$< Ў 㾘 ձ䌪 ӊ 㸼ЁⱘϔϾձ䌪 ӊ˗$? Ў ⱘ ↨ 㾘 ⱘⳂ ӊⱘ ⱘձ䌪 ӊˈ䆹 Փ⫼ 㾘 Ӯ㹿Փ⫼˗$* 㾘 ЁⳂ ӊ ձ䌪 ӊ ѿⱘ ӊ ˈϡ ˗$^ Ў Ͼձ䌪 ӊⱘ 㸼(䰸 њ 䞡 ⱘ ӊ )DŽ⫼䖭ѯ 䞣ˈ ҹ Ϟ䴶ⱘ makefile ˖OBJS = main.o io.oCC = gccCFLAGS = -Wall -O -gexecutable: $(OBJS)$(CC) $^ -o $@main.o : main.c$(CC) $(CFLAGS) –c $< -o $@io.o : io.c$(CC) $(CFLAGS) -c $< -o $@ҹ 䞣 ⫼ Ҫ䆌 ˈ Ӏ ⏋ Փ⫼ⱘ ˈℷ⹂Փ⫼ ˈӮ㒭 㗙 ⱘ DŽ2ǃ䱤 㾘䇋⊼ ˈ Ϟ䴶ⱘ՟ 䞠ˈ Ͼѻ⫳ .o ӊⱘ Ҹ䛑 ҹ.c ӊЎձ䌪 ӊѻ⫳ .o Ⳃ (obj) ӊˈ䖭 ϔϾ ⱘ⫳ Ⳃ ӊⱘℹ偸DŽ ⫳ main.o io.oⱘ㾘 ҢmakefileЁ 䰸ˈmake Ӯ ⱘ䱤 㾘 ˈ✊ Ӯ ϔϾ䗖 ⱘ Ҹ 㸠DŽ 䰙Ϟmake 㒣ⶹ䘧䆹 ԩ⫳ 䖭ѯⳂ ӊˈ Փ⫼ 䞣 CC Ў㓪䆥 ˈ ϨӴ䗦 CFLAGS㒭 C 㓪䆥 (CXXFLAGS⫼Ѣ C++ 㓪䆥 )ˈCPPFLAGS(C乘 ⧚䗝乍)ˈTARGET_ARCH ( Ⳃ ՟ 㗠㿔ˈ䖬ϡ⫼㗗㰥䖭Ͼ )ˈ✊ 䗝乍 -c ˈ 䴶䎳乘 Н $<(ϔϾձ䌪 ӊ )ˈ 乍 -oˈ 䎳乘 Н $@ (Ⳃ ӊ )DŽϔϾ˟㓪䆥ⱘ ԧ Ҹ Ӯ ˖$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@make Ё ⱘ䖭ѯ 㕂ⱘ 䱤 ⱘ㾘 ˈ Нњ ԩҢϡ ⱘձ䌪 ӊ ゟ⡍ ㉏ ⱘⳂ DŽUnix㋏㒳䗮 ϔ⾡ Ѣ ӊ ӊ 㓔ⱘ䱤 㾘 DŽ䖭⾡ 㓔㾘 Нњ ԩ ϔϾ ⡍ ӊ 㓔ⱘ ӊ(՟ .c ӊ)ˈ䕀 Ў ϔ⾡ ӊ 㓔ⱘ ӊ(՟ .o ӊ)˖㋏㒳Ё咬䅸ⱘ ⫼ ӊ НЎ˖.oⳂ ӊ.c C⑤ ӊ.f FORTRAN⑤ ӊ.s∛㓪⑤ ӊ.y Yacc-C⑤䇁⊩.l Lex⑤䇁⊩㗠GNU make 䰸њ 㓔㾘 䖬 ϔ⾡㉏ ⱘ䱤 㾘 㾘 DŽ䖭⾡㾘 䗮⫼ˈ Ў ҹ ⫼ 㾘 Н ⱘձ䌪 㾘 DŽ ⫼ НⳂ ձ䌪 ӊП䯈ⱘ ㋏ˈ՟ ϟ䴶ⱘ 㾘 Нњ ԩ ӏ ϔϾ.c ӊ䕀 Ў ӊ Ⳍ ⱘ.o ӊ˖%.o : %.c$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<3ǃӾⳂ䳔㽕 㒜ѻ⫳ϸϾ ⱘ 㸠 ӊˈԚ䖭ѯ ӊ ⳌѦ⣀ゟⱘˈг 䇈ӏԩϔϾⳂ ӊⱘ䞡 ˈϡӮ ҪⳂ ӊDŽℸ ˈ ҹ䗮䖛Փ⫼ 䇧ⱘӾⳂ 䖒 䖭ϔⳂⱘDŽϔϾӾⳂ ϔϾⳳℷⱘⳂ ӊⱘ ϔ Ѣˈ䖭ϾⳂ ӊ 䑿 ϡ DŽ ℸˈ make Ӯ 䆒 䳔㽕㹿⫳ ˈ make 䆹ӾⳂ ӊⱘ ձ䌪 ӊ䛑 ˈ Ӯ 㸠 ⱘ㾘 䞠ⱘ Ҹ㸠DŽВϔϾㅔ ⱘ՟ ˈ makefile 䕧all : executable1 executable2䖭䞠 executable1 executable2 㒜 ⫳ ⱘϸϾ 㸠 ӊDŽ make 䖭Ͼ 'all' Ў ⱘЏ㽕Ⳃ ˈ↣ 㸠 䛑Ӯ 䆩 'all' DŽԚ ˈ⬅Ѣ䖭㸠㾘 䞠 ≵ Ҹ ⫼ ϔϾ 'all' ⱘ 䰙 ӊϞ(џ Ϟˈ all гϡӮ 䰙⫳ )ˈ ҹ䖭Ͼ㾘 ϡⳳⱘ 'all' ⱘ⢊ DŽ ✊䖭Ͼ ӊ ϡ ˈ ҹ make Ӯ 䆩 all 㾘 ˈ ℸ Ẕ ⱘձ䌪 ӊ executable1, exectable2 䳔㽕 ˈ 䳔㽕ˈ Ӏ ˈҢ㗠䖒 ⫳ ϸϾⳂ ӊⱘⳂⱘDŽӾⳂ makefileЁ ⊯Փ⫼DŽ4ǃmakefile 䞠ⱘ 䎳 ⱘ ⳌԐˈ Փ⫼ⱘ ˈ⫼ϔϾ $ ヺ 䎳 ˈ ˈぎḐ 䎳ϔ㋏ ⬅䗫 䱨ⱘ DŽ՟ ˈ GNU Make 䞠 ϔϾ Ў 'wildcard' ⱘ ˈ ϔϾ ˈ 㛑 ϔ ヺ ⬅ 䗄ⱘ ӊ ˈ ӊ䯈ҹぎḐ䯈䱨DŽ ҹ ϟ䴶 ⼎Փ⫼䖭Ͼ Ҹ˖SOURCES = $(wildcard *.c)䖭ḋӮѻ⫳ϔϾ ҹ '.c' 㒧 ⱘ ӊⱘ 㸼ˈ✊ 䞣 SOURCES 䞠DŽ ✊Դϡ䳔㽕ϔ 㽕 㒧 ϔϾ 䞣DŽϔϾ ⫼ⱘ patsubst (patten substitude, 䜡 ⱘ㓽 ) DŽ 䳔㽕ˏϾ ˖ϔϾ ϔϾ䳔㽕 䜡ⱘ ˈѠϾ㸼⼎⫼ҔМ ˈϝϾ ϔϾ䳔㽕㹿 ⧚ⱘ⬅ぎḐ 䱨ⱘ DŽ՟ ˈ ⧚䙷Ͼ㒣䖛Ϟ䴶 Н ⱘ 䞣ˈOBJS = $(patsubst %.c,%.o,$(SOURCES))䖭Ͼ䇁 ⧚ SOURCES Ёⱘ ӊ 㓔 '.c'ⱘ ӊˈ⫼ '.o' '.c' ҷDŽ⊼ 䖭䞠ⱘ % ヺ 䗮䜡ヺˈ 䜡ϔϾ Ͼ ヺˈ ↣ 䜡ⱘ ヺІ ϔϾ‘ ’(stem) DŽ ѠϾ 䞠ˈ%㹿㾷䞞 ⫼ϔ 䜡ⱘ䙷Ͼ DŽ䍷ⱘ䇏㗙 䳔㽕 䖯ϔℹⱘњ㾷ˈ䇋 㗗GNU Make DŽ7.2.2.3 makefileⱘϔϾ ԧ՟䖭䞠㒭䇏㗙ВϔϾㅔ ⱘmakefileⱘ՟ ˈ䗮䖛 䖭Ͼmakefileⱘ䆆㾷ˈ 䴶ҟ㒡ⱘⳌ ⶹ䆚DŽINCLUDES =-I/home/nie/mysrc/include \-I/home/nie/mysrc/extern/include \-I/home/nie/mysrc/src \-I/home/nie/mysrc/libsrc \-I. \-I..EXT_CC_OPTS = -DEXT_MODECPP_REQ_DEFINES = -DMODEL=tune1 -DRT -DNUMST=2 \-DTID01EQ=1 -DNCSTATES=0 \-DMT=0 -DHAVESTDIORTM_CC_OPTS = -DUSE_RTMODELCFLAGS = -O -gCFLAGS += $(CPP_REQ_DEFINES)CFLAGS += $(EXT_CC_OPTS)CFLAGS +=$(RTM_CC_OPTS)SRCS = tune1.c rt_sim.c rt_nonfinite.c grt_main.c rt_logging.c \ext_svr.c updown.c ext_svr_transport.c ext_work.cOBJS = $(SRCS:.c=.o)RM = rm –fCC = gccLD = gccall: tune1%.o : %.c$(CC) -c -o $@ $(CFLAGS) $(INCLUDES) $<tune1 : $(OBJS)$(LD) -o $@ $(OBJS) -lmclean :$(RM) $(OBJS)䖭ϾmakefileЁ佪 Нњ Ͼ ˖' INCLUDES =-I …'(ⳕ⬹ ҷ㸼-I 䴶ⱘ )ˈ'-I dirname' 㸼⼎ dirname ⱘⳂ ӊⳂ 㸼Ё ˈ 䖯㸠乘 ⧚䖛ЁՓ⫼ⱘ ˗' EXT_CC_OPTS = -DEXT_MODE ' 㸼⼎ Ё Нњ EXT_MODEˈㄝӋѢ ⑤ҷⷕ 䇁 ' #define EXT_MODE ' ˗ϟ ⱘϸϾ НCPP_REQ_DEFINES RTM_CC_OPTS䍋 EXT_CC_OPTS ㉏Ԑⱘ⫼˗'CFLAGS =-O -g ' 㓪䆥 ⱘ㓪䆥䗝乍ˈ㸼⼎ 㓪䆥ⱘ䖛Ё ҷⷕ䖯㸠 Ӭ ˈ ѻ⫳㛑㹿GNU䇗䆩 ( gdb)Փ⫼ⱘ䇗䆩 ˗'CFLAGS += ' 㸼⼎ 䖭Ͼ Н ⱘ ⸔Ϟ ⱘ ˗' SRCS = …'ҷ㸼њ 㽕㓪䆥ⱘ⑤ҷⷕ ӊ 㸼˗' OBJS = $(SRCS:.c=.o)'㸼⼎ SRC ҷ㸼ⱘ ҹ.c㒧 ⱘ ӊ ⫼.o㒧 ⱘ ӊ ˈ 㸼⼎ Ͼ⑤ ӊ ⱘⳂ ӊ ˗' RM = rm –f ' 㸼⼎ 䰸 Ҹˈ-f 䰸䗝乍ˈՓ⫼䆹ヺ ˈ ӊ䖯㸠 䰸 ˈ≵ ⼎˗' CC = gcc '㸼⼎㓪䆥 ⫼gcc˗' LD= gcc' 㸼⼎䫒 Ҹ ⫼gcc˗all clean ϸϾӾⳂ ˈ Փ⫼make Ҹⱘ ˈ ϡ Ⳃ ӊ ˈ ҹ makefile Ё ⦄ⱘϔϾⳂ Ў 㒜Ⳃ ˈ ҹ 䬂 Ҹmakeˈ ӾⳂ all㹿Ў 㒜ⱘⳂ 㗠 㸠ˈ⬅Ѣ䖭Ͼ ӊ ϡ ˈ ҹ make Ӯ 䆩 all 㾘 ˈ ℸ Ẕ ⱘձ䌪 ӊ tune1 䳔㽕 ˈ 䳔㽕ˈ ˈ䖭ḋӾⳂ ϟ䴶ⱘϸ 㾘 Ӯ㹿 㸠ˈҢ㗠⫳ 㸠 ӊtune1DŽ 㽕 㸠 䰸 Ҹˈ 䳔㽕䬂 Ҹmake cleanˈ Ӯ ҹ.o㒧 ⱘЁ䯈 ӊ 䰸DŽˈ䇋䇏㗙⊼ makefileⱘ՟ Ё ⫼ ' \'ˈ䆹ヺ ⫼Ѣ makefileЁˈ ϔ 䇁 䖛䭓 ˈ ҹ⫼' \' 䖭 䇁 ⱘ 䖍⬠ˈ䗮䖛 䔺 㸠ˈՓϟ䴶 ϔ㸠ⱘ䇁 Ў䆹䇁 ⱘ㓁㸠DŽmakefile ӊЁˈ⫼ヺ ' #'Ў⊼䞞㸠䇁 ⱘ ˈҹ makefile ӊⱘ 䇏 DŽ ՟ 䆒makefile ӊ Ўmakefileˈ ✊г ✻ϾҎⱘ Ҫ ӊ ˈ ӊ ϡ makefileˈMakefileⱘ䆱ˈ ⫼make Ҹ ˈ䇋Փ⫼make –f makefilenameDŽ ℸˈ 䇏㗙㛑 make makefileⱘ Փ⫼DŽ7.2.3Փ⫼GDB䇗䆩䆎 М䌘⏅ⱘ 㓪 ⱘ ˈ䛑ϡ 㛑ϔ Ӯ ˈ 䖤㸠 ˈӮ ⦄䆌䆌 ϡ ⱘ䫭䇃ˈϔ ⳟ ⫼ ϡ ˈ ⱘ ⊩䗮䖛ϔѯ ↉䖯 䚼䖯㸠䇗䆩DŽ䗮 䇗䆩 ⱘ 㛑 ҹϟϔѯ ˈ Ѣ 㗙 䫭䇃 ⱘDŽ1ˊ 䖤㸠 Ͼ䇁 㗙㸼䖒 ⫳њ䫭䇃˛2ˊ 䫭䇃 㸠ϔϾ ⱘ ⦄ⱘˈ䙷М ⱘ ϔ㸠 њ䖭Ͼ ⱘ䇗⫼䇁 ˈ 䇗⫼䆹 ⱘ Ӵ䗦ⱘ ҔМ˛3ˊ 㸠 ˈ ⱘ ϔϾ 䞣 Ў ˛4ˊ Ͼ㸼䖒 㒜䖤㸠ⱘ㒧 Ўԩ ˛䇗䆩 ( ⹂ 䇈 䆹⿄Ўヺ 䇗䆩 )㛑 Ϟ䗄Ⳃ DŽ ϔϾ㛑 䖤㸠 Ҫ ⱘ ⫼ ˈ 䗮 НϞⱘ ⱘ ϔϡ П Ѣˈ䇗䆩 㛑 䖯 ⑤ⷕЁˈ 䆌 㗙䖯㸠䗤㸠 ℹ䖤㸠ˈњ㾷 ҷⷕ 㸠乎 ˈ ↣ 䇁 㸠ⱘ㒧 ˈ ҹ 䖤㸠ⱘ ˈ ⳟ⫮㟇 ӏϔ 䞣 DŽ 䖤㸠 䫭 ˈ Ў 㗙 կ 䖤㸠 ⱘ䆺㒚㒚㡖ˈҢ㗠 䫭ⱘ DŽ Linux㋏㒳Ёˈ ⫼ ⱘ GDB(GNU Degugger)DŽGDB GNU㞾 ⱘ䇗䆩 DŽ7.2.3.1 GDB ⫼ Ҹ㽕 Փ⫼gdbˈ 乏 ⑤ⷕ䖯㸠㓪䆥ⱘ ˈՓ⫼-g㓪䆥䗝乍 ˈ 䗮ⶹ㓪䆥 ˈ 㗙 䖯㸠 䇗䆩DŽ⫼њ-g䗝乍 ˈ 㓪䆥ⱘ Ӯ 䇗䆩 ˈ䖭ѯ䇗䆩 Ⳃ ӊЁˈ 䗄њ↣Ͼ 䞣ⱘ ㉏ ҹ ⑤ⷕ㸠 㸠ҷⷕ 䯈 ㋏ˈgdbℷ 䗮䖛䖭ѯ Փ⑤ⷕ ⷕⳌ 㘨ⱘˈ ⦄њ⑤ⷕ㑻ⱘ䇗䆩DŽЎњՓ⫼gdb䇗䆩ˈ 䳔㽕 Ҹ㸠Ё䕧 gdb filename(filename ⫼gcc㓪䆥⫳ ⱘ 㒜 㸠 ӊ )ˈ䆹䇁 Ϣ䇗䆩 ⱘ DŽ Ϟϔ 㡖Ё Вmakefile՟ 䇈ˈ 䬂 gdb tune1ˈ ϞӮ ⦄[nie@uClinux mysrc]$ gdb tune1GNU gdb Red Hat Linux 7.x (5.0rh-15) (MI_OUT)Copyright 2001 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details.This GDB was configured as "i386-redhat-linux"...(gdb)gdb㱑✊䖤㸠䍋 ˈԚ 㸠 tune1 ≵ 䖤㸠ˈℸ gdb ⼎ヺϟⳈ 䬂 run Ҹ ˈ 㸠 䖤㸠ⱘ 䳔㽕䕧 Ҹ㸠 ˈ gdb ⼎ヺϟ ҹ䖭ḋ䬂 Ҹ˖run command-line-arguments ˈ 䕧 Ҹ˖tune1 command-line-argumentsϔḋˈ њ 㸠 ⱘ䖤㸠DŽˈ Ӏ 㛑 ⚍䇗䆩 ˈ䅽 㸠 ҷⷕ ℶ㒻㓁 㸠ϟ ˈℸ ҹՓ⫼ Ҹbreakˈ䆹 ҸⱘḐ Ўbreak placeˈ䖭䞠place ҹ ҷⷕⱘ㸠 ˈ ˈ⫮㟇 ҹ ⫼break main ˈ䅽 ⚍䆒㕂 ҷⷕϔ 㸠ⱘ ˈ↨ ѢϞ䴶Вⱘ 㸠 ӊ Ўtune1ⱘ՟ ˈ 䇗⫼њϔϾ ЎrtExtModeCheckInitⱘ ˈ 䅽 㸠 䆹 ℶˈ ҹ gdb ⼎ヺϟ䕧 ˖break rtExtModeCheckInitˈℸ Ϟ ⦄ϟ ˖Breakpoint 1 at 0x8049a28: file grt_main.c, line 604.DŽ ✊ˈг ҹՓ⫼㸠 䆒㕂Ё ԡ㕂ˈϞ䴶䆒㕂Ё ⱘ䇁 ҹㄝӋЎbreak 604ˈ ҹ Ϟⳟ Ⳍ ⱘ DŽ䆒㕂њ ⚍ ˈ Ӯ䖤㸠 ⚍ ϟ ˈℸ Ң Ϟ ҹ ㉏Ԑϟ䴶ⱘ ˖Breakpoint 1, main (argc=4, argv=0xbffffb84) at grt_main.c:604604 rtExtModeCheckInit();(gdb)Ͼ ⚍䰸 ˈ ҹ gdb ⼎ヺϟ䕧 Ҹ˖delete Nˈ䖭䞠N㸼⼎ ϾЁ ˈϔϾ䆒㕂ⱘЁ Ў1ˈѠϾ䆒㕂ⱘ Ў2ˈձ㉏ DŽ delete ϡ䎳ӏԩ ˈ 㸼⼎ 䆒㕂ⱘ ⚍䛑 䰸DŽ ⳟⳂ 䆒㕂 ⚍ⱘ ˈ ҹՓ⫼ Ҹinfo breakˈ Ӯ ⼎ ↣ϔϾ䆒㕂ⱘ ⚍ DŽgdb ⼎ヺϟՓ⫼help ҸˈӮ㒭 gdb ҸⱘϔϾㅔⷁ 䗄 Ҹ ㉏DŽ 㗙 䖯 䚼䖯㸠 ℹ䇗䆩ˈgdb կϸ⾡ Ҹկ䗝 ˈstep next Ҹˈϸ㗙ⱘ Ѣstep 㸠↣ϔ 䇁 ˈ 䘛 䇗⫼ˈӮ䏇䕀 䆹 Нⱘ 㸠 㸠ˈ㗠next ϡ䖯 䚼ˈ 䇗⫼䇁 䗮ϔ 䇁 㸠 DŽcontinue Ҹ 㒻㓁䖤㸠 ˈⳈ 䘛 ϟϔϾ ⚍ 㒧 DŽՓ⫼㗙ҙҙ linuxⱘbash ⼎ヺϟ䕧 Ҹgdb ˈ њgdb㗠 ˈℸ ˈ 㽕 䕑 㸠 ӊˈ䳔㽕 gdb ⼎ヺϟ䬂 Ҹ˖file filename(filenameЎ 㸠 ӊ )ˈ⊼ 㸠 ӊⱘ 㗠ϡ ⑤ ӊ DŽ䇗䆩䖛Ёˈ ⳟϔϾ 䞣 ⱘ ˈ ҹ gdb⦃ ϟ䕧 Ҹ˖watch variablename ˈ䖭䞠ⱘvariablename Դ 㾖 ⱘ 䞣 DŽ䖬 ϔϾ ҹ ⼎㸼䖒 ⱘ Ҹprintˈ Փ⫼㾘 Ўprint expressionnameˈ ЁexpressionnameЎ㽕 ⼎ⱘ㸼䖒 DŽ7.2.3.2 GDB ԧ䇗䆩 ՟ϟ䴶䗮䖛Փ⫼ϔϾㅔ ⱘ Փ䇏㗙䖯ϔℹ❳ ⫼gdbⱘ䇗䆩 ⊩DŽ⑤ Ўexample1.cˈҷⷕ ϟ˖/******************************************************** Institute of Automation, Chinese Academy of Sciences* File Name˖example.c* Description˖ introduce how to use gdbNie* Author˖Xueyuan* Date˖*******************************************************/#include <stdio.h>static void display(int i, int *ptr);int main(void){int x = 5;int *xptr = &x;printf("In main():\n");printf(" x is %d and is stored at %p.\n", x, &x);printf(" xptr holds %p and points to %d.\n", xptr, *xptr);display(x, xptr);return 0;}void display(int z, int *zptr){printf("In display():\n");printf(" z is %d and is stored at %p.\n", z, &z);printf(" zptr holds %p and points to %d.\n", zptr, *zptr);}㽕Փ⫼gdb䇗䆩 ˈϔ 㽕 㓪䆥 ˈՓ⫼-g㓪䆥䗝乍ˈҹ⫳ ヺ 㸼( augmented symbol table)ˈ կ䇗䆩 DŽ佪 Փ⫼gcc –g –o example1 example.c ⑤ҷⷕ䖯㸠㓪䆥ˈ䖭ḋ ҹՓ⫼gdbⲥ㾚example1ⱘ 㸠㒚㡖DŽ bash ⼎ヺϟˈ䬂 Ҹ:gdb example1ˈ њ 㸠 ӊexample1 ⱘ䇗䆩ˈ ϞӮ ⦄ϟ䴶ⱘ ˖[nie@uClinux nie]$ gdb example1GNU gdb Red Hat Linux 7.x (5.0rh-15) (MI_OUT)Copyright 2001 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details.This GDB was configured as "i386-redhat-linux"...(gdb)ϔ㸠(gdb) 䖯 gdb䇗䆩Ёⱘ ⼎ヺˈℸ ҹ ⼎ヺϟ䕧 ӏԩ 䬂 ⱘ ҸDŽ⦄ 㽕䖯㸠 ⚍䇗䆩ⱘ䆱ˈ 䳔㽕 ⼎ϔϟ㽕䇗䆩ⱘ⑤ⷕˈҹ ⶹ䘧 Ͼ 䖯㸠 ⚍䆒㕂DŽ gdbϟˈLinux ⫼ 㓪䕥 Ҹviϡ㛑Փ⫼ˈ ҹՓ⫼list Ҹ 㸠 ӊⱘ⑤ҷⷕⱘϔ䚼 ˈЎњ ⑤ҷⷕⱘ 䚼ˈ 㽕 䬂 list Ҹ DŽ ԧ ϟ˖(gdb) list1 #include <stdio.h>2 static void display(int i, int *ptr);34 int main(void) {5 int x = 5;6 int *xptr = &x;7 printf("In main():\n");8 printf(" x is %d and is stored at %p.\n", x, &x);9 printf(" xptr holds %p and points to %d.\n", xptr, *xptr);10 display(x, xptr);(gdb) list11 return 0;12 }1314 void display(int z, int *zptr) {15 printf("In display():\n");16 printf(" z is %d and is stored at %p.\n", z, &z);17 printf(" zptr holds %p and points to %d.\n", zptr, *zptr);18 }(gdb) listLine number 19 out of range; example1.c has 18 lines.(gdb)Ϟ⏙Ἦ ⼎ њ↣ϔϾ䇁 ⱘ ԧ㸠 ˈ↨ ⦄ Ӏ Ѩ㸠䆒㕂 ⚍ˈ ҹ gdb ⼎ヺϟ䕧 Ҹ˖break 5ˈ ҹⳟ ϟ䴶ⱘ ⼎ ˖(gdb) break 5Breakpoint 1 at 0x8048466: file example1.c, line 5.⚍ 㒣䆒㕂 ˈ⦄ 䅽 䖤㸠䍋 ˈ䬂 Ҹrunˈг ҹ䬂 㓽 rˈ Ϟ ⦄ⱘ ϟ˖(gdb) rStarting program: /home/nie/example1Breakpoint 1, main () at example1.c:55 int x = 5;Ϟ䗄 㸼 ˈgdb 㒣 㸠 㸠 ˈⳂ 䖤㸠 example1.c Ёmain() ⱘѨ㸠 ℶˈ Ϩ ⼎ 㽕 㸠ⱘѨ㸠䇁 DŽ⦄ Ӏ䖯㸠 ℹ䇗䆩ⱘ ˈ䕧 Ҹ˖nextˈ 㸼 ℹ 㸠 ⱘ↣ϔ 䇁 ˈ ⫼next Ҹ 㸠 display ˈ ⦄ ϟ ⼎ ˖(gdb) next6 int *xptr = &x;(gdb) next7 printf("In main():\n");(gdb) nextIn main():8 printf(" x is %d and is stored at %p.\n", x, &x);(gdb) nextx is 5 and is stored at 0xbffffb44.9 printf(" xptr holds %p and points to %d.\n", xptr, *xptr);(gdb) nextxptr holds 0xbffffb44 and points to 5.10 display(x, xptr);Ўњ䖯 display 䚼䖯㸠䇗䆩ˈ䕧 Ҹstepˈ ˖(gdb) stepdisplay (z=5, zptr=0xbffffb44) at example1.c:1515 printf("In display():\n");step ҸՓ 㸠䖯 䚼ˈℸ 䆹 䚼ˈ ҹ㒻㓁Փ⫼step Ҹ 㗙 next Ҹ䖯㸠 ℹ 㸠ˈ ϡ ℹ 㸠ˈ㗠 Ⳉ ϔ 㸠 ↩ˈ ҹ䕧 Ҹcontinue DŽ㽕䗔 gdbˈ䇋䬂 Ҹquitˈ ℸ ҡ 䖯㸠ˈgdbӮ䅽Դ⹂䅸 ⳳⱘ㽕䗔 ˈ Ӯ ⦄㉏Ԑϟ䴶ⱘ ⼎ ˖(gdb) quitThe program is running. Exit anyway? (y or n)ϟ'y' 䗔 䇗䆩 ˈ 䑿 㒣䖤㸠 ↩ˈ quit Ҹ䬂 ˈӮⳈ 䗔 gdb,㗠ϡ ⦄ӏԩ ⼎ DŽ✊䰸њՓ⫼gdb䖯㸠 䇗䆩 ˈ ↨䕗ㅔⷁˈ䘏䕥 ↨䕗ㅔ ˈℸ ҹϡ⫼gdbˈ䞛⫼printf䇁 Ё䕧 Ё䯈 䞣ⱘ 䇗䆩 ˈг ϔϾϡ䫭ⱘ䇗䆩 ⊩DŽℸЎℶˈ Ӏ 㒣ҟ㒡њuClinux ㋏㒳ˈGNU ⱘՓ⫼ˈ њ䖭ѯ乘 ⶹ䆚 ˈ Ӏ 䖯 ゴⱘ䞡⚍ њDŽ7.3 ゟuClinux ⦃Ўњ ⦄ ѢuClinuxⱘ ⫼㋏㒳ⱘ ˈ ゟ ϔϾ ⱘuClinux ⦃ 㽕ⱘDŽѢuClinux ㋏㒳ⱘ ⫼ ⦃ ϔ㠀 ⬅Ⳃ ㋏㒳⹀ӊ ЏPC DŽⳂ ⹀ӊ ( кЁ ѢS3C4510Bⱘ )⫼Ѣ䖤㸠 ㋏㒳 ㋏㒳 ⫼䕃ӊˈ㗠Ⳃ ⫼ ⱘ ㋏㒳ⱘ Ḍ㓪䆥ǃ ⫼ ⱘ 䇗䆩 䳔㽕䗮䖛 ЏPC DŽ П䯈ϔ㠀䗮䖛І ˈ ҹ 㔥 ゟ䖲 ㋏DŽ7.3.1 ゟѸ 㓪䆥䗮 ⱘ ㋏㒳ⱘ 䛑 ҹ㺙 LinuxⱘPC Ў Џ 㓪䆥 Ḍ ⫼ ⫼ ⱘˈԚ Ѣ 䭓 Windows ㋏㒳ϟⱘ⫼ 䇈ˈさ✊ Linux⦃ ϟ Ӯ 䇌 ϡ ˈ ℸ к Ѣϡ ⱘ䇏㗙 կњ Џ 㺙 ϡ ㋏㒳 ˈⳌ ⱘѸ 㓪䆥⦃ ゟⱘ ⊩DŽ7.3.1.1ˊЎ 㺙Linuxⱘ Џ ゟѸ 㓪䆥佪 ˈ㽕 Џ Ϟ 㺙 Linux ㋏㒳ˈ RedHat Linux( кՓ⫼ⱘ Redhat 7.2)ˈϔ 㽕⹂ 䅵ㅫ ⱘ㔥 偅 ǃ㔥㒰䗮䆃䜡㕂ℷ ˈ ԩ PC Ϟ 㺙Linux ㋏㒳ⱘ䯂乬ˈ䇋 㗗 䌘 DŽ⬅ѢuClinux ⱘⳌ 䲚 䛑 㞾㞾⬅䕃ӊ㒘㒛ⱘ ⑤ҷⷕˈ ҹ 䕃ӊ ⦃ ゟⱘ ˈ 䕃ӊ䛑 ҹҢ㔥㒰ϞⳈ ϟ䕑㦋 ˈ ϟ ҹ ゟѸ ⦃ DŽ⦄ ҟ㒡ϔϟѸ 㓪䆥ⱘὖ DŽㅔ 䆆ˈѸ 㓪䆥 ϔϾ Ϟ⫳ ҹ ϔϾ Ϟ 㸠ⱘҷⷕDŽ⊼ 䖭䞠ⱘ ˈ 䰙Ϟ ϸϾὖ ˖ԧ㋏㒧 (Architecture)ǃ ㋏㒳(Operating System)DŽ ϔϾԧ㋏㒧 ҹ䖤㸠ϡ ⱘ ㋏㒳˗ ḋˈ ϔϾ ㋏㒳г ҹ ϡ ⱘԧ㋏㒧 Ϟ䖤㸠DŽВ՟ 䇈ˈ Ӏ 䇈ⱘx86 Linux 䰙Ϟ Intel x86ԧ㋏㒧 Linux for x86 ㋏㒳ⱘ㒳⿄˗㗠x86 WinNT 䰙Ϟ Intel x86ԧ㋏㒧 Windows NT for x86 ㋏㒳ⱘㅔ⿄DŽ к ⍝ ⱘⳂ ⹀ӊS3C4510B㗠㿔ˈП ҹՓ⫼Ѹ 㓪䆥 Ў 䆹⹀ӊϞ ⊩ 㺙 Ӏ 䳔ⱘ㓪䆥 ˈ Ѣ Џ ˈ Џ Ϟ 䖤㸠 Ⳃ Ϟⱘ ⫼ 䖯㸠㓪䆥ˈ⫳ Ⳃ Ϟ䖤㸠ⱘҷⷕḐ DŽ䇏㗙 ҹҢ.tw/->download ϟ䕑 䫒˖arm-elf-binutils-2.11-5.i386.rpmˈarm-elf-gcc-2.95.3-2.i386.rpmˈgenromfs-0.5.1-1.i386.rpmⱘ ӊ Џ ϞⱘӏϔⳂ ϟDŽ䬂 ϟ䴶ⱘ Ҹ 㺙rpm ˖$su#rpm –ivh *.rpmRPM(Red Hat Package Manger)䕃ӊ ㅵ⧚ ˈ ⱘ䕃ӊ 㺙 ˈ䕏 ⫼ ϔ DŽRPMⳂ ⱘ 3⾡㉏ ˖x86(i386)ˈSparcҹ Alphaˈ ҹ ⱘҢ ӊ Փ⫼ⱘ DŽ Ⳃ ϟ䕑 ӊ↨ arm-elf-binutils-2.11-5.i386.rpmˈarm-elf-binutils㸼⼎ ӊ ˈ2.11㸼⼎⠜ 㓪 ˈ5㸼⼎ 㸠 ˈг Ⳃ 㒣 㸠ⱘ ˈi386 ℸ䕃ӊ Ў䗖⫼ѢIntel x86ⱘѠ䖯 (binary) ˈг 㒣㓪䆥 Ϩ ҹⳈ 㺙ⱘ䕃ӊ ˈ ⱘĀrpmā㸼⼎䖭 Red HatⱘRPM DŽ↣ϔ⠜ⱘRPM ˈ㢹 ⦄䕃ӊ 䯂乬ˈ䛑Ӯ䞡 䖯㸠patch buildˈ䖭ḋ 㸠 ⱘ䚼 Ӯ 1ˈҹ㸼⼎䆹⠜ ϞϾ⠜ ⱘ DŽ䖭䞠 ⫼ⱘ Ҹrpm –ivhЁˈ-i㸼⼎Installationˈ 㺙 ⱘRPM䕃ӊ ˗-h㸼⼎Hashˈ䆹 㺙 䯈 ⦄”#”ヺ ˈ ⼎Ⳃ ⱘ 㺙䖛ˈ䖭Ͼヺ ϔⳈ 㓁 㺙 ℶ˗-v㸼⼎Verboseˈ ⼎ 㺙 ⱘ䆺㒚 DŽ㟇ℸ Ӏ Ѹ 㓪䆥 㒣 㺙 њ Џ DŽҹ Ӏ ҹ⫼Ѹ 㓪䆥 arm-elf-gcc 㓪䆥 ㋏㒳 Ḍ ⫼ ⫼ њDŽ䇏㗙г ҹҢ㔥キ/pub/uClinux/arm-elf-tools/Ϟϟ䕑 ⱘarme-elf-gcc ˈ 㛮 ӊarm-elf-tools-20030314.shˈ Џ Ϟ 㺙䆹 䫒ˈ 䆹 ӊ Ⳃ ϟˈ䬂 ˖$su#ls –l arm-elf-tools-20030314.sh䆹 Ҹ ⼎ ӊⱘ ⾡ ˈ 䆹㛮 ӊ ⱘϡ 㸠ⱘˈ 䖬䳔㽕䕧 Ҹ˖#chmod 755 arm-elf-tools-20030314.shҹ Ў 㸠 ˈ✊ 䗮䖛䬂 Ҹ:#sh ./arm-elf-tools-20030314.shҹ 㸠䆹 ӊDŽ 㸠 /usr/local/bin/䏃 ϟ gcc, g++, binutils, genromfs, flthdr elf2flt ㄝ ⾡ ⫼ DŽ7.3.1.2Ў 㺙windowsⱘ Џ ゟѸ 㓪䆥䖭䚼 ϧ䮼䩜 䙷ѯ Linux⦃ LinuxЁⱘ ⫼ ϡ❳ ˈ ⫼PCϞ ѢWindowsⱘ ㋏㒳 ㋏㒳ⱘ䇏㗙㗠 ⱘDŽ1. Cygwin䕃ӊҟ㒡Ўњ Windowsϟ ㋏㒳 ⫼ ˈ ҹ Windows⦃ ϟ㺙ϞCygwin 䕃ӊDŽCygwin ϔϾ Windows Ϟ䖤㸠ⱘUnix ⦃ ˈ Cygnus Solutions ⱘ㞾⬅䕃ӊDŽ Ѣ д Unix/Linux ⦃ ˈ 㗙䖯㸠 ѯ⡍⅞ⱘ ˈ Փ⫼GNU 䲚 WindowsϞ䖯㸠 ㋏㒳 ˈ䴲 ⫼DŽCygnus 佪 gccˈgdbㄝ 䖯㸠њ 䖯ˈՓ Ӏ㛑 ⫳ 㾷䞞win32ⱘⳂ ӊDŽ✊ ˈ 䖭ѯ ⿏ỡ windows Ϟ DŽϔ⾡ Ḝ Ѣwin32 API 䖭ѯ ⱘ⑤ҷⷕ䖯㸠 ˈ䖭ḋ ✊䳔㽕 䞣 DŽ ℸˈCygnus䞛 њϔ⾡ϡ ⱘ ⊩üüҪӀ њϔϾ ѿ ( cygwin1.dll)ˈ win32 APIЁ≵ ⱘUnix亢Ḑⱘ䇗⫼( fork,spawn,signals,select,socketsㄝ) 㺙 䞠䴶ˈг 䇈ˈҪӀ Ѣwin32 A PI њϔϾUnix㋏㒳 ⱘ DŽ䖭ḋˈ 㽕 䖭ѯ ⱘ⑤ҷⷕ 䖭Ͼ ѿ 䖲 ϔ䍋ˈ ҹՓ⫼UnixЏ ϞⱘѸ 㓪䆥 ⫳ ҹ Windows Ϟ䖤㸠ⱘ 䲚DŽҹ䖭ѯ⿏ỡ Windows Ϟⱘ Ў ⸔ˈCygnus 䗤ℹ Ҫⱘ ( Тϡ䳔㽕 ⑤ҷⷕ䖯㸠 ˈ 䳔㽕 ҪӀⱘ䜡㕂㛮 )䕃ӊ⿏ỡ WindowsϞ DŽ䖭ḋˈ Windows Ϟ䖤㸠bash ǃ⫼ ˈ 㾝 UnixϞ DŽ ѢCygwin ⦄ⱘ 䆺㒚 䗄ˈ䇋 㗗/cygwin-ug-net/cygwin-ug-net.htmlDŽ2. Cygwin䕃ӊⱘ 㺙㽕 Cygwinⱘ 㺙⠜ ˈ䇋 CygwinⱘЏ义/Ϟϟ䕑 ⱘCygwinˈ 䆹义䴶ⱘ Ϟ㾦 '' Install Cygwin Now ''ˈ⚍ ℸ ˈ Ӯ ϟ䕑ϔϾ setup.exeⱘGUI 㺙 ˈ⫼ 㛑ϟ䕑ϔϾ ⱘCygwinDŽ 7.2 ⼎Ў ⚍ setup.exe ⦄”䗝 㺙㉏ ” 䆱ḚDŽ 䆂䇏㗙 Cygwin Ͼ 㺙 ϟ䕑 ˈ 䖯㸠 㺙↨䕗 ˈ ϟ 䗝 ѠϾ䗝乍ˈㄝ Cygwin ϟ䕑 ˈ 䗝 ϝϾ䗝乍䖯㸠 㺙DŽ7.2䗝 㺙㉏㺙ⱘ 䆂 ϡ㽕 㺙 C:\Ⳃ ϟˈ↨ 㺙 D:\ϟDŽ㺙ⱘ䖛ЁˈӮ䅽⫼ 䗝 㺙 ѯ ˈ䖭ѯ Џ㽕 ⹂ ⦃ ˈ㓪䆥 ㄝˈ ϡ㛑⹂ ԧ䳔㽕 ѯ ⱘ䆱ˈ㗠⹀Ⲭぎ䯈䎇 ⱘ ϟˈ 䗝 䚼 㺙DŽ ⦄ⱘ 䆱Ḛⱘ''All''ⱘ 䖍⚍ ''Default''ˈⳈ ''Install''ˈ ϟ 7.3 ⼎˖7.3䗝 㺙Cygwinⱘ 㺙䖛 䯈↨䕗䭓ˈ䇋䇏㗙㗤 ㄝ DŽ ⦄ ⱘ⬏䴶⚍ Ā ā 䪂П ˈ Ӯ ⾦䩳ⱘ䮾 ˈ ⦄㉏Ԑϟ䴶ⱘ⬏䴶 7.4 ⼎ˈ䖭 㸠Cygwin 㺙 ⱘ㛮 䜡㕂DŽ7.4Cygwin 㺙 㞾 䜡㕂㞾 䜡㕂㒧 ˈ ⦄Cygwin 㺙㒧 ⱘ ⼎ḚDŽḠ䴶ϞӮ ⦄Cygwinⱘ DŽ3. Cygwinϟ⫳ Ѹ 㓪䆥㞾 ⫳ Ѹ 㓪䆥 П ˈ佪 cygwin䖯㸠ϔѯ䆒㕂DŽ 䆒Cygwin 㺙 dⳂ ϟˈ Cygwinに П ˈ䖯 D:\cygwinⳂ ˈ 䖭ϾⳂ ϟˈ ϔϾ ӊ Ўcygwin.batⱘ ⧚ ӊˈ㓪䕥䆹 ӊˈ ϔ㸠 set CYGWIN=title nteaˈ䖭 Ўcygwinⱘ ⧚ ӊ䳔㽕 Unix ӊ㋏㒳 DŽ ↩ ˈ 䗔 DŽ Ḡ䴶ϞⱘCygwin ˈ 咬䅸⫼ Ў WindowsЁⱏ ⱘ⫼ (䖭䞠 Փ⫼ⱘ ㋏㒳 windows 2000professsional)ˈ 7.5 ⼎ⱘ⬠䴶Ёˈ ḍⳂ ( D:\cygwin)ϟ䬂 ˖cd binmv sh.exe sh-original.exeln –s bash.exe sh.exeϞ䗄 ℹⱘ Ў linux㋏㒳 shヺ 䫒 bashˈCygwinϞⱘsh.exe bash.exe ϡ ⱘˈ ℸ 乏⫼bashҷ shDŽҢ㔥キ/pub/uClinux/arm-elf-tools/tools-20030314/Ϟϟ䕑⫳ 䫒ⱘ ⾡⑤ⷕˈḍ 㛮 ӊbuild-uclinux-tools.sh ゟ windowsϟ㓪䆥⫼ ⫼ ⱘѸ 㓪䆥 ˈ⫳ ⱘѸ 㓪䆥 㒜㹿 Ўarm-elf-tools-cygwin-yyyymmdd.tar.gzⱘ ӊˈ ЁyyyyЎ⫳ Ѹ 㓪䆥 ⱘ ˈmmЎ⫳ Ѹ 㓪䆥 ⱘ ӑˈddЎ DŽ䖭䞠ˈ 䇏㗙⊼ ⱘ ⫳ Ѹ 㓪䆥 ⱘ䖛Ёˈ 㛑Ӯ䘛 䫭䇃ˈ䇏㗙 䆹ḍ 㒭 ⱘ 䫭 ˈ䖯㸠Ⳍ ӊⱘ DŽ⬅Ѣд Ϟⱘ ˈlinuxϟⱘ 㓽 ӊϔ㠀䛑 ҹ.tar.gz 㗙.tgz㒧 ⱘˈ㱑✊⫼windowsϟⱘ㾷 䕃ӊ↨ winzip 㗙winrar ҹ㾷 䖭ѯ ӊˈԚ 㤤䇏㗙ϡ㽕⫼䖭ѯ䕃ӊ windowsϟ㾷 ˈ Ў䖭ḋ 㛑Ӯ䗴 ѯ ⱘ϶ DŽк⫳ ⱘѸ 㓪䆥 Ўarm-elf-tools-cygwin-20030502.tar.gzDŽ7.5Cygwin ⦃4. Cygwin⦃ ϟ ゟѸ 㓪䆥ḍⳂ ϟ䬂 ˖tar xvzf arm-elf-tools-cygwin-20030502.tar.gz䖯㸠Ѹ 㓪䆥 ⱘ㾷 ˈ㾷 ↩ /usr/local/bin/Ⳃ ϟ ҹⳟ ⾡GNU DŽ њѸ 㓪䆥 ˈ❳ Windowsⱘ䇏㗙 ҹ Windowsϟ㓪䆥 uClinuxϞ䖤㸠ⱘ ⫼ њDŽ7.3.2 uClinux䩜 ⹀ӊⱘⳂ ˈuClinux 㹿 ⿏ỡ S3C4510B Ҫ ℒARM㢃⠛ϞˈԚ⬅Ѣ ㋏㒳ⱘ䖤㸠 Ϣ ㋏㒳ⱘ⹀ӊ Ⳍ ⱘˈ㗠⹀ӊⱘ䆒䅵 Ӯ ЎՓ⫼ ⱘϡ 㗠 ϛ ˈ ℸˈ uClinux Ḍ⑤ҷⷕЁ ⹀ӊ㋻ Ⳍ ⱘ䚼 䆹䩜 ⡍ ⱘ⹀ӊ 䗖 ⱘ ˈ⬅ѢuClinux Ḍ⑤ҷⷕ ϔ䚼 ⱘ⹀ӊ偅 ˈϡ 㛑ϔϔ Вˈ ℸˈ ѢS3C4510Bⱘ ㋏㒳ⱘ䆒䅵Ϣ䖤㸠Ⳍ ⱘ䚼 ㅔ ⱘҟ㒡ˈ 䇏㗙 DŽuClinux Ḍ⑤ҷⷕЁ S3C4510B⠛ ⡍⅞ 㛑 ҹ ҪⳌ ⹀ӊ ⱘ НԡѢuClinux-Samsung\Linux-2.4.x\include\asm-armnommu\arch-samsung\hardware.h ӊЁˈ Ё Ͼ ⊼ ˖/** define S3C4510b CPU master clock*/#define MHz 1000000#define fMCLK_MHz (50 * MHz)#define fMCLK (fMCLK_MHz / MHz)#define MCLK2 (fMCLK_MHz / 2)ҹϞ Нњ㋏㒳 ⱘЏ 䩳乥⥛Ў50MHzˈ㢹⫼ ㋏㒳ⱘ 乥⥛ϡ ˈ ℸ ˈ㢹І㸠 䞛⫼ 䚼 䩳 ⫼Ѣ⊶⡍⥛⫳ ˈ䆹乥⥛ 䖬ϢІ㸠䗮 ⊶⡍⥛ DŽ/**********************************//* System Memory Control Register *//**********************************/#define DSR0 (2<<0) /* ROM Bank0 */#define DSR1 (0<<2) /* 0: Disable, 1: Byte, 2: Half-Word, 3: Word */ #define DSR2 (0<<4)#define DSR3 (0<<6)#define DSR4 (0<<8)#define DSR5 (0<<10)#define DSD0 (2<<12) /* RAM Bank0 */#define DSD1 (0<<14)#define DSD2 (0<<16)#define DSD3 (0<<18)#define DSX0 (0<<20) /* EXTIO0 */#define DSX1 (0<<22)#define DSX2 (0<<24)#define DSX3 (0<<26)#define rEXTDBWTH (DSR0|DSR1|DSR2|DSR3|DSR4|DSR5 | DSD0|DSD1|DSD2|DSD3 | DSX0|DSX1|DSX2|DSX3)ҹϞ Нњ㋏㒳 ˈ ✻ҹϞ НˈROM/SRAM/FLASH Bank0 НЎ16ԡ ˄џ ϞˈROM/SRAM/FLASH Bank0ⱘ ⬅B0SIZE[1:0]ⱘ⢊ ˅ˈ㗠ROM/SRAM/FLASH Bank1̚ROM/SRAM/FLASH Bank5⽕⫼˗DRAM/SDRAM Bank0 НЎ16ԡ ˈDRAM/SDRAM Bank1̚DRAM/SDRAM Bank3⽕⫼˗ 䚼I/O㒘 䚼⽕⫼˗㢹⫼ ㋏㒳ⱘ ㋏㒳䜡㕂ϡ ˈ ℸ DŽП 䖬 њ Ҫϔѯ ˈ ROM/SRAM/FLASH Bank0 ⱘ䆒㕂ˈFlash 䞣ⱘ䆒㕂ˈDRAM/SDRAM Bank0 ⱘ䆒㕂ˈSDRAM 䞣ⱘ䆒㕂ㄝˈ䖭ѯ䆒㕂 䆹Ϣ⫼ ㋏㒳 DŽ7.3.3㓪䆥uClinux ḌЎ ㋏㒳ⱘḌ ˈuClinux Ḍ䋳䋷ㅵ⧚㋏㒳ⱘ䖯ǃ ǃ䆒 偅 ǃ ӊ㋏㒳 㔥㒰㋏㒳ˈ ⴔ㋏㒳ⱘ ⾡ 㛑DŽuClinux Ḍⱘ⑤ҷⷕ ⱘˈӏԩҎ 㽕䙉 GPLˈ ҹ Ḍ ҹ 㒭ҪҎՓ⫼ˈ ℸˈ 㓪Ҏ ⱘ ϟˈuClinuxⱘ Ḍ⠜ ϡ ˈ ⱘ Ḍ њ ⱘ Ḍⱘ㔎䱋ˈ њ䆌 ⱘ⡍ ˈ⫼ 㞾 ⱘ㋏㒳ЁՓ⫼䖭ѯ ⱘ⡍ ˈ ḍ 㞾 ⱘ㋏㒳䞣䑿 催 ǃ 〇 䴴ⱘ Ḍˈ 䳔㽕䞡 㓪䆥 ḌDŽϔ㠀䇈 ˈ ⱘ Ḍ⠜ Ӯ ⱘ⹀ӊˈ ⱘ䖯ㅵ⧚㛑 ˈ䖤㸠䗳 Ӯ ǃ 〇 ˈ Ϩϔ㠀䛑Ӯ ⠜ Ё ⦄ⱘ㔎䱋ㄝˈ ℸˈ㒣 䗝 㑻 ⱘ㋏㒳 Ḍ 㽕ⱘDŽuClinux Ḍ䞛⫼ ⱘ㒘㒛㒧 ˈ䗮䖛 Ḍ ⱘ ㋏㒳ⱘ 㛑ˈ ℸˈℷ⹂ ⧚ⱘ䆒㕂 Ḍⱘ 㛑 ˈҢ㗠 㓪䆥㋏㒳 䳔 㛑ⱘҷⷕˈӮ ㋏㒳ⱘ䖤㸠䖯㸠 ϟ Ͼ 䴶ⱘӬ ˖ü⫼ ḍ 㞾䑿⹀ӊ㋏㒳ⱘ 䰙 㓪䆥ⱘ Ḍ Ў ⱘҷⷕˈϔ㠀Ӯ㦋 催ⱘ䖤㸠䗳 DŽü⬅Ѣ Ḍҷⷕ ㋏㒳䖤㸠 Ӯ 偏 ˈ ℸˈ ⷁ ⱘ ḌӮ㦋 ⱘ⫼ ぎ䯈DŽü ḌЁϡ 㽕ⱘ 㛑 ˈ ҹ ㋏㒳ⱘⓣ⋲ˈҢ㗠 ㋏㒳ⱘ〇 DŽuClinuxⱘ Ḍ⑤ҷⷕ ҹҢ䆌 㔥キϞ 䌍ϟ䕑ˈ Ḍⱘ ϔ㠀 ϸ⾡ ˈϔ⾡ ⱘ Ḍ⠜ ˈ ⱘ Ḍ⠜ ϔ㠀 .tar.gz ӊˈՓ⫼ 䳔㽕㾷 DŽ ϔ⾡ 䗮䖛ⱘ⠜ 㸹ϕ˄patch˅ˈ䖒 㑻ⱘ DŽ՟ 䞛⫼ⱘ LinuxϟՓ⫼ⱘѸ 㓪䆥 uClinux-Samsung-20020318.tar.gz⑤ⷕ 㞾㔥キ.twDŽuClinuxⱘ Ḍ⑤ҷⷕ ˈ ⫼Ѹ 㓪䆥 ҹ㓪䆥⫳ 䖤㸠 ⹀ӊⳂ ϞⱘuClinux ḌDŽҢ.twϞϟ䕑uClinux Ḍ⑤ҷⷕuClinux-Samsung-20020318.tar.gzˈ Џ ⱘ⫼ Ⳃ DŽ䖤㸠㾷 Ҹ˖tar xzvf uClinux-Samsung-250020318.tar.gz㾷 ↩ ˈ Ӯ ⫼ Ⳃ ϟ⫳ uClinux-SamsungⳂ ˈҹϟ Ҹ䖯 䆹Ⳃ Ё˖$cd uClinux-Samsung1.䬂 Ҹ˖make menuconfigḌ䜡㕂DŽ䆹 Ҹ 㸠 ↩ ⫳ ӊ.configˈ 䖭Ͼ䜡㕂 DŽϟϔ make menuconfigⱘ ѻ⫳ ⱘ.config ӊˈ ⱘ.config㹿 Ў.config.oldDŽℸ Ӯ ⦄㦰 䜡㕂 䆱Ḛˈ㽕∖䖯㸠Ⳃ ⱘ䗝 ˈ 7.6 ⼎ˈ䕧 䔺 ˈ ⦄կ䗝 ⱘ ԧⱘկ ѻ 㸼ˈ 䖭䞠 Ӏ䗝 ˖Samsung/4510Bˈ 7.7 ⼎ˈ ⱘ䗝 Ϟˈ Ӏ䗝 uC-libcˈ Ҫ䗝乍 ϡ⫼ ˈ 䆒㕂 ˈ Ⲭ䗔 DŽ7.6Ⳃ 䜡㕂7.7䗝 䗖ⱘѻ ㉏2ˊ䬂 Ҹ˖make dep䆹 Ҹ⫼Ѣ ձ ㋏DŽ3.䬂 Ҹ˖make clean䆹 Ҹ⏙䰸ҹ 䗴 Ḍ ⫳ ⱘ Ⳃ ӊˈ ӊ ϔѯЈ ӊDŽ4ˊ䬂 Ҹ˖make lib_only䆹 Ҹ㓪䆥 ӊDŽ5ˊ䬂 Ҹ˖make user_only䆹 Ҹ㓪䆥⫼ ⫼ ӊDŽ6ˊ䬂 Ҹ˖make romfs䆹 Ҹ⫳ romfs ӊ㋏㒳DŽ7ˊ䬂 Ҹ˖make image⊼ 䖭ϔℹⱘ 㛑Ӯ ⦄䫭䇃ⱘ ⼎ˈ㉏ԐѢ˖arm-elf-objcopy: /home/nie/uClinux-Samsung/linux-2.4.x/linux: No such file or directorymake[1]: *** [image] Error 1make[1]: Leaving directory `/home/nie/uClinux-Samsung/vendors/Samsung/4510B'make: *** [image] Error 2䖭 Ўϔ㓪䆥 䖬≵ romfs.oˈ ҹ 䫭ˈㄝromfs.o㓪䆥 њҹ ˈ 䖯㸠 Ḍⱘ㓪䆥ˈ ϡӮ ⦄䖭Ͼ䫭䇃 њDŽ ϡ Ḍⱘ㓪䆥ˈ ҹ ϡ ⧚Ӯ䖭Ͼ䫭䇃 DŽ㒻㓁䖯㸠㓪䆥 DŽ8ˊ䬂 Ҹ˖make䗮䖛 ϾⳂ ⱘMakefile ӊ䖯㸠ˈӮ Ⳃ ϟ⫳ ϔ Ⳃ ӊDŽϞ䗄ℹ偸 ˈ њ uClinux⑤ⷕⱘ㓪䆥 DŽ Ͼ㓪䆥䖛㾚䅵ㅫ 䖤㸠䗳 㗠 ˈ 㑺䳔㽕 䩳 DŽ㓪䆥 Ḍⱘ ˈ 䆂 Linux ϟ䖯㸠DŽ7.3.4 Ḍⱘ 䕑䖤㸠Ḍⱘ㓪䆥 П ˈӮ / uClinux-Samsung/imagesⳂ ϟⳟ ϸϾ Ḍ ӊ˖image.ram image.romˈ Ёˈ image.rom⚻ ROM/SRA M/FLA SH Bank0 ⱘFlash Ёˈ ㋏㒳 ԡ Ϟ⬉ ˈ Ḍ㞾㾷 SDRAMˈ 䖤㸠DŽimage.ram Ⳉ ㋏㒳ⱘSDRAMЁ䖤㸠ˈՓ⫼ADS˄ SDT˅䲚 ⦃ ㋏㒳ⱘSDRAM 䍋 Ў0x0 ˈ image.ram䕑 Ң0x8000 ⱘSDRAMЁˈ 䕑 ↩ ˈ PC 䩜 ⱘ Ў0x8000 㸠DŽ⊼ 䆹 Ḍ咬䅸І㸠 COM1Ў䕧 䕧 ˈ⊶⡍⥛Ў19200ˈ8Ͼ ԡˈ1Ͼ ℶԡˈ 偠DŽ7.4 uClinuxϟ ⫼њϞ䗄 ˈϔϾ ⫼ 㒣 њˈ 䖭Ͼ ПϞˈ ҹḍ ϡ 䳔㽕 ⫼њDŽ 7.8 ⼎ЎϔϾ ѢuClinuxⱘ ㋏㒳 Ḛ 㒧 ˈϟ䴶 䇏㗙ҟ㒡 ԩ 㞾 ⱘ ⫼ ⏏ Ⳃ Ϟ䖤㸠DŽ7.8 ѢuClinux ㋏㒳ḚѢuClinux㋏㒳ⱘ ⫼ ⱘ 䗮 Linux Ϟ( к 㒣ҟ㒡њ䗖⫼ѢWindows⦃ ⱘѸ 㓪䆥 ˈ ҹг ҹ Windows )⫼Ѹ 㓪䆥 DŽ⬅ѢuClinux Ў≵ ㅵ⧚ (MMU)ⱘ ⧚ 㗠䆒䅵ⱘˈ њ䕗 ⱘ㊒ㅔˈ ҹ 㛑 ⦄䖭ḋⱘ ˖ Linuxϟ ҹՓ⫼ⱘ ѯ uClinuxϟ ⫼ϡњˈ䖭Ͼ ˈ 䳔㽕⫼ 㓪 Ⳍ ⱘ њDŽ ✊㒱 ⱘ Ӏ䛑䖬 䗮⫼ⱘDŽ䰸ℸҹ ˈ x86⠜ ⱘgcc㓪䆥 ϟ㓪䆥䗮䖛ⱘ䕃ӊˈ䗮 ϡ䳔㽕 ⱘ ҹ⫼ Ӏ ゟⱘѸ 㓪䆥 㓪䆥 ҹ uClinuxϞ䖤㸠ⱘ ӊḐ DŽ ℸ uClinuxϟ䖤㸠ⱘ ˈ Ϟ Linuxϟ䖤㸠ⱘ ϔḋⱘˈ ѢLinuxϟⱘ㓪ˈ䇏㗙 ҹ 㗗 Ҫ 䆺㒚ⱘ䌘 ˈҹϟ ϔϾㅔ ⱘ՟ ˈ 䗄 䖛DŽ㗗㰥ϔϾ Ё ⱘ՟ ˈ ӊ Ўlednxy.cˈ ⑤ҷⷕ ϟ˖/******************************************************** Institute of Automation, Chinese Academy of Sciences* File Name˖lednxy.c* Description˖ timing interrupt* Author˖Xueyuan Nie* Date˖*******************************************************/#include <signal.h>#include <unistd.h>#define IOPMOD (*(volatile unsigned*)0x3ff5000)#define IOPDATA (*(volatile unsigned *)0x3ff5008)。