【转】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 (<a href="http://www.arduino.cc" target="_blank">www.arduino.cc</a>)
[ 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
但,你可能遇到类似
<div align="left">* please convert /etc/portage/package.mask to a directory</div>* 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'线程模型:singlegcc 版本 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 中,你需要加入 uucp 和 dialout 用户组。然后,你应该重新登录,来保证权限修改一定生效。
# usermod -aG uucp <用户>
# usermod -aG dialout <用户>
Workaround for SystemdArduino 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!
页:
[1]