虽说 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}"
这只是一个暂时性修改。你可以把原来的 FLAGS 注释掉,等工具链构建完成后,再恢复原本的工具链。
正式开工
一切都非常简洁。
crossdev -s4 avr
如果出现关于
/usr/avr/etc/portage/make.conf
,大可无视掉。由于需要构建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
配置
读写 tty 这种底层的操作,需要一些特殊的权限。在 Gentoo 中,你需要加入
uucp
和dialout
用户组。然后,你应该重新登录,来保证权限修改一定生效。# 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!
文章来源:https://biergaizi.info/archives/2013/10/1750.html