ETRD博客

Windows下建立第一个树莓派应用程序

引言

摸索了几天树莓派,基本对其有了一个基本而肤浅的了解,前面已经实现了在Windows下对树莓派进行远程桌面连接,因此我已经迫不及待的希望开始对其进行应用开发了,我牢记着自己的目标,是要在上面实现一个全是C代码的工程,而不是纯粹来玩这么一个小型的电脑,因此相同功能的实现方法我似乎没有太多的选择,我的选择只有一个,就是在上面运行一个C语言的工程。

因此,如何开发在树莓派上运行的C程序,以及用什么IDE(集成开发环境)开发,在什么个系统下开发成了核心的几个问题。

树莓派基础

Raspbian系统

Raspbian是基于Debian Linux的一个系统,因此我理解它就是一个基于Linux的系统,只是针对树莓派这个平台做了相应的优化和修改。Raspbian又分Raspbian Wheezy和Raspbian Jessie两个版本,原因是它们基于的Debian的版本不同,Raspbian Wheezy基于Debian Wheezy,Raspbian Jessie基于Debian Jessie,现在较新的是基于Debian Jessie的Raspbian Jessie系统,我现在的树莓派安装就是这个系统,是3-18号以后的版本。因此我的理解是Linux衍生出了Debian Jessie,Debian Jessie又衍生出了Raspbian Jessie。因此我觉得开发在Raspbian Jessie上运行的应用程序实际上是开发在Linux上运行的应用程序,但很遗憾,我还未曾正式接触过Linux,因此即使弄清楚了这个关系,我也还是从0开始。

目前的开发现状

这几天我不断的在Google树莓派开发的资料,我发现普遍使用的是C语言和Python语言,而这两者中Python又似乎占比比较大,这对我而言似乎不是一个好消息,因为我的代码是C的,而且Python关键我也不会。但也不是很糟,起码C语言用了这么多年还是可以继续用的。因此我又着重看了在不少在用C语言开发树莓派程序的资料,或许是我搜索的关键字还不对,我发现他们的教程里面基本都是在树莓派本身的系统下直接在编写一个C源文件,然后通过终端使用相关指令编译运行。这显然不适合我,如果是只有一个c文件的工程,且这个文件只有十几行代码,我还可以接受,可我的是一个包含几十个c文件的大工程,我如何进行有序的管理?虽然我不是一个程序员,但也写过不代码,这些代码都是在有良好的交互界面IDE下开发的,例如VC6.0,Keil,IAR等,让我突然脱离IDE我很能办到。

因此我的目标又进一步明确,我必须要使用C语言,需要一个IDE的开发环境,且是在Windows平台下开发。

交叉编译

想在Windows下开发Linux上运行的程序,就需要引入交叉编译的概念,交叉编译就是在一个平台使用交叉编译工具编译出可以在另外一个平台上运行的可执行程序。而树莓派的Raspbian系统本身已经自带集成了Linux的编译器,因此它本身就是大开发环境,所以它才能直接在终端调用指令编译.c的源文件。因此实际上有两种方法在windows下开发,一种是将代码在Windows下写好以后,copy到树莓派中,由树莓派使用自身的编译工具进行编译链接生成可执行文件;另一种则是在Windows下使用交叉编译工具直接编译生成可以在树莓派上运行的可执行文件。显然第二种更符合我的需求。

VisualGDB工具

VisualGDB是一个为Windows上的Visual Studio准备的插件,目前支持Visual Studio 2008~2017,有了这款插件,Visual Studio便可以开发linux程序了。它实际上是在Visual Studio中帮你配置好交叉编译的工具,并且它还可以帮你使用SSH远程连接上你的树莓派。

环境搭建步骤

QQ截图20170126130028

根据树莓派的系统选择合适的最新的编译工具链,并下载安装。

QQ截图20170125193020

所有安装完成后,打开Visual Studio中会多出VisualGDB的东西,例如帮助菜单下,多了一项 About VisualGDB:

QQ截图20170125211401

建立第一个工程

打开VS,文件/新建/项目

QQ截图20170125212417

左侧选择VisualGDB,中间选择Linux Project Wizard,下方配置工程名及工程存放目录

QQ截图20170125213152

接下来,选择创建Application(executable file)/Use MSBuild,点next,其它几个我目前也还不知道是个什么意思

QQ截图20170125213318

接下来便出现了两种选择:

QQ截图20170125213629

这实际上就是前面提到的两种方案,第一种是只在Windows管理工程,编写代码,源文件通过网络传送到Linux的电脑上进行编译,第二种是使用交叉编译工具在在本地进行编译,然后将生产的可执行文件通过网络传送到Linux电脑上进行运行。不管是选择哪一种,此时,请将你的树莓派上电运行,并确保它与我们的电脑处于同一局域网中,并清楚它的IP地址,还需要确保树莓派的SSH处于默认开启状态,因为马上要使用SSH进行远程登录链接了。

下面是选择第一种方案时:

QQ截图20170125213851

这种情况,你需要填入树莓派的IP地址,然后配置好登录的用户名和密码即可,用户名和密码跟前一篇文章中提到的远程桌面的登陆用户名和密码一样的。此时应该会自动获取树莓派的工具链信息,之前也提到树莓派的系统本身已经相当于一个大的编译环境了,选择这种情况的话,实际上你并不需要安装前面步骤中提到的交叉工具链,因为代码是传到树莓派中在远程编译链接的。

这是选择第二种方案

QQ截图20170125214734

这种方案必须使用交叉编译工具链,由于前面安装了,这里会自动检测到,选择一下即可。特别说明的是,如果你在没有安装交叉编译工具链的情况下到了这个步骤,VisualGDB会帮你下载安装,但是非常慢且下载失败会全部重新下,因此建议按照我前面说的方法直接去下载交叉工具链,用迅雷下载快,然后自行安装。下面这个截图就是我亲自走的弯路,下载了三个小时竟然又从头开始下载了。

QQ截图20170125164612

然后同样配置SSH连接,同时可以看到选择Deployment folder,这个目录是交叉编译好的树莓派上可直接执行的文件传到树莓派上存放的地方,可以记下来路径:/tmp,待会去看看。

这里我选择的是第二种方案。

Windows下编译调试

在工程默认创建的cpp文件中输入如下代码:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <stdio.h>
using namespace std;

int main(int argc, char *argv[])
{

char sz[] = "Hello, World! by launcher"; //Hover mouse over "sz" while debugging to see its contents
cout << sz << endl; //<================= Put a breakpoint here
getchar();
return 0;
}

根据提示,设下一个断点:

QQ截图20170125215426

点击Debug按钮:

QQ截图20170125215514

此时程序启动,并停留在断点处,选择右下方的输出标签进行查看观察输出信息:

QQ截图20170125215849

F10单步执行,即可看到程序输出信息

QQ截图20170125215955

树莓派中查看和验证可执行程序

前面Windows下的调试真的是运行在树莓派中的吗,太过方便反而觉得有点忐忑,所以通过远程桌面直接查看树莓派中的程序,还记得前面提到的Deployment folder文件夹/tmp,打开目录看看

QQ截图20170125220409

果然在该目录下发现了这个可执行文件,双击打开,选择在终端模拟器中执行

QQ截图20170125220535

可以发现,程序确实与我们写的代码期望结果相同:

QQ截图20170125220639

小结

在Windows下使用VS开发树莓派(Linux)的程序是可以的,需要安装VisualGDB插件,并安装对应树莓派的交叉编译工具链,这样就能使用我们熟悉的VS这个IDE进行树莓派程序的开发和调试了,非常方便高效,本文的一小步在我心里是一大步,虽然只是简单建立一个Hello Word工程,但感觉后续的研究学习有了崭新的开始。

由于作者知识水平的局限,如有理解错误的地方,请批评指正。

参考文献

https://www.raspberrypi.org/blog/raspbian-jessie-is-here/

http://visualgdb.com/download/

http://gnutoolchains.com/raspberry/

http://visualgdb.com/tutorials/raspberry/crosscompiler/