实验课

嵌入式系统Lab3实验报告

姓名 学号 班级 电话 邮箱
戴斯铭 15352071 M1(1504) 13727023544 908660116@qq.com

1、实验题目

DOL实例分析及编程

2、实验要求

任务:

  1、修改example1,使其输出3次方数

  2、修改example2,让3个square模块变成2个

提示:

  修改代码之后,重新编译运行(sudo ant -f runexample.xml -Dnumber=XXX,其中XXX是指运行example的号码。)

报告内容:

  1、改完的*.dot截图

  2、结合论文分析编译过程

3、实验原理

  要想实现上述两个任务,首先需要了解实验中各个文件的主要内容以及各自代表的意义。接下来,让我们重温实验课件中的重要内容。

  接下来分析各个example文件夹中各个文件的含义,以example1为例:

image.png

  可以看到example文件夹中有两个重要的文件,一是src文件夹,二是example1.xml。src文件夹中有各个进程(生产者,消费者,处理模块等)的功能定义,如图所示的generator以及consumer。而example1.xml文件,描述了系统的架构即模块连接方式的定义。

  接下来,让我们进入src文件探个究竟。

image.png

  /src文件夹中包含两种文件:.c和对应的.h,这些是*.dot对应生产者框和消费者框的功能描述。先将dot图贴在此处,以方便讲解:

16.png

  每个模块都需要实现两个接口,分别是xxxinit和xxxfire函数,用于初始化这个模块需要做什么,以及模块在运作时做了什么;而./example*.xml文件则定义了模块之间的连接方式,从上图可以看到,定义的内容是具体使用哪种框、哪条线来将模块相连。而且,上述蓝框中的内容也对应src文件里的内容,其连线也由xml文件来决定。

  大致介绍了各个文件的具体内容后,接下来进入具体的实验过程。

4、实验过程

任务一:修改example1,使其输出3次方数

  由实验2时我们得知,example1原本输出的是平方数,那么我们进入其对应的src文件夹,寻找定义了平方这个计算方式的文件。很容易便可以进入square.c文件中进行查看。下面对其进行源码分析(当然,实验课上TA也对代码部分进行了详细的解读):

  其内部共有两个函数,分别为square_init函数和square_fire函数,前者的源码如下:

image.png

  可以看到,这里对两个变量进行了初始化。其中,p->local->index表示当前位置,初始化为0;而p->local->len则代表生产者的长度即个数,初始化为常量LENGTH。(更具体的含义可以通过阅读generator以及consumer文件的源码来得知)

  接下来是square_fire函数中的内容。

  从此函数中可以看到,若满足当前位置小于生产者的长度,则对变量i进行平方运算。实验要求我们输出i的三次方,毫无疑问,只需要将i = i i修改为i = i i * i即可。通过命令行指令删除main文件夹下的已存在的example文件,再重新进行编译运行即可。编译成功的截图如下:

image.png

  其对应的*.dot文件与原来相比,并没有改变,如下图:

16.png

任务二:修改example2,让3个square模块变成2个

  从这个实验任务也可以推测,我们需要修改的是模块的连接方式,而不是修改模块内具体是怎么计算的。因此可以推测,需要我们修改的是example2.xml文件内的内容。

  当然,从所给的实验课件中我们也可以得知,example2的各个进程功能与example1相同,这也说明其消费者、生产者等进程的实现相同。而不同之处在于,example2架构中包含3个square进程,因此其相乘为产生的结果为i的八次方。因此,我们需要修改的,便是将3个square进程变为两个。

  打开example2.xml文件,分析源码。此外,课件中也给了相应的提示,需要修改iterator部分,因此我们很快便可以锁定关键位置。

image.png

  这里通过迭代,定义了3个square模块,因此我们只要将上图的value值由3改为2即可。其余更具体的连接方式方面的内容在实验课上已讲过,因此不再重复。在删除原main文件夹下的已存在的example文件后,通过执行指令sudo ant -f runexample.xml -Dnumber=2即可编译运行example2。其修改后输出的结果如下:

两个square模块.PNG

  可以看出,结果不再是i的八次方,而是i的四次方。同样的,贴出对应的.dot文件截图:

image.png

  可以看到,如今只有两个square模块。至此,上述两个任务实现结束。

5、结合论文分析编译过程

  首先可以明确的一点是,我们使用的环境是DOL编程环境,因此我直接阅读了该论文中的第三个部分:DOL PROGRAMMING ENVIRONMENT。下面对其内容进行具体分析。
  DOL是一个平台独立的MPSoC编程环境,以实时为目标流和(阵列)信号处理应用程序。下面重点根据此图来对编译过程进行分析。

image.png
  此图给我们展示了一个DOL环境的概述。而从图中也可以看到,我们实验中所涉及的修改example文件并进行编译的步骤,仅与”functional simulation generation有关。实验时,我们也知道,所接触到的代码文件均是xml和c文件。首先需要通过图中的三个步骤:

application specification(XML & C)
mapping specification(XML)
architecture specification(XML)

  经过上述三步后,接下来便是自动生成功能模拟应用程序。从论文中可以阅读到,功能模拟允许测试和调试并行应用程序代码与标准工作站上的标准调试工具。具体来说,是使用SystemC模拟引擎和gdb。这也是为什么我们需要下载systemC的压缩包进行安装。

  接下来就具体介绍功能模拟过程中所涉及的DOL以及SystemC的整个编译实现过程。

  首先是明确为何选择使用C语言和xml语言,在实现中,使用C/C++程序来编译Actors,选择XML来描述数据流过程的网络拓扑。选择这些语言具有务实的原因,因为使用C / C ++允许重用现有的旧代码,并且由于具有大量的可用工具,XML更易于处理。简单来说,编译过程可以描述为以下两个步骤:

  1. 处理XML过程网络描述和相关联的C源代码来生成可执行的SystemC模型;

  2. 可视化流程网络,即生成dot文件。

  更详细的过程,可参考下图:

image.png

  以我们所编译的example1文件为例。首先由先前的实验过程可知,我们的编译是使用以下语句来进行的:

ant -f runexample.xml -Dnumber=1

  这个runexample.xml文件用来触发指定实例的扁平化,C代码生成,编译和执行。这里的实例扁平化应该就是指将xml过程描述以及相关联的C源代码进行mapping,之后再进而生成可执行的SystemC模型,再进行编译执行即可。

参考链接:https://durant35.github.io/2016/10/01/TACouses_Embedded_System_2016/#DOL-amp-SystemC-for-Functional-Simulation

6、实验感想

  这次实验任务完成就比较简单了,比较难的部分是需要分析黄凯老师的博士论文。当然,我在阅读的时候是有点偷懒成分的,直接阅读了涉及课程内容比较多的第三个部分。另外,从别的同学那里得知了一个助教的github地址,有着比较直观的解释吧,所以也借鉴了一下。

  当然,我觉得如果需要理解更深层面的内容,则需要具备比较深厚的专业知识才比较好。