如何构建裸机hello world目标程序并在SkyEye全数字实时仿真平台上运行及调试?

SkyEye全数字实时仿真平台,简称SkyEye,是一款支持 ARM、TI DSP、PowerPC、X86、SPARC、龙芯、飞腾等多种处理器体系架构的指令级仿真平台。

SkyEye可以部署在桌面计算机上,开发人员可以基于SkyEye提供的已有模型库的组件(如处理器、内存总线、存储器、片上外设、外围总线设备等),通过图形化搭建环境拖拽需要的组件并定制与实际目标机相同的虚拟目标系统。

使运行在真实目标机上的二进制代码可以不加修改直接在虚拟系统中运行,并且可以得到与在真实目标机下相同的执行结果,支持的目标二进制文件主要包括ELF、raw binary、COFF等格式。配合调试器,可以查看到虚拟系统中所有的资源,包括寄存器,存储器和端口系统等。SkyEye支持运行的目标系统软件包括操作系统OS软件和裸机应用程序,今天以经典程序hello world为例介绍下裸机程序如何一步步编译构建成二进制文件并在SkyEye上运行调试,处理器架构采用ARM架构。如何构建裸机hello world目标程序并在SkyEye全数字实时仿真平台上运行及调试?

目标二进制文件构建过程

所需工具:

  1. SkyEye安装包;

  2. linux系统,本人使用ubuntu 14.04;

  3. ARM 交叉编译工具链;

裸机 hello_world.c 程序

首先编写hello world程序,创建hello_world.c文件,编写hello_world函数,如下所示:

void hello_world()
{uart_printf(“hello world!);return ;
}

代码通过调用uart_printf函数输出「hello world」字符串,由于是裸机程序,不能调用库中的printf函数,而是要自己实现输出函数,实现一个最简单的输出字符串的uart_printf函数,如下:

#define UART_TX_ADDR 0x640000
void uart_puts(const char *s)
{while(*s)
{
*(char *)UART_TX_ADDR = *s++;
}return ;
}void uart_printf(char *fmt, …)
{uart_puts(fmt);
}

上述的功能是把uart_printf要输出的字符串中的每个字符写入0x640000这个地址的内存中,这个内存地址所在空间设置的是串口设备的内存映射空间。

至此,hello world C代码完成,但是处理器刚复位时是不会直接执行C代码的,所以在执行逻辑转移到C代码之前,必须正确设置以下内容。

  1. 全局变量

    • 已初始化

    • 未初始化

  2. 只读数据

C语言使用栈来存储本地变量,传递参数,存储返回地址等。所以在将控制权交给C代码之前,栈必须正确设置。

栈在ARM架构中是非常灵活的,因为它完全由软件实现。ARM CPU寄存器R13被用作栈指针,因此,在启动代码中需要将R13设置堆栈的大小。

例如:

ldr sp, =0x1000 //初始化堆栈指针

全局变量

编译C代码时,编译器将初始化的全局变量放在.data段。

C语言保证所有未初始化的全局变量都将初始化为零。当编译C程序时,一个名为.bss的独立段用于放置未初始化变量的描述。在将控件转移到C代码之前,必须将这些变量对应的内存位置初始化为零。

只读数据

GCC将标记为const的全局变量放在一个名为.rodata的独立段中。.rodata还用于存储字符串常量。

通过上述的必须设置的条件,就能创建链接脚本和启动代码。

启动代码

编写启动代码start.S,该裸机程序只是测试验证通过SkyEye可以加载运行目标程序,所以没有设置ARM工作模式和其他CPU寄存器的初始化,只对堆栈指针SP进行了初始化,然后跳转到C代码的入口函数main执行。

.text
.global begin
begin:
LDR SP,=0x1000 //初始化堆栈指针
bl main //跳转到main函数
b . //循环执行该条指令

链接脚本

编写链接脚本hello_world.lds来控制段如何合并以及它们在内存中的位置,如下所示:

.ENTRY(begin) //设置程序入口点
​
SECTIONS {
. = 0x100000; //程序的链接地址是0x100000
. = ALIGN(4) //对当前地址4字节对齐
.text : {
start.o (.text) //CPU上电后,首先执行start.o代码
* (.text);
}
.rodata :
{
* (.rodata);
}
. = ALIGN(4) //对当前地址4字节对齐
.data:
{
*(.data)
}
. = ALIGN(4) //对当前地址4字节对齐
.bss : {
* (.bss);
}
}

构建目标二进制文件使用汇编器as汇编启动代码,如下命令:arm-linux-as -o start.o start.S使用编译器gcc编译hello_world.c,加上-g用于调试,如下命令:

arm-linux-gcc -g -o hello_world.o hello_world.c

使用链接器ld链接生成可执行文件,命令如下:

arm-linux-ld -Thello_world.lds -static -o hello_world start.o hello_world.o

由此hello_world目标二进制文件已经构建成功,通过arm-linux-readelf来查看生成的目标二进制文件信息,如下所示:


也可以编写Makefile来构建和编译工程。

Makefile编写

如下所示:

#beginCC=arm-linux-gccLD=arm-linux-ld​CFLAGS= -c -Wall -g -O1LDFLAGS= -Thello_world.lds -static​all: hello_world​hello_world: start.o hello_world.o​$(LD) $(LDFLAGS) start.o hello_world.o -o hello_world​arm-linux-objdump -xS hello_world > hello_world.s​start.o:start.S$(CC) $(CFLAGS) start.S​hello_world.o:hello_world.c$(CC) $(CFLAGS) hello_world.c​clean:rm -rf *.o hello_world *.s
#end

直接输入make就可以生成hello_world二进制文件。至此,hello_world目标二进制文件已经生成,现在可以基于SkyEye 图形化界面构建虚拟目标系统来运行hello_world程序。

使用SkyEye来运行目标二进制程序

创建新的工程

首先,打开SkyEye界面,点击文件->新建,输入工程名,选择要导入的源码和目标二进制文件即可创建新的工程,工程目录如下:

图形化搭建

双击打开hello_world_testcase.gp打开图形化搭建界面,可以通过先点击所需组件,再点击网格中所要放置位置即可。组件如下图所示:

虚拟目标系统构建

选择单板(通用的base_mach)、CPU(选择ARM926EJS处理器)和内存总线设备memory_space、存储设备RAM和串口设备,如下所示是配置串口设备的内存地址,与上述所说的串口设备的内存映射空间的地址一致。


通过各个模块直接的接口连线来构建整个虚拟目标系统,如下图所示:


至此,虚拟目标系统搭建完成,配置启动脚本后即可加载运行。

启动脚本配置

启动脚本中主要配置要加载的目标二进制文件,如下图所示:


要使用代码覆盖率功能,可以配置使能覆盖率的命令,如下图所示:

加载和运行

点击工程目录,选择菜单栏中的加载图标,当有skyeye term弹窗并没有报错信息,则说明工程加载成功,可以点击运行按钮,如下图所示:

点击运行,可以看到串口有hello world!输出,如下图所示:

到此,整个裸机程序从编译生成目标二进制文件到通过SkyEye构建虚拟目标系统来加载运行目标程序的完整过程结束了。

下面是介绍SkyEye平台提供的代码覆盖率功能和远程GDB调试功能。如何构建裸机hello world目标程序并在SkyEye全数字实时仿真平台上运行及调试?

SkyEye调试和代码覆盖率功能

代码覆盖率功能

首先需要在启动脚本中配置使能代码覆盖率的命令,然后加载运行工程,点击暂停,点击覆盖率统计按钮,即可生成覆盖率统计结果,如下图所示:

支持打开和导出覆盖率报告,覆盖率报告内容如下图所示:

GDB远程调试功能

选中项目后,可以通过工具栏中,或者通过右键「调试」功能,会有调试配置弹窗,配置如下:


选择调试器中的GDB调试器为ARM架构GDB,如下图所示:


点击调试,即可进入调试界面并在设置的begin入口位置停住,可以进行单步和断点和内存查看等操作,如下图所示:

如下图 debug 按钮 是最常用的 debug 按钮。

  1. 表示当前继续执行代码,直到遇到下一个断点,快捷键 F8;

  2. 表示暂停执行;

  3. 表示停止调试;

  4. 表示断开当前远程连接;

  5. 表示进入当前函数内部,一步一步执行,快捷键 F5(step into);

  6. 表示运行下一行代码,执行当前行,但不进入执行细节,快捷键 F6(step over);

  7. 表示退出当前方法,返回到调用层,快捷键为 F7(step return);

  8. 表示进行指令单步调试。

可以进行单步,如下所示:

点击全速执行,点击暂停,会发现停在最后一条跳转指令位置,如下所示:

SkyEye主要功能介绍
如何构建裸机hello world目标程序并在SkyEye全数字实时仿真平台上运行及调试?通过上面的例程讲述了如何构建裸机hello world目标二进制程序并通过SkyEye运行调试的方法,也介绍了SkyEye的调试和代码覆盖率功能,那么,SkyEye还有没有其他的有用的功能协助开发者或测试者进行目标系统软件的验证呢?答案当然是肯定的,下面列举SkyEye一些主要的功能。

  1. 更灵活快速的虚拟目标系统搭建——通过可视化图形界面拖拽虚拟硬件组件快速搭建;

  2. 仿真状态可控性、确定性和重复性–在虚拟系统上运行的二进制文件与实际目标上运行的二进制文件相同,仿真过程可以通过运行、暂停控制、可以随时重复执行,每次运行结果是确定的,可以使用软件复现问题;

  3. 提供GDB源码调试和汇编级调试工具,使开发者更高效的分析和定位问题;

  4. 提供代码覆盖率和生成报告功能,进行源码和目标码的覆盖率分析;

  5. 提供故障注入功能,可以进行内存和IO的故障注入进行测试;

  6. 提供协同仿真工具,支持与其他异构模型协同仿真;

  7. 提供外设建模工具和二次开发API接口,方便用户进行自定义仿真设备的快速构建和二次开发;

  8. 支持外部数据激励功能,可以通过与上位机软件通过虚拟串口、网络等方式建立通信,通过SkyEye构建的虚拟环境与目标系统软件进行数据的交互,完成闭环测试。

  9. 提供Python API接口,可以通过自动化测试脚本构建所需测试环境,例如监视内存地址,监视和修改应用软件全局变量的值;

  10. Docker容器化支持;

  11. 界面提供自动化测试功能,可以选择所需测试用例自动运行并给出测试结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「基于模型的系统工程」的发展历程

节选自《「基于模型的系统工程」的发展历程》,因篇幅有限,完整报告文末领取。 当下,人们热衷于讨论基于计算机的建模、模型、数据库和敏捷设计方法。然而,很少有人会耐心地审视和理解大量的技术创新,这些技术创新和发…

Unity使用Rider作为默认编辑器

01.Edit -> Preferences 02.Externel Tools -> Open by file extension 如果界面选项有Rider直接选择,如果没有选择Browse) 03.选择rider64.exe 04.成功关联

同步数据流语言代码生成工具的研究进展

摘要 同步数据流语言(如Lustre,Signal)近年来在航空、高铁、核电等安全关键领域得到了广泛应用,因此与这类语言相关的开发工具本身的安全性问题受到高度关注.同步数据流语言到串行命令式语言的代码生成工具是此类工具的典型代表(如Scade)。构造代码生成工具的途径可…

一种全数字实时仿真的安全关键领域解决方案

随着科技的发展,系统工程的设计体量逐渐庞大起来,尤其是对于轨道交通、航空航天、核电站等安全关键领域中,如何在复杂度逐年变大的同时保证其安全性和可靠性,是近年来各大公司需要研究的课题。最近比较火热的基于模型的系统工程&a…

应用在核电站DCS系统的代码自动生成工具ModelCoder

对标航空航天领域,核电新型号作为典型复杂系统在未来的发展趋势和任务变得十分明确,即正规化、标准化地应用MBSE从概念设计、初步设计、持续贯穿至详细设计、施工、调试、运维、退役的全生命周期各阶段,开发出符合核工业本身的需求&#xff0…

怎样在电脑上上传图片_电脑上回收站怎样恢复

把桌面上的文件删除,如果想再次找回,只要在电脑的回收站就可以原封不动的把文件找回来。但不小心删除了回收站的信息,怎么办呢?大家遇以这样的情况,也不要太着急,电脑上回收站怎样恢复呢?小编带分享一下解…

基于模型的系统工程设计软件ModelCoder在航空发动机控制设计中的应用

基于模型的系统工程(MBSE)使用数字模型的方式表达描述工程系统的完整生命周期中的需求和设计等活动,以无歧义、模块化等优点快速覆盖了如航空航天、船舶、卫星等相关安全关键领域。在系统工程的初期,系统产生的信息都以文档得形式…

基于模型的系统工程MBSE软件工具(ModelCoder)

我们一直致力于提供给航空航天制造商一套全数字的MBSE建模与仿真优化解决方案——基于模型的系统工程MBSE软件工具(ModelCoder)。我们的仿真验证技术可用于开发高复杂度和高保真度的模型,对飞机发动机,飞机的飞控进行预测性的虚拟…

面向航空航天工业领域的基于模型的仿真验证工具SkyEye

我们一直致力于提供给航空航天制造商一套全数字的优化方案——面向航空航天工业领域的基于模型的仿真验证工具SkyEye。我们的仿真验证技术可用于开发高复杂度和高保真度的模型,对发动机,飞机的飞控进行预测性的虚拟验证和测试。我们能够准确地进行全数字…

高性能高可靠性的全数字嵌入式仿真测试软件SkyEye

随着科技的发展,系统工程的设计体量逐渐庞大起来,尤其是对于轨道交通、航空航天、核电站等安全关键领域中,如何在复杂度逐年变大的同时保证其安全性和可靠性,是近年来各大公司需要研究的课题。最近比较火热的基于模型的系统工程&a…

二元一次函数最值问题_初二上学期,一次函数方案设计最值问题,两类题目解题思路不一样...

方案设计问题在一元一次方程实际问题中有所接触,在一次函数实际应用题中也有。一次函数中的方案设计问题,常与一次函数的性质、不等式(组)、方程组等知识点相结合,这类题目一旦掌握解题方法,难度不是很大。本篇文章主要介绍一次函…

高性能全数字嵌入式仿真测试软件SkyEye支持多达70余种核心

全数字仿真平台作为工业领域不可缺少的重要软件之一,除了可以与MATLAB或者Simulink集成外,还支持哪些优秀的功能?在了解新一代全数字仿真平台SkyEye之前,先来学习一下什么是全数字仿真平台。 什么是全数字仿真平台 全数字仿真平…

SystemC 代码添加和测试方法

1.启动流程 在 code/utils/ 下添加 new_systemc 相关代码,启动流程如下: 2.调用关系 3.地址映射 假设有两个 systemc 设备:device1 和 device2,device1 的内存地址映射区域为 0x20000x2fff,device2 的内存映射区域为 …

支持多达70余种嵌入式核心的嵌入式仿真软件SkyEye

SkyEye 介绍 SkyEye,中文全称天目全数字实时仿真软件,应用软件仿真技术,逼真地模拟出被测软件的物理环境。用图形化方式构建虚拟目标系统,有效降低了硬件工程师和软件工程师之间的沟通成本,软件工程师可以不依赖硬件工…

嵌入式仿真平台SkyEye的覆盖率分析

随着嵌入式系统也越来越复杂,功能迭代越来越多,代码中就可能就会存在部分无用代码,或者在执行过程中无法测试覆盖的分支,这可能就会给软件带来很大的漏洞,严重降低软件的可靠性。因此,需要一个能够动态分析…

access重复数据累计_小程序·云开发之数据库自动备份丨云开发101

小程序云开发之数据库自动备份数据是无价的,我们通常会把重要的业务数据存放在数据库中,并需要对数据库做定时的自动备份工作,防止数据异常丢失,造成无法挽回的损失。小程序云开发提供了方便的云数据库供我们直接使用,…

嵌入式系统实时仿真解决方案SkyEye

SkyEye介绍 SkyEye,中文全称天目全数字实时仿真软件,应用软件仿真技术,逼真地模拟出被测软件的物理环境。用图形化方式构建虚拟目标系统,有效降低了硬件工程师和软件工程师之间的沟通成本,软件工程师可以不依赖硬件工…

read函数头文件 window_of_property_read_string 剖析

前言今天在一个群里面看到的一个朋友提交,说of_property_read_string 这个函数有两个定义,到底是用了哪个呢?所以这篇文章就说下这个函数。函数引用的头文件引用的头文件位置在kernel-4.4includelinuxof.h其中一个是extern int of_property_r…

全数字实时仿真平台SkyEye的同步数据流语言可信编译器的构造

随着计算机控制系统在人们生活中的普及,软件自身的可靠性也越来越受到重视.在航空、高铁、核电及军事等高安全要求领域的软件系统——安全关键系统(safety-critical system,简称SCS)更是受到高度的重视.而随着软件系统的复杂度越来越高,软件系统的安全性保证也变得越来越困难.这…

div html 下边加横线_HTML的组成部分、DIV+CSS布局

HTML的组成部分dtd部分:文档类型说明,声明版本、标准header部分:给机器看的body部分:给人看的CSS控制div显示是一个块级元素。这意味着它的内容自动地开始一个新行。实际上,换行是 固有的唯一格式表现。可以通过 的 cl…