【STM32】双堆栈的使用

发布者:码农创想家最新更新时间:2016-10-12 来源: eefocus关键字:STM32  双堆栈 手机看文章 扫描二维码
随时随地手机看文章
    首先了解一下双堆栈的知识,下面的图片来自《Cortex-M3权威指南》,有点枯燥,但还是要看的。

 

【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃
 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃
 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃

 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃

 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃

 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃

 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃

 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃

 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃

 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃

 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃

 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃

 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃

 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃

 【STM32】双堆栈的使用 - 大学生のSystem℃ - 大学生のSystem℃

  

总结:

1.系统复位后默认使用的是MSP,复位后的状态是特权级线程状态,在这个状态下是允许修改寄存器

  CONTROL[1](见上面的图片)的。进入到用户特权以后就不能修改这些寄存器了。

2.用户特权的情况(也就是用户建立的非中断服务程序)下可以使用MSP或PSP,特权模式(中断服务程序)只能使用MSP。

3.还有很重要的一条就是.假如在用户模式下使用的是PSP,那么寄存器的数值被保存到任务堆栈的空间,进入中断程序后就开始使用MSP,如果还有一个高优先级的中断难么就继续的使用MSP,在程序推出最后一级中断的时候就用用户堆栈恢复寄存器。

下面以uCOS-II为例进行说明:

首先建立一个堆栈  OS_STK   AppTaskStartStk[1024]  //32位

STM32是向下生长的满栈,初始化堆栈后(在没有使用PSP以前,一直使用的是MSP)。

                 |     ....        | AppTaskStartStk[0]
                 |-----------------|
                 |     ....        | AppTaskStartStk[1]
                 |-----------------|
                 |     ....        |
                 |-----------------|       |---- 任务切换时PSP
    Low Memory   |     ....        |       |
                 |-----------------|       |    |---------------|      |----------------|
        ^        |       R4        |  <----|----|--OSTCBStkPtr  |<-----|   (OS_TCB *)   |
        ^        |-----------------|            |---------------|      |----------------|
        ^        |       R5        |            |               |         OSTCBHighRdy
        |        |-----------------|            |---------------|
        |        |       R6        |            |               |
        |        |-----------------|            |---------------|
        |        |       R7        |            |               |
        |        |-----------------|            |---------------|
        |        |       R8        |                 Task's
        |        |-----------------|                 OS_TCB
        |        |       R9        |
        |        |-----------------|
        |        |      R10        |
      Stack      |-----------------|
      Growth     |      R11        |
       = 1       |-----------------|
        |        |    R0 = p_arg   |  <-------- 异常时的PSP (向下生长的满栈)
        |        |-----------------|
        |        |       R1        |
        |        |-----------------|
        |        |       R2        |
        |        |-----------------|
        |        |       R3        |
        |        |-----------------|
        |        |       R12       |
        |        |-----------------|
        |        |       LR        |  
        |        |-----------------|
        |        |    SP = task    | AppTaskStartStk[1022]
        |        |-----------------|
        |        |      xPSR       | AppTaskStartStk[1023]
    High Memory  |-----------------|                                       

第一次执行PendSV中断之前,已经初始化PSP = 0 ,进入中断前使用的是MSP,所以自动入栈的寄存器的数值是保存在了系统堆栈里面,由于是第一次执行,不需要手动保存PSP和{R4-R11}到任务堆栈里面,然后从任务堆栈空间中取出数据到寄存器{R4-R11}中,退出中断的时候设置LR的位2,保证退出中断的时候使用PSP,恢复剩下的寄存器(这些寄存器的数值是自动入栈的)的数值,最后就进入到了任务里面,在执行任务程序的时候,使用的是PSP,有需要入栈的数,就会进入到任务堆栈里面。现在分两种情况进行考虑,

(1)有一个高优先级的中断要执行,那么自动入栈的寄存器数值会保存到当前任务的堆栈里面,进入到中断服务程序以后就开始使用MSP(剩下的的寄存器如果需要保存的话,会由编译器自动的生成相应的汇编代码,保存到系统堆栈,而不是任务堆栈),如后还有更高优先级的中断,那么就会一直使用MSP。

(2) 如果此时有一个高优先级的任务需要执行,那么xPSR, PC, LR, R12, R0-R3自动的由硬件保存到当前任务的堆栈里面,然后PSP和{R4-R11}需要手工的入栈。

假如在执行低优先级任务的过程中有两个数据压栈了。那么进入PendSV中断后保存寄存器的结果如下:

   |     ....        | AppTaskStartStk[0]
                 |-----------------|
                 |     ....        | AppTaskStartStk[1]
                 |-----------------|
                 |     ....        |
                 |-----------------|       |---- 任务切换时PSP
    Low Memory   |     ....        |       |
                 |-----------------|       |    |---------------|      |----------------|
        ^        |       R4        |  <----|----|--OSTCBStkPtr  |<-----|   (OS_TCB *)   |
        ^        |-----------------|            |---------------|      |----------------|
        ^        |       R5        |            |               |         OSTCBHighRdy
        |        |-----------------|            |---------------|
        |        |       R6        |            |               |
        |        |-----------------|            |---------------|
        |        |       R7        |            |               |
        |        |-----------------|            |---------------|
        |        |       R8        |                 Task's
        |        |-----------------|                 OS_TCB
        |        |       R9        |
        |        |-----------------|
        |        |      R10        |
      Stack      |-----------------|
      Growth     |      R11        |
       = 1       |-----------------|
        |        |    R0 = p_arg   |  <-------- 异常时的PSP (向下生长的满栈)
        |        |-----------------|
        |        |       R1        |
        |        |-----------------|
        |        |       R2        |
        |        |-----------------|
        |        |       R3        |
        |        |-----------------|
        |        |       R12       |
        |        |-----------------|
        |        |       LR        |  
        |        |-----------------|
        |        |    SP = task    |

        |        |-----------------|
        |        |      xPSR       |

        |        |-----------------|

        |        |  0x11111111     |

        |        |-----------------|
        |        |  0x22222222     |

High Memory      |-----------------|

关键字:STM32  双堆栈 引用地址:【STM32】双堆栈的使用

上一篇:【STM32】FSMC 应用
下一篇:【STM32】嵌套中断向量控制器(NVIC)

推荐阅读最新更新时间:2024-03-16 15:14

STM32独立看门狗介绍_STM32单片机独立看门狗实验
  STM32独立看门狗简介   单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)。   STM32的独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的40Khz,而是在30~60Khz之间的一个可变化的时钟,只是我们在估算的时候,以40Khz的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。   涉及的寄存器有:键寄存器
[单片机]
stm32如何获取自己的ID号
一、函数。 void STM32_GetChipID(unsigned int *cID) { cID =*(vu32*)(0x1ffff7e8); cID =*(vu32*)(0x1ffff7ec); cID =*(vu32*)(0x1ffff7f0); } 二、可以用串口打印出来。 Printf( \r\nChip ID: %d, %d, %d\r\n , cID , cID , cID );
[单片机]
STM32 IIC详解
1、IIC定义 IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司(后被NXP收购)在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。多主多从的通讯协议。 下文将结合NXP官方的IIC手册讲解IIC协议。下载链接见文末。 I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。速率最高400
[单片机]
<font color='red'>STM32</font> IIC详解
基于STM32的DS18B20驱动
#include ds18b20.h #include delay.h short tmp_arg; //温度平滑滤波 //复位DS18B20 void DS18B20_Rst(void) { DS18B20_IO_OUT(); //SET PG11 OUTPUT DS18B20_DQ_OUT=0; //拉低DQ delay_us(750); //拉低750us DS18B20_DQ_OUT=1; //DQ=1 delay_us(15); //15US } //等待DS18B20的回应 //返回1:未检测到DS18B20的存在 //返回0:存在 u8 DS18B20_Check
[单片机]
STM32的GPIO输出编程实例之点亮三色LED
一、概述: 1、发光二极管简介 发光二极管是半导体二极管的一种,可以把电能转化为光能,常简写为LED。常用的是发红光、绿光或黄光的二极管。发光二极管的反向击穿电压约为5V。它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。限流电阻R可用下式计算: R = (E - UF)/IF 式中E为电源电压,UF为LED的正向压降,IF为LED的一般工作电流。LED广泛应用于各种电子电路、家电、仪表等设备中,做电源或电平指示。 2、STM32 GPIO简介 GPIO可以配置成以下8种工作模式: 浮空输入:此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。 上拉输入:上拉输入模式与浮空输入模式相
[单片机]
<font color='red'>STM32</font>的GPIO输出编程实例之点亮三色LED
STM32 ADC 多通道16路电压采集
下面介绍一种利用STM32单片机制作的16路多通道ADC采集电路图和源程序。采用USB接口与电脑连接,实则USB转串口方式,所以上位机可以用串口作为接口。电路图中利用LM324作为电压跟随器,起到保护单片机引脚的作用。直接在电脑USB取点,省去外接电源麻烦,实测耗电电流不到20ma. 1.主控电路图: 2. USB转串口电路图 3.LM324电压跟随器电路图 4. 滤波电路 图 5.16路接口电路图 6.电源电路图 7.16路ADC初始化程序: void Adc_Init(void) { //先初始化IO口 RCC- APB2ENR|=0X7 2; //使能PORTAPORABPORT
[单片机]
<font color='red'>STM32</font> ADC 多通道16路电压采集
STM32的一些基本知识总结
Cortex-M3缩略语 AMBA:先进单片机总线架构 ADK:AMBA设计套件 AHB:先进高性能总线 AHB-AP:AHB访问端口 APB:先进外设总线 ARM ARM:ARM架构参考手册 ASIC:行业领域专用集成电路 ATB :先进跟踪总线 BE8:字节不变式大端模式 CPI:每条指令的周期数 DAP:调试访问端口 DSP:数字信号处理(器) DWT:数据观察点及跟踪 ETM:嵌入式跟踪宏单元 FPB:闪存地址重载及断点 FSR:fault状态寄存器 HTM:Core Sight AHB跟踪宏单元 ICE:在线仿真器 IDE:集成开发环境 IRQ:中断请求(通常是外中断请求) ISA:指令系统架构 ISR:中断服务例程 I
[单片机]
<font color='red'>STM32</font>的一些基本知识总结
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved