Renode学习:平台描述文件REPL

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

1. 基本结构

每个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

2. 缩进与注释

REPL文件使用空格进行缩进,缩进量为4个空格的倍数。若不使用缩进,也可以使用花括号“{”,使用花括号时,配合使用分号“;”来分割不同的行,如下两种表达方式是等价的:

line1
line2
    line3
    line4
        line5
    line6
line1
line2 { line3; line4 { line5 }; line 6 }

REPL文件的注释与C/C++类似,使用“//”对单行进行注释,使用“/*”和“*/”对多行注释。 

3. 值的表示

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}

4. 定义外设

要添加外设,需要明确其类型、名称以及注册点。大部分外设会注册在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

注意:构造函数的参数以小写字母开头,属性则以大写字母开头(例如,当属性值为字符串时)。

5. 连接外设

以上示例中,我们把uart0连接到了系统总线sysbus的特定地址上,除此之外,我们还可以把外设连接到其他总线上,比如I2C、SPI或者GPIO控制器。

例如,把一个温度传感器连接到名为i2c0的I2C总线的0x80处,可使用如下语句:

sensor: Sensors.SI70xx @ i2c0 0x80

外设也可以通过GPIO或者中断连接,这种连接使用符号“->”来创建。例如,要把一个定时器连接到plic中断控制器的第31号中断上,则可用如下语句:

timer: Timers.MiV_CoreTimer @ sysbus 0x1000000
    -> plic @ 31

6. 文件依赖

如同我们平时写程序代码,在Renode中,一个REPL文件可以依赖另一个REPL文件,使用关键字using实现,例如,

using "platforms/cpus/miv.repl"

同样地,以上路径可以是绝对路径,也可以是renode可执行文件所在目录的相对路径。

被依赖文件中的非局部变量可以被使用在当前文件中。实际上,使用using关键字,相当于把被依赖的文件整个粘贴在当前文件的头部。

另外还有一种用法,可以在被依赖文件中的变量被使用时,所有(非局部)变量都增加一个前缀:

using "path" prefixed "prefix"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值