用Raspberry Pi制作简单的轮盘游戏机

浙江大学嵌入式系统课程

之前在Raspberry Pi上做了许多好玩的事情,但与物理计算却是一点关系也没有。所以这次我们来尝试用RPi做一个简单的轮盘游戏机。因为材料有限,“轮盘”将使用一个2位8段数码管模拟。

材料准备:

  • Raspberry Pi
  • 面包板一块
  • 2位8段数码管一个
  • 按钮2个
  • 1K~10KΩ电阻2个
  • 面包线+杜邦线若干

在RPi上安装wiringPi

使用串口或SSH连接RPi,输入以下命令安装wiringPi。

1
2
3
4
$ cd /tmp/
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ sudo ./build

安装完成后,你可以使用命令gpio -v测试wiringPi是否已经正确安装。

Read More

Raspberry Pi上μC/OS II的移植

下载μCOS II for Raspberry Pi源码,修改makefile文件

  根据自己使用的交叉编译工具链,修改源码根目录下的makefile文件,主要修改的地方有如下两处:

1
2
3
ARMGNU ?= arm-linux-gnueabi
INCLUDEPATH ?= "./h"

检查源码错误

  不知道助教是不是有意“增加”实验难度,这次提供的源码中存在不少小错误,比如makefile文件的第59行的ucos_bcm2835.elf最后多了一个“.”、没有注意文件名大小写(这个与操作系统有关)等。这步可以通过执行make命令找出错误的地方,很快就能解决。

Read More

用于Raspberry Pi的简易bootloader

浙江大学嵌入式系统课程

这是一次痛并快乐着的实验。

以下引用实验要求:

David Welch的 GitHubbootloader05给出了一个非常简单的RPi bootloader,他的代码链接在内存的0x00020000位置,一直在监听串口是否有XMODEM协议的文件下载,如果有就开始接收数据,并复制到0x00008000位置,传输完成后跳转到 0x00008000去执行。

TA写了一个Python脚本,按照下面的命令调用脚本可以下载并执行用户程序python xmodem-loader.py -p com3 -b 115200 output.bin

你的任务是修改bootloader和python脚本实现如下功能:

调用命令python xmodem-loader.py -p com3 -b 115200启动脚本并且与板卡建立串口连接,之后可以发送下面的命令。

    load *.bin 下载程序*.bin
    go 执行已下载的程序
    peek addr 以一个字为单位读取内存中addr位置的数据(addr是4字节对齐,十六进行的形式,长度为8,例如 0x00008000),并以十六进制的形式输出
    poke addr data 以一个字为单位修改内存中addr位置的数据为data(addr是4字节对齐,十六进行的形式,长 度为8data也是十六进行的形式,长度为8)
    verify *.bin 验证已下载的程序和*.bin是否完全相同。

Read More

给RaspberryPi增加一个系统调用

浙江大学嵌入式系统课程

安装交叉编译工具,并设置NAS

1
2
3
4
sudo apt-get install gcc-arm-linux-gnueabi
cd ~
mkdir pi
sudo mount 192.168.0.4:/home/pi /home/neo/pi

详情见搭建RaspberryPi的交叉编译环境

下载Raspberry Pi的源码

1
2
3
4
5
6
# PC
cd ~/pi
mkdir kernel
cd kernel
git clone https://github.com/raspberrypi/linux.git
git clone https://github.com/raspberrypi/firmware.git

因为网络原因这一步耗时较长,需要耐心等待。也可以直接在github上下载zip压缩包自行解压,不过无论是使用RPi解压或是通过NAS解压速度都不快,可以考虑取下SD卡在PC上直接解压。

Read More

[RPi] ARM指令

浙江大学嵌入式系统课程

生成了Thumb指令还是ARM指令,如何通过编译参数改变

编写测试代码arm.c。

1
2
3
4
5
6
7
#include <stdio.h>
int main() {
int a = 0;
a++;
return 0;
}

用如下命令编译,并使用objdump查看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
gcc -c arm.c
objdump -d arm.o
arm.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <main>:
0: e52db004 push {fp} ; (str fp, [sp, #-4]!)
4: e28db000 add fp, sp, #0
8: e24dd00c sub sp, sp, #12
c: e3a03000 mov r3, #0
10: e50b3008 str r3, [fp, #-8]
14: e51b3008 ldr r3, [fp, #-8]
18: e2833001 add r3, r3, #1
1c: e50b3008 str r3, [fp, #-8]
20: e3a03000 mov r3, #0
24: e1a00003 mov r0, r3
28: e28bd000 add sp, fp, #0
2c: e8bd0800 pop {fp}
30: e12fff1e bx lr

可以看到指令长度都是32位的,说明gcc默认是以arm指令编译的。使用如下命令查找如何以Thumb编译。

Read More