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

news2024/11/22 18:36:16

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

在函数调用时,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.coloradmin.cn/o/1051464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLO训练心得

文件框架 通过简单的模型训练,对于YOLO的理解更加透彻了。 detect.py文件 如上图所示,weights表示权重。source表示识别图像的位置。 train.py文件 如上图所示,weights是权重,我们通常使用YOLO提供的训练权重进行训练。data是训…

ADworld reverse wp easyre-153

逆向分析 做逆向题先查壳, 就像做pwn先checksec一样 用PEid查不出来, 用Exeinfo PE可以查出ELF文件的壳 用工具直接脱upx壳, kali自带的工具或者手动安装一个windows的upx工具 脱壳之后拖入IDA32 int __cdecl main(int argc, const char **argv, const char **envp) {int …

SLAM从入门到精通(amcl定位使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 学习slam,一般就是所谓的边定位、边制图的知识。然而在实际生产过程中,比如扫地机器人、agv、巡检机器人、农业机器人&…

Sentinel学习——sentinel的使用,引入依赖和配置 对消费者进行流控 对生产者进行熔断降级

前言 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 本篇博客介绍sentinel的使用&#x…

Bug:elementUI样式不起作用

前端问题合集:VueElementUI 1. Vue引用Element-UI时,组件无效果解决方案 前提: 已经安装好elementUI依赖 //安装依赖 npm install element-ui //main.js中导入依赖并在全局中使用 import ElementUI from element-ui Vue.use(ElementUI)如果此…

电压提前/滞后电路 —— 电赛综测备赛

电容可以让交流波形提前或滞后,不过很多人不知道用法 电压滞后电路 我们从中间输出给示波器 波形(红色) 电容越大电阻越大,波形越滞后 电压提前电路 波形(红色)提前 电容越小电阻越小,波形…

【python】numpy库

文章目录 简单介绍功能示例代码 简单介绍 NumPy(Numerical Python的简称)是Python数值计算最重要的基础包。大多数提供科学计算的包都是用NumPy的数组作为构建基础。 NumPy是在一个连续的内存块中存储数据,独立于其他Python内置对象。NumPy…

uniapp iOS离线打包——如何创建App并提交版本审核?

uniapp 如何创建App,并提交版本审核? 文章目录 uniapp 如何创建App,并提交版本审核?登录 appstoreconnect创建AppiOS 预览和截屏应用功能描述技术支持App 审核信息 App 信息内容版权年龄分级 价格与销售范围App 隐私提交审核 登录…

VS Code使用clang-format自定义C++代码默认格式化样式

解决的问题 让 VS Code 在不使用.clang-format或_clang-format文件时,默认使用自定义的 C 代码格式化样式。以下假定规则文件为D:\ClangFormat\rules.txt。 格式规则 具体设置参照 Clang-Format官方文档,也可以使用 Clang-Format交互式构建器。 贴上…

Spring Boot 中使用 Micrometer 进行度量和监控

Spring Boot 中使用 Micrometer 进行度量和监控 Micrometer 是一个开源的度量库,用于在应用程序中收集、存储和展示度量数据。它提供了一种统一的方式来度量应用程序的各种指标,如响应时间、请求次数、内存使用等。在Spring Boot中,Micromet…

kuaishou sig、sig3参数记录分析

**免责任声明: 任何可操作性的内容与本文无关,文章内容仅供参考学习 如有侵权, 损害贵公司利益, 请联系作者,会立刻马上进行删除** 经常研究快手的小伙伴都知道,快手有几个比较重要的参数,像sig,token-sig和sig3字段…

linux-定时任务

目录 一、crond命令 1、什么是计划任务 2、crond服务的概念 3、crontab 二、at命令 1、at任务的概念 三、邮件服务 1、概念 2、启动postfix 四、mailx命令 1、三个概念: 2、交互式发邮件 3、非交互式发邮件 四、cron定时任务实践 1、系统定时任务配置…

What is a UDP Flood Attack?

用户数据报协议 (UDP) 是计算机网络中使用的无连接、不可靠的协议。它在互联网协议 (IP) 的传输层上运行,并提供跨网络的快速、高效的数据传输。与TCP(其更可靠的对应物)不同,UDP不提…

ChatGPT,AIGC 助力人力资源管理对身份证号处理

HR,行政,文员办公对于员工信息管理中有一项目非常重要的操作,便是从身份证号中提取相关信息如下: 可以用ChatGPT完成三个字段的提取与计算。 我们先让ChatGPT描述一下身份证号每一位都代表什么意思。 接下来从身份证号中提取出生…

leetCode 139.单词拆分 + 完全背包 + 排列数

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1: 输入: s "leetcode", wordDict […

BUUCTF reverse wp 31 - 40

[HDCTF2019]Maze 脱壳, IDA打开, 发现无法F5, 而且反汇编失败 这种情况一般是花指令, 误导了IDA的递归反汇编, 这里E8是call指令, nop掉按p设置main函数入口再F5即可 int __cdecl main(int argc, const char **argv, const char **envp) {int v4; // [esp0h] [ebp-24h]int v5…

Python语言简介和版本选择

博主:命运之光 专栏:Python程序设计 目录 Python语言简介 Python发展历史 Python语言概述 Python版本选择 Python语言简介 解释型 解释执行可移植好 3种编程模式 函数式编程;对象编程;命令式编程 丰富的库 内置强大标准…

【软件评测】Apowersoft 傲软抠图AI智能换背景工具软件

现如今的数字图像处理已经成为人们生活中不可或缺的一部分,而图像抠图作为其中的重要环节,更是被广泛应用于设计、摄影、广告等领域。为了满足用户的需求,Apowersoft推出了一款傲软抠图AI智能换背景工具,宣称能够自动抠图并智能替…

提升 Windows 生产力的实用工具集:Microsoft PowerToys | 开源日报 No.42

microsoft/PowerToys Stars: 95.2k License: MIT Microsoft PowerToys 是一套用于调整和优化 Windows 体验以提高生产力的实用工具集。该项目包含多个功能模块,其中主要功能有:Always on Top、FancyZones、File Explorer Add-ons 等。其核心优势和关键特…

opencv实现目标跟踪及视频转存

创建跟踪器 def createTypeTracker(trackerType): 读取视频第一帧,选择跟踪的目标 读第一帧。 ok, frame video.read() 选择边界框 bbox cv2.selectROI(frame, False) 初始化跟踪器 tracker_type ‘MIL’ tracker createTypeTracker(tracker_type) 用第一…