update chapter6

pull/1/head
Zhiyuan Shao 3 years ago
parent 7d7e61fbad
commit 875d84616c

@ -6,9 +6,10 @@
- [6.1.1 pynq开发板介绍](#subsec_pynq)
- [6.1.2 设备树](#subsec_device_tree)
- [6.1.3 内存映射I/O(MMIO)](#subsec_MMIO)
- [6.1.4 轮询I/O控制方式](#subsec_polling)
- [6.1.5 中断驱动I/O控制方式](#subsec_plic)
- [6.1.6 设备文件](#subsec_file)
- [6.1.4 riscv-fesvr原理](#subsec_fesvr)
- [6.1.5 轮询I/O控制方式](#subsec_polling)
- [6.1.6 中断驱动I/O控制方式](#subsec_plic)
- [6.1.7 设备文件](#subsec_file)
- [6.2 lab4_1 POLL](#polling)
- [给定应用](#lab4_1_app)
- [实验内容](#lab4_1_content)
@ -34,7 +35,15 @@
本实验中我们所使用的pynq-z2开发板上搭载两块芯片一块为Arm架构32位芯片称为PS端我们能在上面运行Ubuntu另一块为FPGA可编程芯片称为PL端通过烧录Rocket chip电路使它能够运行Riscv架构的操作系统即riscv-pke。
在前面的实验中Spike模拟器负责执行PKE的机器指令和为PKE分配内存并通过HTIF协议和PKE进行通信为PKE分配主机的其他资源如文件等。在开发板上运行时执行PKE的机器指令和为PKE分配内存由PL端的电路负责负责和PKE通信的则是我们在PS端运行的程序riscv-fesvrPKE借此可以访问PL端的用户程序等文件这是实验4的基础。
![](pictures/fig6_4.png)
如上图在开发板上运行的时候PKE在PL端运行一方面它可以通过Rocket Chip电路的连线访问PL端的设备device如蓝牙、小车电机等另一方面在PS端运行的riscv-fesvr程序可以和PKE通过HTIF协议通信使得PKE可以读写PS端Linux操作系统下的设备文件host device比如摄像头、声卡等。也就是说PKE除了可以访问本身的设备还可以利用PS端操作系统的功能访问更复杂的设备这就是代理内核的特点。
实验四和前三个实验的关系如下:
![](pictures/fig6_5.png)
可见除了部分硬件相关的操作外PKE在Spike和开发板上的运行是完全等价的代理内核一方面让我们可以用最简单的方法访问两端的设备另一方面在不同地方运行基本不用改太多代码非常优越。
<a name="subsec_device_tree"></a>
@ -58,9 +67,28 @@
在本章节中修改后的RocketChip将蓝牙控制寄存器和小车电机端接到固定的内存地址因此可以通过对这些地址进行读写控制蓝牙和小车电机。
<a name="subsec_fesvr"></a>
### 6.1.4 riscv-fesvr原理
riscv-fesvr是PKE在PYNQ开发板上使用的重要工具它是ARM端系统上运行的程序控制PKE的启动。除了启动功能riscv-fesvr程序主要分为两个模块系统调用模块块负责接受PKE对ARM端的系统调用请求在ARM端执行这些函数内存模块负责读写RISCV端的内存和PKE交换数据。
PKE调用宿主机/开发板ARM端的系统调用函数使用的是HTIF协议。协议要求内核保留两个地址作为和riscv-fesvr共享数据的地方。PKE要使用系统调用函数就需要将系统调用函数的编号和参数通过这个地址发送给riscv-fesvr方法是定义一个数组magic_mem该数组存储了调用号和参数再将数组的起始地址按一定的格式填入这个地址中如下图。
![](pictures/fig6_7.png)
打个比方我通过HTIF协议调用ARM端的write函数那么我先定义一个数组magic_memmagic_mem[0]为write的系统调用号magic_mem[1]为文件描述符magic_mem[2]为缓冲区地址magic_mem[3]为写入长度。然后把一个数写入共享地址这个数高8位和中间8位都是0低48位为magic_mem的地址。riscv-fesvr会首先读出magic_mem里的数据然后根据magic_mem[0]决定要调用write函数这时需要注意magic_mem[2]里的缓冲区地址是RISCV端内存的地址所以先把RISCV端内存里的这段数据读到外面内存再以外面内存地址为参数调用write函数。
riscv-fesvr的内存模块用来读写RISCV端的内存从而可以读取系统调用参数以及读写PKE的缓冲区。Pynq开发板把RISCV端的内存抽象成设备文件/dev/mem所以内存模块可以通过在固定偏移量读写该文件从而实现读写内存。
另外控制摄像头需要用到的ioctl、mmap、munmap三个系统调用函数是原版的riscv-fesvr不支持的所以我们对riscv-fesvr的系统调用模块进行了修改
* ioctl函数比较简单可以直接用PKE传过来的参数调用系统调用函数
* mmap函数比较麻烦因为ARM端通过mmap映射的是ARM端的内存RISCV端无法访问。所以再添加readmmap函数PKE可以通过HTIF调用此函数读取ARM端被映射的内存。将ARM端用mmap映射的所有内存用数组存储映射地址返回给PKE数组索引PKE向readmmap传入索引riscv-fesvr根据索引找到地址读取ARM端的内存数据返回给PKE。
<a name="subsec_polling"></a>
### 6.1.4 轮询I/O控制方式
### 6.1.5 轮询I/O控制方式
在实验四中,我们设备管理的主要任务是控制设备与内存的数据传递,具体为从蓝牙设备读取到用户输入的指令字符(或传递数据给蓝牙在手机端进行打印),解析为小车前、后、左、右、停止等动作来传输数据给电机实现对小车的控制。在前两个实验中,我们分别需要对轮询控制方式和中断控制方式进行实现。
@ -72,7 +100,7 @@
<a name="subsec_plic"></a>
### 6.1.5 中断驱动I/O控制方式
### 6.1.6 中断驱动I/O控制方式
在前一种轮询的控制方式中由于CPU的高速性和I/O设备的低速性导致CPU浪费绝大多数时间处于等待I/O设备完成数据传输的循环测试中会造成大量资源浪费。中断驱动的方式是允许请求I/O的进程在设备工作时进入休眠状态使CPU能够运行别的进程。直到设备工作完成时再由设备发出中断中断处理程序唤醒之前休眠的进程使其能够接受设备返回的数据继续执行。采用中断驱动的控制方式在I/O操作过程中CPU可以执行其他的进程CPU与设备之间达到了部分并行的工作状态从而提升了资源利用率。
@ -84,7 +112,7 @@ Riscv包含三类中断软中断、时钟中断和外部中断。软中断和
<a name="#subsec_file"></a>
### 6.1.6 设备文件
### 6.1.7 设备文件
用户程序访问外部设备通常有两种方式通过特定系统调用访问和通过设备文件访问。前者即操作系统提供专门的函数控制设备后者是操作系统把设备指定成一个文件通过通用的文件的读写函数控制设备。设备文件常用的函数除了open、read、write、close还有以下几种
@ -140,9 +168,11 @@ Riscv包含三类中断软中断、时钟中断和外部中断。软中断和
#### **实验内容**
如输出提示所表示的那样需要找到并完成对uart_getchar的调用完成后进行验证。
如输出提示所表示的那样需要找到并完成对uart_getchar的调用由于本实验给出的基础代码修改了硬件相关的部分代码所以无法在Spike上运行需在PYNQ开发板上进行验证运行步骤如下
手机端验证首先将蓝牙模块接入pynq板接口对应关系为
1. 依照仓库https://gitee.com/hustos/fpga-pynq下**usb-device-pynq**分支的说明在板上安装ARM端操作系统和下载必要的文件
2. 依照仓库https://gitee.com/hustos/myriscv-fesvr的说明自行编译或直接下载修改后的riscv-fesvr
3. 连接外设首先将蓝牙模块接入pynq板的PMODA接口组接口对应关系为
| pynq接口 | 蓝牙接口 |
| -------- | -------- |
@ -151,27 +181,19 @@ Riscv包含三类中断软中断、时钟中断和外部中断。软中断和
| JA4 | RXD |
| JA3 | TXD |
接入时注意对应接口错位正确插入然后在手机端下载任意一种蓝牙串口通信APP匹配并连接蓝牙模块。蓝牙的名称通常是“HC-两位数字”。使用网线连接pynq板和电脑打开开发板电源。
成功连接蓝牙模块后,启动连接:
```
$ ssh xilinx@192.168.2.99
```
接入时注意对应接口错位正确插入且插入的所有接口均在上面的一排。然后将小车的电机接口接入PMODB接口组为了防止小车行走过程中接口松开可自行使用胶布粘贴。
随后使用scp指令将编译后的pke内核和用户app文件导入
![](pictures/fig6_6.jpg)
```
$ scp 文件名 xilinx@192.168.2.99:~
```
4. 在手机端下载任意一种蓝牙串口通信APP匹配并连接蓝牙模块。蓝牙的名称通常是“HC-两位数字”。使用网线连接开发板和电脑同时使用USB线连接开发板和电脑或者充电宝打开开发板电源。
此时便成功进入pynq板环境。运行:
5. 执行开机之后必要的操作后烧录电路等见步骤1里的仓库运行
```
sudo ./riscv-fesvr riscv-pke app_poll
```
```
sudo ./riscv-fesvr riscv-pke app_poll
```
之后即可在手机上输入控制指令,小车应能根据指令反应。
之后即可在手机上输入控制指令,小车应能根据指令反应。
<a name="lab4_1_guide"></a>
@ -485,7 +507,7 @@ $ git commit -a -m "my work on lab4_2 is done."
47 }
```
实验预期结果:小车在前进过程中能够正常识别障碍物后并自动停车。
实验预期结果:小车在前进过程中能够正常识别障碍物后并自动停车。测试时别忘记把摄像头接到USB接口否则系统会找不到设备文件。
<a name="lab4_3_guide"></a>

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Loading…
Cancel
Save