步骤
修改 board/Kconfig,添加 adc 相关部分,以下为参考
1 | menuconfig BSP_USING_ADC |
如果启用的 adc 不自带,需要手工修改
修改libraries/HAL_Drivers/config/f4/adc_config.h
1 |
menuconfig
1 | scons --menuconfig 启用 adc |
修改 board/Kconfig,添加 adc 相关部分,以下为参考
1 | menuconfig BSP_USING_ADC |
如果启用的 adc 不自带,需要手工修改
修改libraries/HAL_Drivers/config/f4/adc_config.h
1 |
1 | scons --menuconfig 启用 adc |
复制 bsp/stm32/libraries/templates 下面复制你的型号的模板 到 bsp/stm32/下,改成你喜欢的名字
rtconfig.py, 配置编译器
1 | if CROSS_TOOL == "gcc": |
1 | scons -c; scons --dist |
创建跟你 mcu 一样的项目,修改配置,生成代码。
复制 Inc 和 Src 目录到 board/CubeMX_Config 下覆盖
从 board/CubeMX_Config 里面找到 main.c,复制 SystemClock_Config() 到 board/board.c 里面,这是唯一需要手工复制的函数,如果不复制,可能会出现烧录以后失去响应的问题
强烈建议看一下原理图,里面 mcu 相关的晶振部分的频率,在 cubeMX 的时钟部分的 HSE 和 LSE 的频率,一定要和原理图里面的一致
注意看原理图里面的串口引脚,是否有重新映射的引脚,不然无法通信
修改 board/Kconfig,搜索 config SOC_STM32, 改为相应的芯片型号
如果需要 i2c 等配置,而当前的 Kconfig 里面没有的话,可以从别的 bsp 里面借鉴一下
mcu 具体的 flash 和 ram 大小,最好看一下芯片手册,比如 f407igt6 里面,有 64k 的内存是保留不能使用的
可以使用 segger 公司的 JFlashLiteExe 查看具体芯片的 flash 和 ram 大小, v6.86g 这个版本是最后一个能看内存大小的版本,推荐使用
修改 board/SConscript, 看看芯片等信息有没有错误
搜索 CPPDEFINES, 改成你的芯片对应的型号,具体写法参考 CPPDEFINES 上面的内容里面改
根据你的芯片型号,修改下面对应的汇编启动文件 xxxxxx.s, 如果不知道用哪个,可以用 cubeMX 生成项目以后找,看用的是哪个文件
1 | if rtconfig.CROSS_TOOL == 'gcc': |
启动顺序
1 | # 自己的启动脚本,需要 chmod a+x |
需要符合 rc 格式
1 | chmod a+x /usr/local/etc/rc.d/* |
格式如下
1 |
|
1 | chmod a+x /etc/rc.local |
标准 shell 格式
1 |
|
每 1tb 的储存空间对应 1gb 的 ram
1 | pool |
查看磁盘
1 | sudo bsdconfig |
如果创建带虚拟设备的 pool,每个虚拟设备的子设备数量需要一致
创建成功,会自动 mount,如果修改了 mountpoint,开机以后也会自动 mount
| 类型 | 说明 |
|---|---|
| stripe | 1 块即可, 类似 raid0 |
| mirror | 至少 2 块, 允许坏掉一个硬盘,类似 raid1 |
| raid10 | 至少 4 块 |
| raidz1 | 至少 2+1 块,允许坏掉一个硬盘,类似 raid5 |
| raidz2 | 至少 2+2 块,允许坏掉两个硬盘,类似 raid6 |
| raidz3 | 至少 2+3 块,允许坏掉三个硬盘,类似 raid7 |
1 | zpool list |
创建没有 mirror 的 pool
1 | zpool create -m /mount_demo demo nvd0 nvd1 nvd2 |
带两组 mirror 的 pool, mirror 即为虚拟设备
1 | zpool create demo mirror nvd0 nvd1 mirror nvd2 nvd3 |
创建 raidz 的 pool
1 | zpool create demo raidz1 nvd0 nvd1 nvd2 |
1 | zpool destroy demo |
1 | zpool add demo raidz nvd3 nvd4 nvd5 |
1 | 只有log device, cache device 和 mirror device 支持删除, raidz不支持删除 |
支持 mirror 虚拟设备和非虚拟设备的 pool
1 | zpool create demo nvd0 |
1 | zpool detach demo nvd1 |
在线替换,支持 raidz, 新盘内不需要放东西
1 | zpool replace demo nvd3 nvd4 |
1 | sudo zpool add demo ada2 |
1 | zfs mount |
1 | zfs snapshot -r demo@2019-1-6 |
1 | zfs send demo@aaa > xxxx |
1 | zfs send demo1@aaa | zfs recv demo2@bbb |
1 | nc -w 120 -l 8023 | zfs receive -F demo2 |
目前使用 qjail
1 | sudo pkg install -y qjail |
创建
1 | sudo qjail create -4 192.168.88.123 xxx |
1 | sudo qjail list |
修改 ip
1 | sudo qjail config -4 192.168.88.222 xxx |
允许使用主机网络
1 | sudo qjail config -k xxx |
改名字
1 | sudo qjail config -n demo xxx |
备份恢复
1 | sudo qjail archive xxx |
具体虚拟机路径
1 | /usr/jails/xxx |
模板路径
1 | /usr/jails/template |
1 | jls 查看任务列表 |
本质和普通进程一样
trap_exit, 并且 gen_server 内部处理 {'EXIT', From , Reason} 消息| gen_server 退出原因 | trap_exit | terminate | 备注 |
|---|---|---|---|
| 内部 crash | true/false | 执行 | 普通业务情况下,保证都能被捕获 |
| exit(Pid,kill) | true/false | 不执行 | kill 杀进程是 vm 的保留手段 |
| exit(Pid,Reason) | true | 如果内部处理了{'EXIT', From , Reason}消息,则执行 |
转换为 handle_info 消息 |
| exit(Pid,Reason) | false | 不执行 | 同普通 process 一样 |
1 | stop(Reason) -> |
exit(Pid, Msg)
未设置 trap_exit
1 | 不给进程发 Exit 消息, 只执行默认的行为 |
设置 process_flag(trap_exit, true)
1 | 执行默认的行为的同时,给进程发 Exit 消息 |
dist_proc.erl
1 | -module(dist_proc). |
测试
1 | dist_proc:start(). |
和 link 的区别,是单向的
dist_proc.erl
1 | -module(dist_proc). |
mon_proc.erl
1 | -module(mon_proc). |
测试
1 | spawn(fun() -> mon_proc:start() end). |
link 是双向的, 任何一个进程挂掉, 另外一个都会受影响
1 | A 挂掉, B 会检查自己有没有设置 process_flag(trap_exit, true) |
dist_proc.erl
1 | -module(dist_proc). |
mon_proc.erl
1 | -module(mon_proc). |
测试
1 | mon_proc:start(). |