如何构建裸机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,一经查实,立即删除!

相关文章

bigdicmal除法精度设置_BigDecimal 高精度计算 熟悉扩展,java除法保留小数问题

java保留两位小数问题:方式一:四舍五入double f 111231.5585;BigDecimal b new BigDecimal(f);double f1 b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();保留两位小数---------------------------------------------…

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

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

Unity使用Rider作为默认编辑器

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

群签名和环签名的区别_环签名方案的研究

摘要:信息时代虽然带给我们无限商机与方便,但也充斥着隐患与危险.由于网络容易受到攻击,导致机密信息的泄密,数据被篡改,轻则引发企业,部门工作陷入瘫痪,个人利益受损,重则危及国家安全和社会稳定,因此保证信息安全已经成为关系国计民生的重要问题之一.而数字签名技…

国产自主可控的代码自动生成工具SkyEye

传统的系统开发过程,都是由工程师根据项目需求书来编写代码完成系统的开发,但随着功能的扩充和版本的迭代,系统中庞大的代码量很难确保正确无误,给后期测试和仿真带来了很大的压力和成本,在航空航天、卫星系统、核电等…

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

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

jstack 脚本 自动日志_深入理解jstack日志

Tags : jstack日志发表时间:2019-03-17 23:53:19在分析线上问题时常使用到jstack 命令将当时Java应用程序的线程堆栈dump出来。面对jstack 日志,我们如何查看?首先要清楚线程的状态线程的状态有:new、runnable、running、waiting、…

swagger默认访问路径_swagger 如何配置项目访问路径

boot子模块的pom文件:xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">swagger-parentcom.test.swagger1.0-SNAPSHOT4.0.0warbo…

layui向body添加html_layui 各项配置

第一、如何全部选中table中每一条记录1.首先给table的父类设置一个唯一id *这种方式不推荐,效果比较差,推荐第2种方式再搜索 alias-table div.layui-table-fixed.layui-table-fixed-l下面的i元素var bbcc $(#alias-table div.layui-table-fixed.layui-ta…

国产自主可控的MBSE解决方案和全数字仿真平台(SkyEye)

2020年6月,哈工大、哈工程被美国商务部列入实体清单,禁用MATLAB事件频繁登上热搜,工业软件被称为「卡脖子」技术。 截止到2020年12月,中国已有超过300家企业和机构被列入美国“实体名单”,被列入名单的大部分是从事安全…

iservice封装有哪些方法_总结WebService的一些封装技巧

今天早上起来,想谈谈.NET中的WebService,当然我不想讲什么是WebService,或者怎么用WebService,因为那个大家随便Google一下前100页都能找到答案。今天我想来分享一下我在用WebService中的一些技巧(至少我认为是技巧,还…

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

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

vue 引用网络css_vue如何引用其他组件(css和js)

1.vuejs组件之间的调用components注意:报错Do not use built-in or reserved HTML elements as component id:修改组件的名字,例如不能使用address为组件名字组件名字不要使用内置的或保留HTML元素为组件id,App.vue是一个入口,vue…

国产自主可控的MBSE建模与仿真平台SkyEye

转载: 2020年6月,哈工大、哈工程被美国商务部列入实体清单,禁用MATLAB事件频繁登上热搜,工业软件被称为「卡脖子」技术。 截止到2020年12月,中国已有超过300家企业和机构被列入美国“实体名单”,被列入名…

access求斐波拉契数列_打印目录,斐波那契数列的递归与循环,牧场牛数

实验报告1任务概述(任务说明)1 f(n)f(n-1)f(n-2)f(0)f(1)1,求斐波那契数列第20项,分别用循环和递归的方式,比较时间效率。提示:可以使用c函数clock取出当前系统时间,计算前后各一次,两次相减除以每秒的时钟…

国产自主可控的形式化验证代码自动生成工具ModelCoder可替代Matlab/Sumlink

在安全关键领域,基于模型的软件工程或者软件开发已逐渐进入了我国的装备研制过程中。使用SimuLink或者SCADE等嵌入式软件建模工具对算法或者控制逻辑进行可视化建模,然后生成高可靠的二进制代码逐渐成为了安全关键领域的主流软件开发方式。由我司自主开发…

自主可控的安全关键领域国产工业软件SkyEye

全球制造业正处于新一轮变革的浪潮中,大数据、云计算等新一代信息技术正加速向工业领域融合渗透,工业互联网、工业4.0、智能制造等战略理念不断涌现。传统产业数字化转型升级的需求强烈,工业软件缺乏自主可控成为横亘在我国发展工业4.0道路上…

weblogic中ssrf漏洞修复_Weblogic-SSRF漏洞复现

0x00简介WebLogic是美国Oracle公司出品的一个application server确切的说是一个基于JAVAEE架构的中间件,BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。SSRF简介服务端请求伪造(Server-Side Request Forgery)…

python 字符串unicode编码_python的string与Unicode转换,gbk字符串编码

问题一字串前面少了u。当遇见以下情况。返回字符串为\u82f9\u679c的unicode时候。str1 \u82f9\u679c # 这里没有u,当传入参数不是unicode的时候print str1 # 结果是 : \u82f9\u679cprint u\u82f9\u679c # 结果是 : 苹果解决方法:加上ustr1 \u82f9\u679…

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

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