找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 2937|回复: 0

EV3从图形化编程到内核编译(三)

[复制链接]
发表于 2022-3-19 00:35:53 | 显示全部楼层 |阅读模式
要了解G语言写的程序如何编译执行就必须对编译后的二进制文件 *.rbf 有一个详细的了解,这一节我就专门讲这个文件。为了更好的理解这个文件,我还专门编写了一个二进制文件的解析文件,不过不具备反编译的功能。
编译后的*.rbf文件为二进制文件,该文件可以使用linux命名vim打开

        Vim 可以用来查看和编辑二进制文件
        vim -b filename   加上-b参数,以二进制打开
        然后输入命令  :%!xxd -g 1  切换到十六进制模式显示
rbf文件的头由16个字节组成
/*    0 */  PROGRAMHeader(size=317, VersionInfo=0.57,NumberOfObjects=2,
GlobalBytes=57),
/*    0 */  Sign =   4C 45 47 4F
/*    4 */  Image size =   3D 01 00 00
/*    8 */  Version info =   39 00
/*   10 */  Number of objects =   02 00
/*   12 */  Number of global bytes  =   39 00 00 00

ImangHeader.png

0-3 四个字节为字母LEGO
4-7 四个字节为rbf文件的大小
8-9 两个字节为版本号*100
10-11  两个字节 object的个数,两个字节
12-15  四个字节为全局变量所占的字节数,全局变量用于各个Object之间交换数据。
Image Header后面接着就是定义每个Object Header
object至少为1个,有多少个obejct就排多少个。
  /*   16 */  VMTHREADHeader(OffsetToInstructions=40,LocalBytes=35),      // Object 1  
  /*   16 */  Offset to instructions  len=4  Code=   28 00 00 00
  /*   20 */  Owner object id    len=2  Code=   00 00
  /*   22 */  Trigger count   len=2  Code=   00 00
  /*   24 */  Local bytes    len=4  Code=   23 00 00 00

Objectheader.png
Object Header 的第一个四字节(16-19字节)为Object对应的指令偏移码,即执行此Object时,跳转到何处开始执行。
Ower Object Id(20-21字节) 依据主Object,子Object,程序调用等进行设置
Trigger count(22-23字节) 为触发器设置。
Local Bytes(24-27字节)为定义局部变量的字节数,用于Object内部交换数据。
Object 后面接着就是程序指令,此指令和内核中定义的指令函数相对应。
在内核中,共定义了255个主函数(实际有些是空的),每个函数都定义了对应的参数个数和参数类型,所有主函数参数个数不超过8个;部分主函数又定义了子函数。
通过每个函数对应的指令和参数即可执行*.rbf对应的二进制文件。每个函数对应的代码在lms2012.c文件中定义


PrimDispatchTabel.png

如: 假说 Object 1 对应的命令信息为40-127处的字节表示
40位置的字节为
A2 00 0F
40个字节处 A2 表示调用函数, opOUTPUT_RESET,  函数对应的属性Pars=0x00000088 表示这个函数的参数类型,为两个 DATA8L类型。
00 0F 表示opOUTPUT_RESET, 的两个输入参数。
  /*   43 */ OpCodes[99]=opINPUT_DEVICE, .Pars=0x00000B18
           SubCodes[0B][0A]=LC0(CLR_ALL),LC0(FFFFFFFF),
           99 0A 3F
43个字节处99 表示调用函数 opINPUT_DEVICE,函数对应的属性Pars=0x00000B18 ,该函数三个参数,并且调用了子函数 CLR_ALL , opINPUT_DEVICE函数对应的属性Pars=0x00000B18  中的0B 表示子函数的类,第44 字节 0A 表示 子函数对应的类中的第几个函数,所有的自函数在SubCodes[0B][0A] 自函数表中, SubCodes[0B][0A] 表示的是子函数 CLR_ALL。
关于各个函数的说明可以参见文档
LEGO MINDSTORMS EV3 Firmware Developer Kit.pdf
此文档在乐高网站上可下载。

老规矩:
我给出了一个简单的ev3文件Ract.ev3 编译后的二进制文件Ract.rbf
以及二进制文件的注释文件。在注释文件中,每一个函数都可以在lms2012.c中找到对应的定义

链接:https://pan.baidu.com/s/1kas53edBp44qB_wgrzqGDw?pwd=euhg

对应文档:    EV3文件及其对应二进制文件注释.zip

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-11-22 22:29 , Processed in 0.084039 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表