找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 31839|回复: 32

使用C语言开发EV3程序(原创,转载请注明出处)

    [复制链接]
发表于 2016-9-6 23:07:12 | 显示全部楼层 |阅读模式


转眼在坛子里逛了大半年了,接触Lego的目的很简单也很单纯,儿子喜欢。为了让儿子觉得他老爸还是很棒的,所以就开始了Lego之旅。其实坛子里抱有我这样目的的人还有很多。从论坛里得到过很多热心人的帮助,也跟很多人讨论过技术,这个过程让人很愉悦。刚接触时,对EV3G很不习惯,幸亏了论坛老大们翻译的编程艺术艺术,让我在儿子的面前树立了高大的形象,辅导他写出了贪食蛇。但作为一个专业的程序员(现在程序写的越来越少了),还是想更深层次的了解EV3。好在EV3的系统是开源的,研究过一阵之后,因为工作时间的原因一度放弃,到现在还欠下ntwuhui老兄的一篇如何编译自己的固件的文章,不是不想写,而是太耗时间,因为工作原因目前很难成行。并且自己愿意尝试,但想事后再整理出来确实很难,借此向ntwuhui说声抱歉,也谢谢您曾经的帮助。


在论坛里,很多人对用C或者C++来写EV3程序很感兴趣,但是苦于没有好的工具来实现。BricxCC停止开发了,RobotC需要购买(因为工作关系,我很少使用盗版软件)。EV3使用的是linux系统,所以只要是C写的程序理论上都可以运行,但问题是EV3的程序运行在自己的虚拟机上,目前我们看到的Smallbasic扩展,EV3G都是将自己的程序翻译成Bytecodes,然后编译运行的。现在的问题转变为如何写一个Lego-VM程序,通过该程序来运行我们的C程序。通过查阅资料发现,Lego-VM可以通过SYSTEM函数来调用外部程序。


所以我们可以写如下的代码,来生成一个rbf程序,通过该程序来调用c生成的elf程序:


vmthread MAIN


{


   DATA32 Timer


   DATA32 Status


   SYSTEM("/home/root/lms2012/prjs/BrkProg_SAVE/Test.elf",Status)


   TIMER_WAIT(10000,Timer)


   TIMER_READY(Timer)


}


为自己找到的方法兴奋不已,编译通过,可以执行(因为编译过自己的固件,所以把这段代码直接放到编译固件的makefile里,很快得到我想要的结果。),但是有没有更加简单的方法呢?通过在网上查找,发现了原来老外已经实现了一个工具,原来我苦苦探索的方法,人家已经有实现了。啰嗦了半天,下面才进入正式的主题。


C4ev3-基于Eclipse的免费C/C++程序开发包,可从如下地址下载(http://c4ev3.github.io/)。在该页面有两个下载包,一个是带GCC的windows安装包,一个是不带GCC的,个人建议下载带GCC的,省得你再去下载CodeSourcery Lite。



如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
 楼主| 发表于 2016-9-6 23:19:19 | 显示全部楼层
本帖最后由 ssgzhl 于 2016-9-12 12:57 编辑

环境搭建很简单,
1.         先下载并安装Eclipse(http://www.eclipse.org/),安装时选择Eclipse IDE for C/C++ Developers,其实用别的也行。
1.png

2.安装c4ev3(http://c4ev3.github.io/),双击c4ev3-withGCC-setup.exe进行安装,默认安装即可。如果你下载的是带GCC的安装包,接下来会自动安装CodeSourcery Lite。

一路默认,到Choose install Folder时,我选择了自定义,这是多年养成的习惯,不太习惯于开发工具的目录有空格和中文。我安装在C:\CSLite目录里。继续下一步。
2.png


3. 接下来选择Eclipse安装目录,这边需要注意新的Eclipse安装时会将CPP,Java安装到不同的目录里,所以我们需要选择cpp-neon下的eclipse目录,该目录下存在plugins子目录。另外注意,我用老的Eclipse的时候最后生成EV3项目时不能选择Toolchain目录。应该是存在一个BUG所以建议安装最新版本的Eclipse。
3.png

4.打开Eclipse,File->New->CProject

4.png

5. 输入项目名称,项目类型选择Hello World EV3 project,Toolchains选择CrossARM/EV3 GCC。

5.png

6,选择Upload Path。不过我后面测试,发现上传不了,所以我通过Small Basic的EV3Explorer创建目录上传文件。

6.png

6.打开start.lms文件,这个文件就是我们上面说的启动文件,通过该文件调用我们的C程序。

7.png

该文件默认将rbf文件和elf文件放置在不同的位置,我们做如下修改,这样我们就可以将启动文件和c程序放置到同一目录中了。

define starter '${brick}/../${projectName}/${projectName}.rbf'

define elfexec '${brick}/../${projectName}/${projectName}.elf'


7. 打开src目录下的EV3Test.c文件,写代码。
8.png


8.更改配置文件为Release,可不做修改。

9.png

9.右击项目,选择Build Project.编译项目。
10.png


10.编译完成后会在Release目录里生成编译好的elf文件:

11.png

11. 点击EV3的图标上传程序到EV3。
12.png


这边测试有时成功有时不成功。如果上传没有成功,刷新你的myapps目录,你会发现虽然上传没成功,但是lms文件被编译了,生成了rbf文件。
13.png
12.打开EV3Explorer,如果没有,创建一个新的目录我的测试目录为EV3Test
14.png

在本地里找到我们刚刚生成的rbf和elf文件,上传到EV3Test。
15.png


最后的结果应该如下图:

16.png

到EV3上,运行你的C程序吧。
17.png





希望大家能通过该文档打开通往EV3的另外一扇门。另外我知道论坛有嵌入式的高手,大家可以一起来移植一些无线网卡驱动,造福大家。


评分

参与人数 2乐币 +110 人气 +10 收起 理由
alex_cn + 10
ntwuhui + 100 + 10 中文乐高有你更精彩:)

查看全部评分

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 4 0

使用道具 举报

发表于 2016-9-7 02:40:22 | 显示全部楼层
不错,就是交叉编译.支持那些库呢?
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 1 0

使用道具 举报

 楼主| 发表于 2016-9-7 08:53:58 | 显示全部楼层
alex_cn 发表于 2016-9-7 02:40
不错,就是交叉编译.支持那些库呢?

可以参考Sourcery G++ Lite帮助,或者你可以自己编译你需要的库
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2016-9-7 10:23:50 | 显示全部楼层
本帖最后由 laoyaoguai 于 2016-9-7 10:26 编辑

狗尾续貂一把,mac上也能用
看了楼主的贴,很兴奋啊。只是我用mac,需要琢磨一番,很多都是手动操作,关键问题请教了楼主,终于搞定了。
Eclipse有mac版的,可以在官网下载。下载,解压,扔应用程序目录
接下来是工具链,http://www.carlson-minot.com/available-arm-gnu-linux-g-lite-builds-for-mac-os-x下载安装即可
然后是c4ev3的plugin,https://github.com/c4ev3/EV3-Eclipse-Plugin/releases/download/1.0/de.h-ab.ev3plugin_1.7.2.201605311139.jar ,下载之后放到Eclipse/Contents/Eclipse/dropins目录
最后是api,https://github.com/c4ev3/EV3-API,别进那个目录一个一个文件地下哈,点clone or download按钮,download zip,下载解压,把API目录拷到一个你认为方便到目录

环境就搭好了,运行Eclipse,新建C project,选Hello World EV3 Project,Toolchains选Cross ARM/EV3 GCC, Next
c4ev3-1.jpg
这里,API path选择你刚才放API的目录,Next,Next
c4ev3-2.jpg
这里,Toolchain path设置成/usr/local/carlson-minot/crosscompilers/bin,至于EV3 Uploader我也偷个懒改天再研究哈。Finish!
编译通过!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2016-9-7 13:27:58 | 显示全部楼层
laoyaoguai 发表于 2016-9-7 10:23
狗尾续貂一把,mac上也能用
看了楼主的贴,很兴奋啊。只是我用mac,需要琢磨一番,很多都是手动操作,关键 ...

刚刚测试了,如果项目文件夹存在,则可以上传成功,比如我的项目名称是EV3Test,则在EV3主机上也对应的存在该目录。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2016-9-7 13:58:53 | 显示全部楼层
本帖最后由 ssgzhl 于 2016-9-7 14:16 编辑

接上,如果大家不想使用EV3Explorer或者EV3G,我们还可以使用ev3duder来上传文件,该文件存在与C:\ev3\uploader\ev3duder.exe。

在Windows命令行模式下,切换到C:\ev3\uploader\目录,执行ev3duder/?可以得到该文件的使用帮助。
USAGE: ev3duder [ --tcp | --usb | --serial ] [=dev1,dev2]
                [ up loc rem | dl rem loc | rm rem | ls [rem] |
                  mkdir rem | mkrbf rem loc | run rem | exec cmd |
                  wpa2 SSID [pass] | info | tunnel ]
       rem = remote (EV3) path, loc = local path, dev = device identifier

up     upload local file to remote ev3 brick
dl     download remote file to local system
rm     remove file on ev3 brick
ls     list files. Standard value is '/'
info   attempt a beep and print information about the connection
mkdir  create directory. Relative to path of VM.
mkrbf  create rbf (menu entry) file locally. Sensible upload paths are:
                ../prjs/BrkProg_SAVE/ Internal memory
                ../prjs/BrkProg_DL/ Internal memory
                ./apps/ Internal memory - Applicatios (3rd tab)
                /media/card/myapps/ Memory card
                /media/usb/myappps/ USB stick
run     instruct the VM to run a rbf file
exec    pass cmd to root shell. Handle with caution
wpa2    connect to WPA-Network SSID, if pass isn't specified, read from stdin
tunnel  connects stdout/stdin to the ev3 VM

通过该帮助文件,我们发现可以通过ev3duder在EV3主机上创建目录,上传文件,下载文件。
做如下操作:
列出prjs下所有项目
ev3duder.exe ls /home/root/lms2012/prjs
创建一个新的文件夹,如下命令创建一个EV3Test的文件夹:
ev3duder.exe mkdir /home/root/lms2012/prjs/EV3Test
上传文件到新创建的文件夹,这边要注意两点,
       1.EV3主机目录分割只能是有/,不能使用\:
       2.EV3主机目录一定要指定具体文件名,不能只指定目录,如下面命令中年的EV3Test.rbf
ev3duder.exe up C:\Users\sshen\workspace\EV3Test\myapps\EV3Test.rbf /home/root/lms2012/prjs/EV3Test/EV3Test.rbf
ev3duder.exe up C:\Users\sshen\workspace\EV3Test\Release\EV3Test.elf /home/root/lms2012/prjs/EV3Test/EV3Test.elf
这样我们就将我们编译好的程序上传到EV3主机上了。
同样该命令还有很多别的操作,大家可以自己动手尝试一下。
大家可以写一个脚本文件来一键上传。

Eclipse的上传也是调用该命令进行上传的。

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 1 0

使用道具 举报

 楼主| 发表于 2016-9-7 14:34:48 | 显示全部楼层
在上面我们提到Eclipse有时上传成功,有时上传不成功。主要是由于lms的定义问题。这两句话定义里,${projectName},也即我们在Eclipse里新建的项目名称。
${brick}                 = /home/root/lms2012/prjs/BrkProg_SAVE 默认的项目在EV3上保存的位置。所以在我们上传时,uploader会使用这边的设置,在EV3上创建文件夹,并上传文件。昨天有时成功有时不成功应该是我的EV3G打开忘记关了。
define starter '${brick}/../${projectName}/${projectName}.rbf'
define elfexec '${brick}/../${projectName}/${projectName}.elf'
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2016-9-9 14:22:07 | 显示全部楼层
好帖子,收藏了慢慢琢磨~~~
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2016-9-11 11:50:07 | 显示全部楼层
我也一直在用Mac,虽然给儿子准备了一台Windows的笔记本,但是我还是想让他多接触一下各种不同的系统。今天能看到这篇帖子真是一场及时雨,Windows和Mac的配置都有了。谢谢楼主及楼上各位!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2017-11-30 23:59:52 | 显示全部楼层
其实我想知道如何交叉编译,eclipse是编辑环境,我的想法是直接用编辑器比方vim,写好代码,然后写好makefile文件,编译出结果来。
哪位有这方面的经验? 无论是windows还是linux都可以。
这样的话,就比较简洁了,将精力集中到开发上去。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2018-1-9 11:38:36 | 显示全部楼层
好帖,学习了
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2018-4-24 08:32:21 | 显示全部楼层
标记下,以后再来学习
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2018-4-24 10:21:20 | 显示全部楼层
EV3使用的是linux系统,所以只要是C写的程序理论上都可以运行,但问题是EV3的程序运行在自己的虚拟机上,目前我们看到的Smallbasic扩展,EV3G都是将自己的程序翻译成Bytecodes,然后编译运行的。现在的问题转变为如何写一个Lego-VM程序,通过该程序来运行我们的C程序。通过查阅资料发现,Lego-VM可以通过SYSTEM函数来调用外部程序。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2018-4-27 16:26:48 | 显示全部楼层
安装c4ev3(http://c4ev3.github.io/)下载不了,打不开下载链接
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-4-20 19:05 , Processed in 0.123664 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表