Model Me, Model World

Model Me, Model World

Blayground

分享文件的各种姿势

1. 实验板连接图

The picture is lost in the juggernaut of history

  1. Acadia 一块,远程 Linux 服务器一台,Windows 笔记本一台
  • 网线一根
  • 5V 直流电源
  • microUSB 线

配置各种串口工具,目的是取代 PuTTY

  1. 尝试使用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 机器上下载文件,同时尝试上传文件。

  1. 首先apt-get install smbclient
  • 在等待安装过程中顺便配置一下 Windows
    1. 先设置好 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 2014

ls 看下发现本电子书,那就下载试试。

  • 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

挂载法

  1. 安装依赖包apt-get install sshfs
  2. 建立挂载点mkdir /mnt/sshfs-mnt
  3. 挂载远程服务器sshfs user@____.tao-j.com:taoj /mnt/sshfs-mnt/
    • 远程 Linux 服务器安装有sshd就能直接被连接,十分之方便。
  4. 查看挂载效果
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 rb

minicom -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.300000

c.测试包含 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: 3

4. 本地工具链配置

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

Blog maintained by Tao J

No longer hosted on GitHub Pages — Theme by mattgraham