SMACCM 的学习与尝试
CPS 期末报告
谢兴宇
目录
- 对 Ivory 内部设计的深入学习
- 运行 SMACCM 固件的尝试
背景
- SMACCM (Secure Mathematically-Assured Composition of Control Models) in DARPA HACMS program
- Architecture design: AADL
- Verified OS (seL4 & eChronos)
- Component implementation: Ivory & Tower
- Unmaintained since 2017
软件架构
前团队成员回复我的邮件
Ivory: "safe C" embedded in Haskell
- 语言表达能力
- “安全”的类型系统
语言表达能力
- Memory-area:在栈上动态分配空间,操作栈上和全局的内存
- Product type:结构体
- Foreign function interface:调用任意 C 函数
- Bit-fields:有类型地操作比特和寄存器
堆上内存分配变长数组指针算术空指针union-
cast:仅允许转成更有表达力的类型,或者是提供一个默认值 void pointer
类型系统
类型附属有 effects 属性
- Allocation effects:是否有栈上内存分配(指针是指向全局还是局部内存)
- Return effects:是否包含 return 语句
- Break effects:是否包含 break 语句
经验总结
- 开发:由于移除了一些 C 语言的特性,可能反而会导致开发者写出一些 bug。
- 调库:需要人工把 C 接口正确地“翻译”到 Ivory。
- 调试:直接运行和调试的是生成的 C 代码,导致很难反过来定位 Ivory 中的 bug;复杂的 spec 也增加了调试难度
后话:我的想法
- 放在 2021 年,Rust 似乎会是一个比 Ivory 更好地选择
- 相同的进路:"safe C"
- 同样可以生成 C 代码
- 更丰富的语言特性
- 更安全的类型
- 更完善的调试及开发环境
- 更好的工业界及学术界的生态
目标
- 目标:把 SMACCM 的固件在 Pixhawk 板上跑起来
- 结果:没跑起来
尝试
尝试获取固件的错误信息
- system console port
- SWD debug port
- B/E 橙色长亮,说明进入 error 态
现象观察
system console port
- 用于给嵌入式系统打印信息
- 可以提供一个 shell (NSH)
PX4 标准固件通过 console port 的输出
接线
SWD (JTAG) debug port
ARM Serial Wire Debug (SWD)
- 用于调试 (breakpoint, step...)
- 烧写 bootloader/firmware
- 软件:gdb, ST-Link Utility, TrueStudio, Visual Studio Code
- 硬件:ST-Link/J-Link/Dronecode Probe/Black Magic Probe
ST-Link Utility 的使用效果
(也可以看到寄存器和简易的调试)
SWD (JTAG) debug port
gdb 在一个示例固件上的使用效果
ST-Link 接线
猜想
- 由于 SWD 的引脚是直接与暴露的杜邦线芯焊接在一起的,可能与不同引脚相连的铜线有意外接触,导致短路烧坏了 FMU 芯片。
- 固件是需要对不同的烧写方式作适配的,否则就会段错误。我们可能没有使用与提供的 binary 相匹配的方式(比如 Black Magic Probe + JTAG)。
现状
- ST-Link 的设备可以被电脑所被识别(在 /dev/ 或者 device manager 中可以看到),但无法通过软件(ST-Link Utility 或 stlink-tools)连接。
- 在 FMU 疑似损坏之前,gdb 可以连接,但调试功能似乎不太正常(有时候 step 就会卡住)
我学到了什么?
- 无人机开发大概是怎么回事
- 认识了不少电子元件
- 怎么找到自己需要的元件
- 怎么读电路图
- 怎么看电路图
- 怎么把电子元件接起来
- 怎么调试嵌入式固件 (ARM)
致谢
- 感谢贺老师给我这样一个允许失败的探索机会。
- 感谢软件学院、计算机系、电子系、自动化系、电机系和航院的同学们,感谢借/送给我的各种元件和提供的各种建议。
期末报告
By Xingyu Xie
期末报告
- 2