6859| 0
|
[项目] 【转】Arduino 开发环境在 Gentoo/Systemd 下的搭建 |
虽说 Gentoo 下的嵌入式开发,有着 Crossdev 神器,避免自己粗制滥造工具链,使最纠结的交叉编译问题消失。但是,今天入手 Arduino Uno,搭建开发环境的时候,还是遇到了太多问题。尤其是我使用 Systemd,导致了更多 Bugs 发生。 本文对我配置开发环境的过程,和可能的错误、陷阱的解决方法,一一记录。 内核配置
无论是编译进内核也好,编译成模块也罢,反正这两项配置是开启的。 完成这个工作之后,连接 Arduino UNO 的 USB 数据线,Arduino UNO 的绿色 LED 应该长亮。在 dmesg 中应该可以看到类似这样的信息。
恭喜你,内核部分已经配置完成。并且,你也知道了你的 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。比如我用的:
这只是一个暂时性修改。你可以把原来的 FLAGS 注释掉,等工具链构建完成后,再恢复原本的工具链。 正式开工 一切都非常简洁。
但,你可能遇到类似
的错误信息。解决方法就如它所说的,新建一个目录 /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 配置为:/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 错误,你需要
请注意,这里的 2.23.2 是计算机中 binutils 的版本,你安装的并不一定是此版本,需要进行相应的替换。使用 ls /usr/lib/binutils/avr 检查你究竟使用的是何种版本的 binutils。 为了防止出现 /usr/libexec/gcc/avr/ld: cannot find crtm328p.o: No such file or directory 错误,你需要
升级 binutils 版本后,需要删除原来的链接,重新链接到新版本。 配置 读写 tty 这种底层的操作,需要一些特殊的权限。在 Gentoo 中,你需要加入 uucp 和 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,将其中的
修改成
然后重新启动计算机。新的权限规则就会生效。 启动 IDE 现在,你可以打开 Arduino IDE。如果你遇到问题,你应该在命令行中运行 arduino,查看是否有错误信息。如果你已经按照上面的方法配置,则应该一切正常。 排除错误 否则,如果你遇到
检查你是否在 uucp 用户组中,并使用 ls -l /run | grep lock,看看权限是否为
如果不是,请检查你是否正确的使用的我的方法解决问题。 如果一切正常,IDE 中应该允许你编译、上传程序。Tools -> Serial Port 这个菜单应该是正常的,而非灰色冻结状态,否则从命令行启动 IDE,排除故障。 至于该选择哪个 Serial Port,你应该在最初的《内核配置》部分,已经用 dmesg 看到了,至于 Tools -> Programmer,我选择的是 USBtinyISP,对我而言工作正常。 字体平滑 OpenJDK/IcedTea 默认的字体平滑选项存在问题,如果你看到的字体毛刺很多,很难阅读,尝试使用你喜欢的编辑器,以 root 打开 /usr/bin/arduino,把 [mw_shl_code=applescript,true]export _JAVA_OPTIONS="-Dawt.useSystemAAFontSettings=on"[/mw_shl_code] 插入到脚本第二行,以便让 Java 打开字体平滑。这个方法的问题是,每当 Arduino IDE 更新,你的修改会被覆盖,你必须重新修改此文件。 值得一提的是,这个方法可以解决多种程序的字体问题,所以你可以考虑把它加入你自己用户的 .profile,.xprofile 等全局性的文件中。 这时候,你的字体应该有了改善,不过,你会发现最重要的代码编辑器字体仍然无法阅读。你需要用你喜欢的编辑器,打开 ~/.arduino/preferences.txt,把其中的
改为
保存后。再打开 IDE,字体应该有了很大改善。 结束 现在,你应该可以愉快的进行你的 Arduino 开发工作。 Happy Hacking! |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed