cortex-m4系列绝对地址函数跳转问题

2024-09-04 12:44

本文主要是介绍cortex-m4系列绝对地址函数跳转问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、环境:

        cortex-m4,IAR,J-LINK。

二、问题:

        1)、首先,

我将另一个程序中的函数扣出来,通过j-flash-lite下载到MCU的一个固定地址Flash中。

        2)、然后,

声明一个变量为函数指针,同时将这个常量经过强转后赋值给该变量。

        3)、接着,

用该变量做函数跳转。

        形如:
        

 int (*func)(int,int) = (int (*)(int,int))0x08002000;func();

        4)、最后

结果出错Hardfault。

        已知,所跳转的函数原码绝对没有问题。

三、分析:

        打开IAR,查看Assembly,查看到其它函数调用。

        如以前的:
        

int (*func)(int,int) = add;func();

        绝对没有问题。

        仔细查看func的值,与Assembly所显示的值,发现还是有区别的。

        func = Assembly + 1

        将原始代码修改为如下:

 //int (*func)(int,int) = (int (*)(int,int))0x08002000;int (*func)(int,int) = (int (*)(int,int))(0x08002000 + 1);func();

程序可以正常运行。

========================================================================

已知cortex-m系使用thumb指令,该指令为16位可变长度。

这样来看的话,再结合大小端的问题,是不是可以理解为PC应该指向最高位,从大地址向小地址读取。因为func的函数就是add(int,int)自加函数,首行机器码为adds为16位指令,所以应该从存储地址的首位,加到最高位,也就是加1位?

四、其它问题:

        1)、J-Link单步执行正常

当程序以问题中的地址运行时,0x08002000(没有+1),直接运行出错,但是当执行进入该函数时,反而可以执行。当去掉j-link,直接在板子上执行时,还是会卡死。

        2)、函数调用规范

我为什么会做这个实验呢?是因为我想将其它函数放到内存中动态执行。嘿嘿,懂的都懂。

于是我使用了arm-none-eabi-gcc来编译函数。但是当我看到dis反汇编后,傻眼了。函数的传参根本不是r0,r1而是更为复杂的sp。也就是将函数参数从右到左做push,然后在函数内使用这些值。这就涉及到调用约定也就是abi application binary interface了。还有哪些规范呢?__cdecl、__stdcall、__fastcall。

至于为什么我使用了aapcs,也就是cmsis,也没有实现r0传参?以及使用了naked却没有返回bx lr的语句?我是如何解决的?我打算放到下一篇幅来讲解。

这篇关于cortex-m4系列绝对地址函数跳转问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136060

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)