• 对CMSIS的学习(第4-5部分)


    四、为 Armv8-M 使用 TrustZone

    1. 关于Armv8-M

      • 历史


      在这里插入图片描述
      在这里插入图片描述

      • STM32L5系列使用M33内核,LPC55S系列使用M33内核,GD32E23系列使用M23内核,这些处理器都是基于ARMv8-M架构
    2. 关于TrustZone

      • TrustZone是ARM为了防止设备有效资源被拷贝、破坏或篡改,防止被恶意攻击,对资产包括有形和无形资产进行,以防止恶意软件、硬件监视、硬件干预等方式破坏或获取设备信息
      • ARMv8-M比较重视安全,TrustZone是ARMv8-M的一项新安全技术(硬件层面)
      • TrustZone 将软件硬件部分分为安全世界和正常世界,正常世界器件不可访问安全世界区域器件、存储空间等
      • TrustZone近几年才用在对安全要求比较高的比如支付、数字版权、物联网等方面
      • 目前暂时没有多少嵌入式芯片支持TrustZone,暂不展开讲解,具体移植参见例子

    五、CMSIS-核心设备模板

    1. 模板包含以下内容

    1. 核心外设的寄存器名称和核心异常向量的名称
    2. 访问核心外设、特殊 CPU 指令和 SIMD 指令的函数(用于 Cortex-M4 和 Cortex-M7)
    3. 通用启动代码和系统配置代码

    2. 一些文件路径

    1. 模板文件路径: .\CMSIS\Core\Include,例其中的core_cm4.h定义内核外设并提供访问内核寄存器的辅助函数
    2. 与设备相关的 CMSIS-Core 文件: .\Device\ARM,包括CMSIS-Core 处理器文件,示例设备在 CMSIS-Pack 描述文件ARM.CMSIS.pdsc中定义,例ARM Cortex–M4-ARMCM4-FP–具有浮点硬件的基于 Cortex-M4 的设备

    3. 模板文件

    1. 芯片供应商应对模板文件进行扩展,以反映实际设备和设备外围设备

    2. 芯片供应商需将以下信息添加到这些模板文件中

      1. 设备外设访问层,为特定设备的外设提供定义
      2. Access Functions for Peripherals(可选),提供额外的帮助函数来访问特定于设备的外设
      3. 启动文件中特定于设备的中断向量
    3. 常用模板文件(本章4-8为对这些文件的描述)

    在这里插入图片描述

    1. 以ToDo:开头的是注释,用于描述所需的修改

    4. 启动文件 startup_<设备>.c

    1. Armv8-M和Armv7-M的这个文件不一样

    2. 启动文件依赖于 CMSIS 编译器头文件中指定的特定编译器预处理器定义,例,__INITIAL_SP

    3. __NO_RETURN:C11函数说明符,表明调用完成后函数不返回主调函数,以便编译器在优化时去掉不必要的函数返回代码,#define __NO_RETURN attribute((noreturn))

    4. __GNUC__指的是GCC的版本

    5. __INITIAL_SP:栈顶地址

     Image$$ARM_LIB_STACK$$ZI$$Limit
    
    • 1

    在这里插入图片描述

    1. __STACK_LIMIT:栈底(主堆栈指针限制值)

    2. __set_MSPLIM:将给定值分配给主堆栈指针限制 ,仅适用于Armv8-M架构

    3. __PROGRAM_START():进入用户应用程序或库启动的入口函数,类似LDR R0, =__main

    4. __main() 和 main():__main()是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到main(),慎用__main()

      1. __main():完成代码和数据的拷贝,并把 ZI 数据区清零。代码拷贝可将代码拷贝到另外一个映射空间并执行 (例如将代码拷贝到 RAM 执行); 数据拷贝完成 RW 段数据赋值;数据区清零完成 ZI 段数据赋值。以上的代码和分散加载文件密切相关。
      2. _rt_entry():进行 STACK 和 HEAP 等的初始化。最后_rt_entry跳进 main()函数入口。当 main()函数执行完后, _rt_entry 又将控制权交还给调试器。
    
    • 1
    • 2
    1. __VECTOR_TABLE_ATTRIBUTE:用于定义静态(编译器时)中断向量表,例如将表标记为已使用并强制将其放入特定的链接器部分

    2. NMI_Handler:不可屏蔽中断

    5. 分散加载文件_ac<5|6>.sct

    1. scatter:文本文件,它可以用来描述ARM连接器生成映像文件时所需要的信息

    2. 文件内容和名字不一定和上面一样,例rt-thread的link.sct

    3. 在keil中查看sct路径方法:

    在这里插入图片描述

    6. 系统配置文件 system_.c 和 system_.h

    1. system_.c存放时钟或者PLL预分频相关内容,比如system_gd32f4xx.c的system_clock_config()
    2. system_.c也可以由供应商添加其它功能,比如电源配置

    7. 设备头文件

    1. 对应到GD32文件就是gd32f4xx.h
    2. 有一些定义比如__CM4_REV,如果没有在gd32f4xx.h中定义为1,会在core_CM4中有默认定义0
    3. 中断号定义:负 IRQn 值表示处理器内核异常(内部中断),正 IRQn 值表示特定于设备的异常(外部中断)
    4. 处理器和核心外设的配置:通过#define定义每个处理器内核的可能值,不同内核有自己的一组定义,比如core_cm4.h和core_cm7.h不一样
    5. CMSIS 版本和处理器信息:例__CM4_CMSIS_VERSION,#define __CORTEX_M (4U)
    6. 设备外设访问层:可能包含访问设备特定外设的功能,比如gd32f4xx.h的各个外设基地址

    8. TrustZone 设置:partition_<设备>.h

    1. Armv8-M相关暂时用不到,关于安全相关的配置,暂不展开
  • 相关阅读:
    Netty——部分优化以及搭建简单RPC框架(笔记)
    gdb结合valgrind一起使用
    css3 函数汇总(笔记)
    Netcode for Entities如何添加自定义序列化,让GhostField支持任意类型?以int3为例(1.2.3版本)
    解锁前端Vue3宝藏级资料 第四章 VUE常用 UI 库 2 ( ailwind 后台框架)
    【camera】【CMOS Sensor】感光芯片cmos sensor简单介绍
    Real-Time Rendering——16.1 Sources of Three-Dimensional Data三维数据的来源
    杭州动环监控系统供应商,动环监控设备
    测试开发概念篇
    HTML笔记
  • 原文地址:https://blog.csdn.net/Fei_Yang_YF/article/details/126675776