2013-12-5 14:39:02 [显示全部楼层]
5165浏览
查看: 5165|回复: 0

[项目] 【转】Arduino 开发环境在 Gentoo/Systemd 下的搭建

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

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

内核配置
  1. Device Drivers --->
  2. USB support --->
  3. *** USB Device Class drivers ***
  4. USB Modem (CDC ACM) support
  5. *** USB port drivers ***
  6. USB Serial Converter support --->
  7. USB FTDI Single Port Serial Driver
复制代码

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

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

  1. [ 991.420250] usb 5-1.3: New USB device found, idVendor=2341, idProduct=0043
  2. [ 991.420252] usb 5-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=220
  3. [ 991.420253] usb 5-1.3: Manufacturer: Arduino (<a href="http://www.arduino.cc" target="_blank">www.arduino.cc</a>)
  4. [ 991.420253] usb 5-1.3: SerialNumber: 75331333939351804152
  5. [ 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。比如我用的:

  1. CFLAGS="-O2 -pipe -fomit-frame-pointer"
  2. CXXFLAGS="${CFLAGS}"
  3. # CPPFLAGS="${CFLAGS}" 这个 CPPFLAGS 本来就不应该存在
复制代码

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

正式开工
一切都非常简洁。

  1. crossdev -s4 avr
复制代码

但,你可能遇到类似

  1. <div align="left">* please convert /etc/portage/package.mask to a directory</div>* If you file a bug, please attach the following logfiles:
  2. * /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,耗时可能较长。

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

  1. # avr-gcc -v
  2. 使用内建 specs。
  3. COLLECT_GCC=/usr/x86_64-pc-linux-gnu/avr/gcc-bin/4.8.1/avr-gcc
  4. 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 错误,你需要

  1. 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 错误,你需要

  1. ln -s /usr/avr/lib/avr5/crtm328p.o /usr/avr/lib/crtm328p.o
复制代码

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

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

  1. # usermod -aG uucp <用户>
  2. # 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,将其中的

  1. d /run/lock 0755 root root -
复制代码

修改成

  1. d /run/lock 0775 root uucp -
复制代码

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

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

排除错误
否则,如果你遇到

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

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

  1. drwxrwxr-x root uucp 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,把其中的

  1. editor.antialias=false
复制代码

改为

  1. editor.antialias=true
复制代码

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

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

Happy Hacking!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail