工作做到这一步,已经和内核密切相关了。在这一节我主要说一下内核是如何编译的,关于内核的编译配置,详细的说明在如下网址 https://github.com/mindboards/ev3sources/wiki/Getting-Started 我这里主要说一下注意事项。 1. 安装ubuntu一定要安装32位的,不要安装64位的,ubuntu16即可,高版本除了界面炫酷一点没有任何好处,我第一次就是安装了64位的系统,然后在上面编译32的程序,各种各样的坑,让我填了半年,最后终于编译出来,还是各种问题不断。后来换成32位的系统立马问题消失了。 2. 如果不想改你电脑的系统,你可以安装一个U盘系统,也挺好用的,不过U盘一定要选3.0接口的U盘,2.0接口的U盘系统慢的不能忍受。 上面两步走对了了之后,基本你就可以愉快的编译了,但是并不代表没有问题。 /projects/lms2012/open_first/执行make如下目标 Execute "make TARGET" where TARGET is: lms2012: to build the lms2012 program and its libraries modules: to build lms2012 kernel modules programs: to build bytecode programs and their data files kernel: to build Linux kernel u-boot: to build u-Boot doc: to build documentation make doc 编译生成帮助说明,你编译时碰到的问题一般能在这里找到答案。 建议首先阅读readme.txt文件 make u-boot 编译嵌入式内核加载程序 make kernel 编译嵌入式linux内核。 make programs 这个我真不知道编译出什么有用的东西,应该是操作系统用的基本程序吧。 make modules 编译驱动,要是想制作乐高兼容设备,可以在这个上面做工作,乐高的硬件定义。当然,自定义算法程序也可以在这里嵌入。 make lms2012 编译主程序,这就是前面说的那个微操作系统了,所有的*.rbf通过它处理。 驱动、LINUX内核,lms2012工程,以及运行程序*.rbf的关系如下图:
在make kernel时可能会报出如下错误 Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373. 起初一头雾水,仔细看了错误提示后发现问题出现在如下文件中,估计是遗传问题/home/book/projects/extra/linux-03.20.00.13/kernel/timeconst.pl 在文件中 373行的 if (!defined(@val)) { 改为if (!@val) { 即可编译通过。 编译后执行文件组装脚本即可生成对应的内核二进制文件。组装脚本主要是将以下三个二进制文件组装成一个二进制文件。 0x0 uBoot 0x50000 uImage linux内核文件 0x250000 EV3.cramfs.bin cramfs映像 组装完成之后的文件即为你经常更新的固件,命名为 EV3-image.*.bin,其中的*为一个时间标签,此内核即可下装到EV3主机当中,当然此固件也可以分解为上面三个文件,并且我已经提供了分解固件的程序和源代码Extract_uImage.zip,当然需要在linux操作系统上运行和编译。编译软eclipse。 将固件下载到EV3主机当中,开机运行,听到嘀的一声,是不是突然有种做上帝的感觉。当然也有可能更新固件失败,导致破坏了一个旧世界,又没有创造新世界。不过也不要着急急,网上有很详细的解决方案,照着做一下,你就会有拯救整个世界的感觉。 EV3从图形化编程到内核编译的思路到这里基本就讲的差不多了,关键是要实践,实践过程中肯定会碰到各种各样的问题,不要担心,因为问题使人进步,但我还是祝你好运!
附固件分解程序下载地址 链接:https://pan.baidu.com/s/1kas53edBp44qB_wgrzqGDw?pwd=euhg
|