引言
在之前的 STM32MCU TrustZone 开发调试技巧的系列文章中,我们已经介绍了 ARMCM33 内核 Trust Zone 特性,STM32MCU 的系统级 TrustZone 架构设计,TrustZone 环境下使用外设的注意事项,以及 HardFault 的处理和调试等内容。我们知道在某些较为复杂的应用中,往往还会用到 RTOS,在这个系列的最后一篇,我们将主要讨论 STM32MCU 应用程序开发中,在 TrustZone 环境下使用 RTOS 时的情况以及相关软件开发的一些注意事项,供开发者参考。
TrustZone 环境+RTOS 的软件架构
通常情况下,在 TrustZone 环境中,Secure 安全侧的代码主要负责处理一些关键数据的操作和关键外设的管理和控制,而更多的业务逻辑相关的应用程序则会运行在 TrustZone 的Non-Secure 非安全侧。软件的开发模式也会由原来的单一应用程序工程变为安全加非安全两个工程的联合开发。系统复位后 CPU 总是从安全工程的 reset handler 开始运行,安全代码完成初始化以及系统的安全配置之后,调用非安全代码的 reset handler 切换到非安全状态,继而开始运行非安全侧代码,非安全代码执行过程中可能会调用安全侧代码提供的一些API 函数。
TrustZone 环境中 NS 非安全侧使用 RTOS 的注意事项
首先需要注意 RTOS 的版本,比较旧的版本可能还没包含对 ARM CM33 内核以及TrustZone 的支持。如果应用的项目是从某个过去的项目中迁移到 STM32MCU 的新产品,尤其使用了 TrustZone 的时候,建议检查原始工程中的 RTOS 版本,确认是否已经包含对CM33 内核以及 TrustZone 的支持。
其次,要注意在安全和非安全工程中添加正确的 RTOS 代码。以 FreeRTOS 为例,它的portable 代码有多个目录,在 TrustZone 环境中应当使用 ARM_CM33 目录下的文件。
小结
本文重点讨论了基于 ARM CM33 内核的 STM32MCU 支持 TrustZone 的环境下使用RTOS 的一些情况,并总结了 TrustZone 环境下使用 RTOS 的一些注意事项。某些 RTOS如果没有对 TrustZone 的非常完整的支持,使用起来可能会有些限制,这时候应用程序可能需要注意。例如通过添加 mutex 避免多个线程同时调用 S API 等。当然这里仅仅讨论了 NS侧使用 RTOS 的情况,也就是 S 安全侧只是提供函数由非安全侧调用,本身安全侧没有调度器没有线程概念,如果安全侧也包含了调度器(比如 TF-M)那么配合非安全侧使用RTOS 可能会是另一种情况。
本文是 STM32MCU TrustZone 开发技巧的系列文章的最后一篇,希望对开发者有所帮助,也欢迎大家多提宝贵意见。
451