开源模拟器 Renode 初体验

开源模拟器 Renode 初体验

Renode 是开源的模拟器,可以模拟 Cortex-M、RISC-V 等微控制器,不仅可以模拟 CPU指令,还可以模拟外设,甚至可以模拟板载的外设。官网:https://renode.io/ 。指令模拟器使用 C 语言编写,外设模拟器使用 C# 语言编写,兼顾了运行效率和开发效率。

https://blog.csdn.net/zoomdy/article/details/95445329
zoomdy at 163 dot com

环境:

$ uname -a
Linux vbox 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

安装

安装 Mono

sudo apt update
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
sudo apt install apt-transport-https ca-certificates
echo "deb https://download.mono-project.com/repo/ubuntu stable-xenial main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt update
sudo apt install mono-complete

安装 Mono 快结束时有个预编译的过程,这需要花费是十几分钟的时间。

参考:

安装其它依赖包

sudo apt-get install policykit-1 libgtk2.0-0 screen uml-utilities gtk-sharp2 libc6-dev

下载 Renode

打开下载页面 https://github.com/renode/renode/releases/latest ,下载 renode_1.7.1_amd64.deb

安装 Renode

sudo dpkg -i renode_1.7.1_amd64.deb

运行 Renode

命令行输入 renode 运行。

renode

运行之后,renode 会开启新的命令窗口用作renode 命令输入,原来的命令行窗口作为renode的日志输出窗口使用。

创建 machine

以下命令均在 renode 命令窗口输入。

创建机器,然后加载平台描述文件,这里是 STM32F4Discovery开发板的平台描述文件。

mach create
machine LoadPlatformDescription @platforms/boards/stm32f4_discovery-kit
.repl 

查看外设

输入 peripherals 命令查看外设。

(machine-0) peripherals 
Available peripherals:
  sysbus (SystemBus)
  │   
  ├── can0 (STMCAN)
  │     <0x40006400, 0x400067FF>
  │       
  ├── cpu (CortexM)
  │     Slot: 0
  │       
  ├── dma1 (STM32DMA)
  │     <0x40026000, 0x400263FF>
  │       
  ├── dma2 (STM32DMA)
  │     <0x40023400, 0x400237FF>
  │       
  ├── ethernet (SynopsysEthernetMAC)
  │   │ <0x40028000, 0x400293FF>
  │   │   
  │   ├── phy (EthernetPhysicalLayer)
  │   │     Address: 0
  │   │       
  │   └── phy1 (EthernetPhysicalLayer)
  │         Address: 1
  │           
  ├── exti (EXTI)
  │     <0x40013C00, 0x40013FFE>
  │       
  ├── flash (MappedMemory)
  │     <0x08000000, 0x081FFFFF>
  │       
  ├── fscmBank1 (MappedMemory)
  │     <0x60000000, 0x6FFFFFFF>
  │       
  ├── gpioPortA (STM32F4GPIOPort)
  │   │ <0x40020000, 0x400203FF>
  │   │   
  │   ├── UserButton (Button)
  │   │       
  │   ├── externalButton (Button)
  │   │       
  │   └── externalLed (LED)
  │           
  ├── gpioPortB (STM32F4GPIOPort)
  │     <0x40020400, 0x400207FF>
  │       
  ├── gpioPortC (STM32F4GPIOPort)
  │     <0x40020800, 0x40020BFF>
  │       
  ├── gpioPortD (STM32F4GPIOPort)
  │   │ <0x40020C00, 0x40020FFF>
  │   │   
  │   └── UserLED (LED)
  │           
  ├── gpioPortE (STM32F4GPIOPort)
  │     <0x40021000, 0x400213FF>
  │       
  ├── gpioPortF (STM32F4GPIOPort)
  │     <0x40021400, 0x400217FF>
  │       
  ├── nvic (NVIC)
  │     <0xE000E000, 0xE000EFFF>
  │       
  ├── rng (STM32F4_RNG)
  │     <0x50060800, 0x50060BFF>
  │       
  ├── rom (MappedMemory)
  │     <0x1FFF0000, 0x1FFFFFFF>
  │       
  ├── spi1 (STM32SPI)
  │     <0x40013000, 0x400133FF>
  │       
  ├── spi2 (STM32SPI)
  │     <0x40003800, 0x40003BFF>
  │       
  ├── spi3 (STM32SPI)
  │     <0x40003C00, 0x40003FFF>
  │       
  ├── sram (MappedMemory)
  │     <0x20000000, 0x2003FFFF>
  │       
  ├── uart1 (STM32_UART)
  │     <0x40011000, 0x400110FF>
  │       
  ├── uart2 (STM32_UART)
  │     <0x40004400, 0x400044FF>
  │       
  ├── uart3 (STM32_UART)
  │     <0x40004800, 0x400048FF>
  │       
  ├── uart4 (STM32_UART)
  │     <0x40004C00, 0x40004CFF>
  │       
  └── uart5 (STM32_UART)
        <0x40005000, 0x400050FF>

加载程序

机器创建好了以后,就可以用 LoadELF 命令加载程序了。

sysbus LoadELF @http://antmicro.com/projects/renode/stm32f4discovery.elf-s_445441-827a0dedd3790f4559d7518320006613768b5e72

启动模拟器

输入 start 命令启动模拟器。

start

暂停模拟

pause

参考

官方帮助文件:https://renode.readthedocs.io/en/latest/

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释下面代码功能#include<iostream> #include<cstring> #include<cmath> using namespace std; int Node[50]; int number; int Calculate(char x)//计算偏移 { if(x>=97&&x<=122) return 0; switch(x) { case '!': case '^': case '(': case ')': return 1; case '|': case '-': return 2; case '<': return 3; default: return 1; } } int CalculateOut(string &Word,int n,int m)//输出||、->、<->,等等 { int i; if(m!=0) { for(i=1; i<m; i++)cout<<Word[n+i]; if(Word[i+n]!='\0') cout<<" "; } } int Input(string &Word)//输出数据 { int m,i,tag,q; number=0; for(i=0; Word[i]!='\0'; ) { q=i; if(Word[i]==' ') { i++; continue; } cout<<Word[i]; tag=Calculate(Word[i]); CalculateOut(Word,i,tag); i+=tag;//偏移 if(!tag)//数字计数 { Node[Word[q]-97]++; number++; if(Word[i+1]!='\0') cout<<" "; i++; } } cout<<endl; return number; } int Bin(int n,int m) { int bin[10000]; int a,b,i=0; do { a=n%2; n/=2; bin[i++]=a; } while(n>0); for(n=0; n<m-i; n++) { cout<<"0 "; } for(n=i-1; n>=0; n--) { cout<<bin[n]; if(n) cout<<" "; } } int Outnumber(int n) { int i,m=1; for(i=1; i<n; i++) { m=m*2+1; } for(i=m; i>=0; i--) { Bin(i,n); cout<<endl; } } void CoutNode() { int i,temp=0; for(i=0; i<50; i++) { if(temp==0&&Node[i]!=0) { cout.put(97+i); temp++; } else if(Node[i]!=0) { cout<<" "; cout.put(97+i); temp++; } } number=temp; cout<<endl; } int ReNode()//初始化 { for(int i=0; i<110; i++) Node[i]=0; } int Turn(char Map[400],string &Word) { int n,i; for(i=0,n=0;i<=strlen(Map);i++) { if(Map[i]!=' ') { Word[n]=Map[i]; n++; } } Word[n]='\0'; } int main() { int n,i; string Word; char Map[400]; while(gets(Map)!=NULL)//输入 { ReNode(); Turn(Map,Word); Input(Word); CoutNode(); Outnumber(number); } // Bin(2); }
06-07

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值