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)

致谢

  • 感谢贺老师给我这样一个允许失败的探索机会。
  • 感谢软件学院、计算机系、电子系、自动化系、电机系和航院的同学们,感谢借/送给我的各种元件和提供的各种建议。
Made with Slides.com