Cortex-M7——内核及汇编

Cortex-M7——内核及汇编

小狼@http://blog.csdn.net/xiaolangyangyang


1、Cortexv8-M特点

  1. 用于ARMv8-M的TrustZone/系统范围安全的基础;
  2. 用于可扩展性的协处理器接口;
  3. 用于任务隔离的内存保护单元(MPU);
  4. DSP扩展;
  5. 单精度浮点单元。

2、CortexV8-M知识点汇总

1、模式及特权

        特权模式有什么特权:部分系统寄存器只能在特权模式下访问,如systick寄存器;mpu可以指定特权模式才能访问的地址范围


2、M33什么场景自动压栈,压栈内容、压栈位置
3、M33中断向量表(原始向量表中只有异常向量,没有中断向量)
4、中断系统(NVIC)
5、自动压栈内容
        XPSR、PC、LR、R12、R3、R2、R1、R0
6、手动出发PendSV中断
        ICSR第28位(PendSV悬起寄存器)写1
7、MSP和PSP怎么切换的?
        MSP用于OS内核和异常处理,PSP用于应用任务
        异常中断模式下自动切换到MSP,线程模式下使用CONTROL寄存器进行切换
        CONTROL[1]=0:MSP
        CONTROL[1]=1:PSP

8、M33工作模式切换
        CONTROL[0]=0:特权模式
        CONTROL[0]=1:用户模式

9、M33复位状态
        复位时处于线程模式+特权级,主堆栈+MSP
10、FREERTOS任务切换时机:
        a)任务强制切换:taskYIELD()
        b)中断强制切换:portYIELD_FROM_ISR()
        c)systick中断中进行切换
        以上切换方法都是pending一个PendSV中断

11、PendSV用于线程切换,在进入PendSV处理函数时:
        a)xPSR、PC、LR、R12、R0~R3已经在处理栈中被保存;
        b)处理模式切换到线程模式;
        c)栈是主堆栈。

12、调试全局变量:
        g_fault_context、g_assert_lr、g_assert_contex、g_assert_err、g_assert_file、g_assert_line
13、XPSR、PRIMASK、FAULTMASK、BASEPRI、CONTROL寄存器
14、具体压栈出栈过程,怎么为参数、局部变量预留栈空间?

        软件压栈:
                a)进入函数后,首先将LR压栈(如果没有调用子函数,则LR不压栈);
                b)参数大于4个时,调用函数将多余的参数压入本函数栈帧供被调用函数使用;
                c)局部变量较少时,R寄存器处理,不开辟栈空间,变量较多时,调整SP指针预留空间;
                d)函数退出时出栈,如果局部变量较多使用了栈,先调整SP释放变量预留空间;
                e)函数退出时将栈中的LR值出栈到PC(如果没有调用子函数,直接将LR赋值给PC)。
        硬件压栈:
                a)中断和异常才会进行硬件自动压栈,压栈顺序:xPSR、PC、LR、R12、R0~R3;
                b)硬件压栈是在进入异常前进行,所以压栈的LR寄存器是原LR,并非进入异常后的LR值(进异常后LR=EXC_RETURN);
                c)异常退出时,执行# bx R14指令,硬件根据R14判断出栈到MSP还是PSP,恢复CPU模式,出栈内容与压栈内容相同。

15、代码中的异常处理(assert、全局变量)
        进异常时的全局变量:g_fault_context
        进assert的全局变量:g_assert_contex
        查看线程状态:g_tm_block

16、模式及特权(配合FreeRTOS+CONTROL),分析几个函数
        vStartFirstTask:执行svc指令,陷入svc异常
        arm_svc_handler:将栈指针改为psp,取第一个线程栈指针赋值给psp(栈中有pc指针)
        arm_pendsv_handler:进行切换线程
        SysTick_Handler:systick+1,检查是否需要进行线程切换,如果需要,触发pendsv中断
        vPortYield:触发pendsv中断

17、ISR后缀函数意义,信号量底层实现
        不带ISR的函数如等待消息,在没有消息时,函数会阻塞,切换到其他线程;
        带ISR的函数在中断中使用,不允许阻塞,如在中断中等待msg,在没有消息时,函数直接返回失败。

18、CMSIS的HAL、LL、Driver层区分
19、内存越界怎么debug

3、cortex-m7内核寄存器

4、复位向量

        当处理器复位之后,会从存储器中读取两个数据,0x0000_0000->MSP,0x0000_0004->PC,__isr_stack_top__是连接脚本里的栈顶地址。


STM32L5 入门课程系列(一)从Cortex-M33内核认识TrustZone
STM32L5 入门课程(二)STM32L5的系统新架构
STM32L5 入门课程系列(三)TrustZone环境下新的用户编程模型
STM32L5 入门课程系列(四)STM32CubeMX:支撑TZ应用
Cortex-M0系统滴答定时器Systick详解
CortexM0中断控制和系统控制(四)
Cortex-M3双堆栈MSP和PSP
cortex-m3 操作模式 寄存器组 异常类型 堆栈 中断
ARM的特权模式是啥?异常模式是啥?​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值