当前位置: 首页 > news >正文

freertos中函数调用和启动第一个任务(栈相关!!!!!!)

本内容仅就一些较难理解的点讲解,请结合其它文章实用

在函数调用时,m3的处理器使用r0-r3共四个寄存器传参,其余的使用栈传参。

但是,如果传入的参数是全局变量,则不需传参,因为全局变量在函数内部是可见的,可直接赋值或修改。

前四个参数使用寄存器传参(全局变量还是用了寄存器,应该是硬件的原因),后三个是全局变量。没有用栈。

函数调用前,sp的值为0x20001708,

进入函数内部,sp的值依然为0x20001708.所以上述可证。

而且,函数在调用时会保存上下文,比如这里是r4-r11,lr.(因为这里可能会用到以上寄存器)其中只有lr的值因为函数调用而发生了改变。从86b变为c9d。在此函数返回后,栈的值依然会是0x20001708,lr最后一个出栈到PC.

返回前sp为0x200016d0,

返回后,栈的值依然会是0x20001708。

对于LR寄存器保存的是函数返回地址。没有问题,但是在启动任务调用时,却不一样了。

对于CM3,使用OS时,有双堆栈机制(在权威指南有讲)。

在启用第一个任务前一直使用的是MSP.


__asm void prvStartFirstTask( void )
{
    PRESERVE8

    /* Use the NVIC offset register to locate the stack. */
    ldr r0, =0xE000ED08
    ldr r0, [r0]
    ldr r0, [r0]

    /* Set the msp back to the start of the stack. */
    msr msp, r0
    /* Globally enable interrupts. */
    cpsie i
    cpsie f
    dsb
    isb
    /* Call SVC to start the first task. */
    svc 0                //通过svc指令启用第一个中断。
    nop
    nop
}

此时的lr保存函数返回地址。

进入异常服务程序。

lr的值为0xfffffff9.为什么是这个值呢?

打开权威指南。

CM3自动保存8个寄存器的值到MSP,所以sp的值降低32个字节。(上面两张图

SP的值变化是,MSP的入栈8个寄存器。

PSR为程序状态寄存器。显示程序的执行情况。

PC ..........

LR,这里的LR不再是程序的返回地址。

这里,将bit3置一,进入线程,即普通模式,

bit2置一,是为了,两个栈互不干扰。

bit0还不清楚。

由上可知。LR在异常服务程序中不再是返回地址。而是用来确定返回后系统的状态。

那么如何正确的执行我们的第一个程序呢,

在这里

我们是系统使用PSP,且退出异常时自动出栈保存的寄存器到当前的栈(PSP).

这里需要注意。入栈时使用的是MSP,在出栈时使用的是PSP,而且,PSP执行的地址是我们所要用的任务栈地址。当出栈PC时,(我们在初始化任务栈时,将PC保存为任务函数指针。)运行第一个任务。

进入定时器任务

因为这是一个死循环。所以,我们在创建任务栈时,有一些寄存器的值是无效的。

比如LR,因为我们进入任务后一直循环,是不会再从这个任务返回的。

可以说,除了PC,和psr,其它的都没用。

这是启动第一个任务,使用SVC,任务切换继续。

http://www.lryc.cn/news/178491.html

相关文章:

  • 【PHP】如何关闭buffer实时输出内容到前端
  • Scala第二章节
  • Spring修炼之路(2)依赖注入(DI)
  • 编写Android.mk / Android.bp 引用三方 jar 包,aar包,so 库
  • 【kylin】【ubuntu】搭建本地源
  • 为什么 Go 语言 struct 要使用 tags
  • WebGL笔记:WebGL中JS与GLSL ES 语言通信,着色器间的数据传输示例:用鼠标控制点位
  • 算法 主持人调度-(双指针+贪心)
  • Elasticsearch 集群时的内部结构是怎样的?
  • IoTDB 在国际数据库性能测试排行榜中位居第一?测试环境复现与流程详解第一弹!...
  • react项目优化
  • 青藏高原1-km分辨率生态环境质量变化数据集(2000-2020)
  • Nature Communications | 张阳实验室:端到端深度学习实现高精度RNA结构预测
  • 提升您的Mac文件拖拽体验——Dropzone 4 for mac
  • Vue之transition组件
  • lenovo联想笔记本电脑ThinkPad X13 AMD Gen2(20XH,20XJ)原装出厂Windows10系统镜像
  • php导出cvs,excel打开数字超过16变科学计数法
  • CSS 模糊效果 CSS 黑白效果 CSS调整亮度 对比度 饱和度 模糊效果 黑白效果反转颜色
  • 蓝桥杯 题库 简单 每日十题 day11
  • dart flutter json 转 model 常用库对比 json_serializable json_model JsonToDart
  • nginx启用了自动目录列表功能的安全漏洞修复方法
  • vector向量类使用
  • 【Java 进阶篇】MySQL多表查询:内连接详解
  • C理解(四):链表
  • 新手教程,蛋糕小程序的搭建流程一网打尽
  • springcloud之自我介绍
  • 机器学习之神经网络的层次
  • 力扣每日一题(+日常水几道题)
  • 百度SEO不稳定的原因及解决方法(百度SEO不稳定因素的5大包括)
  • 深度学习(1)---卷积神经网络