树莓派4评测 国内版

树莓派4目前已经发布了,外媒给出了很多评测,国内也很多翻译稿了,几天前,52Pi团队也拿到了最新的树莓派4(2G版本).

其他不用多说,就大家最关心的问题展开讨论.

CPU到底提升了多少?很多外媒都用了HPL这个算法来衡量速度提升,首先,比较片面,而且也没提到相应的测试条件.究竟GCC版本是多少,编译参数是什么,只是给了一个对照表.对温度参数,那更是闭口不谈,实际功耗多少,也没有个明确的意思,网络能不能跑满,这也是很多人关心的话题.

首先,网友关心的第一问题,CPU提升了多少?(以下情况在良好散热条件下进行)

根据历史评测:http://www.52pi.net/archives/1306 数据来看

使用sysbench工具,单核性能从3B Plus的317.6974秒缩短到250.3330秒,提升大约27%.比3B的 370.5472秒提升大约48%.

而多核性能(4核全开)来看,也从3B Plus的80.6170秒缩短到64.1216秒,提升约26%,比3B提升约45%.

但是如果使用4G版本,则还有部分性能提升.

这里可见比官宣的要低上一些,为了公平起见,我另外在树莓派3B Plus上烧录同样的系统,进行同样的测试,基本没有变化.为了引入对比,这里加入了NanoPC-T4 (RK3399)作为对照组,由于RK3399可以用64位系统,而树莓派目前64位依然是Beta测试中,所以RK3399依然占有加成.6核全开情况下,RK3399跑分3.4272秒,大概是树莓派4在4核全开下18倍性能,期待树莓派适配64位系统,带来更高的性能提升.

网友关心的第二个问题,能不能跑满千兆?

测试用对传的主机配置是i7 6950X / 64G DDR4 / INTEL 82599万兆,使用的工具是iperf3,连接方式是和电脑主机直接连接.

可见,单纯的传输来说,是可以接近千兆的,除去协议开销,基本就是千兆网的配置了.比以前被USB 2.0 480Mbps掐住咽喉而言,现在算是不少的提升,由于以前USB2.0的原因,实际网卡速度还要限制在400Mbps左右.这个提升,算是翻倍不止了.

网友关心的第三个问题,USB 3.0速度是否能跑满?

首先,硬盘是闪迪SSD U110,就读取速度而言,是满足USB3.0的接口带宽的.(官标470MB/s)

可见USB 3.0速度比想象要低很多,但是也是USB 2.0没法比的,由于USB是10Bit传输,同时,这里的USB3.0控制芯片自身支持UASP,所以理论速度应该为500MB/sec,实际发挥了理论速度的71%水平.

网友关心的第四个问题,是否真的需要散热?

首先,如果不辅以散热,正常工作时,获取到的温度如下.

并且在负载运行后,快速到达温度墙,80度,其中意味,大家都能想到.

网友关心的第五个问题,加解密性能如何?

看到这个需求,我猜测大概是希望用来做软路由的,其中用户最关心的,应该是AES性能了,其中比较常用的AES-256(1K块)大约62MB/s,基本满足大部份需求.更多的参考截图.使用openssl测试工具测试.

网友关心的第六个问题,功耗如何?

首先,官方推荐使用5V 3A电源,我实测中发现,不接任何外设,也不连接网络,整机的功耗约为5V 0.6A(3W),连接网络后整机的功耗约为5V 0.8A(4W),进行stress火力全开的测试条件下,连接网络,不连接其他外设,整机功耗约为5V 2.1A(10.5W),如果算上用户要接移动硬盘等,则这些功耗还要在输入端扣除,建议使用更优质的电源,或者,直接上电源板吧.购买连接: https://item.taobao.com/item.htm?id=597551219738

网友关心的第七个问题,现在手上有的扩展板,是否还能继续使用?

首先,扩展板最依赖的,就是各种库,这样开发才方便,现在系统wiringPi库和Python GPIO库还没有更新,并不能直接操作IO,但是,我们的DockerPi系列模块,是非常方便的,就算脱离了GPIO库,我也可以用命令控制开关啊~ 具体可以参照 https://wiki.52pi.com/index.php/DockerPi_4_Channel_Relay_SKU:_EP-0099 购买链接: https://item.taobao.com/item.htm?id=596936971926

目前GPIO库是不完善的,如果你用的是DockerPi系列模块,就没这个烦恼了.

网友关心的第八个问题,Python 2是否还在?

Python 2目前是即将结束寿命的开发语言(2020 年 1 月 1 日 EOL),并且Debian Buster中,Python 2是被移除的,但是,在树莓派上,Python 2是依然存在的,并且,RPi.GPIO库看起来还会继续更新支持,只不过,现在开发新程序的话,最好是切换到Python 3了.

网友关心的第九个问题依然是开发问题,Java还在吗?

这个问题,跟Python 2在不在很像,由于大家都知道.Java正在走向商业化,所以,现在已经替换到OpenJDK了,当然,程序上的改动会有一些,相信不会难到Java程序猿.

其他关心的诸如GPU问题,官方还没更新最新的驱动,目前测试来看,提升几乎可以忽略,但是后续更新应该会带来更好的体验.另外由于树莓派4比较挑TF卡,所以也就要更加注意.

Jetson Nano 夜用超长评测

板子的基本配置:

目前来说,我也算是国内比较早拿到板子的吧!

盒子背面还是有比较详细的一些介绍.

特别注意的是,这里提供电源有四种模式,分别是5V 2A(USB)/5V 3A(GPIO引脚)/5V 4A(DC接口)/5V 6A(所有电源IO反向供电),5V 2A是受限于USB自身,这就奇怪了,明显可以做Type-c接口,支撑更大功率?为什么没有做呢?

另外由于架构和核心多重原因,这个板子满功率大概是10W,剩余的功耗,是用于提供其他外设,比如以太网,USB等等.我实测如果使用华为5A USB线,也能启动带的动这个板子.(注:适配器标定5V 8A)

另外,如果使用DC供电,则必须禁用USB电源.(短路帽插上)

串口和音频口在不是很显眼的位置出现.

不过,标注是非常清晰的.(这串口还有流控?)

另一边还有40P的树莓派兼容排针,他的右边,当然就是POE排针了.

同样的,有很清晰的标注,这一点,比树莓派强.

为了更方便地散热,风扇接口也做了,就是不知道是否兼容大多数主板风扇定义.

在底部还留有电池座,应该是芯片内有RTC外设.

在核心板下方,还有MiniPCIE的接口.

想来可以接无线或者其他什么设备进来,看走线,走的是PCIE协议.

在主板有个非常特别的飞线电容.

核心板预留了EMMC位置.

可能以后会提供带EMMC版本?

当然,上图还有突兀之极的中文丝印,不过想到板子全是在国内生产,这样也不是很奇怪的事情.只是老外看得懂吗?

总体来说,用料是很扎实的,网口是EDAC的,核心板接插件是TE的.

除了主板,还包含一份简易说明,只是这个说明,有点简单.

这个板子必须要买的配件有哪些?首先,如果要做实时分析,摄像头是一定要的,可以是Pi官方摄像头,也可以是USB摄像头,只不过,如果是USB摄像头的话,程序要微调一下.屏幕,是必备品,因为开机配置如果不做的话,启动根本不会继续往下执行.

虽然,我很多时候也只是用来做分析,通常在终端环境下就够用了,但是如果没屏幕根本没法进行下一步,我测试过这个屏幕可以用:http://wiki.52pi.com/index.php/5-Inch-800×480-HDMI-TFT-LCD-Touch-Screen_SKU:Z-0053

当然,没有键鼠,也没法继续,这些,也要自备了.

最后,因为Jetson Boot时间比较长,所以,一开始是没画面的,大概要等30秒才能看到开机过程,并且,首次启动网络灯是不会闪的.(路由侧会闪烁),也不怎么发热.配置完整个过程还需大约20分钟,主要还是大多数资源在网络,且拔掉网线也会使劲重试到超时,还不如多等一会.

软件资源基本就是系统一个,Ubuntu 16.04 x64宿主机(包括nvidia-docker并下载有DIGITS.),其他东西基本没有.

至于其他软件?你就当他是ARMv8板子跑就是,CPU性能的话,肯定不是值得炫耀的部分,但是也不会差到哪里,毕竟还要靠CPU打包数据.至于从数据看,是比树莓派出彩的!

以图形部分,BCM2837 VideoCore IV:(28.8 GFLOPS) 对比 128 Maxwell GPU(472 GFLOPs),完全不是一个水平线.

最后补刀,如果要扩展配件,将是无底洞~ 欢迎入坑~ (已经通过买各种模块板子,至少是5位数水平了吧.)

测试软件:

  1. 系统镜像:jetson-nano-sd-r32.1-2019-03-18.zip (你猜哪里下载?不知道?那你一定没好好读说明书:https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit)
  2. 其他软件:https://github.com/dusty-nv/jetson-inference

很幸运的是,由于Jetson Nano出生比较晚,所以JetPack是预装在系统里面了.但是,系统也真的大,以至于我烧了1个小时以上.建议大家有条件,还是买个更快一点的TF卡,不然会拖后腿的.

另外这个比较挑卡,我这里有好多不同品牌的卡,结果只有一个能启动?

JetPack大概就是TensorRT/Caffe等各种神器集合,也算是CUDA的一个中间件.

废话太多了,太多了,下面马上….上….前奏.主要是实现物体标记和物体识别.大家接触了很多CNN相关的东西,所以对这两个肯定也不陌生.至于基础的方程预测之类的,官方没有给出例子,当然,这些自己写也很简单.

先安装cmake,下载需要的源.

$ sudo apt update
$ sudo apt install cmake
$ git clone --recursive https://github.com/dusty-nv/jetson-inference
$ cd jetson-inference
$ mkdir build
$ cd build
$ cmake ../

嗯,这个过程很漫长,因为下载大量的软件.如果你网络可以直接访问英伟达的网站,那可以直接cmake,如果不能的话.就需要处理一下,至于怎么做,就不方便说了,大家肯定有办法.

下载过程如下图.(大约1.5GB+数据要下载,根据网速不同,所需时间也不同,Jetson Nano配备的是千兆网卡)

cmake完成后应该如此:

接下来make编译,但是产生了很多警告,这类警告只是编码规范问题,不影响程序结果.

通过sudo make install完成安装.

完成后,你得到了一个支持GOOGLENET/GOOGLENET-V12/ALEXNET网络框架的CUDA优化的机器学习支持库.

先试试图像分类,目前用的是默认训练好的库.

$ cd jetson-inference/build/aarch64/bin
$ ./imagenet-console bird_0.jpg output.jpg

运行过程日志也是有输出的,第一次运行会比较慢,因为神经网络第一次加载时候需要解释.后面会讲到如何构造自己的神经网络训练结果包,这个包也就是丢到Jetson上面用的.

嗯,判断准确度还可以,他认为这个图是American robin,实际上他肯定不止一个结果,只是显示了最可信的结果出来.

但是由于这个库可能是训练不太好,我上传了个苹果,识别出来是石榴?

而其他候选结果,分别是无花果>澳洲青苹>橙子>七叶树.

不过,处理速度确实很快,可见,直到输出层也只需要80ms,相对于在树莓派上来做,都要用秒来衡量的.

这个程序还是开源,代码也不难:https://github.com/dusty-nv/jetson-inference/blob/master/imagenet-console/imagenet-console.cpp

而特定物体查找的例子,跟这个也差不多.

$ ./detectnet-console peds-001.jpg output.jpg facenet

从返回结果看到,捕获了3个对象以及他们的坐标.

结果是这样的.

但是当我随机在互联网上找到另一张图时,表现就差了一些了,也许还是训练不足的原因.

而且,目前也只有几个模型,更多,还是去训练吧.(注意看classes,就是能识别的类)

既然训练不足,不能满足现状的话,只能使用DIGITS重新训练了.

但是,训练只能在PC上做,做好之后,把训练结果变成一个压缩包放在SD卡上,实现离线识别.至于为什么不用开发板直接跑识别,我觉得主要问题不在性能,而在储存上(带宽/容量).

记得Movidius上也是如此,先在PC上训练,再最终训练结果写入棒子(本来训练结果就比较小,训练集比较大),然后实际使用就可以了.

不过,有一点特别要注意的是,nvdia-docker中绑定的路径,才是真正的操作路径.而非官方git中给出的参考路径形式,如下图,目录是/data下的ilsvrc12目录.

只要训练之后,下载训练后的结果层次,就可以使用了,当然也可以自己添加训练数据,目录中的形式表示得很明白,最后还可以先在PC上测试.

下载的训练结果,复制到Jetson Nano中解压,指定NET环境变量之后,就可以开始使用了.由于这些数据试验结果也是没什么差别的,所以就不再重复了.

NET=networks/GoogleNet-ILSVRC12-subset

如果真要得到更准确的数据,还需要自己真正的找一堆数据来分类,让学习结果更靠谱.

其他方面来说,系统是基于ARMv8的,真正的64位系统.

从sysbench结果来看,CPU性能大约是30倍于树莓派3B Plus @ ARMv7,主要得益于DDR4,CPU内核较好,且使用64bit指令集.

在连续执行识别操作,并运行stress耗尽CPU性能,再观察内部温度传感器,竟然如此凉快?当然,也许是因为大散热器的原因,但是,实际温度依然在缓慢上升,在实际使用中,最好是配备散热器的.

5分钟后的温度结果.

另外系统中配备了很多针对NV GPU优化的软件,这也是一大亮点.

并且是Unity桌面系统,尤其漂亮,只是比较吃GPU.

还内置了Docker,Python 3,Cuda支持,OpenGL支持,OpenCV支持,谷歌浏览器,文档编辑器,GCC7等,可以看作是比较完整的Ubuntu发行版.16G的TF写入后预计剩余空间都不足1G,推荐使用32G以上或者外挂储存.

如果给他定位成高端树莓派,那还是不值当的,毕竟人家擅长的是GPU啊.

最后来一个功耗实测,共同的测试条件:

  • 无USB设备
  • 无额外配件
  • 以太网有线连接(10Gbps)
  • SSH登录
  • 使用DC接口供电

测试结果,满载时为死循环识别图片(GPU)或使用stress耗尽性能(CPU):

  • 空载:0.533A @ 5.1V
  • CPU满载,GPU空载:1.117A @ 5.1V
  • GPU满载,CPU空载:2.133A @ 5.0V
  • CPU,GPU满载:2.838A @ 5.0V
  • CPU,GPU满载,且接入HDMI屏幕,HDMI屏幕独立供电:3.017A @ 5.0V

树莓派3B Plus评测(对比Pi 3B)

在评测之前呢,先介绍下目前树莓派家族~

可见,3B Plus为最高端产物,之前Model B之后有个Model B Plus,性能提升,温度下降,不知道3B Plus又能如何表现呢?我们就开封两个不同版本的Pi测试一下.

软件测试条件:

  1. TF卡 16G 东芝C10
  2. 5V 2.5A 电源
  3. newifi 3 千兆路由
  4. 超七类网线
  5. SanDisk U110 SSD (JMS576 转接)
  6. Raspbian 2018-03-13 版本(根据测试,其他版本无法再Raspberry Pi 3B Plus启动.)

测试对象:

  1. Raspberry Pi Model 3B Plus
  2. Raspberry Pi Model 3B

第一节,CPU基本信息.

首先是Raspberry Pi Model 3B Plus,识别出版本号是a020d3.

其次看看Raspberry Pi Model 3B,识别出版本号是a22082

第二节,wiringPi 识别

首先是Raspberry Pi Model 3B Plus,其中wiringPi是会识别的,但是GPIO操作是会失败…

在Raspberry Pi Model 3B完全正常,毕竟出来这么久了,也很正常了…

第三节:CPU性能(使用sysbench)

单核性能测试命令: sysbench –test=cpu –cpu-max-prime=20000 –num-threads=1 run

首先是Raspberry Pi Model 3B Plus,他的单核性能如下(317.6974 秒执行完成):

多核性能测试命令: sysbench –test=cpu –cpu-max-prime=20000 –num-threads=4 run

因为调度核心也是需要资源的,所以核心调度能力也影响了具体性能,所以执行时间会略比原来的1/4长一些.

在Raspberry Pi Model 3B Plus下,他的多核性能如下(80.6170 秒执行完成):

其次是Raspberry Pi Model 3B,他的单核性能如下(370.5472 秒执行完成):

而他的多核性能如下(93.0482 秒执行完成)

第四节:内存性能 (使用sysbench)

内存性能测试命令: sysbench –test=memory –memory-total-size=50G run

首先是Raspberry Pi Model 3B Plus,他的传输性能如下(传输速度:640.86MB/sec):

其次看看Raspberry Pi Model 3B,他的传输性能如下(传输速度:551.76/sec):

第五节:GPU性能( GeeXLab 测试软件,屏幕分辨率800 * 480 )

首先看Raspberry Pi Model 3B Plus,他的GPU性能如下(传输速度:216fps,窗口大小800*480.):

再看看Raspberry Pi Model 3B,他的GPU性能如下(传输速度:220fps,窗口大小800*480.):

他们几乎没区别,可以理解成误差了.

 

第六节:无线网络性能

Raspberry Pi Model 3B Plus 无线竟然没法用…

测试Raspberry Pi Model 3B.(距离路由30cm,附近有6个2.4G的AP)

第七节:有线网络性能(iperf 测试)

使用数据生成方法来测试,就是没有实际文件读取.

先看Raspberry Pi Model 3B Plus,他的TCP性能如下.可见于宣传还是有出入的,而且看起来不是CPU能力问题,是转换问题.

然后使用USB传输数据,为了避免速度瓶颈,我选择SSD插在USB上.理论上来说,大家都占用了USB带宽,应该速率会下降,我们来看看成绩.

因为Raspberry Pi Model 3B不带千兆网,所以成绩肯定差一下,也要试试.

另外,能传递多少速率,还要跟CPU一起衡量,幸好树莓派CPU还是足够处理这么点网络资源的.

下面结果是直接传输.

因为没有达到USB瓶颈,所以就算要发送的文件在USB上,也并没看出百兆网降低(因为本身就不快)

第八节:USB性能

先看Raspberry Pi Model 3B Plus,他的USB HUB芯片换成LAN7515,看起来更高端,虽然温度范围没那么广泛.但是USB性能也基本能跑满USB 2.0了.

再看Raspberry Pi Model 3B也读取速度欠佳一些.

USB2.0的理论带宽并不是480Mbps/8=60MB/s,而是约等于48MB/s(UASP协议),或22.14MB/s(BULK协议)

第九节:功耗测试

Raspberry Pi Model 3B Plus,因为Raspberry Pi Model 3B Plus暂时还没有支持的游戏机系统等,所以还是用默认系统测试.不接外设,只接入屏幕(屏幕独立供电),没有外设,空闲时候功耗约450mA.进入CPU和GPU双烤的状态下,功耗约1.67A.这些还是没有外设下功耗,如果带着外设,功耗会更大.

Raspberry Pi Model 3B,因为Raspberry Pi Model 3B 与Raspberry Pi Model 3B Plus同样条件测试,空闲时候功耗约370mA.进入CPU和GPU双烤的状态下,功耗约1.32A.总体来说,低于Raspberry Pi Model 3B Plus.

第十节:温度测试,使用如下脚本.(室温23度)

 while true;do vcgencmd measure_temp; cat /sys/class/thermal/thermal_zone0/temp; sleep 2; done

在Raspberry Pi Model 3B Plus双烤模式下,达到了81度的CPU温度,80度的GPU温度的高温,配备散热措施势在必行,因为官方说了,50度是正常的.而且这里测试不出HUB芯片的温度,实际上温度更高.PMIC是带有温度传感器的,然而官方还没开发.最后,得益于金属外壳封装的CPU,温度才下来了吧.

在充分关机降温情况下,重新开机测量温度,结果如下:

换作Raspberry Pi Model 3B,双烤接近85度.

在充分关机降温情况下,重新开机测量温度,结果如下:

第十一节:降频

在Raspberry Pi Model 3B Plus中,测试发现,无论如何,他频率都显示为1.4GHz,通过改变设备文件,发现没有效果,初步猜测频率只是一个数字,因为根据实际体验,只要温度上去了,运行就非常之卡!而在以往的Raspberry Pi Model 3B中,75度才降频.

大家还想知道其他的,我尽量给大家评测,欢迎大家留言.

使用eFuse释放ESP32的IO12引脚

ESP32的IO12决定了VDD_SDIO,也就是内部的SPI,EXT RAM的IO工作电压,针对WROVER,他是1.8V的,针对WROOM,他是3.3V的,但是他是通过IO12判断,有没有办法释放IO12然后也能决定VDD_SDIO呢.

当然可以,非常简单,使用esp-idf里面的esptool_py工具集吧.首先切换到工具所在目录.

比如WROOM设置(默认ttyUSB0):

espefuse.py set_flash_voltage 3.3V

对于WROVER设置(默认ttyUSB0):

espefuse.py set_flash_voltage 1.8V

运行后会提示你输入BURN,然后确认才能写,因为是一次性的.

这样IO12就释放了.又多一个IO可以用了.

dietpi.txt 快速配置上手

DietPi是所谓的超级简单系统,一般人都知道怎么操作他,他非常轻量,也很容易适合本土化.引用老外的话就是:

“I’m a Linux noob and I have been playing around with installing things on my new Raspberry Pi–the hard way–doing manual installs! The amount of hours that goes into something like this is staggering. And then I discovered DietPi just yesterday. What a time-saver!”

他大概就是说,我就说个菜鸟,但是用这个我发现我会使用RPI了.而且对比DietPi和RPI官方系统Raspbian还是差别挺大的.

首先Raspbian的官方系统比较笨重,他已经没对比了,他对比的是Raspbian Lite.明显各项指标都很强大,但是经过我们的”优化”调整后,这更强大.其中我们很熟悉Raspbian的config.txt,而dietpi,他也有dietpi.txt,功能远比config.txt强大.

我们先打开这个文件:

逐一介绍下:

  • Ethernet_Enabled,如果设置为1,就是用以太网功能,如果设置为0,就是不用以太网功能.
  • Wifi_Enabled,如果设置为1,就是用以太网功能,如果设置为0,就是不用以太网功能.
  • Wifi_SSID和Wifi_KEY就是你的WIFI名字和密码,如果你没有屏幕键鼠,还没有以太网线,更没有串口调试,这个就非常实用了.
  • Use_Static就是使用静态IP地址,下面就是他的配置了.
  • Hostname就是你在路由上看到的名字,也就是设备名,如果你有多个设备就得区分下,他默认是DietPi,比如我一个Pi 3一个Pi B+,那么我要区分就得改他名字.
  • Ethernet_Force_Speed就是强制以太网速率,0就是自动识别,一般够用了,接百兆网就是百兆,1是10M网,1000是100M网,1000就是千兆网了.
  • Swapfile_Size就是设定SWAP文件的大小,一般设置为1就是自动,0就是不做SWAP,当然不推荐禁用SWAP了,除非你卡非常小,如果不是1也不是0,就你设定一个SWAP大小了.
  • AUTO_Install_Enable第一次启动DietPi总有提示,然后安装软件,比如在吃饭前你刚烧写好个系统,然后还要插上去操作一番才能离开,如果使能这个开关,设置为1,那么,这都不是问题.烧写好,然后插卡,去吃饭,回来就好了.
  • AUTO_Global_Password全局密码,包括用户名啊,Mysql啊各种都是默认这个密码,改掉安全一些.
  • AUTO_DietpiSoftware_Install_ID就是自动安装软件,比如我想首次启动帮我安装好LAMP,那么找到LAMP套件的ID,然后写AUTO_DietpiSoftware_Install_ID=74 (假设LAMP的ID是74.),当然,还要使能AUTO_Install_Enable,然后烧写好之后去吃饭,吃饭后回来软件也装好了.当然,这里软件包甚至包括WordPress.
  • AUTO_DietpiSoftware_SSHServerIndex是选择SSH服务提供组件,默认是dropbear,也就是-1,如果要用openssh,选-2就可以了,dropbear一般够用,openssh当然也有更多功能,如果根本用不到SSH,可以选0,关闭,更省资源.
  • AUTO_DietpiSoftware_FileServerIndex是选择文件服务器提供组件,默认是不开的,你可以用-1 ftp方式,-2 samba方式.
  • AUTO_DietpiSoftware_LoggingIndex是日志记录模式,默认是-1,也就是ramlog,0是跟Raspbian Lite一样记录方式,选ramlog的话,重启日志就没了,但是磁盘(TF)读写少,选-2 ramlog并每小时保存是个折中的办法.
  • AUTO_DietpiSoftware_WebserverIndex是Web提供组件,需要配合LAMP等一起用哦,0就是Apache2,最费资源但是最多功能,-1是Nginx,-2是Lighttpd.最后一个最轻量,也最少功能.
  • AUTO_AutoStartTarget是设置启动后默认状态,0是烧写系统后默认的,就是命令行不登录,2就是桌面环境.
  • AUTO_Timezone就是自动设置时区,这个也是依靠AUTO_Install_Enable使能的,比如我们设置成Asia/Shanghai,就是国内时间了.
  • AUTO_Locale就是本地化,类似语言,这个也是依靠AUTO_Install_Enable使能的,看英文看不爽,先预设成中文就爽了.默认是en_GB,我们换成zh_CN.
  • AUTO_KeyboardLayout就是键盘布局设置,这个也是依靠AUTO_Install_Enable使能的,当然你没键盘设置什么都是白扯的,有键盘的话,设置这个为us,就符合我们中国人键盘了.
  • rpi_hdmi_output 是针对RPI的了,如果设置为0,节省点RAM,因为不用启动显示功能了,做服务器尤为好用.
  • cpu_governor就是CPU调节器,对于Pi 3来说,performance就是固定1.2G,powersave就是固定600MHz,默认ondemand就是没事情时候低主频,有事时候快速升高.
  • SambaClient_ComputerName,SambaClient_ShareName,SambaClient_Username.SambaClient_Password就是配置samba的用户名密码名称的,很好理解啦.
  • boot_wait_for_network默认是1,就是等网络连接,可以设置成0,不等网络连接就开机,开机后网络也是不受影响的.对于没有网络连接的人来说,大胆禁用吧,对于只有无线但是不想在配置文件设置密码的,也可以禁用.
  • dietpi_check_for_updates为1就是可以检查更新,否则不检查更新.默认当然更新.
  • ntpd_update_mode是NTP时间同步的时刻,默认是开机同步,其实国内环境开机同步很费时,可以设置成4,后台同步.
  • wifi_hotspot_ssid,wifi_hotspot_key,wifi_hotspot_channel没有WIFI又没有以太网怎么操作,那就让Pi成为热点吧,这三个参数设置热点,名称啊密码,这样设置后,你就可以通过连接热点方式连接Pi,而不需要路由等附件了.
  • serial_console_enabled就是是否开启串口登录,又不想开热点,又没法连网络,比如在飞机上,你还是想玩玩,那么就用串口吧,默认是0,1是开启,开启后Pi的蓝牙就不好用了.
  • prefer_ipversion可以指定是否支持IPV6,默认auto是自动检测,其实国内IPV6除了高校,其他都支持不太好,可以直接force到ipv4,就是参数填ipv4,这样就很方便了.
  • Apt_Raspbian_Mirror就是设置树莓派源,还在讨厌树莓派源特别慢?不如把源改成http://mirrors.ustc.edu.cn/raspbian/raspbian/ 在国内可是神速.
  • dietpi_vncserver_*,如果没有显示器,还想要图形界面,VNC是你的选择,以前Raspbian时候VNC分辨率就是很小,感觉不好用,现在可以在配置文件直接配置VNC分辨率了.

2017-07-22 最新镜像(国内镜像优化版)

最新官方镜像!

最新官方镜像!

最新官方镜像!

重要事情要说三遍,因为是2017-07-22的镜像,而官网目前依然是2017-07-05,而实际上这个2017-07-22也是官方镜像,大家放心下载,并且还注入了几个重要补丁,相信大家会比较喜欢:

  • 替换了树莓派的乌龟速度源到国内USTC源,速度全满.
  • 替换了默认的en_US为zh_CN,再也不报中文语言的错了.
  • 默认启动了ssh,再也烧写后还要再新建个文件了.
  • 百分百保证原汁原味官方系统,非修改系统文件做的补丁,含官方签名.
  • 提供Lite版本和完整版本下载的同事,还提供带图形界面的4GB TF卡版本.
  • 加入内核上的ADS1115模块,让AD模块更好用,更易用.(AD模块购买请到顶端淘宝商城更实惠.)

这个系统镜像因为是官方方法制作,原汁原味,不留后门,支持USB启动,支持CM核心板!

另外,制作工具地址:https://github.com/nickfox-taterli/pi-gen-chinese

镜像下载地址:https://mega.nz/#F!IjAUzSRR!U0acFJoVM7XvKruFl4OHpQ

辅助下载链接:

完整系统链接: http://pan.baidu.com/s/1kUJJ471 密码: 5iun

Lite系统链接: http://pan.baidu.com/s/1nv3aDS1 密码: r8bb

4G TF卡可烧写系统链接: http://pan.baidu.com/s/1mi9OsPy 密码: ikj4

 

 

十步配置TeamViewer远程控制Pi – 支持内网穿透

使用TeamViewer远程控制Pi有如下好处:

  1. 可穿透局域网,延迟较低.
  2. 账号管理,不会遗忘连接.
  3. 操作友好,移动设备可管理.
  4. 无需显示器即可配置完成.

但是,我们怎样才能通过TeamViewer远程操作树莓派呢?首先注意确定的你的板子是Pi 3的.如果不确定,请参考文章:http://www.52pi.net/archives/454

然后确定自己系统版本比较新,我使用的是目前截稿为止的2017-06-21-raspbian-jessie.

剩下的,你需要一根网线,还有耐心啦.

第一步:拉取TeamViewer的安装包.

wget https://dl.tvcdn.de//download/linux/version_12x/teamviewer-host_12.0.78433_armhf.deb

第二步:尝试安装.

sudo dpkg -i teamviewer-host_12.0.78433_armhf.deb

第三步:虽然第二步失败了,但是我们目的是让系统知道他缺了什么软件包.这才有这一步,如果你已经成功,略过此步.

sudo apt-get -f install

第四步:我们重新开始安装,这次就能成功安装了.

sudo dpkg -i teamviewer-host_12.0.78433_armhf.deb

第五步:因为我们烧写的系统有图形界面,默认TeamViewer要在图形配置,除非你没有图形界面才能在命令行下配置,我们并没有显示器,所以先使用raspi-config配置到仅命令行模式.

sudo raspi-config

选择Boot Options – Desktop / CLI – Console AutoLogin

第六步:逐步退出raspi-config的配置,这会重启你的Pi.然后重启后登陆,运行下面命令开始配置:

sudo teamviewer setup

第七步:输入账号密码密码,如果还没有账号,那么你需要在你的电脑端注册一个账号了.

注册账号请点击电脑端此位置:

树莓派提示:

第八步:输入用户名和密码后,会询问是否加入树莓派到你的机器列表,我们当然选y.

如果此时提示你需要邮件验证,请进行邮件验证,然后重新登录,无需退出本程序.

第九步:此时提示我们成功加入到分组内了.同时,电脑的TeamViewer上也出现了设备了.

树莓派提示:

电脑提示:

第十步:还原为图形界面登录.运行raspi-config.

sudo raspi-config

选择Boot Options – Desktop / CLI – Desktop AutoLogin

完成:逐步退出raspi-config的配置,这会重启你的Pi.大功告成了.

此时你可以使用电脑版,移动端版TeamViewer测试连接.

电脑端测试图:

移动端测试图:

不知道大家注意到没,我手机访问使用的是移动网络,并且依然可以访问到内网的Pi,而我是没有给我的Pi分配公网IP的哦.

 

#Raspbian C应用编程#strlen 和 sizeof 的区别

上一次已经做了个CPU温度频率记录器,细心的同学如果打开文件一看,就哭晕了.

跟想象中好大差别啊:

为什么这么多^@啊,原来这是0x00的转义字符啊,因为我们上一节只用到了sizeof,所以不管buf多大,我们都写了1K数据进去.简直是浪费.把sizeof换成strlen,每次生成字符串前都清空buf.

这样每次写入的数量就心中有数了,strlen获取的是字符串有效长度,sizeof获取的是字符串的整个容器大小.

经过上述调整的代码,看起来就不违和了.

要想学习更多Linux C知识,多多关注本站吧,本站所有调试基于树莓派学习,现在入手买个套件,更方便你更进一步哦.

程序下载:

cpu_logger (3KB)

#Raspbian C应用编程#Linux 文件I/O – 系统温度主频记录器

UNIX/Linux 的一个基本哲学是”一切皆文件”.不仅普通的文件,甚至连各种字符设备、 块设备、套接字等都被当成文件对待,尽管它们的类型差异很大,但 UNIX/Linux 为它们提 供的操作界面却是相同的. Linux 把大部分系统资源当作文件并呈现给用户,用户只需按照文件 I/O 的方式,就能完成数据的输入输出. Linux 文件按其代表的具体对象,可大致分类为:

  1. 普通文件,即一般意义上的文件、磁盘文件;
  2. 设备文件,代表的是系统中一个具体的设备;
  3. 管道文件、 FIFO 文件,一种特殊文件,常用于进程间通信;
  4. 套接字( socket)文件,主要用在网络通信方面.

文件 I/O 的常用操作方法有”打开”、”关闭”、”读”和”写”等.只要是文件,所有文件都有前面两种方法.系统提供了文件 I/O API,以函数的形式提供给应用程序调用.打开文件对应的函数是 open(),读文件对应的函数是 read(),写文件对应的函数是 write(),关闭文件对应的函数是 close()

文件描述符 是进程中用来表示某个文件的一个变量, 文件描述符的作用,类似于在排队取号,业务员(进程)通过叫号(文件描述符)就能找到来搞事的人(文件)

大多数 Raspbian系统中,可通过命令”ulimit -n”查询到这个数值的大小,但注意,不是所有Linux都有这个指令.

文件描述符 012 在Linux上有特殊意义,我们暂时可以不去理解他.只知道他们比较特殊就行了,所以实际上树莓派只有最多7312个同时打开文件.(难道还不够?)

另外文件操作要涉及几个头文件,死记硬背.要用到哪个函数,就用哪个头文件,就是这样的.

#include<sys/types.h> /* 定义数据类型,如 ssize_t, off_t 等 */
#include <fcntl.h> /* 定义 open, creat 等函数原型,创建文件权限的符号常量 S_IRUSR 等 */
#include <unistd.h> /* 定义 read, write, close, lseek 等函数原型 */
#include <errno.h> /* 与全局变量 errno 相关的定义 */
#include <sys/ioctl.h> /* 定义 ioctl 函数原型 */

我们这就上Pi实践下,还是使用VS + Visual GDB神奇组合.就算你不懂Linux各种繁琐指令也能写出不错的程序.如果还不是特别了解,就参考下之前的文章吧.

下面演示的例子,先以可写方式打开当前目录下的hello.txt文件,如果该文件不存在,则创建文件,再往文件中写入一个字符串Hello, welcome to 52pi.net!,把操作结果输出到终端后,关闭文件. 接着再次以只读模式打开该文件,读取刚才写入的数据,并把结果输出到终端最后关闭该文件.

代码:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/stat.h>

int main(int argc, char *argv [])
{
	char sz_str [] = "Hello, welcome to 52pi.net!";
	char sz_filename [] = "hello.txt";
	int fd = -1;
	int res = 0;
	char buf[128] = {0x00};
	fd = open(sz_filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
	if (fd < 0)
	{
		printf("Open file %s failed,errno = %d.\n", sz_filename, errno);
		return -1;
	}
	
	res = write(fd, sz_str, sizeof(sz_str));
	printf("write %d bytes to %s \n", res, sz_filename);
	fsync(fd);
	close(fd);
	
	fd = open(sz_filename, O_RDONLY);
	if (fd < 0)
	{
		printf("Open file %s failed,errno = %d.\n", sz_filename, errno);
		return -1;		
	}
	
	res = read(fd, buf, sizeof(buf));
	buf[res] = '\0';
	printf("read %d bytes from file %s ,data = %s \n", res, sz_filename, buf);
	close(fd);
	
	return 0;
	
}

测试结果:

那么刚才代码里面的O_WRONLY都是什么定义呢,我们可以右键,转到定义去查看一下.


当然也可以看我解释:

  • O_RDONLY 以只读方式打开文件
  • O_WRONLY 以只写方式打开文件
  • O_RDWR 以可读写方式打开文件. 上述三种旗标是互斥的, 也就是不可同时使用, 但可与下列的旗标利用OR(|)运算符组合.
  • O_CREAT 若欲打开的文件不存在则自动建立该文件.
  • O_EXCL 如果O_CREAT 也被设置, 此指令会去检查文件是否存在. 文件若不存在则建立该文件, 否则将导致打开文件错误. 此外, 若O_CREAT 与O_EXCL 同时设置, 并且欲打开的文件为符号连接, 则会打开文件失败.
  • O_NOCTTY 如果欲打开的文件为终端机设备时, 则不会将该终端机当成进程控制终端机.
  • O_TRUNC 若文件存在并且以可写的方式打开时, 此旗标会令文件长度清为0, 而原来存于该文件的资料也会消失.
  • O_APPEND 当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文件后面.
  • O_NONBLOCK 以不可阻断的方式打开文件, 也就是无论有无数据读取或等待, 都会立即返回进程之中.
  • O_NDELAY 同O_NONBLOCK.
  • O_SYNC 以同步的方式打开文件.
  • O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接, 则会令打开文件失败.
  • O_DIRECTORY 如果参数pathname 所指的文件并非为一目录, 则会令打开文件失败.(Linux特有)

而第二项权限意思是这样的:

  • S_IRWXU00700 权限, 代表该文件所有者具有可读、可写及可执行的权限.
  • S_IRUSR 或S_IREAD, 00400 权限, 代表该文件所有者具有可读取的权限.
  • S_IWUSR 或S_IWRITE, 00200 权限, 代表该文件所有者具有可写入的权限.
  • S_IXUSR 或S_IEXEC, 00100 权限, 代表该文件所有者具有可执行的权限.
  • S_IRWXG 00070 权限, 代表该文件用户组具有可读、可写及可执行的权限.
  • S_IRGRP 00040 权限, 代表该文件用户组具有可读的权限.
  • S_IWGRP 00020 权限, 代表该文件用户组具有可写入的权限.
  • S_IXGRP 00010 权限, 代表该文件用户组具有可执行的权限.
  • S_IRWXO 00007 权限, 代表其他用户具有可读、可写及可执行的权限.
  • S_IROTH 00004 权限, 代表其他用户具有可读的权限
  • S_IWOTH 00002 权限, 代表其他用户具有可写入的权限.
  • S_IXOTH 00001 权限, 代表其他用户具有可执行的权限.

如果不指定,权限就是000了,000代表谁都对这个文件没办法.

从上述我们已经了解到文件基本读写,那么现在开始实践,已知Raspbian系统的核心0的主频是存在/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq文件,而CPU温度是存在于/sys/class/thermal/thermal_zone0/temp文件.我们读取这两个文件,定时写入到一个文件里面做记录.

所以,记录工程应该长这个样子.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/stat.h>

#include <time.h>


int main(int argc, char *argv [])
{
	int cpu_freq_fd = -1;
	int cpu_temp_fd = -1;
	int cpu_logger_fd = -1;	
	
	char freq_buf[128] = {0x00};
	char temp_buf[128] = {0x00};
	char log_buf[1024] = {0x00};
	
	time_t rawtime; 
	struct tm * timeinfo; 
	
	cpu_freq_fd = open("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq", O_RDONLY);
	cpu_temp_fd = open("/sys/class/thermal/thermal_zone0/temp", O_RDONLY);	
	cpu_logger_fd = open("cpu.log", O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
	
	while (1)
	{
		lseek(cpu_freq_fd, 0, SEEK_SET); /* 回到文件的开始 */
		read(cpu_freq_fd, freq_buf, sizeof(freq_buf)); /* 读取文件 */
		
		lseek(cpu_temp_fd, 0, SEEK_SET); 
		read(cpu_temp_fd, temp_buf, sizeof(temp_buf)); 
		
		time(&rawtime); 
		timeinfo = localtime(&rawtime); 
		
		char *now_time = asctime(timeinfo);
		now_time[strlen(now_time) - 1] = 0;
		
		sprintf(log_buf,"%s - CPU = %d MHz - Temp = %d degC\n", now_time, atoi(freq_buf) / 1000, atoi(temp_buf) / 1000);		
		
		write(cpu_logger_fd, log_buf, sizeof(log_buf));
		fsync(cpu_logger_fd);
		
		sleep(1);
	}
	
	close(cpu_freq_fd);
	close(cpu_temp_fd);	
	close(cpu_logger_fd);		
	
	return 0;
	
}

执行效果,是不是很棒,这样就有一个监控程序了.通过程序不难看出,就是不断写cpu.log文件.然后休眠.

此处用到的两个工程:

cpu_temp_logger

file_wr

Visual Studio + VisualGDB 远程调试树莓派

想必很多人都知道地表最强IDE VS,超级补全非常靠谱,如何结合VisualGDB,还能调试树莓派呢.Visual GDB的下载地址:

http://visualgdb.com/download/

可以足足试用30天,试用结束后可以寻求网友帮助或者购买软件.本站是不提供破解下载的哦.

软件原材料:

  1. Visual Studio 2017 社区版(更高版本也可以)
  2. VisualGDB 5.2r8(更高版本也可以)
  3. 树莓派需要开启SSH登陆

硬件原材料:

  1. 树莓派
  2. 跑着Raspbian系统的TF卡(同类系统也可以)

首先打开VS,然后点击文件 – 新建项目 – VisualGDB – Linux Project Wizard.并选择一个英文路径和文件名保存工程.

我们使用微软编译器,并选择C语言.

选择新建一个连接:

依次如图填写主机IP,用户名,密码(Raspbian的默认用户名是pi,密码raspberry):

第一次设置连接会弹出如下提示,直接按Save保存好通信的”钥匙”.

编译器选择,我们可以选GCC,GCC比较通用,然后接着下一步.

等待项目创建:

如果没有出现上图的创建项目的过程,检查下SSH是否已经打开,IP和密码是否正确.如果出现下图的错误,请直接点击OK修复.此错误通常出现在新的Raspbian系统上.

如果以上问题都解决了,就可以点击完成Finish了.

首次会从树莓派上复制部分文件到电脑,这样是为了一些代码补全和调试方便.

当工程创建完毕后,双击右侧的c文件,打开源码显示,如图.

并在右侧return 0的位置单机左键,新增一个红点,这个红点意思是断点,程序执行到这里,就等我们继续发令才能继续运行.

点击上面的VisualGDB Debugger开始编译并下载到板子测试.

这里可以看得到编译过程:

可见程序已经执行并输出Hello World.并且停在红点位置了.

使用VS进行调试最大的优点是实时观察变量,内存等,并且支持断点调试,还不用去学习vim怎么去使用.更多功能还等着大家去探索.