Linux Control Group
基本介绍Control Group是挂载在GNU/Linux系统/sys/fs/cgroup的一个虚拟文件系统, 用于对进程进行分类并且控制其使用的系统资源(CPU占用个数和时长/内存使用量/网络使用量/etc).
除了/sys/fs/cgroup/, GNU/Linux系统还有/dev/shm(将部分内存以磁盘形式暴露)//proc(暴露各进程)等虚拟文件系统.
限制进程的内存使用量sudo su
cd /sys/fs/cgroup/memory
mkdir test # 克隆memory control group
cd test
echo $$ > tasks # 将本终端的进程号加入被控制范围
echo 10M > memory.limit_in_bytes # echo入要限制的内存大小
... # 运行要被控制的程序
Ubuntu设定自动重启
Goal: 使用Cron完成Ubuntu的定时重启.
分析: Ubuntu等发行版一般自带Cron, 需要设置其随开机自动启动, 并且配置Crontab.
sudo systemctl enable cron.service; sudo systemctl start cron.service
sudo crontab -e
Crontab末尾追加的内容:
# m h dom mon dow /sbin/reboot 例如每周一凌晨两点重启
0 2 * * 1 /sbin/reboot
如果cron还是无法开机自启动, 则修改/etc/rc.local, 在exit 0前插入一行:
service cron start
结合双网口香橙派的实验室电脑改造方案
初步构想为了在离开实验室的时候可以获取实验室电脑上的资源, 并且给实验室其他人分享自己的部分实验资料,需要做到
Wake on LAN远程开机
NFS网络文件系统
HTTP服务器
L2TP网络认证(否则无法上网)
软路由
内网穿透
因为实验室的电脑只有百兆网卡, 所以我也对应选择了有两个百兆网口的香橙派R1.
armbian配置从https://www.armbian.com/orange-pi-r1/下载系统镜像, dd入SD卡, 连接好串口转USB线, 开机上电.
软件源修改/etc/apt/source.list, 把http://ports.ubuntu.com/修改为https://mirrors.ustc.edu.cn/ubuntu-ports/.
GCC
建议先安装build-essential. 使用
GCC*.c \rightarrow 预处理\; \mathrm{gcc\, -E} \rightarrow *.i \rightarrow 编译\; \mathrm{gcc\, -S} \rightarrow *.s \rightarrow 汇编\; \mathrm{gcc\, -c} \rightarrow *.o \rightarrow 链接\; \mathrm{gcc} \rightarrow 可执行文件链接可分为动态链接和静态链接:
动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态库才能运行。动态链接生成的程序小巧,但是必须依赖动态库,否则无法执行。
Linux下的动态链接库实际是共享目标文件(shared object), 一般是.so 文件, 作用类似于 Windows 下的.dll 文件。
静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行,不过体积较大。
Linux 下静态库是汇编产生的.o 文件的集合,一般以.a 文件形式出现。
gcc 默认是动态链接,加上-s
EasyConnect
OS: Deepin Linux 15.11 Desktop stable.
我们学校需要使用EasyConnect进行反向VPN代理入内网. 直接在rvpn.xxx.edu.cn下载安装EasyConnect后就能在之前页面登录进入内网.
但是安装完EasyConnect后的电脑中, 即使不开启EasyConnect, 也能发现其相关进程EasyMonitor与ECAgent在运行. 要知道EasyConnect可是会监控电脑的整个网路连接, 天知道EasyMonitor里面会留下什么后门漏洞之类的泄露数据(可能是我多虑了). 本着绝不给不用的软件丝毫浪费计算机资源的想法, 还是禁用掉这个进程的自动开机吧.
sudo systemctl disable EasyMonitor
这样以后就不能正常启动EasyConnect连内网了, 需要使用EasyConnect的时候需要开启EasyMonitor.
sudo systemctl start EasyMonitor
至于ECAgent, 关掉EasyMonitor后它就销声匿迹了.
MicroPython (ESP32)使用定时中断实现伪多线程
首先加载machine及其中的Timer, 并定义一个定时器timer.
from machine import Timer
import machine
timer = Timer(0) # Timer的参数是可变的, 代表硬件定时器的编号.
定义中断处理函数与中断变量.
counter = 0
def hantimer(timer)
global counter
counter = counter+1
'''
中断处理代码 # 此处不建议加入过多代码或者循环/递归, 容易出错.
'''
初始化计时器:
timer.init(period=1000, mode=Timer.PERIODIC, callback=hantimer)
# period的单位为ms, 此处每过1000执行一次中断函数hantimer.
不断查询中断变量, 获取中断后复原之.
while 1:
if counter > 0:
state = machine.disable_irq() # 从计时器处释放中断函数, s
用单片机模拟低压交流电的微型电路(思路)
最近在思考能够用于96孔板的ECIS电路, 需要给板中电极提供约2.5V峰值电压(最好可调)而且频率可调的交流电. 而且我不想用类似金手指的方法把电极引出用板外电路供电. 为了完成目标, 我准备在电极层下面再加一块电路板提供交流电甚至是电流电压检测, 用通孔把电极引入(其实相当于原来是两层板现在做成了三层电路板), 这样造成了我的交流电发生/控制模块只有9mm×9mm的面积能放器件.
使用RS485/RS422模拟交流电RS422这个通讯协议中使用4条线来传输数据(不含时钟线), 它的一位数据由两条线仪器传输, 当线A比线B电压高1.5V时为1, 线A比线B低1.5V时为0. 速率可达为30Mbps, 也就是说我一直发10101010的循环可以得到由方波构成的15MHz的交流电, 一直发11001100则得到7.5MHz的交流电, 以此类推.
RS485也是类似的, 不过它只用2条线来传输数据(所以不能同时收发), 而且传输速率只能达到250kbps, 用上述方法最多得到峰值2.5V(记不清了, 好像是2.5V)频率125kHz的交流电.
这个方案的缺点是只能发出方波的交流电, 峰值电
Beginner guide for Digispark USB
Digispark简单小巧, PWM/ADC/I2C都有, 还能模拟USB, 核心ATTINY85芯片的性能也还过得去, 16MHz的主频, 6kB存储, 就是IO口少的可怜(最多6个, 国产Digispark一般只有5个, P5不能用)以及没有串口.
Digispark兼容大多数Arduino源码, 这里用Arduino IDE为其烧写程序.
OS: Deepin Linux 15.11 Desktop
Arduino IDE configuration for Digispark USB在Arduino IDE的首选项里附加开发板管理器网址中写入https://raw.githubusercontent.com/ArminJo/DigistumpArduino/master/package_digistump_index.json(对于很旧的使用老版本固件的Digispark, 可能需要更新固件或者使用老本币的管理器网址http://digistump.com/package_digistump_index.json). 然后在工具中找到 开发板... > 开发板管理器,
Using ESP32 with MicroPython and Mu
ESP32能够用与Arduino一样的价格来获得更多的功能, 包括WiFi/BLE/更多UART/更高速MCU(最高240MHz), 而且它除了C还支持Python.
ESP8266也可以用MicroPython, 还比ESP32便宜, 但是没有BLE, IO口更少, 并且MCU最高只能达到160MHz.
OS: Deepin Linux 15.11 Desktop, 自带Python2与Python3.
MicroPython固件刷写
详细可以参考http://docs.micropython.org/en/latest/esp32/quickref.html.
可以在MicroPython官网找到ESP32的固件, 建议下载Firmware with ESP-IDF v3.x中的第一个固件的二进制文件(*.bin).
刷写软件esptool为Python的一个包, 可以直接使用pip安装.
sudo apt update
sudo apt install -y python3-pip
sudo pip3 install esptool # sudo pip install