比尔盖子 博客

Arduino 开发环境在 Gentoo/Systemd 下的搭建

虽说 Gentoo 下的嵌入式开发,有着 Crossdev 神器,避免自己粗制滥造工具链,使最纠结的交叉编译问题消失。但是,今天入手 Arduino Uno,搭建开发环境的时候,还是遇到了太多问题。尤其是我使用 Systemd,导致了更多 Bugs 发生。

本文对我配置开发环境的过程,和可能的错误、陷阱的解决方法,一一记录。

内核配置

Device Drivers  --->
    USB support  --->

        *** USB Device Class drivers ***
        USB Modem (CDC ACM) support

        *** USB port drivers ***
        USB Serial Converter support  --->
            USB FTDI Single Port Serial Driver

无论是编译进内核也好,编译成模块也罢,反正这两项配置是开启的。

完成这个工作之后,连接 Arduino UNO 的 USB 数据线,Arduino UNO 的绿色 LED 应该长亮。在 dmesg 中应该可以看到类似这样的信息。

[  991.420250] usb 5-1.3: New USB device found, idVendor=2341, idProduct=0043
[  991.420252] usb 5-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=220
[  991.420253] usb 5-1.3: Manufacturer: Arduino (www.arduino.cc)
[  991.420253] usb 5-1.3: SerialNumber: 75331333939351804152
[  991.420522] cdc_acm 5-1.3:1.0: ttyACM0: USB ACM device

恭喜你,内核部分已经配置完成。并且,你也知道了你的 USBtty 的设备文件。在我这里,你可以看到是 ttyACM0,可能在你的机器上会有所不同。

安装 Arduino IDE

这个 IDE 是用 Java 编写的,可使用 emerge arduino 直接安装。如果出现有关 package.license 或者 package.use 等需要修改的地方,只需要用常规手段修改即可。我相信每一个 Gentooer 都是会的。

构建工具链

等等,如果你现在打开 IDE,你会发现缺少编译器,无法编译。所以,你需要构建工具链。

在嵌入式开发中,打造交叉编译器是一个挑战。你自己可能有过花费一天,手工粗制滥造一个勉强可用的编译器,然后把二进制保存,不再动它,一直使用至今的经历。不过,Gentoo 的 Crossdev 神器,可以帮助我们打造整洁的工具链。

修改配置文件,防止编译失败

我在构建工具链的时候,遇到了 CFLAGS 导致编译不通过的 Bug。因此,请修改你的 /etc/portage/make.conf(如果你是个老古董,你可能会打开 /etc/make.conf),把里面涉及到各种 FLAGS 的部分,全都改成最简单的,以防止交叉 gcc 不识别某些 FLAGS。比如我用的:

CFLAGS="-O2 -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"
# CPPFLAGS="${CFLAGS}" 这个 CPPFLAGS 本来就不应该存在

这只是一个暂时性修改。你可以把原来的 FLAGS 注释掉,等工具链构建完成后,再恢复原本的工具链。

正式开工

一切都非常简洁。

crossdev -s4 avr

但,你可能遇到类似

 * please convert /etc/portage/package.mask to a directory
 * If you file a bug, please attach the following logfiles:
 * /var/log/portage/cross-avr-info.log

的错误信息。解决方法就如它所说的,新建一个目录 /etc/portage/package.mask,然后把原来的 package.mask 文件移动进去,还可以改名字。你可能需要将很多配置转换成目录。

实际上,即使你不使用 crossdev,也建议你把配置文件转换成目录。这样,你可以把不同类别的软件放到不同的文件中。crossdev 就是利用这点,避免配置污染的。

如果出现

!!! WARNING - Cannot auto-configure CHOST avr
!!! You should edit /usr/avr/etc/portage/make.conf
!!! by hand to complete your configuration

的警告,大可无视掉。由于需要构建 gcc 的三个 stage,和 libc,耗时可能较长。

编译完成后,简单检查一下。

# avr-gcc -v
使用内建 specs。
COLLECT_GCC=/usr/x86_64-pc-linux-gnu/avr/gcc-bin/4.8.1/avr-gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/avr/4.8.1/lto-wrapper
目标:avr
配置为:/var/tmp/portage/cross-avr/gcc-4.8.1-r1/work/gcc-4.8.1/configure --prefix=/usr (省略)
p1.2, pie-0.5.7'
线程模型:single
gcc 版本 4.8.1 (Gentoo 4.8.1-r1 p1.2, pie-0.5.7) 

我是激进分子,整个系统使用的都是最新版本的 gcc。Portage 默认不会允许你这样做,因此你的版本可能比我的老旧一些,但也足够新了。如果输出正常,你可以恢复原本的 CFLAGS。

Hack 路径

有时,编译程序时会提示找不到一些文件,因此需要一些额外的 Hack。

为了防止出现 /usr/libexec/gcc/avr/ld: cannot open linker script file ldscripts/avr5.x: No such file or directory 错误,你需要

ln -s /usr/lib/binutils/avr/2.23.2/ldscripts /usr/avr/lib/ldscripts 

请注意,这里的 2.23.2 是计算机中 binutils 的版本,你安装的并不一定是此版本,需要进行相应的替换。使用 ls /usr/lib/binutils/avr 检查你究竟使用的是何种版本的 binutils

为了防止出现 /usr/libexec/gcc/avr/ld: cannot find crtm328p.o: No such file or directory 错误,你需要

ln -s /usr/avr/lib/avr5/crtm328p.o /usr/avr/lib/crtm328p.o

升级 binutils 版本后,需要删除原来的链接,重新链接到新版本。

配置

读写 tty 这种底层的操作,需要一些特殊的权限。在 Gentoo 中,你需要加入 uucpdialout 用户组。然后,你应该重新登录,来保证权限修改一定生效。

# usermod -aG uucp <用户>
# usermod -aG dialout <用户>

Workaround for Systemd

Arduino IDE 需要创建 Lock File 到 /run/lock。允许任何用户向这里写入文件,是相当大的安全问题。因此,只要加入了 uucp,那么你就有权读写它。对于 OpenRC 的使用者,一切都工作的很好。因此,请跳过这个小节。

但不幸的是,Systemd 对 /run/lock 的权限设置不正确。只有 root 才有权读写它。但如果直接修改这个目录的权限,你会发现权限会在重启后被重置,因为这个目录是由 Systemd 的 systemd-tmpfiles-setup.service 自动生成的。因此,我们需要编辑相关的配置文件。

用你喜欢的编辑器,打开 /usr/lib/tmpfiles.d/gentoo-run.conf,将其中的

d /run/lock 0755 root root -

修改成

d /run/lock 0775 root uucp -

然后重新启动计算机。新的权限规则就会生效。

启动 IDE

现在,你可以打开 Arduino IDE。如果你遇到问题,你应该在命令行中运行 arduino,查看是否有错误信息。如果你已经按照上面的方法配置,则应该一切正常。

排除错误

否则,如果你遇到

check_group_uucp(): error testing lock file creation Error details:权限不够check_lock_status: 
No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL

检查你是否在 uucp 用户组中,并使用 ls -l /run | grep lock,看看权限是否为

drwxrwxr-x root uucp lock/

如果不是,请检查你是否正确的使用的我的方法解决问题。

如果一切正常,IDE 中应该允许你编译、上传程序。Tools -> Serial Port 这个菜单应该是正常的,而非灰色冻结状态,否则从命令行启动 IDE,排除故障。

至于该选择哪个 Serial Port,你应该在最初的《内核配置》部分,已经用 dmesg 看到了,至于 Tools -> Programmer,我选择的是 USBtinyISP,对我而言工作正常。

字体平滑

OpenJDK/IcedTea 默认的字体平滑选项存在问题,如果你看到的字体毛刺很多,很难阅读,尝试使用你喜欢的编辑器,以 root 打开 /usr/bin/arduino,把

export _JAVA_OPTIONS="-Dawt.useSystemAAFontSettings=on"

插入到脚本第二行,以便让 Java 打开字体平滑。这个方法的问题是,每当 Arduino IDE 更新,你的修改会被覆盖,你必须重新修改此文件。

值得一提的是,这个方法可以解决多种程序的字体问题,所以你可以考虑把它加入你自己用户的 .profile.xprofile 等全局性的文件中。

这时候,你的字体应该有了改善,不过,你会发现最重要的代码编辑器字体仍然无法阅读。你需要用你喜欢的编辑器,打开 ~/.arduino/preferences.txt,把其中的

editor.antialias=false

改为

editor.antialias=true

保存后。再打开 IDE,字体应该有了很大改善。

结束

现在,你应该可以愉快的进行你的 Arduino 开发工作。

Happy Hacking!

Categories: IT生活, Linux

流缓冲影响父子进程通讯的问题 » « 令人纠结的代码重用

2 Comments

  1. crossdev 毁掉了我的 Funtoo QAQ

发表评论

Your email address will not be published.

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax

Copyright © 2017 比尔盖子 博客

匿名浏览:http://x4wttqqrkud5pttgqlpxgevtr4rbqpa6lkwdiw3o3m6q4deeldgq.b32.i2p
警告:残留有明网混合资源,访问前请自行屏蔽明网流量

Theme by Anders NorenUp ↑