riscv-gcc工具编译firmware进行仿真问题总结

RISCV 交叉编译工具链 RISC-V GCC交叉编译工具根据环境分为好多种。源码工具链编译器的获取可以通过源码自己编译,也可以直接下载编译好的文件。以下是在Ubuntu环境通过源码的方式安装交叉编译器的操作方法,可以参考源码里提供的说明文件。 阅读详情

Q1 riscv裸机编程undefined reference to `_memcpy` :c代码中数组长度超过16,并在定义时做初始化,编译报错问题,

Q2 全局变量初始化问题

Q3 riscv裸机编程undefined reference to `_memcpy` :c代码中字符数组长度超过16,并在定义时做初始化,编译报错问题.

Q4 字符串常量初始化问题。

A.Q1,QQ3两个问题使用gcc三级优化选项解决

B.Q2,Q4两个问题是,反汇编时,objump,只选取了.text段的代码(使用的的是-d,只disassembly了.text段),而应该将.rodata段的也进行反汇编,应该使用-D将所有段进行反汇编。

objdump -d app.elf    //对包含机器指令的段进行反汇编

objdump -D app.elf    //-D 与 -d 类似,但对所有段进行反汇编

Q1.现象c代码中数组长度超过16,并在定义时做初始化,链接时报错undefined reference to `_memcpy`,如果长的字符串也是一样的。

代码:

报错,推测(对编译不是特别了解)是由于数组过程,直接初始化,会使得编译器调用memcpy这个函数(可能是编译器自身做的优化,如果数组长度比较小,那么可以直接赋值,如果长的化,编译器就会优化出来调用这个memcpy这个函数,如果你没有定义就会报错)

但是系统或者工具链里面没有这个函数,所以,编译完成后,在链接时,就会报错(因为链接器找不到这个函数):

如果定义成16长度的数组:

编译结果,汇编代码中会一个个去初始化数组的值。;

所以数组过长,避免这个错误的方式:这里采用的方法是,可以在c代码里面使用循环来初始化。或者使用一个个手动初始化。

Q2.另外全局变量定义后初始化时也不成功。

所以全局变量单独使用了一个函数来做初始化(这是其中一种做法)。

注意更新了一下链接脚本。

比如有如下代码:

func.c编译结果,如下,可以看见全局变量的初始化值被放入了data段(.sdata包含其中):

注意我把链接脚本做了修改,主要修改时是ram段的地址,因为若是原来的地址(见Q4中的链接脚本中的地址段),仿真时访问的是fffffff地址而不是5208000:

但是, 我仿真时没有,并没有读到初始化的值,读到是0,说明全局变量没有被初始化。但是从链接结果来看,全局变量的初始值是放入data段的。

仿真波形如下。可以看到5b000000读出来的值为X,说明并没有被初始化:

Q3.另外长字符串常量也编译不成功(这个和Q1是同一个问题)。

比如代码:

编译结果中可以看到,也是调用memcpy这个函数,所以链接时也会报错:

Q4.字符串常量的另外一个问题:

当我把字符串长度减少,可能是编译觉得不用优化,就没有调用memcpy这个函数。比如下面这个代码:

编译结果,注意这种情况下,没有调用memcpy,并且常量也没有放在rodata段。程序可以正常使用,也可以正常连接:

但是,如果我在一个函数的参数中使用了一个字符串常量.比如:

此时编译结果,会将这printstr("abcd\n")中所使用的字符串常量放在.rodata段:

连接结果的map中显示,的确存在firmware的常量连接到了rodata段(但是我实际去跑代码时这段地址仍然没有被初始化为X态):

rodata段地址,见下面的链接脚本:

波形如下,当去读取0xa000_0000这个rodata地址时,读出来的值是x.

所以没法这样使用字符串常量。

解决:

(一)GCC的三级优化。(解决Q1和Q3)

GNU编译器提供-O选项供程序优化使用:

-O 提供基础级别的优化

-O2 提供更加高级的代码优化,会占用更长的编译时间

-O3 提供最高级的代码优化

-O4 不优化,这是默认值

上面Q1,3这两个问题,会得到解决。编译器不会再调用memcpy函数。

(二)反汇编生成firmware时,只使用了.text段,其他段并没有使用。

如下所示,第31行,-d这个选项只会对对包含机器指令的段进行反汇编

比如Q2这个问题。使用riscv32-bst-elf-objdump -d isp_firmware得到的结果如下,结果中只对.text进行了disassembly。这样在

第35-36句时只会使用生成,.text段相关的地址和数据。

如果使用-D,就会包含所有段的disassembly:

按照-d,生成的最终仿真使用的文件coreisp.elf.txt如下,可以看见最终firmware中并没有5b00_0000地址段(Q2中链接脚本中ram地址段)。

Q4这个问题也是一样的,并没有将rodata段写入到最终firmware中(Q4中rodata段地址是a000_0000开始的)。

需要修改地方,0.对于data段(ram)地址范围也需要修改下。

                        1.makefile的31行改为-D。 这样会把所有段都包含进结果。

                        2.修改脚本od2txt.py脚本从包含的所有段的结果中筛选出需要的段。(除了.text段外还有,比如Q4的rodata段和Q2的.data(其中包含.sdata)段)

                        原来的:

                        

                        修改后的:

                        

修改后例子:

编译之后再使用objdump -D反汇编的得到:

   

然后使用修改后od2txt.py得到下面结果,最后几行是sdata和rodata的值,和代码是对应上的:

仿真波形,haddr依次是a000_0000,1000,5b00_0000,1000:

RISC-V开发与应用学习系列——Windows下make和交叉编译工具GCC安装 为了能够在Windows下的PowerShell中能获得Linux下Make和GCC工具的使用体验,本文将介绍如何在Windows下安装Make工具和交叉编译工具GCC。 阅读详情

相关推荐

基于WSL的RISC-V的GCC交叉工具链搭建

基于WSL的RISC-V的GCC交叉工具链搭建

yueyuanhuaqing的专栏 6921

从零学习开发一个RISC-V操作系统(二)丨GCC编译器和ELF格式

学习开发一个RISC-V的操作系统的学习笔记,在Ubuntu 20.04上开发一个简易的操作系统。本系列持续不定期更新,分享出来和大家一同交流进步。

电子德彪西的博客 2591

Renode实战:STM32固件纯软件硬件仿真与自动化测试

在嵌入式开发中,硬件板卡尚未到位时,软件联调往往被迫停滞,这也成为项目进度的关键瓶颈。纯软件硬件仿真通过指令级模拟与虚拟外设建模,在PC上完整运行固件逻辑,有效解决了板卡成本、并行开发与回归测试三大难题。从CPU指令执行到GPIO、UART等外设行为,虚拟环境能够提供可观测、可控制的运行空间,使驱动开发、RTOS调试、协议栈验证均可在无硬件条件下开展。面向MCU固件场景,Renode以其丰富的外设模型和自动化支持,成为连接开发与验证的桥梁;结合CI流水线,每次代码提交都能自动完成编译、装载、运行与日志断言,

weixin_34174422的博客 347

RISC-V GCC工具链介绍

一、RISC-V GCC工具链种类 RISC-V GCC工具链与普通的GCC工具链基本相同,用户可以遵照开源的riscv-gnu-toolchain项目(请在Github中搜索riscv-gnu-toolchain)中的说明自行生成全套的GCC工具链。 由于GCC工具链支持各种不同的处理器架构,因此不同处理器架构的GCC工具链会有不同的命名。遵循GCC工具链的命名规则,当前RISC-V GCC工具链有如下几个版本: 1、以“riscv64-unknown-linux-gnu-”为前缀的版本,譬如riscv6

耐心的小黑的博客 1万+

别只盯着ARM!用QEMU快速上手RISC-V、MIPS、Xtensa等冷门架构开发

本文介绍了如何利用QEMU快速上手RISC-V、MIPS、Xtensa等冷门架构开发,突破硬件限制构建跨架构开发环境。通过详细的安装配置指南和实战案例,帮助开发者零成本体验这些架构的特性,提升在物联网、网络设备等领域的开发能力。

weixin_30512089的博客 382

嵌入式工程师必须手写Makefile的四大硬核理由

Makefile是嵌入式构建系统的底层契约,其核心在于显式定义源码依赖、交叉编译工具链、头文件搜索路径与目标平台约束。它支撑着ARM Cortex-M、RISC-V等异构芯片的可移植构建,保障CI/CD流水线、产线刷机脚本及资源受限设备(如512KB Flash、64MB RAM)上的稳定编译。相比IDE自动生成方案,手写Makefile能精准控制-O2优化、-I路径优先级、自动.d依赖生成和build目录隔离,是实现多平台(STM32/RK3399/全志H6)、多配置(debug/release)和裸机/

axfcjwkbi259888707的博客 433

如何快速构建RISC-V微控制器上的Micropython payload:完整编译与运行指南

在嵌入式开发领域,**RISC-V微控制器开发**正变得越来越流行。rvc项目是一个创新的32位RISC-V仿真器,支持在C语言和HLSL着色器中运行,为开发者提供了在虚拟环境中测试和运行RISC-V代码的完整解决方案。本文将详细介绍如何在rvc项目中**编译和运行Micropython payload**,让您能够轻松地在RISC-V仿真环境中运行Python代码。 ## 📋 项目概述与核心

gitblog_00079的博客 456

硬核硬件协作新范式:从稚晖君‘摇人’看开源工程化实践

硬件开发正经历从单点创作到模块化协作的范式升级,其核心在于工程可交付性与过程可验证性。随着RISC-V生态成熟、开源EDA工具链(如KiCad)和CI/CD在硬件领域的深度落地,开发者得以构建具备环境一致性、公差可控性、协议确定性与文档结构化的闭环系统。这种演进不仅提升了机器人、工业控制器等场景的迭代效率,更催生了以GitHub为载体、以PR和Workflow为契约的新型协作基础设施。稚晖君‘摇人’现象背后,实则是国产硬科技领域对‘可复现设计’‘可计量能力’‘可追溯集成’三大技术价值的集体共识——它既是开源

liudaoru - 悟 778

嵌入式开发工具链怎么选?从交叉编译到CI的完整实践指南

在嵌入式软件开发中,工具链的选择往往决定了项目的成败。与普通软件工程不同,嵌入式开发面临资源受限、实时性要求高、硬件耦合紧密等独特挑战,这使得交叉编译、链接脚本、调试器、构建系统等每一个环节都需要精细化考量。理解GCC工具链的关键参数、IDE与命令行工具的取舍,以及如何通过CMake和CI实现可复现构建,是提升开发效率的核心。本文从工具链基础概念出发,结合资源受限环境下的编译优化、JTAG/SWD调试、Flash烧录等工程实践,系统梳理了嵌入式开发工具选型的方法论与避坑指南,帮助开发者构建一套稳定、高效且可

weixin_33910460的博客 372

LLVM 编译器学习笔记之三十六-- 指令调度Instruction scheduling

1、参考Instruction scheduling in LLVM - 知乎,在中后端均存在指令调度 指令调度模型 2、在llvm12->llvm14 中Machine Instruction Scheduler有个patch增强了load/store指令的合并,也就是指令调度不仅仅只是改变指令的顺序,该优化类似gcc中的store-merge优化 .....................................................................

~ 飞 扬 的 天 空 ~ 5688

STM32L433使用DSP库配置过程

STM32L433中有FPU,在使用中为了使用其中的部分函数,需要对其进行配置。     配置成功后做些总结,留待后续复习备忘,同时也希望有朋友像我一样使用DSP库配置时少走弯路,留作交流。

在在在的博客 4550

给嵌入式开发者的RISC-V入门指南:从RV32I指令集到TinyRISC开源核实践

本文为嵌入式开发者提供全面的RISC-V实战指南,涵盖RV32I指令集解析、TinyRISC开源核部署及优化技巧。通过详细的工具链配置、FPGA综合流程和低功耗实践,帮助开发者快速掌握RISC-V在嵌入式系统中的应用,提升开发效率。

weixin_30723433的博客 307

【头歌实训:逆置顺序表】

根据提示,在右侧编辑器补充函数rev的代码,使用顺序表L的空间就地逆置L。},要求时间复杂度为O(n),空间复杂度为O(1)。第一行为顺序表逆置之前的元素。每个数据后一个空格。第二行为顺序表逆置之后的元素。每个数据后一个空格。本关任务:设计一个算法,将一个顺序表L的元素{a。第一行为顺序表中元素个数n。第二行为空格隔开的n个整数。开始你的任务吧,祝你成功!

guang_Lee的博客 998

3步精通PicoRV32:从零构建RISC-V嵌入式系统的完整指南

PicoRV32是一款极致精简的开源RISC-V CPU核心,专为资源受限的嵌入式环境设计。这款CPU实现了RV32IMC指令集,可灵活配置为RV32E、RV32I、RV32IC、RV32IM或RV32IMC变体,在FPGA和ASIC中仅需750-2000个LUTs就能实现高效处理能力。无论您是嵌入式系统开发者、FPGA爱好者,还是计算机体系结构学习者,PicoRV32都能为您提供轻量级RISC-

gitblog_00059的博客 796

EV1527 vs HS1527:固定码芯片的STM32解码避坑指南

本文深入解析EV1527与HS1527固定码芯片的技术差异,提供基于STM32的完整解码方案与稳定性优化策略。通过硬件接口配置、状态机实现及示波器诊断,解决工业遥控、安防报警等场景中的解码难题,特别针对时序差异和干扰问题给出实用解决方案。

o0p1q2r3的博客 329

Chapter 19 Digital Phase-Locked Loops

数字锁相环 Digital Phase-Locked Loops, 就是根据原来时钟信号, 产生新的时钟信号, which is locked or synchronized. (align 参考时钟边沿 or 在中间)

2304_76736886的博客 973

手把手搭建RISC-V虚拟化环境:QEMU与OpenSBI实战指南

虚拟化技术是云计算和系统软件的核心基础,它通过软件模拟硬件环境,实现资源的隔离与高效复用。其原理主要依赖于CPU的虚拟化扩展(如RISC-V的H扩展)和特权级切换机制,由Hypervisor(或VMM)在硬件与客户操作系统之间进行协调。这项技术的价值在于提升服务器资源利用率、增强系统安全性与灵活性,并支持容器、云原生等现代架构。在嵌入式系统、数据中心和边缘计算等场景中,虚拟化都扮演着关键角色。本文聚焦于使用QEMU模拟器和OpenSBI固件,快速构建一个支持RISC-V虚拟化扩展的仿真环境,这是深入理解RI

WGH100817的博客 326

Pikachu靶场环境搭建(Windows环境下安装详细教程)

Pikachu靶场是一个漏洞测试练习平台。其中包含了常见的web安全漏洞,如果你是一个渗透测试学习者没有靶场的练手,那么pikachu是一个很好的测试平台。

weixin_42857656的博客 1823

如何高效集成PicoRV32:5个关键步骤实现超低功耗RISC-V嵌入式开发

在资源受限的嵌入式系统设计中,选择合适的处理器核心至关重要。PicoRV32作为一款超低功耗的RISC-V CPU核心,以其极致的资源优化和灵活的配置选项,为FPGA和ASIC设计提供了理想的解决方案。本文将为你揭示快速集成PicoRV32的五个关键步骤,助你轻松实现高性能、低功耗的嵌入式系统开发。 ## 开发痛点:资源受限环境下的处理器选择困境 嵌入式开发者常面临三大挑战: 1. **硬件

gitblog_00780的博客 607

专栏目录:Linux 内存管理子系统的进化——从 MM 到 HMM

专栏梳理了Linux内存管理子系统从经典MM到异构内存管理(HMM)的演进历程。内容分为六大部分:首先介绍经典MM基础,包括虚拟地址空间、页表、VMA等核心机制;其次分析MM通用框架如页表遍历、NUMA迁移等;然后探讨设备内存引入的关键技术,如ZONE_DEVICE和dev_pagemap;接着深入解析HMM核心机制及其与DMA的集成;随后通过多个实际驱动案例展示HMM应用;最后讨论大页支持等进阶主题。专栏采用"经典机制→问题→扩展方案"的三段式结构,帮助开发者理解Linux如何通过HMM实现设备内存管理。

图形/计算GPU的驱动与虚拟化技术分享园地 871

微信公众号 - 最新详细实现H5网页接入微信支付功能,开发移动端、PC端网站集成使用微信支付流程及示例代码,公众号网页利用JS-SDK/JSAPI/H5支付授权唤起微信支付,可脱离微信环境支付或内置浏

微信公众号,微信支付,网页,移动端,h5,扫码支付,二维码付款,手机网页,电脑pc网页生成支付二维码,js-sdk,jsapi,外部浏览器调起微信支付,脱离微信环境,在微信内置浏览器如何进行微信支付,前端H5微信支付,web网站,vue2,vue3,nuxt2,nuxt3,jquery,微信公众号h5支付流程,如何实现,怎么做,回调报错,redirect_uri参数错误,必须部署才能调试吗,怎么不打包发布就能在本机测试,微信H5支付能力,uniapp微信支付,h5页面调起支付,支付没反应,无效,失败,H5页

🏆 前端领域优质创作者 6102

QEMU模拟器到底能玩哪些开发板?从树莓派到STM32,这份避坑指南帮你选

本文深入解析QEMU模拟器对各类开发板的兼容性,从树莓派到STM32,提供实战评测和避坑指南。详细介绍了ARM、RISC-V等架构的支持情况,外设兼容性对比,以及开发环境构建和调试技巧,帮助开发者高效选择适合的开发板进行虚拟化开发。

weixin_30607029的博客 434

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

5分钟快速上手PicoRV32:超小型RISC-V CPU核心实战指南

你是否正在寻找一款既小巧又高效的RISC-V CPU核心?是否在为资源受限的嵌入式项目而烦恼?PicoRV32可能就是你要找的答案!这款开源的RISC-V RV32IMC CPU核心,专为资源受限环境设计,在Xilinx 7系列FPGA上仅需750-2000个LUTs就能实现250-450MHz的运行频率,完美平衡了性能与资源占用。 ## 新手常见困惑与解决方案 ### 问题一:如何快速验证P

gitblog_00804的博客 1094

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

开源硬件协同开发:跨时区FPGA+RTOS联合调试新范式

硬件开发正从单点设计迈向分布式协同,其核心是解决BOM版本混乱、信号完整性验证孤岛、固件与硬件兼容性不可追溯等结构性难题。基于IEC 62474材料声明码(MDL)的物理层可信锚点、仿真即服务(SaaS)微架构、以及融合AOI/电气/温控数据的硬件数字孪生体,共同构建起可验证、可审计、可复现的协作基础设施。该范式显著提升多地域团队在PCB阻抗控制、FPGA逻辑验证、RTOS任务调度等关键环节的并行效率,已应用于RISC-V伺服驱动器等真实项目,支撑深圳、柏林、成都工程师72小时内完成从原理图到可运行固件的全

Coding 397

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Ubuntu 20.04下IDE深度解析:七个耦合模块与实战排障

集成开发环境(IDE)是现代软件工程的核心工作流引擎,其本质并非编辑器、编译器与调试器的简单叠加,而是基于操作系统底层能力(如inotify、fanotify、udev、IPC)深度耦合的多子系统协同平台。理解IDE需从Linux系统原理切入:文件监听依赖内核事件机制,语言服务(LSP)需跨进程符号解析,构建调度依赖状态机与缓存一致性,设备通信直面权限博弈(dialout组、AppArmor、pulseaudio劫持)。在Ubuntu 20.04这一广泛用于嵌入式与AI开发的稳定发行版中,IDE稳定性高度受

hck341204的专栏 400

PicoRV32:如何在750个LUT内实现完整的RISC-V CPU核心?

PicoRV32是一款专为资源受限环境优化的开源RISC-V CPU核心,支持RV32IMC指令集,可在仅750-2000个LUTs的硬件资源上实现完整的32位RISC-V处理器功能。这款核心的设计哲学是"极致精简",在保持RISC-V标准兼容性的同时,通过精巧的架构设计实现了面积与性能的最佳平衡,为FPGA和ASIC嵌入式开发提供了理想的处理器解决方案。 ## 技术架构深度解析:模块化设计的艺

gitblog_00088的博客 1049
上一篇: systemverilog $isunknown的使用
下一篇: riscv引导程序及仿真记录
geter_CS
博客等级 码龄10年 7310粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值