
告别VM虚拟机,使用WSL安装交叉编译器
学习嵌入式Linux的首先是开发环境安装,在Linux平台上使用交叉编译器编译,但是VM虚拟机体积大,使用起来用户体验很不好,尤其是电脑内存捉急的。有没有可以替代的方法呢?答案是可以使用WSL
什么是WSL?适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销。
WSL1和WSL2区别
首先从官方的比较中可以看出除了跨操作系统文件系统的性能外,WSL 2 体系结构在多个方面都比 WSL 1 更具优势。但是假如需要使用的串口或者跨操作系统文件系统的话只能选择WSL1,笔者在这里只用到了wsl进行行编译,其他操作全部windows下解决,所以选择WSL2
安装WSL
首先需要在电脑BIOS中打开VT
具体步骤请按电脑品牌百度
自动安装步骤
powershell输入以下命令(WIN+X)
1 | wsl --install |
此命令将下载最新的 Linux 内核,将 WSL 2 设置为默认值,并安装 Linux 发行版。步骤简单但是默认安装在C盘,虽然只有几百兆,但某些小伙伴可能有精神洁癖(逃),咱们选手动安装
WSL手动安装步骤
启用适用于 Linux 的 Windows 子系统
以管理员身份打开 PowerShell 并运行:
1 | dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart |
重启
启用虚拟机功能
1 | dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart |
下载 Linux 内核更新包
适用于 x64 计算机的 WSL2 Linux 内核更新包
下完后打开一路下一步
将 WSL 2 设置为默认版本
以管理员身份打开 PowerShell 并运行:
1 | wsl --set-default-version 2 |
安装所选的 Linux 分发
方法一:Microsoft Store商店中搜索需要的Linux版本直接安装,缺点是默认装C盘
方法二:手动装,首先下载
- Ubuntu 20.04
- Ubuntu 20.04 ARM
- Ubuntu 18.04
- Ubuntu 18.04 ARM
- Ubuntu 16.04
- Debian GNU/Linux
- Kali Linux
- SUSE Linux Enterprise Server 12
- SUSE Linux Enterprise Server 15 SP2
- openSUSE Leap 15.2
- Fedora Remix for WSL
下载好后解压.appx格式的包,假设安装在D盘,则直接将其复制到D盘即可,双击文件夹中的exe文件启动linux,首次使用需要设置账户密码。
注意:如果需要使用模拟器时需要在“启用或关闭Windows功能”中关闭Linux子系统功能,否则模拟器无法检测到VT
交叉编译器安装
首先时需要下载安装包了,这里从韦东山jz2440资料光盘中拷贝出
首先将其复制到Linux用户目录下,此处路径以笔者为例,请按需修改
文件管理器打开下面的位置即为Linux目录,注意版本号按需修改
1 | \\wsl$\Ubuntu-20.04 |
打开Linux的命令行,首先新建目录
1 | sudo mkdir \usr\local\arm |
将安装包复制到arm文件夹中
1 | sudo cp arm-linux-gcc-4.3.2.tar.bz2 \usr\local\arm -f |
解压
1 | sudo tar -xjvf arm-linux-gcc-4.3.2.tar.bz2 |
设置环境变量
笔者习惯使用nano编辑器,自行选择编辑器操作
1 | sudo nano \etc\profile |
在最后添加
1 | export PATH=$PATH:/usr/local/arm/arm-linux-gcc-4.3.2/bin |
Ctrl+O并回车保存,Ctrl+X退出
重启
注意WSL中不能直接重启,只能关闭再打开
以管理员身份打开 PowerShell 并运行:
1 | wsl --shutdown |
然后再重新打开
输入arm-linux-gcc -v能够正常显示版本则表示安装成功
Makefile
基本格式
1 | 目标...:依赖... |
注意为Tab,不得出现空格
变量
系统变量
$(变量名)
自定义变量
- = 延迟变量(不调用不改变)
- := 立即赋值
- ?= 空赋值
- += 追加赋值
自动化变量
- $< 第一个依赖文件
- $^ 全部的依赖文件,若目标中有重复文件将只保留一份
- $@ 目标的集合
- $% 当目标为函数库的时候表示规则中的目标成员名。若目标不是函数库文件则值为空
- $? 所有比目标新的依赖目标集合,以空格隔开
- $* 表示目标模式中”%”及其以前的部分
- $+ $^类似但不主动除去
伪目标
仅执行命令的目标与目录下存在的文件名冲突时,例如clean
声明方式:1
.PHONY:clean
模式规则
% 长度任意的非空字符串,当”%”出现在目标时,目标中的”%”决定依赖中的”%”值条件分支
1
2
3
4
5
6ifeq (var1,var2)
...
else
...
endif1
2
3
4
5
6ifneq (var1,var2)
...
else
...
endif函数
模式替换函数patsubst
$(patsubst %.c,%.o,x.c.c bar.c) 将“x.c.c bar.c”中以“.c”结尾的单词替换成“.o”取文件名函数notdir
$(notdir src/foo.c hacks)取出路径中非目录的部分wildcard 获取匹配模式文件名函数
$(wildcard *.c)返回当前目录下所有“.c”源文件列表foreach循环函数
$(foreach VAR,LIST,TEXT)LIST中以空格间隔的单词逐个赋值给VAR进行TEXT中的运算
树莓派下岗再就业-ZeroTier内网穿透
需要截图的部分等新图床弄好后再补
离校后进不了校园内网,但是万一需要的时候就很麻烦,于是我看向了边上的树莓派
zerotier安装
注册账号
https://www.zerotier.com/
接着新建网络,类型选择PRIVATE
客户端安装
Windows
下载安装客户端,并右击添加网络,将上一步获得的16位Network ID填入注意复制的时候不要带换行或空格符号
Linux
安装
1 | curl -s https://install.zerotier.com | sudo bash |
加入网络
1 | sudo zerotier-cli join Network ID |
配置树莓派的数据转发和路由控制
查看IP转发设置
0为关闭
1 | $ sudo sysctl net.ipv4.ip_forward |
打开内核IP转发
1 | sudo nano /etc/sysctl.conf |
将下列语句去掉注释并修改为1
1 | net.ipv4.ip_forward=1 |
修改完成后CTRL+O并回车保存,CTRL+X退出
接下来激活配置
1 | sudo sysctl -p |
再次查看IP转发状态
1 | sudo sysctl net.ipv4.ip_forward |
查看网卡状态
1 | $ ifconfig |
可以看到eth0为真实网卡,而————————为zerotire虚拟出来的网口
使用 iptables 启用 eth0 的网络地址转换和 IP 伪装
1 | sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
允许流量转发和跟踪活动连接:
1 | sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT |
接下来设置从zt7u3fcxwr 到 eth0 流量转发
1 | sudo iptables -A FORWARD -i zt7u3fcxwr -o eth0 -j ACCEPT |
经过以上设置就完成了配置,但是iptables 规则在重新启动后就无效了,需要保存在配置文件中
安装 iptables 配置存储工具
1 | $ sudo apt-get install iptables-persistent |
保存 iptables 配置到文件
1 | $ sudo netfilter-persistent save |
查看 iptables 配置文件内容
1 | sudo iptables-save |
路由设置
授权
进入zerotier控制台,将下来到设备可以看到第一步加入的设备,勾选Auth?
设置路由
Managed Routes项中添加0.0.0.0/0(全局转发,可根据需求设置)
客户端设置
Windows
Allow Default Route勾选转发
不用的时候一定记得取消勾选,否则客户端退出后无法正常使用网络
Android
在设置中勾选转发
参考链接
【网络通信】【zeorTier】基于 zerotier 使用 Linux Kernel 设置转发代理
ZeroTier Documentation
RTS、DTR与一键下载电路
单片机在通过ISP下载程序的时候一般我们只关注四根线,VCC、GND、RXD、TXD。最近在画一个ESP32的最小系统时发现很多开发板的USB->TTL电路却使用到了串口芯片的RTS、DTR管脚。

似乎有那么一丢丢眼熟,没错,原子的一键下载电路也长这个样

战舰V3一键下载电路
通过串口的RTS# DTR#管脚控制MCU的RST和BOOT0实现一键下载。上位机控制DTR#输出高电平,RTS#输出低电平,三极管均导通,通过三极管的反向作用,4148导通,RESET被拉低,系统复位,而BOOT0被拉高。一定延时后再将DTR#输出低电平,系统启动,此时因为BOOT0拉高所以程序进入ISP模式。需要注意的是这两个管脚与FlyMcu上设置的电平完全相反。
再回到51单片机,下载程序的软件无非两个,STC-ISP和普中的下载软件。STC-ISP下载异常的稳定,但是每次都需要冷启动。而普中的却不需要,翻阅下普中开发板设计

普中HC6800下载电路
这两个管脚控制Q1,再通过Q1控制MOS管导通与否实现对板子电源的控制。emmm,,,问题出在这个MOS管经常炸管,,,
给树莓派添加物理开关机按键
之前通过树莓派把打印机改成了共享打印机,但每次开关机就显得无比麻烦,直接断电鬼知道下次开机系统是不是正常运行的,每次关机都接个键盘实在太不优雅了
想法一:单片机模拟USB键盘发送关机指令,费时费力,直接pass
想法二:板子上有没有啥预留的电源控制接口,实际上拆开可以看到个RUN,用于控制重启,中文资料约等于0,抄来抄去都是那一篇,但是在检索的过程中发现了这个

有前辈已经整出来了
在/boot/config.txt添加以下:
1 | # 使用GPIO3(这里的GPIO指3BCM GPIO编号,也就是SCL1)作为电源键,下降沿为按下,上升沿为弹起,内部上拉 |
保存关机后,试下将IO3和GND短接下,没错,直接开机,开机后再短接下,关机,完美!
在外壳上加个按键,建议把杜邦线拆了加焊一下再插上
参考
Raspberry PI 3B+CUPS实现共享打印机
每次打印东西都要把电脑搬到打印机边上,实在过于麻烦,恰巧手里有块吃灰大半年的树莓派,干脆直接改无线打印机算了
把打印机通过USB线连接Raspberry PI,然后安装CUPS(一定要换国内源,具体参考开箱配置那一篇)
sudo apt-get install cups
系统会自动安装相关依赖和打印机驱动,安装完后将用户加到lpadmin 用户组,然后开启 CUPS 的远程访问权限。
1 | sudo usermod -a -G lpadmin pi |
执行完之后局域网内任何一个设备访问Raspberry PI的631端口,如http://192.168.1.XX:631,接了屏幕的建议直接在Raspberry PI上访问
按CUPS界面引导配置CUPS:Administration->Add Printer,记得选中分享打印机,打印机的名字尽量简单(吐槽句,有个教程写成Description ,然后一堆复读机复读了这个错误,,,,),后面可能会用到,配置完后打印测试页试下能不能正常打印
安装samba来添加Windows环境支持(实际测试Windows下能不能找到完全看缘分,但是Android下可以找到)
1 | sudo apt-get install samba |
接下来到Windows系统里添加打印机,安装samba后运气好能直接找到,但是大概率是没办法直接找到的,选择我需要的打印机不在列表中

然后按下图设置(打印机IP:631/printers/Name),注意IP地址和在CUPS中设置的打印机名不要设置错,之后一路下一步,正确选择打印机驱动即可。

Android中本人测试为Redmi K20,无法打印图片,但是可以通过先转PDF的方式打印(办法总比困难多嘛
参考:
浏览器抓取cookies
最近为了白嫖室友的某些网站会员(白嫖使人进步),首先某些网站登陆后下次再访问发现已经自动登陆了,这里面利用到了cookie进行标识用户,Cookie是一段不超过4KB的多个键值对组成,只要将有效的cookie抓取到就可以实现免密登陆。
那么如何以最简单的方法获取cookies?
打开页面,按下f12

依次Network->过滤器(漏斗图标)->Doc,再刷新

以某易云为例,选择music.163.com,在Headers中向下寻找cookies即可
CC2530开发环境搭建
CC2530是个什么玩意?
简单的说是256kB 闪存和 8kB RAM 的 Zigbee 和 IEEE 802.15.4 无线8051增强型MCU,能zigbee组网。
准备环境
软件:IAR for 8051,SmartRF Flash Programmer(德州仪器官网有两个版本,注意选择老版本)
硬件:cc2530核心板(抢的),SmartRF04EB仿真器(捡的),万用板、led等元件(嫖的) P.S.开局一双手,东西全靠抢(逃
最小系统结构


GND—GND
VCC—VCC
DC—-P22
DO—-P21
CSN—P14
SCLK–P15
RESET–RES
MOSI–P16
NC
MISO–P17
连接接线说明
P.S.友情提示,一定要注意接线是否靠谱,杜邦线坑人
IAR开发环境设置
打开IAR->创建workspace

创建工程,之后选择工程存储路径。


Ctrl+N新建文件,Ctrl+S保存文件(注意文件拓展名.c)右击工程添加文件


还需要设置项目属性,点击project->Options




注意输出文件后缀改为hex

编辑程序后编译(快捷键F7),也可以ctrl+D直接进入仿真(需要仿真器)
1 | //示例 |

GPIO配置
CC2530共有21个IO,核心板给出了19个(P2_4和P2_3用于接32.768K的晶振),其中P22、P21用于下程序,不建议使用。

在CC2530的21个IO口中,除了P1_0和P1_1两个IO口具有20mA的驱动能力之外,其余IO口的驱动能力仅为4mA。官方例程这两个IO用于点灯,至于自己焊电路麻,无所谓了(摊手
寄存器PxSEL,其中x为端口标号(0-2),用来设置端口的每个引脚为通用IO或外部设备IO,默认时,每当复位后,所有数字输入输出引脚都设置为通用输入引脚。0:通用IO 1:外设功能
寄存器PxINP用于设置每个端口引脚为输入或输出。0:输入 1:输出
寄存器PxINP用来在通用IO端口用作输入时设置为上拉/下拉或三态操作模式,默认复位后所有端口设置为带上拉的输入P10、P11即使外设功能是输入,也没有上拉/下拉功能。0:上拉/下拉 1:三态
驱动安装与程序下载
插上仿真器,电脑应识别出但无法正常驱动,打开设备管理器,右击仿真器,选择更新驱动程序

选择“浏览我的计算机以查找驱动程序软件”,路径选择为IAR安装目录下
1 | \IAR SYSTEMS\EMBEDDED WORKBENCH 8.1\8051\DRIVERS\TEXAS INSTRUMENTS\WIN_64BIT_X64 |
选择下一步后关闭窗口,复位仿真器,刷新设备管理器,此时仿真器应被正确识别
打开SmartRF Flash Programmer并按下图设置

1.注意芯片是否识别正确,未识别按下仿真器复位键,如果还不行请检查接线。
2.选择对应hex文件。
3.点击perform actions下载,等待进度条完成。
2020\"TI\"杯省级大学生电子设计竞赛反思、总结
尽职尽责地完成任务,同时保持身心健康,不被过度加班折磨心智,也不因碌碌无为而愤世嫉俗
这次比赛不论获奖如何对我来说都是血亏,开学后先是准备期末考试,之后是准备电赛,直到九号特么终于放了一天假。结果晚上组委会提前放题目,长期的高压、失眠差点猝死,十一号早上吐胆汁,心率不齐过了半个月才恢复….以身体为代价换取的任何东西都是彻底的赔本买卖

本组选择赌A题——无线运动传感器节点设计,首先吐槽的是题目说明不清,题目要求将节点数据上传至服务器,想都没想直接上阿里云,第一天下午程序移植完成,结果组委会来一句不得连接外网,&*%#W*@!& 一天白干了

全题最蛋疼的就是这个心率波形显示了,使用心率发生器输出波形非常稳定,但是电极片贴到人身上就是另一码事了。电极粘贴情况、皮肤干燥情况、粘贴位置等均影响AD采集数值,Vpp能从50000直接蹦到400000不等。直到最后这个问题都没解决,另外,电极片长时间粘贴对人有害,而且难以撕下,胸口汗毛全被这玩意撕下来了。
在比赛过程中,为了解决所出现的问题,想尽一切方法解决,为了解决屏幕刷新跟不上数据采集问题,使用了消息队列,最后发现还是得切片才能显示,,,不过至少说明数据结构没白学。
不足:
首先是队友配合问题,由于磨合时间短,缺乏经验等原因导致磨合不足,配合效率低下,作为队长我有不可推卸的责任。
其次,上位机一直作为本人短板,比赛中不仅没解决,还耗费了大量时间,不管是第一天的阿里云还是最后一个晚上死磕pyqt,耗费大量精力。由于上位机短板最后评测时只能三选一得分(三个功能分开实现,只能算一个5/15)
长期高压+熬夜,最后熬的心率不齐,本来板上订钉的心率检测最后也没测出来
不要耍小聪明,你能想到的造假手段别人也能想到