当前位置:   article > 正文

Renode学习:平台描述文件REPL

renode

Renode往期文章:

1. 初识Renode

2. Renode学习:Working with machines

本篇介绍平台描述文件的写法。

Renode使用基于文本的格式REPL(REnode PLatform)来描述平台,平台描述文件一般使用.repl的后缀,文件内格式大体如下(该文件为renode工程自带的leon3.repl):

  1. rom: Memory.MappedMemory @ sysbus 0x0
  2. size: 0x40000000
  3. ddr: Memory.MappedMemory @ sysbus 0x40000000
  4. size: 0x20000000
  5. sdram: Memory.MappedMemory @ sysbus 0xC0000000
  6. size: 0x02000000
  7. cpu: CPU.Sparc @ sysbus
  8. cpuType: "leon3"
  9. ahbInfo: Bus.GaislerAHBPlugAndPlayInfo @ sysbus <0xfffff000, +0xfff>
  10. apbController: Bus.GaislerAPBController @ sysbus <0x800ff000, +0xfff>
  11. esaMemController: MemoryControllers.ESAMemoryController @ sysbus <0x80000000, +0x100>
  12. mic: IRQControllers.GaislerMIC @ sysbus <0x80000200, +0x100>
  13. 0 -> cpu@0 | cpu@1 | cpu@2
  14. uart: UART.GaislerUART @ sysbus <0x80000100, +0x100>
  15. -> mic@2
  16. timer: Timers.GaislerGPTimer @ sysbus <0x80000300, +0x100>
  17. 0 -> mic@8
  18. timersNumber: 2
  19. frequency: 1000000
  20. eth: Network.GaislerEth @ sysbus 0x80000B00
  21. -> mic@12
  22. gpio: GPIOPort.GaislerGPIO @ sysbus <0x80000800, +0x100>
  23. -> mic@10
  24. numberOfPorts: 16
  25. numberOfInterrupts: 1

1. 基本结构

每个REPL文件都由一些外设描述的条目(entry)组成,每个条目的格式如下:

  1. variableName: TypeName registrationInfo
  2. attribute1
  3. attribute2
  4. ...
  5. attributeN

 其中,TypeName、registrationInfo和attributes都是可选的,但至少要有其中的一个。

每个条目分为创建条目(creating entry)和更新条目(updating entry),创建条目用于声明一个条目,它必须包含TypeName字段。条目创建后,可通过更新条目对其中的一项或多项属性进行更新,举例如下:

  1. variable1: SomeType
  2. property: value
  3. variable1:
  4. property: otherValue

条目中的变量默认为全局变量,可在其它文件引用该文件时,在其它文件中被引用。我们也可以在条目声明时,使用local关键字将某条目的变量声明为局部变量,局部变量只能在本文件中使用,不可跨文件引用。举例如下:

  1. local cpu: SomeCPU
  2. StringProp: "a"
  3. cpu:
  4. IntProp: 32

2. 缩进与注释

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

  1. line1
  2. line2
  3. line3
  4. line4
  5. line5
  6. line6
  1. line1
  2. 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) 内联对象

与引用值类似,但不是创建变量然后引用它,而是在引用的地方定义它。类似下面这种:

  1. variable: SomeType
  2. 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个空格缩进:

  1. uart0: UART.MiV_CoreUART @ sysbus 0x80000000
  2. clockFrequency: 66000000

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

5. 连接外设

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

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

sensor: Sensors.SI70xx @ i2c0 0x80

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

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

6. 文件依赖

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

using "platforms/cpus/miv.repl"

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

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

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

using "path" prefixed "prefix"
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/940025
推荐阅读
相关标签
  

闽ICP备14008679号