查看: 6144|回复: 1

[项目] 教你如何配置树莓派集成开发环境(IDE)

[复制链接]

该用户从未签到

发表于 2017-12-1 15:22:59 | 显示全部楼层 |阅读模式
分享到:
640.webp (41).jpg

转自趣无尽
树莓派同Beaglebone Black,Arduino一起被称为3大开源硬件。笔者对比过这三个平台,觉得树莓派是最适合单片机工程师学习Linux的SBC,树莓派玩熟了剩下的两个平台也很容易融入。另外大家应该知道,树莓派是当前全球第三大计算机平台(另外两个Windows-PC & MacOS-PC不用我介绍了吧),树莓派现在硬件可以定制,完全可以用于产品开发!它不仅是创客玩具!
Cpu core: BCM2708/BCM2709/BCM2710 Cpu packages: BCM2835/BCM2836/BCM2837
如今Linux计算机体系从硬件到软件都很复杂,覆盖电路设计,底层内核与驱动设计,应用软件设计,系统运维多个方面,我们精力有限,无法逐一精通。像我,单片机起家的就选择专注于Linux应用软件设计(吐槽:我觉得做内核做驱动是纯技术活,枯燥,不够Business, 再说做单片机对硬件,驱动,RTOS都折腾过了,兴趣不大。但是我特别尊重那些做纯技术活的NB人,他们是灵魂工作者,保持了自我,毕竟社会太浮躁了…)

首先需要一块树莓板,我用了Model B+, Arm11的老内核,不过都一样,Linux玩的是软件,
以下请准备:
1:FT232 USB转串口模块
640.webp (38).jpg
2:RT2870/RT3070 Wireless Adapter USB无线网卡,兼容卡也行
3:8G class10 SD卡 + USB读卡器
4:5V,2A电源
5:RJ45网线 + USB有线网卡
6:USB转TTL串口线,用于终端命令行,我的PL2303芯片的(吐槽,还是FTDI Chip好)
7:我无奈的又用了一个USB hub,如今的笔记本USB口真TM金贵
好吧,把所有连接,连接,再连接,最后就是:
640.webp (39).jpg

镜像下载:https://www.raspberrypi.org/downloads/raspbian/
我用了最新的OS RASPBIAN STRETCH LITE,这是Debian9的OS,BB Black也是Debian
用Win32DiskImager工具软件烧写空的SD卡,烧完就插卡上电,启动
640.webp (40).jpg

注意USB无线网卡和USB串口此时已经被系统识别!
开始系统配置!
1:开启root权限,登陆pi账户,在命令行输入如下:
sudo passwd root
sudo passwd –unlock root
su root
跳转到root账户命令行
2:增加root账户SSH登陆权限,为了安全,默认情况OS禁止了root登陆
用nano编辑/etc/ssh/sshd_config
PermitRootLogin行处改为 ‘PermitRootLogin yes’
640.webp (42).jpg

3: 配置各个网卡
我的笔记本USB有线网卡IP:192.168.1.71,直接连接树莓ETH0网卡
我的树莓ETH0网卡IP:192.168.1.11(ETH0有时候识别为别的name,我搞不清这个name命名机制,谁懂 Why enxb827eb957644? Call me!)
我的树莓USB无线网卡,使用DHCP,连接手机的wifi热点(吐槽: 外企Web不好用,干脆用自己的流量了)
我需要我的树莓有2个可以使用的网卡,但是无论怎么配置我发现都有使用冲突(一个静态IP,一个动态IP),网上一堆的配置教程都不Work,可把我整惨了,于是我决定自己搞:
ETH0(enxb827eb957644)配置: 修改/etc/rc.local增加一行启动脚本
640.webp (43).jpg
  1. #!/bin/bash

  2. x=$( ifconfig -a | grep -c "eth0" )
  3. if [ $x -eq 1 ];then
  4. ifconfig eth0 192.168.1.11 up
  5. else
  6. ifconfig enxb827eb957644 192.168.1.11 up
  7. fi

  8. touch power_on_time.log
  9. echo "Your PI is powered up at: " > power_on_time.log
  10. date >> power_on_time.log

  11. echo "Init..."
复制代码
USB无线网卡设置:
直接修改wpa_supplicant.conf:
root@raspberrypi:/etc# cd wpa_supplicant
  1. country=GB
  2. ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
  3. update_config=1

  4. network={
  5.         ssid="david-wifi"
  6.         psk="12345678"
  7. }
复制代码
或者修改interfaces文件,追加wpa.conf

640.webp (44).jpg

Interfaces内容:
  1. auto wlan0
  2. iface wlan0 inet dhcp
  3. wpa-conf /etc/wpa.conf
  4. # iface default inet dhcp
  5. wpa.conf内容:
  6. network={
  7.         ssid="david-wifi"
  8.         key_mgmt=WPA-PSK
  9.         psk="12345678"
  10. }
复制代码
Show log:
  1. root@raspberrypi:~# ifconfig -a
  2. enxb827eb957644: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
  3.         inet 192.168.1.11  netmask 255.255.255.0  broadcast 192.168.1.255
  4.         inet6 fe80::9de1:de0c:cb1d:462b  prefixlen 64  scopeid 0x20
  5.         ether b8:27:eb:95:76:44  txqueuelen 1000  (Ethernet)
  6.         RX packets 2361  bytes 206594 (201.7 KiB)
  7.         RX errors 0  dropped 0  overruns 0  frame 0
  8.         TX packets 1140  bytes 180441 (176.2 KiB)
  9.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  10. lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
  11.         inet 127.0.0.1  netmask 255.0.0.0
  12.         inet6 ::1  prefixlen 128  scopeid 0x10
  13.         loop  txqueuelen 1  (Local Loopback)
  14.         RX packets 0  bytes 0 (0.0 B)
  15.         RX errors 0  dropped 0  overruns 0  frame 0
  16.         TX packets 0  bytes 0 (0.0 B)
  17.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  18. wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
  19.         inet 192.168.43.236  netmask 255.255.255.0  broadcast 192.168.43.255
  20.         inet6 fe80::eb41:da24:d28:8575  prefixlen 64  scopeid 0x20
  21.         ether f4:28:53:0e:6a:25  txqueuelen 1000  (Ethernet)
  22.         RX packets 69  bytes 6756 (6.5 KiB)
  23.         RX errors 0  dropped 0  overruns 0  frame 0
  24.         TX packets 101  bytes 11817 (11.5 KiB)
  25.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  26. root@raspberrypi:~# ping 192.168.1.11
  27. PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
  28. 64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.210 ms
  29. 64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.226 ms

  30. --- 192.168.1.11 ping statistics ---
  31. 2 packets transmitted, 2 received, 0% packet loss, time 1001ms
  32. rtt min/avg/max/mdev = 0.210/0.218/0.226/0.008 ms
  33. ^Croot@raspberrypi:~# ping www.baidu.com
  34. PING www.a.shifen.com (180.97.33.107) 56(84) bytes of data.
  35. 64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=1 ttl=50 time=45.1 ms
  36. 64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=2 ttl=50 time=47.0 ms
  37. 64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=3 ttl=50 time=39.5 ms
  38. ^C
  39. --- www.a.shifen.com ping statistics ---
  40. 3 packets transmitted, 3 received, 0% packet loss, time 2002ms
  41. rtt min/avg/max/mdev = 39.559/43.928/47.057/3.184 ms
  42. root@raspberrypi:~#
复制代码
重启树莓派,让一切生效!
配置更新树莓派!
1:必须会用raspi-config指令,首先设置扩展SD卡容量
640.webp (45).jpg

640.webp (46).jpg

查看内存,查看存储器,最后重新分配一个tmp文件夹用于存放调试的临时程序文件,不用往FLASH上面写了
2: 更新OS内容
  1. sudo apt-get update
  2. sudo apt-get upgrade
  3. sudo apt-get dist-upgrade
复制代码
设置Vim,如果你喜欢Vim
  1. sudo apt-get install vim
复制代码
编辑/etc/vim/vimrc文件,在末尾添加以下内容
1: set nu #显示行号
2: syntax on #语法高亮
3: set tabstop=4 #Tab退四格
安装调试器:
  1. sudo apt-get install gdbserver # 很重要!!!
  2. sudo apt-get install picocom
复制代码
一点口水概念:
1:Linux里platform_driver,属于内存型设备驱动,驱动直接访问SOC内部寄存器,platform_device是位于芯片内部的所有片上外设,其它驱动均是用于SOC外部device访问
2:Linux中device tree配置主要起到了初始化板载硬件资源的作用,如初始化GPIO寄存器,UART寄存器等, 指定了这些寄存器的数值,dts源文件中还会有引脚分配等信息,配置引脚的功能,启动相应的驱动程序
3:Linux开发需要toolchains工具链,要写makefile,需要GDB(client debugger/server)调试器,这些资源需要自己找,自己匹配版本,自己编译测试,纷繁复杂(当然找个供应商就全解决了,都是钱的事,有钱可以是大爷。没钱你就跟我混,让你不花钱也能全搞定)
我真是说了一大堆的废话!赶紧上Linux-App-IDE,一定要整的像Keil-MDK一样方便好用,不用写Makefile。
吐槽: 我知道有人喜欢在终端里用VIM,GDB/CGDB,NFS远程连接目标机GDBserver调试程序,我知道有人喜欢用Ubuntu 用DDD调试程序,我也知道树莓可以本地GCC/GDB,但是考虑编辑易用性,编译速度,考虑大众化,哥依然坚持Windows交叉编译调试。或者什么事哥错过了,请大家告诉我这个井底蛙!
提示:强大的终端软件MobaXterm Home Edition,貌似很好用,树莓可以不用屏幕了。
为了探求一个免费,不断更新,官方支持,且好用的Linux应用软件开发IDE,我搜索了N个词条,尝试了:
Visual Studio + winGDB :要钱啊,VS太大了
Visual Studio + visualGDB: 要钱啊,VS太大了
Eclipse + plugins :插件设置TTMD麻烦了
Sourcery-CodeBench-Lite-Edition: 免费,但官方支持度差,对于树莓不敢折腾,觉得有坑,有精力的同学可以去折腾下,OK了告诉我,什么心情?
Arm-DS-5 Community Edition:官方的免费IDE,定制版Eclipse,设置方便不少。
使用ARM最新工具DS-5开发Linux简单Hello World应用程序,开胃菜,各位!
http://bbs.21ic.com/icview-410255-1-1.html?_dsign=2f342972
DS-5 Community Edition/ Version: 5.27.0/ Build number: 5270014 我决定用这个!
首先解决工具链问题,试过几个,包括Linaro。没找到一个明显告诉你交叉编译系统间库文件如何同步更新的工具链,顿时迷茫!这库都不同步,后面写程序还不是一堆问题啊,于是茫茫Internet坚持找寻,坚信树莓强大的生态链,终于有一天,SYSPROGS拯救了我。

640.webp (47).jpg


完美,一切都是这么完美!注意一定要Updating Sysroot for Raspberry PI Cross-Toolchain
http://gnutoolchains.com/raspberry/tutorial/
http://gnutoolchains.com/raspberry/tutorial/sysroot
SYSPROGS官方完美支持了树莓1/2/3,SmarTTY终端软件也挺好用。
紧跟伟哥的步伐 GO GO GO!
1: 默认安装raspberry-gcc4.9.2-r4.exe,我的系统Win10。
2: 默认安装ds5-ce-windows64-27rel0.zip(setup.exe)。
3: 打开DS-5,选择工作空间,我的是(C:\Users\cn28060369\Documents\DS-5 Workspace)。
4: 拷贝C:\IT_CodeRepo\DS-5\examples\Linux_examples中hello_linux文件夹到DS-5工作空间。
5: File->Import已经存在的Workspace工程文件夹hello_linux到IDE中。
640.webp (48).jpg

6: 设置工具链,选择安装的树莓专用工具链,然后Next,DS-5会自动检测工具链然后跟着提示Finish,我的图片里是已经设置过的。

640.webp (49).jpg

7: 右击项目文件夹,选择Properties,设置工具链参数。
640.webp (50).jpg

640.webp (51).jpg

此处使能了并行编译!很棒吧!
640.webp (52).jpg

当前工具链选择: GCC4.9.2就是树莓的。

640.webp (53).jpg

8: 配置GDB debug设置
640.webp (54).jpg

9: 使用DS-5 debugger新建一个调试项,如下图效果

640.webp (55).jpg

尽量和我的图片设置一样
640.webp (56).jpg

10: 远程SSH登陆树莓。
参考这个:http://blog.csdn.net/luyejie8888/article/details/38611293
差不多的,使用root账户登陆树莓试试。
11: 把原来hello.c源码改掉,我们玩树莓不能只玩python/wiring-pi,它们屏蔽了基础文件访问知识,方便但是缺乏学习意义,我们操作扩展的ttyUSB0串口,把TXD与RXD短接。
  1. /************************** Demo for RaspberryPi **************************/

  2. // MSG> Hi, I'm Automan, My WeChat account is OPC_davidlee
  3. // MSG> Let's be technical partner, study and day day up
  4. // MSG> Use DS-5 IDE to simplify your Arm SOC development

  5. #include#include#include#include#include#include#include#include#include#include#include#include#define DATA_LEN        0xFF        /* test data's len */

  6. //#define DEBUG        1

  7. static int openSerial(char *cSerialName) {
  8.         int iFd;

  9.         struct termios opt;

  10.         iFd = open(cSerialName, O_RDWR | O_NOCTTY);
  11.         if (iFd < 0) {
  12.                 perror(cSerialName);
  13.                 return -1;
  14.         }

  15.         tcgetattr(iFd, &opt);

  16.         //cfsetispeed(&opt, B57600);
  17.         //cfsetospeed(&opt, B57600);

  18.         cfsetispeed(&opt, B115200);
  19.         cfsetospeed(&opt, B115200);

  20.         //raw mode

  21.         opt.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
  22.         opt.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
  23.         opt.c_oflag &= ~(OPOST);
  24.         opt.c_cflag &= ~(CSIZE | PARENB);
  25.         opt.c_cflag |= CS8;

  26.         // DATA_LEN bytes can be read by serial

  27.         opt.c_cc[VMIN] = DATA_LEN;
  28.         opt.c_cc[VTIME] = 150;

  29.         if (tcsetattr(iFd, TCSANOW, &opt) < 0) {
  30.                 return -1;
  31.         }

  32.         return iFd;
  33. }

  34. int main(void) {
  35.         char tmp[1024];
  36.         int len;
  37.         int fd, i;
  38.         int x = 0;

  39.         printf("\n[#1] Software operations demo:\n");

  40.         x = x + 1;
  41.         printf("x=%d\n", x);
  42.         x = x - (-1);
  43.         printf("x=%d\n", x);
  44.         x = x * x - 1;
  45.         printf("x=%d\n", x);
  46.         x = (x + 5) / 2;
  47.         printf("x=%d\n", x);

  48.         printf("[#2] Hardware ttyUSB0 operations demo:\n");

  49.         fd = openSerial("/dev/ttyUSB0");

  50.         for (i = 0; i < 3; i++) {
  51.                 tmp[i] = 'V';
  52.         }

  53.         write(fd, tmp, 3);    // send to ttyUSB0

  54.         for (i = 0; i < 3; i++) {
  55.                 tmp[i] = '0';
  56.         }

  57.         len = read(fd, tmp, 3);

  58.         for (i = 0; i < len; i++) {
  59.                 printf("Read value: %c\n", tmp[i]);
  60.         }

  61.     printf("Finish test, DS-5 and PiB+ are OK!\n");

  62.         return 0;
  63. }
复制代码
12: 激动人心的时刻到了,我们编译(debug版本才能调试,含符号信息),Project->Build All(注意保存后的文件才能再次编译生效)。
640.webp (57).jpg

点击右上角小爬虫进入调试。
640.webp (58).jpg

点击如下红色圈圈进入调试连接,hello执行文件会自动加载到/tmp文件夹下执行,并自动执行GDBserver。
640.webp (59).jpg

如下:运行,断点,AppConsole输出,都是OK的了,完美!

640.webp (60).jpg

如果想重新调试,可以点击绿色圈圈断开连接后重新再连接
640.webp (61).jpg

到此,一个完美的IDE已经呈现给您,剩下的请您慢慢探索吧,虽然不用写makefile,但是笔者依旧建议后续学习使用Cross-GCC,Makefile,CGDB-debugger,GDB-server,Autotools,Cmake等传统工具,毕竟它们通用性强。当然如果您同我一样年纪大了,那就同我一样玩儿吧。
最后一点废话!
从拿到一个闲置树莓到搞完IDE,笔者花了1个星期去SETUP,宝宝心里苦啊!怎么就没人整个完整的IDE玩树莓呢,老命令行整人,一点都没有与时俱进!
大家可以使用相同的方式匹配BeagleBone Black,不过笔者对它兴趣不大,BBB生态不强但够用。调试接口程序的时候大家可以用Arduino-M0配合树莓调试,注意IO电压3V3,NOT 5V0!
640.webp (62).jpg
发扬Armfly精神,哥决定投稿开源,造福单片机开发者,早早入门Linux开发,让这个装A后面的世界变得透彻,不再神秘!我好伟大!!!
附:老外整的Arm DS-5 for Raspberry Pi, 没细节,不过让我知道我的想法是可行的!要相信自己!

回复

使用道具 举报

  • TA的每日心情
    开心
    2018-8-25 16:46
  • 签到天数: 28 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2017-12-2 20:55:53 | 显示全部楼层
    不错,转的很认真
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则



    手机版|小黑屋|与非网

    GMT+8, 2024-4-23 17:02 , Processed in 0.136069 second(s), 20 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.