RISCV-semi host原理以及实践

news2024/12/23 16:31:58

嵌入式裸机调试需要在有限资源的目标硬件上尽可能挖掘更多的信息,比如打印寄存器等等,但是即便看似很简单的串口打印,在有的情况下也是奢望,针对这种情况,能够有效利用主机资源协同调试的semi-host(半主机)技术应运而生。以下是关于semi-host的简单介绍。

  1. semi-host机制使用在目标处理器(arm,riscv等)上运行代的代码能够与正在运行调试器的主机进行通信,并使用其IO设施。
  2. 这些设施包括键盘,屏幕和磁盘IO.
  3. 嵌入式端使用C库中的函数(printf,scanf)能够使用主机的屏幕和键盘,而无需在目标系统上具备屏幕和键盘。
  4. semi-host最早由ARM在1995年定义,公开了ARM半主机规范,被很多调试器和C库支持,调试器比如jlink(rtti),trace32,以及ICE仿真器等,C库包括newlib,picolibc等。
  5. RISCV基于ARM版本也定义了自己的半主机规范。

semihost工作原理

semihosting=semi+hosting,表明了半主机操作一半在目标设备上执行,另一半在主机上执行,半主机通过一组特殊的软件指令序列来陷入主机,例如ARM的svc指令,RISCV的ebreak指令,这些指令会出发CPU进入异常执行流,在异常执行流中,执行调试代理程序处理异常,这些调试代理程序包括解析半主机命令并实现和主机通信的逻辑实现。

下图表示在不依赖串口的情况下,资源受限的目标平台将调试信息打印到主机的过程。

流程如下:

  • 目标设备上的应用程序调用标准库函数printf.
  • 在库的底层不会将调用重定向到串口,而是准备号要发送的数据后,使用特殊指令ebreak通知调试器。
  • 调试器收到通知后,检测到SEMI-HOST请求,然后执行对应的处理程序,将字符串显示出来。

下图是newlibc中 RISCV架构下触发SEMI-HOST请求的代码,在libgloss/riscv/semihost_syscall.h文件中。

由于CPU没有为semi-host保留异常号,为了将semihost触发的异常和其它异常区分开,在ebreak指令周围添加额外的指令来帮助调试器区分“半主机ebreak"和“常规ebreak".

其它约定包括,半主机调用号通过寄存器a0传递,调用参数的指针地质,通过a1寄存器传递,返回值放在a0中。

规范一共定义了24种类型的半主机调用:

支持半主机的C库
  1. Newlibc,如上截图。
  2. Picolibc,fork from newlibc.但是更轻量。
  3. Arm CMSIS。
QEMU半主机测试环境搭建

测试应用基于picolibc,编译方法如下:

$ sudo apt install gcc-riscv64-unknown-elf meson
$ git clone https://github.com/picolibc/picolibc.git
$ cd picolibc && mkdir build && cd build
$ ../scripts/do-riscv-configure
$ ninja
$ suso ninja install

编译生成了测试用例test/semihost/semihost-exit-extended-failure_rv64imafdc_lp64d, 之后安装

编译RISCV 64 QEMU:

参考博客Qemu在ARM和X86平台上的运行机制初探_papaofdoudou的博客-CSDN博客

这里使用8.0.0的QEMU,编译配置:

$ ./configure --target-list=arm-softmmu,aarch64-softmmu,i386-softmmu,x86_64-softmmu,riscv32-softmmu,riscv64-softmmu,aarch64-linux-user,arm-linux-user,riscv64-linux-user,x86_64-linux-user --audio-drv-list=alsa,sdl,pa --enable-system --enable-user --enable-linux-user --enable-sdl --enable-vnc --enable-virtfs --enable-kvm --enable-fdt --enable-debug --disable-strip --enable-debug-tcg --enable-debug-info --enable-debug --disable-strip --enable-vnc --prefix=/home/zlcao/semihost/install

 

结束

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

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

相关文章

基于YOLACT的目标跟踪算法移植与测试

基于YOLACT的目标跟踪算法移植与测试 一、初始化开发环境(基于x86架构CPU的开发环境中完成) 1.1 初始化开发环境 1.下载SOPHON SDK开发包 #下载SOPHON SDK wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/06/15/16/Release_230501-pub…

大数据就业路线

✨博文作者:烟雨孤舟 💖 喜欢的可以 点赞 收藏 关注哦~~ ✍️ 作者简介: 一个热爱大数据的学习者 ✍️ 笔记简介:作为大数据爱好者,以下是个人总结的学习笔记,如有错误,请多多指教! 数仓&#x…

English Learning - L3 作业打卡 Lesson7 Day46 2023.6.19 周一

English Learning - L3 作业打卡 Lesson7 Day46 2023.6.19 周一 引言🍉句1: If your life were a book and you were the author, how would you want your story to go?成分划分弱读连读语调 🍉句2: That’s the question that changed my life foreve…

ps beta爱国版下载全过程

​前言: 前段时间也是写了一篇ps beta版本下载的全过程呀,当时那篇文章还没有将软件变成永久免费试用,所以ps beta只能进行7天的免费使用,很多朋友可能意犹未尽呀,所以现在继续,将软件变成永久免费使用​。…

步长(stride) | 填充(padding) | 扩长(dilation)

这几个名词中文真的好难翻译,不是大佬就不要造名词了,后面还是老老实实用英文吧!(标题是机翻的 。) stride stride 很好理解,stride 就是卷积核移动的步长。 如下图: stride1 stride2 paddi…

【嘉立创EDA】复合焊盘的引线居中对齐,typc接口引线对齐方法

文章路标👉 文章解决问题主题内容小结文章解决问题 1️⃣ 嘉立创EDA中对齐工具越发完善,但一些特殊的器件引线中,由于对齐属性设置等原因,部分引线无法与焊盘完全居中对齐,影响了线路的表象美观度与里内信号铺面。本文主要讲述如何应用嘉立创EDA的其他技巧将器件引线与…

基於Hadoop HA 在kerberos中配置datax

概要 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 概要 前言一、基於HADOOP HA 搭建datax二、基於HADOOP HA 配置好的datax去配置kerberos1.在datax的配置文件中進行配置2.在shell腳本中加入認證語句 总结 前言…

detrex | 面向detr系列的目标检测开源框架

DETR作为Transformer应用于目标检测领域的开山之作,后续有大量的算法都是在其基础上改进而来,如Deformable-DETR,DAB-DETR,DN-DETR,DINO等。这些模型尽管都是采用DETR的基本架构,但其改进创新却各有千秋&am…

人工智能时代,你知道ai绘画如何使用吗?

在数字时代的今天,人工智能正逐渐渗透到我们生活的方方面面,艺术创作也不例外。ai绘画软件作为一种创新的工具,为艺术爱好者、设计师和创作者提供了崭新的创作方式。但是,对于初次接触这类软件的人来说,可能会感到一些…

EMC学习笔记(四)地的设计

地的设计 1.接地的含义2.接地目的3.基本的接地方式3.1 单点接地3.2 多点接地3.3 浮地3.4 以上各种方式组成的混合接地方式 4.关于接地方式的一般选取原则4.1 单板接地方式 接地是抑制电磁干扰、提高电子设备EMC性能的重要手段之一。正确的接地既能提高产品抑制电磁干扰的能力&a…

静音或取消静音?苹果AirPods17Beta版推出全新功能

近期,苹果的AirPods系列耳机推出了一些新功能,iOS 17 Beta版用户已可解锁尝试。 其中,第一项功能是静音或取消静音,适用于AirPods Pro(第一代和第二代)、AirPods(第三代)和AirPods …

【C++11】右值引用和移动语义 万能引用和完美转发

文章目录 1 右值引用和移动语义1.1 左值引用和右值引用1.2 右值引用的使用场景1.3 新的类功能 2 万能引用与完美转发2.1 万能引用的基本介绍和使用2.2 完美转发2.3 完美转发的实际应用场景 3 可变参数模板3.1基本语法3.2递归函数方式展开参数包3.3逗号表达式展开参数包3.4 可变…

javaee sql注入问题

jsp页面 <% page language"java" contentType"text/html; charsetutf-8"pageEncoding"utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> &…

第三章 GoogLeNet网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

基于Java软件科技公司信息管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

STM32启动模式

M3/M4/M7内核复位后&#xff0c;做的第一件事&#xff1a; 从地址0x00000000处取出堆栈指针MSP的初始值&#xff0c;该值就是栈顶地址。从地址0x00000004处取出程序计数器指针PC的初始值&#xff0c;该值是复位向量。 芯片厂商可能会把0x00000000和0x00000004地址映射到其它的…

ADC(模数转换)详解

ADC&#xff08;模数转换&#xff09;详解 前言ADC的定义ADC简介ADC特性ADC时钟工作模式单通道单次转换练习多通道扫描模式单次转换 前言 在STM32微控制器中&#xff0c;ADC代表模数转换器&#xff08;Analog-to-Digital Converter&#xff09;。ADC是一种用于将模拟信号转换为…

【Linux】程序地址空间?进程地址空间

目录 程序地址空间回顾进程地址空间什么是进程地址空间&#xff1f;进程地址空间与PCB、物理内存、页表和磁盘之间的关系为什么要存在虚拟地址空间&#xff1f;重新理解地址空间 程序地址空间回顾 了解进程的运行&#xff1a; 1 #include <stdio.h>2 #include <unist…

Web安全——HTML基础

HTML 一、对于前端以及后端的认识以及分析二、HTML认知1、网页的组成2、浏览器3、Web标准 三、简单的HTML页面架构四、HTML常见标签1、meta标签2、标题标签3、文本属性4、form表单5、a 标签6、锚文本7、img 标签8、table 表格9、列表标签9.1、无序列表9.2、有序列表 10、框架的…

个人工作总结和计划怎么写

工作总结和计划怎么写1 20__年就快结束&#xff0c;回首年的工作&#xff0c;有硕果累累的喜悦&#xff0c;有与同事协同攻关的艰辛&#xff0c;也有遇到困难和挫折时惆怅&#xff0c;时光过得飞快&#xff0c;不知不觉中&#xff0c;充满希望的_年就伴随着新年伊始即将临近。可…