• (转)UCOSII在任务切换与出入中断时堆栈指针的使用


    1 uc/os ii在M3中的堆栈结构

    1.1 M3入账序列 
    这里写图片描述 
    1.2 加上手工入栈序列 
    这里写图片描述

    2 PendSV在Cortex-M3中的应用

    Systick为嵌入到内核中,优先级比一般中断优先级高。若在一般中断的ISR执行过程中,发生了Systick异常,则Systick会抢占该ISR。若此时Systick做上下文切换,在M3中将触发用法fault(在中断活跃时尝试切入线程模式)。即使在别的内核体系下不发生硬fault,ISR也会被延迟,这对于任一讲究实时性的系统是不能接受的。 
    所以Systick只是在其服务程序中触发一个PendSV中断(事先将PendSV中断优先级设置的很低)。Systick返回后将继续执行被抢占的中断ISR。执行完后,程序跳转到PendSV服务程序中执行任务切换。

    3 M3中堆栈的切换

    3.1 在中断返回时,通过修改LR中的EXC_RETURN 
    3.1.1 EXC_RETURN 
    在出入ISR的时候,LR的值将得到重新的诠释,这种特殊的值称为“EXC_RETURN”, 
    在异常进入时由系统计算并赋给LR,并在异常返回时使用它。EXC_RETURN的二进制值除了最低4位外全为1,而其最低4位则有另外的含义。 
    表1 EXC_RETURN位段详解 
    这里写图片描述 
    表2 合法的EXC_RETURN值及功能 
    这里写图片描述

    3.2 异常返回和异常返回序列 
    M3 提供的异常返回指令 
    这里写图片描述 
    出栈:先前压入栈中的寄存器在这里恢复。内部的出栈顺序与入栈时的相对应,堆栈指针的值也改回先前的值。 
    只要ISR没有更改过CONTROL[1],就依然使用发生本次异常的瞬间正在使用的SP指针来执行出栈操作。

    3.3 修改EXC_RETURN,进行模式和堆栈的选择。 
    在异常ISR中,处理器处于特权模式,可以访问所有存储器(除MPU规定)。通过修改LR的值来达到不同模式和堆栈的切换。

    4、再论M3双堆栈机制

    已经知道M3堆栈分为MSP和PSP,CONTROL[1]决定如何选择。当CONTROL[1]为0时,只使用MSP,此时用户程序和异常handler共享一个堆栈。 
    当CONTROL[1]为1时,线程模式将不再使用MSP,而改用PSP。这样做的好处在OS内核中防止用户程序 的堆栈破坏OS的堆栈。在在这种情况下进入异常的自动压栈使用的是进程堆栈,进入异常handler后才自动改为MSP,退出异常时切换回PSP,并且从进程堆栈上弹出数据

    5、理解M3中的R14

    1 在中断 
    在出入ISR的时候,LR的值将得到重新的诠释,这种特殊的值称为“EXC_RETURN”。在异常进入时由系统计算并赋给LR,并在异常返回时使用它。

    2 在函数跳转 
    当呼叫一个子程序时,由R14存储返回地址。

    6、UCOSII中的PSP MSP

    1 、执行任务的时候用的是PSP

    PSP堆栈指针在任务初始化的时候指向的是任务的堆栈而不是CPU内核堆栈,即在创建任务的时候定义的全局变量数组

    当任务运行时,任务堆栈用来保存一些局部变量

    当任务挂起时,任务堆栈负责保存任务的运行现场,也就是CPU寄存器的值

    2、执行中断的时候用的是MSP

    MSP指向CPU内核堆栈,就是启动文件里面分配的堆栈大小

    文章转载自:https://blog.csdn.net/sunheshan/article/details/48554327

  • 相关阅读:
    Webstorm 9.0.3 注册码
    css去掉iPhone、iPad的默认按钮样式只需要一行样式就可以搞定
    手机下拉加载
    webpack vuejs项目学习心得
    nodejs常用模块之url
    jquery ajax详解
    iOS 10 (X8)上CoreData的使用(包含创建工程时未添加CoreData)
    使用StoryBoard设置Scrollview的横向滚动不用一行代码
    iOS 创建上线证书
    CoreData多表操作.
  • 原文地址:https://www.cnblogs.com/yeshenmeng/p/9590814.html
Copyright © 2020-2023  润新知