赞
踩
Renode往期文章:
1. 初识Renode
2. Renode学习:Working with machines
本篇介绍平台描述文件的写法。
Renode使用基于文本的格式REPL(REnode PLatform)来描述平台,平台描述文件一般使用.repl的后缀,文件内格式大体如下(该文件为renode工程自带的leon3.repl):
- rom: Memory.MappedMemory @ sysbus 0x0
- size: 0x40000000
-
- ddr: Memory.MappedMemory @ sysbus 0x40000000
- size: 0x20000000
-
- sdram: Memory.MappedMemory @ sysbus 0xC0000000
- size: 0x02000000
-
- cpu: CPU.Sparc @ sysbus
- cpuType: "leon3"
-
- ahbInfo: Bus.GaislerAHBPlugAndPlayInfo @ sysbus <0xfffff000, +0xfff>
-
- apbController: Bus.GaislerAPBController @ sysbus <0x800ff000, +0xfff>
-
- esaMemController: MemoryControllers.ESAMemoryController @ sysbus <0x80000000, +0x100>
-
- mic: IRQControllers.GaislerMIC @ sysbus <0x80000200, +0x100>
- 0 -> cpu@0 | cpu@1 | cpu@2
-
- uart: UART.GaislerUART @ sysbus <0x80000100, +0x100>
- -> mic@2
-
- timer: Timers.GaislerGPTimer @ sysbus <0x80000300, +0x100>
- 0 -> mic@8
- timersNumber: 2
- frequency: 1000000
-
- eth: Network.GaislerEth @ sysbus 0x80000B00
- -> mic@12
-
- gpio: GPIOPort.GaislerGPIO @ sysbus <0x80000800, +0x100>
- -> mic@10
- numberOfPorts: 16
- numberOfInterrupts: 1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
每个REPL文件都由一些外设描述的条目(entry)组成,每个条目的格式如下:
- variableName: TypeName registrationInfo
- attribute1
- attribute2
- ...
- attributeN
其中,TypeName、registrationInfo和attributes都是可选的,但至少要有其中的一个。
每个条目分为创建条目(creating entry)和更新条目(updating entry),创建条目用于声明一个条目,它必须包含TypeName字段。条目创建后,可通过更新条目对其中的一项或多项属性进行更新,举例如下:
- variable1: SomeType
- property: value
-
- variable1:
- property: otherValue
条目中的变量默认为全局变量,可在其它文件引用该文件时,在其它文件中被引用。我们也可以在条目声明时,使用local关键字将某条目的变量声明为局部变量,局部变量只能在本文件中使用,不可跨文件引用。举例如下:
- local cpu: SomeCPU
- StringProp: "a"
-
- cpu:
- IntProp: 32
REPL文件使用空格进行缩进,缩进量为4个空格的倍数。若不使用缩进,也可以使用花括号“{”,使用花括号时,配合使用分号“;”来分割不同的行,如下两种表达方式是等价的:
- line1
- line2
- line3
- line4
- line5
- line6
- line1
- line2 { line3; line4 { line5 }; line 6 }
REPL文件的注释与C/C++类似,使用“//”对单行进行注释,使用“/*”和“*/”对多行注释。
REPL中的值有三种表示:
(1) 简单值
简单值包括strings(单行string、多行string)、booleans(true 或false)、numbers(十进制后者十六进制表示)、范围。其中,范围的表示,在我们本文开头的例子中比较多见,例如:
uart: UART.GaislerUART @ sysbus <0x80000100, +0x100>
范围有两种表示法,一种是<begin, end>表示法,标明范围的起始值和结束值;另一种是 <begin, +size>表示法,标明范围的起始值和范围的大小。范围可用十进制表示,也可用十六进制表示。
(2) 引用值
通过变量名称指向一个变量的值。
(3) 内联对象
与引用值类似,但不是创建变量然后引用它,而是在引用的地方定义它。类似下面这种:
- variable: SomeType
- SomeProperty: new Point {x: 5; y: 3}
要添加外设,需要明确其类型、名称以及注册点。大部分外设会注册在sysbus上,在前面文章我们提到,sysbus是在创建machine后默认存在的,因此不需要对其显式定义。
外设的类型名称必须是命名空间的全称,但是对于默认命名空间Antmicro.Renode.Peripherals,则可省略不写。
例如,我们要创建一个类型为Antmicro.Renode.Peripherals.UART.MiV_CoreUART的UART对象,并将其连接到系统总线的0x80000000处,则可使用如下语句:
uart0: UART.MiV_CoreUART @ sysbus 0x80000000
如果外设的构造函数需要设置参数,则将参数及其属性列在外设构造语句的下方,并以4个空格缩进:
- uart0: UART.MiV_CoreUART @ sysbus 0x80000000
- clockFrequency: 66000000
注意:构造函数的参数以小写字母开头,属性则以大写字母开头(例如,当属性值为字符串时)。
以上示例中,我们把uart0连接到了系统总线sysbus的特定地址上,除此之外,我们还可以把外设连接到其他总线上,比如I2C、SPI或者GPIO控制器。
例如,把一个温度传感器连接到名为i2c0的I2C总线的0x80处,可使用如下语句:
sensor: Sensors.SI70xx @ i2c0 0x80
外设也可以通过GPIO或者中断连接,这种连接使用符号“->”来创建。例如,要把一个定时器连接到plic中断控制器的第31号中断上,则可用如下语句:
- timer: Timers.MiV_CoreTimer @ sysbus 0x1000000
- -> plic @ 31
如同我们平时写程序代码,在Renode中,一个REPL文件可以依赖另一个REPL文件,使用关键字using实现,例如,
using "platforms/cpus/miv.repl"
同样地,以上路径可以是绝对路径,也可以是renode可执行文件所在目录的相对路径。
被依赖文件中的非局部变量可以被使用在当前文件中。实际上,使用using关键字,相当于把被依赖的文件整个粘贴在当前文件的头部。
另外还有一种用法,可以在被依赖文件中的变量被使用时,所有(非局部)变量都增加一个前缀:
using "path" prefixed "prefix"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。