Linux_ARM_AT&T汇编
- 格式:pdf
- 大小:86.47 KB
- 文档页数:5
利用at命令在Linux中延时执行任务在Linux系统中,at命令是一种用于延时执行任务的工具。
通过at 命令,用户可以在指定的时间点运行特定的命令或脚本,实现任务的自动化处理。
本文将介绍如何使用at命令在Linux中延时执行任务。
一、at命令简介at命令是一种定时执行命令的工具,它可以让用户在指定的时间执行任务。
at命令的基本语法如下:at [-f 文件名] 时间其中,-f选项指定了要执行的命令或脚本文件,时间参数指定了任务执行的时间。
下面我们来详细介绍at命令的使用方法。
二、at命令的使用方法1. 查看当前已有的延时任务我们可以使用以下命令来查看当前已经存在的延时任务:atq2. 创建延时任务要创建一个延时任务,可以使用以下命令:echo "command" | at 时间其中,command是要执行的命令,时间是指定任务执行的时间。
时间的格式可以是绝对时间,例如2021-01-01 12:00:00;也可以相对于当前时间的相对时间,例如now + 2 hours表示2小时后执行。
3. 删除延时任务如果需要删除一个已经创建的延时任务,可以使用如下命令:atrm 任务编号其中,任务编号可以通过atq命令查看得到。
三、示例下面通过一个示例来演示如何使用at命令在Linux中延时执行任务。
假设我们要在2022年1月1日12:00:00执行一个脚本文件/home/user/test.sh。
那么我们可以使用以下命令来创建延时任务:echo "/home/user/test.sh" | at 2022-01-01 12:00:00执行以上命令后,系统会返回一个任务编号,表示任务已经成功创建。
如果需要查看当前已有的延时任务,可以使用以下命令:atq如果要删除刚刚创建的延时任务,可以使用以下命令:atrm 任务编号四、注意事项在使用at命令时,需要注意以下几点:1. at命令需要管理员权限才能使用,如果当前用户没有足够权限,可以使用sudo命令来提升权限。
arm版本linux系统的启动流程ARM架构是一种常见的处理器架构,被广泛应用于嵌入式设备和移动设备中。
在ARM版本的Linux系统中,启动流程是非常重要的,它决定了系统如何从开机到正常运行。
本文将详细介绍ARM版本Linux系统的启动流程。
一、引导加载程序(Bootloader)引导加载程序是系统启动的第一阶段,它位于系统的固化存储器中,比如ROM或Flash。
在ARM版本的Linux系统中,常用的引导加载程序有U-Boot和GRUB等。
引导加载程序的主要功能是加载内核镜像到内存中,并将控制权转交给内核。
二、内核初始化引导加载程序将内核镜像加载到内存后,控制权被转交给内核。
内核初始化是系统启动的第二阶段,它主要完成以下几个步骤:1. 设置异常向量表:ARM架构中,异常是指硬件产生的中断或故障,比如系统调用、中断请求等。
内核需要设置异常向量表,以便正确处理异常。
2. 初始化处理器:内核对处理器进行初始化,包括设置页表、启用缓存、初始化中断控制器等。
3. 启动第一个进程:内核创建第一个用户进程(一般是init进程),并将控制权转交给它。
init进程是系统中所有其他进程的父进程,负责系统的初始化工作。
三、设备树(Device Tree)设备树是ARM版本Linux系统中的一种机制,用于描述硬件设备的相关信息。
在内核初始化过程中,内核会解析设备树,并建立设备树对象,以便后续的设备驱动程序使用。
设备树描述了硬件设备的类型、地址、中断等信息,以及设备之间的连接关系。
它使得内核能够在运行时自动识别和配置硬件设备,大大提高了系统的可移植性和灵活性。
四、启动初始化(Init)启动初始化是系统启动的第三阶段,它是用户空间的第一个进程(init进程)接管系统控制权后的操作。
启动初始化主要完成以下几个任务:1. 挂载根文件系统:启动初始化会挂载根文件系统,使得用户可以访问文件系统中的文件和目录。
2. 加载系统服务:启动初始化会加载并启动系统服务,比如网络服务、日志服务、时间同步服务等。
linuxat命令用法Linux中的at命令是一个用于在指定时间执行一次任务的工具。
它可以帮助用户安排计划任务,并在需要时自动执行。
at命令具有很高的灵活性和可配置性,适用于各种场景,如定时备份数据、定时执行脚本等。
at命令的基本用法是通过指定时间来安排任务的执行。
例如,要在10分钟后执行一个命令,可以使用以下命令格式:```at now + 10 minutes```然后,在提示符后输入要执行的命令,并按Ctrl+D结束输入。
at命令将会在指定时间执行该命令。
at命令还支持其他时间格式。
例如,可以使用小时和分钟来指定执行时间,如下所示:```at 10:30```这将在今天的10:30执行任务。
另外,at命令也支持指定日期和时间的格式。
例如,可以使用以下命令来安排在明天的特定时间执行任务:```at 2pm tomorrow```此外,at命令还支持一些可选的参数,以提供更多的灵活性。
例如,我们可以在at命令后面添加参数-n来指定任务的名称,以便于后续管理和查看。
例如:```at now + 1 hour -n "backup"```这将在1小时后执行任务,并将其命名为"backup"。
除了指定执行时间和命令外,at命令还可以通过其他参数来定制任务的执行环境和配置。
例如,通过使用参数-m,可以指定任务的输出消息将通过电子邮件发送给指定的用户。
总之,通过at命令,我们可以方便地安排计划任务并在指定的时间自动执行。
无论是定时执行脚本、备份数据还是其他类型的定时任务,at命令都是一个强大而灵活的工具。
通过熟练掌握at命令的用法,我们可以提高工作效率并自动化一些重复性的任务。
linux中at的用法Linux中的at命令是一种非常有用的工具,它允许用户在指定的时间执行一次性任务或脚本。
无论是在服务器维护还是个人使用中,at命令提供了一种方便的方式来执行计划任务。
本文将介绍at命令的用法和一些示例。
1. at命令的基本语法通过在终端中输入at命令,可以打开at任务的调度器。
at 命令的基本语法如下:at [时间] [日期]根据需要,at命令要求用户提供任务的执行时间和可选的日期。
时间的格式可以是24小时制或12小时制,日期的格式可以是指定的年份、月份和日期,也可以是指定特定日期的相对值。
2. at命令的参数at命令还提供了一些有用的参数。
下面是一些常用的参数:-m:将任务的输出通过邮件发送给用户-f:在指定的时间执行一个脚本-l:列出当前正在运行的at任务-d:删除一个已计划的任务3. at命令的使用示例以下是at命令在不同场景下的使用示例:3.1 执行一次性任务假设你希望在25分钟后执行一个命令,那么你可以这样做:at now + 25 minutes然后,你可以在新的提示符下输入要执行的命令,按下Ctrl+D结束输入。
命令现在将在25分钟后执行。
3.2 在未来的特定时间执行任务假设你正在规划一个重要的任务,在未来某个特定的日期和时间执行。
你可以使用以下命令:at 18:00 2022-01-01然后,你可以在提示符下输入要执行的命令,按下Ctrl+D 结束输入。
命令现在将在指定的日期和时间执行。
3.3 执行脚本你还可以使用at命令来执行脚本。
假设你有一个名为"script.sh"的脚本文件并且希望在未来的时间执行它:at 09:00 tomorrow -f script.sh这将安排脚本在明天的9点执行。
3.4 发送邮件通知如果你想通过电子邮件接收任务的输出,你可以使用-m 参数。
例如:at 10:30 -m然后,你可以在新的提示符下输入命令,并且任何输出都将通过电子邮件发送给你。
linux下使用at指令Linux下使用at指令引言:在Linux系统中,at指令是一个非常实用的工具,它可以让用户在指定时间运行命令或者脚本,无需等待。
本文将详细介绍at指令的使用方法,帮助读者更好地掌握这一功能。
第一部分:安装at工具at工具在大多数Linux发行版中都预装了,但是如果你的系统没有安装,你可以通过以下命令在终端中安装:sudo apt install at接下来,我们将一步一步地学习如何正确地使用at指令。
第二部分:at指令基本用法1. 使用at指定时间运行命令at指令的最基本用法是在特定的时间运行命令。
我们可以使用以下命令格式来实现:echo "<command>" at <time>这里,`command`是你想要运行的命令,`time`是您希望命令运行的时间。
时间的格式可以是绝对时间(如"12:00 PM")或相对时间(如"+5 minutes"或"+1 hour")。
例如,要在下午3点运行命令"ls -l",可以使用以下命令:echo "ls -l" at 3pm或者,要在5分钟后运行命令"echo Hello World",可以使用以下命令:echo "echo Hello World" at now +5 minutes2. 查看at任务列表可以使用以下命令来查看当前计划的at任务列表:atq该命令将显示所有当前计划但尚未运行的at任务。
3. 取消计划的at任务如果您想取消预定的at任务,可以使用以下命令:atrm <job_number>这里,`job_number`是您想要取消的at任务的编号。
您可以通过atq命令查看到的列表来确定要取消的任务编号。
第三部分:at指令的高级用法除了基本用法外,at指令还提供了一些高级用法,帮助用户更灵活地使用该工具。
嵌入式linux arm时间同步方法嵌入式Linux ARM时间同步方法在嵌入式系统中,时间同步是非常重要的一个功能。
它可以确保系统中各个设备的时间一致,以便于各个模块之间的协同工作。
本文将介绍一些在嵌入式Linux ARM平台上实现时间同步的方法。
一、使用NTP协议进行时间同步NTP(Network Time Protocol)是一种用于同步网络中各个设备时间的协议。
在嵌入式Linux ARM系统中,可以通过安装和配置NTP服务器来实现时间同步。
具体步骤如下:1. 安装NTP服务器软件。
可以通过在终端中执行相应的命令来安装NTP服务器软件,例如在Debian系列系统中可以使用apt-get命令来安装。
2. 配置NTP服务器。
可以通过编辑配置文件/etc/ntp.conf来配置NTP服务器。
在配置文件中,需要指定一些NTP服务器的参数,例如要同步的时间服务器的地址等。
3. 启动NTP服务器。
在配置完成后,可以使用命令启动NTP服务器,例如在Debian系列系统中可以使用service命令来启动。
4. 配置客户端设备。
在每个需要同步时间的客户端设备上,需要配置NTP客户端。
可以通过编辑配置文件/etc/ntp.conf来配置NTP 客户端,指定要同步的时间服务器的地址。
5. 同步时间。
在配置完成后,可以使用命令手动同步时间,或者设置自动同步时间的策略。
一般情况下,NTP客户端会定期向NTP 服务器发送请求,以获取最新的时间信息。
二、使用PPS信号进行时间同步PPS(Pulse Per Second)信号是一种精确的时间信号,可以用于实现高精度的时间同步。
在嵌入式Linux ARM系统中,可以通过配置PPS信号来实现时间同步。
具体步骤如下:1. 配置GPIO引脚。
首先需要选择一个GPIO引脚,将其配置为输入模式,并连接到一个精确的时间源上,例如GPS模块的PPS输出引脚。
2. 配置内核。
在Linux内核中,需要配置相应的驱动程序来接收和处理PPS信号。
linuxarm64启动代码:汇编部分1. 汇编部分主流程1.1 时序图1.2 代码解析1 ENTRY(stext)2/*3 * Kernel startup entry point.4 * ---------------------------5 *6 * The requirements are:7 * MMU = off, D-cache = off, I-cache = on or off,8 * x0 = physical address to the FDT blob.9 *10 * This code is mostly position independent so you call this at11 * __pa(PAGE_OFFSET + TEXT_OFFSET).12 *13 * Note that the callee-saved registers are used for storing variables14 * that are useful before the MMU is enabled. The allocations are described15 * in the entry routines.16*/17 __HEAD1819/*20 * DO NOT MODIFY. Image header expected by Linux boot-loaders.21*/22 b stext // 跳转到内核初始化中23 .long0// reserved24 .quad TEXT_OFFSET // Image load offset from start of RAM25 .quad 0// reserved26 .quad 0// reserved27 .quad 0// reserved28 .quad 0// reserved29 .quad 0// reserved30 .byte0x41// Magic number, "ARM\x64"31 .byte0x5232 .byte0x4d33 .byte0x6434 .word 0// reserved3536 ENTRY(stext)37 mov x21, x0 // x21=FDT,FDT是bootloader传过来的,是DTS的基地址38 bl __calc_phys_offset // 计算物理地址和物理地址和线性地址偏移x24=PHYS_OFFSET, x28=PHYS_OFFSET-PAGE_OFFSET39 bl el2_setup // 从el2模式退回到el1模式40 mrs x22, midr_el1 // 获得cpuid x22=cpuid41 mov x0, x2242 bl lookup_processor_type // 搜索处理器类型,在arch/arm64/kernel/cputable.c中定义43 mov x23, x0 // x23=current cpu_table44 cbz x23, __error_p // invalid processor (x23=0)?45 bl __vet_fdt // 检测FDT是否是8字节对齐,位于物理地址的前512MB之内46 bl __create_page_tables // 创建内核页表,x25=TTBR0, x26=TTBR147/*48 * The following calls CPU specific code in a position independent49 * manner. See arch/arm64/mm/proc.S for details. x23 = base of50 * cpu_info structure selected by lookup_processor_type above.51 * On return, the CPU will be ready for the MMU to be turned on and52 * the TCR will have been set.53*/54 ldr x27, __switch_data // 需要注意这⾥,处理器初始化完成后跳转到__switch_data55// 这时候MMU已经打开56 adr lr, __enable_mmu // 初始化完成以后ret的时候返回到__enable_mmu所在的地址57 ldr x12, [x23, #CPU_INFO_SETUP]58 add x12, x12, x28 // cpu_info的地址转换成物理地址59 br x12 // 初始化处理器60 ENDPROC(stext)。
什么是ARM?什么是嵌入式系统?发布时间: 2008-11-19 来源:电力~电子设计网站作者: kapor 浏览: 2677随着ARM处理器的流行,为了使更多工程师了解ARM傅立叶撰写了系列开发文章,主要解决什么是ARM,ARM在产品项目中的开发流程,LINUX,WINCE,VXWORKS等操作系统在ARM处理器上的应用等内容。
希望对初学者有所帮助。
第一篇、嵌入式系统和ARM开发(傅立叶电子科技ARM技术研发部710065)1.嵌入式系统概述应该肯定地讲我们每一位都已经使用过嵌入式系统有关的产品,嵌入式系统已经深入到我们生活的每一个角落。
他所涉及的领域广泛到我们的想象力能及的任何地方。
嵌入式系统是相对桌面系统来讲的,凡是带有微处理器的专用软硬件系统都可以称为嵌入式系统。
作为系统核心的微处理器又包括三类:微控制器(MCU)、数字信号处理器(DSP)、嵌入式微处理器(MPU)。
嵌入式比较准确一个定义如下:系统以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
嵌入式系统的应用和组成嵌入式系统就是可精简计算机系统,现在一个ARM7的处理器比一个486还要快,可以挂很多设备并且价格很低。
嵌入式技术目的就是在不适宜用工控机的场合替代pc系统,而对于很多场合工控机的很多功能没有用处而用户必须要付出成本,嵌入式系统解决了这个问题,兼顾功能而又节省成本把不需要的设备裁减掉。
嵌入式系统无处不在,他的核心是处理器。
包括单片机也是嵌入式处理器的一种,在实际应用中不同等级的处理器应用方向也不同。
嵌入式微处理器的应用对比表:为什么要用位处理器?随着电子设备日新月异的发展,电子设备功能越来越完备,无论军品、工业品还是民品设计理念都越来越人性化。
很简单的讲,您家里空调、电视、DVD每样设备都单独使用一台遥控器,我们是否能够把他们几合一呢?岂不是更加方便?管理这么一堆设备从软件上来讲肯定是复杂的多了,从硬件方面当然也需要功能更加强大、功耗极低、价格更廉价的处理器来支持,32位的ARM处理器能够轻松完成以上需求。
linux arm的编译命令摘要:1.Linux ARM 编译命令概述2.Linux ARM 编译器的安装3.Linux ARM 编译命令的使用4.编译命令的实例正文:1.Linux ARM 编译命令概述Linux ARM 编译命令是指在Linux 系统下,针对ARM 架构处理器进行编译的命令。
ARM 架构处理器广泛应用于嵌入式系统、移动设备等,因此在Linux 系统中进行ARM 编译是非常常见的任务。
2.Linux ARM 编译器的安装要在Linux 系统中使用ARM 编译器,首先需要安装相应的编译器。
一般情况下,我们可以通过以下命令来安装:```bashsudo apt-get install gcc-arm-linux-gnueabi```其中,`gcc`是GNU 编译器集合,`arm-linux-gnueabi`表示针对ARM 架构的Linux 系统。
安装完成后,您可以在终端中输入`gcc -v`来查看编译器的版本信息。
3.Linux ARM 编译命令的使用安装好编译器后,您可以开始编写源代码文件,例如`test.c`。
编写完成后,通过以下命令编译:```bashgcc -o test test.c```其中,`-o`选项用于指定编译后输出文件的名称,`test`是源代码文件名,`test.c`是源代码文件的扩展名。
编译成功后,您可以在当前目录下找到名为`test`的可执行文件。
4.编译命令的实例下面是一个具体的实例,展示如何使用Linux ARM 编译器编译一个简单的C 语言程序。
假设您有一个名为`hello.c`的源代码文件,内容如下:```c#include <stdio.h>int main() {printf("Hello, ARM!");return 0;}```要编译这个程序,您可以使用以下命令:```bashgcc -o hello hello.c```编译成功后,您将在当前目录下找到一个名为`hello`的可执行文件。
Linux ARM 汇编低层分析第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作 ARM的协处理器等。
初始化完成后就可以跳转到C代码执行。
需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点()上下载有关规范。
一. Linux汇编行结构任何汇编行都是如下结构:[:] [} @ comment[:] [} @ 注释Linux ARM 汇编中,任何以冒号结尾的标识符都被认为是一个标号,而不一定非要在一行的开始。
【例1】定义一个"add"的函数,返回两个参数的和。
.section .text, “x”.global add @ give the symbol add external linkageadd:ADD r0, r0, r1 @ add input argumentsMOV pc, lr @ return from subroutine@ end of program二. Linux 汇编程序中的标号标号只能由a~z,A~Z,0~9,“.”,_等字符组成。
当标号为0~9的数字时为局部标号,局部标号可以重复出现,使用方法如下:? 标号f: 在引用的地方向前的标号? 标号b: 在引用的地方向后的标号【例2】使用局部符号的例子,一段循环程序1:subs r0,r0,#1 @每次循环使r0=r0-1bne 1f @跳转到1标号去执行局部标号代表它所在的地址,因此也可以当作变量或者函数来使用。
三. Linux汇编程序中的分段(1).section伪操作用户可以通过.section伪操作来自定义一个段,格式如下:.section section_name [, "flags"[, %type[,flag_specific_arguments]]]每一个段以段名为开始, 以下一个段名或者文件结尾为结束。
这些段都有缺省的标志(flags),连接器可以识别这些标志。
(与armasm中的AREA相同)。
下面是ELF格式允许的段标志含义a 允许段w 可写段x 执行段【例3】定义段.section .mysection @自定义数据段,段名为“.mysection”.align 2strtemp:.ascii "Temp string \n\0"(2)汇编系统预定义的段名.text @代码段.data @初始化数据段.bss @未初始化数据段.sdata @.sbss @需要注意的是,源程序中.bss段应该在.text之前。
四. 定义入口点汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点。
【例4】定义入口点.section.data.section .bss.section .text.globl _start_start:五. Linux汇编程序中的宏定义格式如下:.macro 宏名参数名列表@伪指令.macro定义一个宏宏体.endm @.endm表示宏结束如果宏使用参数,那么在宏体中使用该参数时添加前缀“\”。
宏定义时的参数还可以使用默认值。
可以使用.exitm伪指令来退出宏。
【例5】宏定义.macro SHIFTLEFT a, b.if \b ”表示不相等,其他的符号如:+、-、*、/、%、、>>、|、&、^、!、==、>=、 {,}分配number_of_bytes字节的数据空间,并填充其值为fill_byte,若未指定该值,缺省填充0。
(与armasm中的SPACE功能相同)(10).word {,} …插入一个32-bit的数据队列。
(与armasm中的DCD功能相同)可以使用.word把标识符作为常量使用例如:Start:valueOfStart:.word Start这样程序的开头Start便被存入了内存变量valueOfStart中。
(11).hword {,} …插入一个16-bit的数据队列。
(与armasm中的DCW相同)八. GNU ARM汇编特殊字符和语法代码行中的注释符号: ‘@’整行注释符号: ‘#’语句分离符号: ‘;’直接操作数前缀: ‘#’或‘$’第二部分 GNU的编译器和调试工具一. 编译工具1.编辑工具介绍GNU 提供的编译工具包括汇编器as、C编译器gcc、C++编译器g++、连接器ld和二进制转换工具objcopy。
基于ARM平台的工具分别为arm- linux-as、arm-linux-gcc、arm-linux-g++、arm-linux-ld和arm-linux- objcopy。
GNU的编译器功能非常强大,共有上百个操作选项,这也是这类工具让初学者头痛的原因。
不过,实际开发中只需要用到有限的几个,大部分可以采用缺省选项。
GNU工具的开发流程如下:编写C、C++语言或汇编源程序,用gcc或g++生成目标文件,编写连接脚本文件,用连接器生成最终目标文件(elf格式),用二进制转换工具生成可下载的二进制代码。
(1)编写C、C++语言或汇编源程序通常汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作ARM的协处理器等。
初始化完成后就可以跳转到C代码执行。
需要注意的是,GNU的汇编器遵循AT&T的汇编语法,读者可以从GNU的站点()上下载有关规范。
汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点(见下文关于连接脚本的说明)。
(2)用gcc或g++生成目标文件如果应用程序包括多个文件,就需要进行分别编译,最后用连接器连接起来。
如笔者的引导程序包括3个文件:init.s(汇编代码、初始化硬件)xmrecever.c(通信模块,采用Xmode协议)和flash.c(Flash擦写模块)。
分别用如下命令生成目标文件: arm-linux-gcc-c-O2-oinit.oinit.s arm-linux-gcc-c-O2-oxmrecever.oxmrecever.c arm-linux-gcc-c-O2-oflash.oflash.c 其中-c命令表示只生成目标代码,不进行连接;-o命令指明目标文件的名称;-O2表示采用二级优化,采用优化后可使生成的代码更短,运行速度更快。
如果项目包含很多文件,则需要编写makefile文件。
关于makefile的内容,请感兴趣的读者参考相关资料。
(3)编写连接脚本文件gcc 等编译器内置有缺省的连接脚本。
如果采用缺省脚本,则生成的目标代码需要操作系统才能加载运行。
为了能在嵌入式系统上直接运行,需要编写自己的连接脚本文件。
编写连接脚本,首先要对目标文件的格式有一定了解。
GNU编译器生成的目标文件缺省为elf格式。
elf文件由若干段(section)组成,如不特殊指明,由C源程序生成的目标代码中包含如下段:.text(正文段)包含程序的指令代码;.data(数据段)包含固定的数据,如常量、字符串;.bss (未初始化数据段)包含未初始化的变量、数组等。
C++源程序生成的目标代码中还包括.fini (析构函数代码)和. init(构造函数代码)等。
连接器的任务就是将多个目标文件的.text、.data和.bss等段连接在一起,而连接脚本文件是告诉连接器从什么地址开始放置这些段。
例如连接文件link.lds为:ENTRY(begin)SECTION{.=0x30000000;.text:{*(.text)}.data:{*(.data)}.bss:{*(.bss)}}其中,ENTRY(begin)指明程序的入口点为begin标号;.=0x00300000指明目标代码的起始地址为0x30000000,这一段地址为 MX1的片内RAM;.text:{*(.text)}表示从0x30000000开始放置所有目标文件的代码段,随后的.data:{* (.data)}表示数据段从代码段的末尾开始,再后是.bss段。
(4)用连接器生成最终目标文件有了连接脚本文件,如下命令可生成最终的目标文件:arm-linux-ld –no stadlib –o bootstrap.elf -Tlink.lds init.o xmrecever.o flash.o其中,ostadlib表示不连接系统的运行库,而是直接从begin入口;-o指明目标文件的名称;-T指明采用的连接脚本文件(也可以使用-Ttext address,address表示执行区地址);最后是需要连接的目标文件列表。
(5)生成二进制代码连接生成的elf文件还不能直接下载执行,通过objcopy工具可生成最终的二进制文件:arm-linux-objcopy –O binary bootstrap.elf bootstrap.bin其中-O binary指定生成为二进制格式文件。
Objcopy还可以生成S格式的文件,只需将参数换成-O srec。
还可以使用-S选项,移除所有的符号信息及重定位信息。
如果想将生成的目标代码反汇编,还可以用objdump工具:arm-linux-objdump -D bootstrap.elf至此,所生成的目标文件就可以直接写入Flash中运行了。
2.Makefile实例example: head.s main.carm-linux-gcc -c -o head.o head.sarm-linux-gcc -c -o main.o main.carm-linux-ld -Tlink.lds head.o ain.o -o example.elfarm-linux-objcopy -O binary -S example_tmp.o examplearm-linux-objdump -D -b binary -m arm example >ttt.s二. 调试工具Linux 下的GNU调试工具主要是gdb、gdbserver和kgdb。
其中gdb和gdbserver可完成对目标板上Linux下应用程序的远程调试。
gdbserver是一个很小的应用程序,运行于目标板上,可监控被调试进程的运行,并通过串口与上位机上的gdb通信。
开发者可以通过上位机的gdb输入命令,控制目标板上进程的运行,查看内存和寄存器的内容。
gdb5.1.1以后的版本加入了对ARM处理器的支持,在初始化时加入- target==arm参数可直接生成基于ARM平台的gdbserver。
gdb工具可以从ftp: ///pub/gnu/gdb/上下载。