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的语句?我是如何解决的?我打算放到下一篇幅来讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/53134.shtml

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

相关文章

力扣刷题--821. 字符的最短距离【简单】

题目描述🍗 给你一个字符串 s 和一个字符 c ,且 c 是 s 中出现过的字符。 返回一个整数数组 answer ,其中 answer.length s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。 两个下标 i 和 j 之间的 距离 为 abs(i…

Elastic Stack--ELFK实例与Dashboard界面

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 学习B站博主教程笔记: 最新版适合自学的ElasticStack全套视频(Elk零基础入门到精通教程)Linux运维必备—Elastic…

低代码技术:简化应用开发,推动数字化转型

在当今快速变化的技术环境中,企业面临着巨大的压力,需要快速响应市场需求并持续推动数字化转型。传统的应用开发方式往往复杂且耗时,开发周期长且需要大量的编程工作。为了应对这些挑战,低代码技术应运而生,为企业提供…

oracle startup失败,ORA-01078: failure in processing system parameters

SQL> startup ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file /data/oracle/product/11.2.0/db_1/dbs/initorc1.ora 出错的原因可能是:文件名字不正确,文件权限不对,文件不存在&#x…

基于激光雷达的无人机相互避障

本框架是基于激光雷达的无人机群自主避障代码: 其主体框架利用ORCA算法,他是经典的多智能体相互避障算法,此版本只能规避动态障碍物,不能规避环境形成的静态障碍物我们对ORVA算法稍作修改,使其可以分布式部署&#xff…

嵌入式系统------ARM

目录 一.c语言回顾 1.特殊符号 (1)const (2)static (3)extern 2.内存的结构 (1)kernel:内核 (2)栈区 (3)堆区 &#xff08…

Mental-LLM——通过在线文本数据利用大型语言模型进行心理健康预测

概述 源码地址:https://github.com/neuhai/Mental-LLM.git 论文地址:https://arxiv.org/abs/2307.14385 在一项关于哪些法律硕士适合精神健康护理的研究中,对以下五种法律硕士进行了比较 羊驼-7b。羊驼-LoRA。FLAN-T5-XXLGPT-3.5GPT-4. 作…

人该怎样活着呢?48

人该怎样活着呢? A多观察多思考 【思考问答】 (20240411) B记录自己的灵感。 (20240412) 别人抢不走的东西:肚子里的食物,脑子里的知识,还有梦想(202011…

爬虫常用模板

这里记录的是我学习爬虫自己用到的一些东西,方便以后打开直接使用。我会不定期的往里面添加内容。 爬虫工具库-spidertools.cn 协程 模板1(通过loop): async def download()passasync def main():# 创建任务队列tasks []for.…

Qt QPushButton 按钮添加数字气泡

使用场景 项目中,在某个按钮的右上角添加数字气泡是一个很常见的功能,可以用新建一个组合类来实现。不过这样比较麻烦,如果加气泡是后面的需求,可能改动的地方较多。 下面介绍2种比较简单,不需要改动按钮响应的方式。…

docker安装prometheus、grafana监控SpringBoot

1. 概述 最新有一个需求, 需要安装一个监控软件,对SpringBoot程序进行监控, 包括机器上cpu, 内存,jvm以及一些日志的统计。 这里需要介绍两款软件: prometheus 和 grafana prometheus: 中文名称, 普罗米…

Excel 将行和列转置的两种方法

方法一: 方法二:使用transpose公式

Unity数据持久化 之 文件操作(增删查改)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ 这里需要弄清几个概念: File:提供文件操作的静态方法,是管理的 Windows.File -…

AI驱动测试管理工具会有哪些发展前景呢?

在软件测试领域,人工智能(AI)的出现犹如一场技术革命,改变了传统的测试管理方式。随着AI技术的迅速发展,它将如何进一步提升测试管理的效率与准确性?未来的AI驱动测试管理工具又会带来哪些令人期待的创新呢…

HTTP协议(超文本传输协议)

HTTP请求消息 http请求消息组成: 请求行 :包含请求的方法 操作资源的地址 协议的版本号 http请求方法: GET:从服务器获取资源 POST:添加资源信息 PUT:请求服务器更新资源信息 DELETE:请…

Postman环境变量:简化API测试的利器

引言 在当今快速发展的互联网时代,API(应用程序接口)的重要性不言而喻。无论是内部系统间的通信还是对外服务的提供,API都扮演着至关重要的角色。然而,在API的开发与测试过程中,经常需要处理各种各样的配置…

数学建模强化宝典(10)多元线性回归模型

一、介绍 多元线性回归模型(Multiple Linear Regression Model)是一种用于分析多个自变量(解释变量、预测变量)与单个因变量(响应变量、被预测变量)之间线性关系的统计模型。这种模型假设因变量的变化可以通…

ARM下汇编语言编程

一、ARM汇编语言程序格式 ARM汇编语言是以段(section)为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。 段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。一个ARM源程序至少需…

Java学习|Java基础知识

目录 类与对象继承封装多态高级话题实践项目类与对象 定义与创建 类: 定义一组具有相同属性和行为的对象的模板。对象: 根据类模板创建的实体。示例代码 public class Person {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}…

4.1 数据分析-excel 基本操作

第四节:数据分析-excel 基本操作 课程目标 学会excel 基本操作 课程内容 数据伪造 产生一份招聘数据 import pandas as pd from faker import Faker import random import numpy as np# 创建一个Faker实例,用于生成假数据,指定中文本地…