Model Me, Model World
Blayground
分享文件的各种姿势
1. 实验板连接图

- Acadia 一块,远程 Linux 服务器一台,Windows 笔记本一台
- 网线一根
- 5V 直流电源
- microUSB 线
配置各种串口工具,目的是取代 PuTTY
- 尝试使用
screen连接/dev/ttyS#不知道传什么参数才能正确打开串口。
- 下载
minicom源码,并且make install(依赖libiconv-devel-libncurses-devel),结果一开Ctrl+A组合键minicom就崩溃。 - 无奈之下只好开启一台 OpenBSD 虚拟机,把 USB 串口转到虚拟机里。使用
pkg_add安装minicom,并发现用 jaist 镜像比较快些。
2. 文件传递服务配置
a. Samba
Acadia 作为客户端
这部分实验的目的是开发板作为客户端,从一台作为 Samba 服务器的 Windows 机器上下载文件,同时尝试上传文件。
- 首先
apt-get install smbclient
- 在等待安装过程中顺便配置一下 Windows
- 先设置好 Windows 的计算机名称,我的电脑右键属性,然后更改计算机名,假设改成 YIF。
- 然后运行
lusrmgr.msc添加一个新用户,同时设定一个密码,比如叫做 sambc,密码是 12345。 - 之后在想分享的文件夹(比如叫做
temp)上右键属性,先给用户 sambc 添加可读权限,如需写权限,也在这儿添加。之后再点击分享那一栏,点击高级共享,里面也有一个权限,也设置下。这个设置的是共享权限,前面设置的是 NTFS 权限。客户端访问这个文件夹的时候会分别经过这两次鉴权。
- 这时候在开发板上输入
smbclient //YIF/temp -Usambc%12345然后就能入服务器了。
root@Acadia:~# smbclient //YIF/temp -Usambc%12345
Domain=[YIF] OS=[Windows 8.1 Pro 9600] Server=[Windows 8.1 Pro 6.3]
smb: \> ls
A Feast Dance for with Crows Dragons.pdf A 6159950 Fri Jun 27 00:04:56 2014ls 看下发现本电子书,那就下载试试。
- 用
mget下载,同时看下本地就存在这个文件了。
smb: \> mget A*for*with*
Get file A Feast Dance for with Crows Dragons.pdf? y
getting file \A Feast Dance for with Crows Dragons.pdf of size 6159950 as A Feast Dance)
smb: \> !ls
A Feast Dance for with Crows Dragons.pdf Arduino here setdate.sh vga.v- 用
mput上传,道理是一样的,sambc 用户在服务器的写权限一定得设置好。
b. SFTP
挂载法
- 安装依赖包
apt-get install sshfs - 建立挂载点
mkdir /mnt/sshfs-mnt - 挂载远程服务器
sshfs user@____.tao-j.com:taoj /mnt/sshfs-mnt/- 远程 Linux 服务器安装有
sshd就能直接被连接,十分之方便。
- 远程 Linux 服务器安装有
- 查看挂载效果
root@Acadia:~# ls /mnt/sshfs-mnt/
Cx hello.c myapp test-dns-m-p.py hs readme.txt ucblogo.sea.hqx
manual.pdf sd_image.xz ucblogo53.sea.bin上传下载文件就像在本地操作一样,十分方便。
直连法
直接sftp user@____.tao-j.com便能访问了。
连上后sftp>提示符后输入命令即可。put get分别是上传下载。
c. X/Y/ZModem 以及 c/g-kermit
上位机设置
使用包管理安装串口应用程序(这里给出 OpenBSD 的例子)pkg_add -i minicom。
在 OpenBSD 包管理系统中,安装时会连带lrzsz一起装好。但是 minicom 初始设置是调用sx而不是lsx,因此,直接做好软连接,免去在 minicom 中修改的麻烦。
cd /usr/local/bin
# ln -s lsb sb
# ln -s lsz sz
# ln -s lsx sx
# ln -s lrx rx
# ln -s lrz rz
# ln -s lrb rbminicom -s进入配置页面。将端口设备改成/dev/ttyU_,同时修改合适的波特率校验位等,关闭硬件流控制。设施好 X/Y/ZModem 接受和发送文件的位置。回到主菜单,选择保存成dfl。
开发板设置
直接安装程序即可apt-get install lrzsz装完以后 X/Y/ZModem 发送和接收都有了。
顺便提一下kermit,其包名称为ckermit。不过得去 Debian 的源才能下载到除了 x86 架构以外的预编译包。
文件传输
使用串口连接上后 Acadia 上运行sx a.out。意思就是用 XModem 发送a.out这个文件。
同时 minicom 里使用Ctrl-A R来接受文件。成功传送后收到的文件会在起初设置的地方。
- 上位机发出传送请求
root@Acadia:~# sx a.out
Give your local XMODEM receive command now.- minicom 中调用接收端,
Ctrl-A R
┌─────────────[xmodem download - Press CTRL-C to quit]────────────┐
│ │
│rx: ready to receive a.out │
│Bytes received: 7808 BPS:2485 │
│ │
│Transfer complete │-
发送文件的话也类似 ,开发板内运行
rx filename,然后Ctrl-A S,会跳出一个对话框,选择一个文件按下空格,再按回车就开始传输了。 -
minicom 里面有 x/y/zmodem 可选,速度 zmodem 最快。
-
OpenBSD 的是 c-kermit,Ubuntu 包管理下载到的是 g-kermit,试了下发送和接受,直接内核给搞爆炸了,估计主机是 Linux 可能会好些吧。
传输方式比较
| 方式 | 身份验证 | 传输加密 | 速度 | 安全 | 备注 |
|---|---|---|---|---|---|
| Samba | + | - | + | * | |
| SFTP | + | + | + | + | 当作文件系统挂载之后十分方便 |
| ZModem | * | * | - | * | ZModem 是协议上的协议,因此验证加密等取决于下层协议 |
3. 配置交叉编译环境并验证结果
a. 基本测试
在 Linux 服务器上安装交叉编译器,依赖包见附件。
sudo apt-get install gcc-arm-linux-gnueabihf
编辑并编译一个 C 文件
ying@d-mint ~/taoj $ emacs hello.c
ying@d-mint ~/taoj $ arm-linux-gnueabihf-gcc hello.c查看 ELF 文件头,确信编译出来的二进制代码是给 ARM 架构用的。
ying@d-mint ~/taoj $ readelf -h a.out
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x8315
Start of program headers: 52 (bytes into file)
Start of section headers: 4544 (bytes into file)
Flags: 0x5000402, has entry point, Version5 EABI, hard-float ABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 9
Size of section headers: 40 (bytes)
Number of section headers: 30
Section header string table index: 27这时候把编译生成的二进制代码scp传送到开发板子里。
输入./a.out运行
ying@d-mint ~/taoj $ scp a.out root@222.205.49.12:~/
a.out 100% 8346 8.2KB/s 00:00
ying@d-mint ~/taoj $ ssh root@222.205.49.12
root@Acadia:~# ./a.out
This is the simplest cross-compilation environment I've ever set-up.b.测试包含浮点运算的交叉编译结果
#include <stdio.h>
main () {
printf("%f\n %lf\n",
(float)1.1 + (float)2.2,
1.1+2.2);
return 0;
}交叉编译后上传运行
root@Acadia:~# ./float.out
3.300000
3.300000c.测试包含 STL 库的 C++程序
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> first;
std::vector<int> second;
std::vector<int> third;
first.assign (7,100); // 7 ints with a value of 100
std::vector<int>::iterator it;
it=first.begin()+1;
second.assign (it,first.end()-1); // the 5 central values of first
int myints[] = {1776,7,4};
third.assign (myints,myints+3); // assigning from array.
std::cout << "Size of first: " << int (first.size()) << '\n';
std::cout << "Size of second: " << int (second.size()) << '\n';
std::cout << "Size of third: " << int (third.size()) << '\n';
return 0;
}
交叉编译后上传运行
root@Acadia:~# ./stl.out
Size of first: 7
Size of second: 5
Size of third: 34. 本地工具链配置
C/C++
apt-get install g++
编译上面交叉编译的源码,正确执行。
###Python
root@Acadia:~# python
Python 2.7.3 (default, Apr 21 2012, 01:05:55)
[GCC 4.6.3] on linux2能够直接import antigravity,说明函数库也正常。
Java
apt-get install openjdk-6-jdk
直接上传一个在别的机器上编译的到的.class文件
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World");
}
}java Helloword然后送出了异常。
发现服务器上javac是 1.7 然后板子上java是 1.6。
那么反过来,用javac1.6 编译出 class 文件,然后放到用java1.7 的虚拟机跑。
这下就正确了。
当然,开发板本地的javac 1.6 编译然后java1.6 的虚拟机跑,当然没问题。
5.远程桌面
VNC
Linux 下无论怎么选,VNC 还是最主流的方法,本地开 X window server 虽然也行,但是效率实在不行。因此安装x11vnc。
结果发现板子上已经带有这个服务了,而且是一直启动着的。
ps auxxxxx | grep auth看一下就能发现其中玄机。
x11vnc -display :0 -auth /var/run/lightdm/root/:0 -forever -bg -o /var/log/x11vnc.log -rfbauth /etc/x11vnc.pass -rfbport 5900解释一下就是端口 5900,即使客户端断开也一直运行(一般客户端断开x11vnc也会退出工作,不过有个密码文件。
这个密码文件里不知道存了一个什么密码,干脆就直接覆盖掉好了。
root@Acadia:~# x11vnc -storepasswd password /etc/x11vnc.pass这样一来新密码就是 password 了。
随便找一个 VNC 客户端直接连上 5900 端口就能看到图形界面。

装一个 GUI IDE
比较讨厌 eclipse,那就装一个 Code::Blocks 得了,搜一下果然有。
root@Acadia:~# apt-cache search "code*block*"
codeblocks - Code::Blocks integrated development environment (IDE)
codeblocks-common - common files for Code::Blocks IDE
....VNC 里点击开始->编程->四个方块图标,这样就打开能用了。
附件:C/C++交叉编译依赖包
C 依赖
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
binutils-arm-linux-gnueabihf cpp-4.8-arm-linux-gnueabihf
cpp-arm-linux-gnueabihf gcc-4.8-arm-linux-gnueabihf
gcc-4.8-arm-linux-gnueabihf-base gcc-4.8-multilib-arm-linux-gnueabihf
libasan0-armhf-cross libatomic1-armhf-cross libc6-armel-armhf-cross
libc6-armel-cross libc6-armhf-cross libc6-dev-armel-armhf-cross
libc6-dev-armel-cross libgcc-4.8-dev-armhf-cross libgcc1-armhf-cross
libgomp1-armhf-cross libsfasan0-armhf-cross libsfatomic1-armhf-cross
libsfgcc-4.8-dev-armhf-cross libsfgcc1-armhf-cross libsfgomp1-armhf-cross
linux-libc-dev-armel-cross
Suggested packages:
binutils-doc gcc-4.8-locales cpp-doc gcc-4.8-doc libgcc1-dbg-armhf-cross
libgomp1-dbg-armhf-cross libitm1-dbg-armhf-cross libatomic1-dbg-armhf-cross
libasan0-dbg-armhf-cross libtsan0-dbg-armhf-cross
libbacktrace1-dbg-armhf-cross libquadmath-dbg-armhf-cross automake1.9
libtool gdb-arm-linux-gnueabihf gcc-doc
Recommended packages:
libc6-dev-armhf-cross
The following NEW packages will be installed:
binutils-arm-linux-gnueabihf cpp-4.8-arm-linux-gnueabihf
cpp-arm-linux-gnueabihf gcc-4.8-arm-linux-gnueabihf
gcc-4.8-arm-linux-gnueabihf-base gcc-4.8-multilib-arm-linux-gnueabihf
gcc-arm-linux-gnueabihf libasan0-armhf-cross libatomic1-armhf-cross
libc6-armel-armhf-cross libc6-armel-cross libc6-armhf-cross
libc6-dev-armel-armhf-cross libc6-dev-armel-cross libgcc-4.8-dev-armhf-cross
libgcc1-armhf-cross libgomp1-armhf-cross libsfasan0-armhf-cross
libsfatomic1-armhf-cross libsfgcc-4.8-dev-armhf-cross libsfgcc1-armhf-cross
libsfgomp1-armhf-cross linux-libc-dev-armel-cross
0 upgraded, 23 newly installed, 0 to remove and 62 not upgraded.
Need to get 18.7 MB of archives.
After this operation, 58.5 MB of additional disk space will be used.C++依赖
ying@d-mint ~/taoj $ sudo apt-get install g++-arm-linux-gnueabihf
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
g++-4.8-arm-linux-gnueabihf g++-4.8-multilib-arm-linux-gnueabihf
libc6-dev-armhf-cross libsfstdc++-4.8-dev-armhf-cross
libsfstdc++6-armhf-cross libstdc++-4.8-dev-armhf-cross
libstdc++6-armhf-cross linux-libc-dev-armhf-cross
Suggested packages:
gcc-4.8-doc libstdc++6-4.8-dbg-armhf-cross libsfstdc++6-4.8-dbg-armhf-cross
libsfstdc++6-4.8-dbg-armhf-cross
The following NEW packages will be installed:
g++-4.8-arm-linux-gnueabihf g++-4.8-multilib-arm-linux-gnueabihf
g++-arm-linux-gnueabihf libc6-dev-armhf-cross
libsfstdc++-4.8-dev-armhf-cross libsfstdc++6-armhf-cross
libstdc++-4.8-dev-armhf-cross libstdc++6-armhf-cross
linux-libc-dev-armhf-cross
0 upgraded, 9 newly installed, 0 to remove and 62 not upgraded.
Need to get 9,232 kB of archives.
After this operation, 33.7 MB of additional disk space will be used.
Do you want to continue? [Y/n] y