单片机中绝对地址转换为函数指针

news2024/11/23 15:29:53

一、相关概念

 函数指针指针函数是两个不同的概念。

  函数指针是指可以指向函数的指针,它的类型与函数的返回值类型和参数类型相对应。通过函数指针,可以实现函数的回调和动态调用等功。

  指针函数则是指返回指针类型的函数,它的返回值是一个指针,可以用来指向一个地址或数据。指针函数通常用于动态分配内存和返回动态生成的数据结构等场景。

  需要注意的是,函数指针和指针函数都跟指针有关系,但它们本质上是不同的概念。

总结:

函数指针:本质是指针,指向的是一个函数。形式如下:

void (*pFun)(void);
int (*pFun)(int i,int k);

指针函数:本质是函数,返回值是一个指针。形式如下:

int* pFun(int i,int k);

二、绝对地址如何转换为函数指针

以上一篇文章<单片机如何分散加载文件>为例,方法如下:

int (*pFun)(int,int);//定义指针函数
pFun = (int(*)(int,int))(0x08080001);//my_add_fun 的地址
pFun(num1,num2);

测试代码,如下:

int my_add_test(int num1,int num2)
{
    int sum;
    my_add_init();
    rt_kprintf("my_add_init=0x%08x\r\n",my_add_init);
    void (*pFun1)(void);
    pFun1 = (void(*)(void))(0x0808001d);//my_add_init 的地址
    pFun1();
    sum=my_add_fun(num1,num2);
    rt_kprintf("my_add_fun=0x%08x\r\n",my_add_fun);
    int (*pFun)(int,int);
    pFun = (int(*)(int,int))(0x08080001);//my_add_fun 的地址
    pFun(num1,num2);
    return sum;
}

或者

typedef void (*pVoidFun)(void);
typedef int (*pIntFun)(int num1,int num2);


int my_add_test(int num1,int num2)
{
    int sum;
    my_add_init();
    rt_kprintf("my_add_init=0x%08x\r\n",my_add_init);
    void (*pFun1)(void);
    //pFun1 = (void(*)(void))(0x0808001d);//my_add_init de di zhi
    pFun1=(pVoidFun)(0x0808001d);
    pFun1();
    
    sum=my_add_fun(num1,num2);
    rt_kprintf("my_add_fun=0x%08x\r\n",my_add_fun);
    int (*pFun)(int,int);
    //pFun = (int(*)(int,int))(0x08080001);//my_add_fun de di zhi
    pFun=(pIntFun)(0x08080001);
    pFun(num1,num2);
    return sum;
}

实际测试

5766318016f1f0d0a577d5edc18648b1.png

如何知道函数的地址呢?

①是通过打印,获取函数的绝对地址;

②通过map文件获取函数地址

2f03b61a15ec749bd49760673a2bf042.png

1edbfadc12be606bd588904017c57bbc.png

6582dd7df9262827f2fa06e3348789fd.png

不知道大家发现了没?地址应该是0x08080000和0x0808001c,怎么变成了0x08080001和0x0808001d。

具体的可以参考:

https://bbs.21ic.com/icview-134389-999-1.html
读PC指针时,返回LSB总是为0;写PC指针时,一定要保证LSB为奇数。

欢迎关注公众号:嵌入式学习与实践

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

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

相关文章

关于CDN加速和负载均衡技术的讨论

一&#xff1a;前言 相信学习到信息收集模块的小伙伴在学习Web信息收集中查找真实IP相关知识点时&#xff0c;必定接触到一个概念&#xff1a;CDN加速。那么什么是CDN&#xff1f;企业为什么要用CDN&#xff1f;就是为了隐藏自己的真实IP&#xff1f;显然不是。经济学中有一个概…

linux17 线程安全 线程同步

1、线程安全&#xff1a; 多线程程序无论调度顺序如何&#xff0c;都能保证程序 的正确性&#xff0c;就说该程序处于线程安全的状态 1&#xff09;、同步 2&#xff09;、线程安全函数//有的函数不适合多线程使用&#xff0c;是函数自身的原因。 2、线程安全函数 1&#…

java-垃圾回收与算法

垃圾回收与算法 1. 如何确定垃圾 1. 引用计数法 在 Java 中&#xff0c;引用和对象是有关联的。如果要操作对象则必须用引用进行。因此&#xff0c;很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说&#xff0c;即一个对象如果没有任何与之关联的引用&…

【Freertos基础入门】任务调度

文章目录 前言对于前面博客的总结一、任务调度算法是什么&#xff1f;1.调度算法是什么以及freertos的调度算法2.抢占式优先级调度3.时间片轮转调度 二、配置调度算法总结 前言 本系列基于stm32系列单片机来使用freerots 任务管理是实时操作系统&#xff08;RTOS&#xff09;…

VS2015+mysql5.7升级到VS2019+mysql-8.0.34

本来一开始是安装的vs2022社区版&#xff0c;结果没找到mysql-for-visualstudio对应的2022的版本。 原来&#xff1a;VS2015mysql5.7 安装的插件&#xff1a; mysql-for-visualstudio-2.0.5.msi mysql-connector-net-6.10.8.msi 升级后&#xff1a;VS2019mysql-8.0.34 安…

深入理解linux内核--块设备驱动程序

块设备的处理 块设备驱动程序上的每个操作都涉及很多内核组件&#xff1b;其中最重要的一些如图14-1所示。 例如&#xff0c;我们假设一个进程在某个磁盘文件上发出一个read()系统调用 ——我们将会看到处理write请求本质上采用同样的方式。 下面是内核对进程请求给予回应的一…

FPGA芯片IO口上下拉电阻的使用

FPGA芯片IO口上下拉电阻的使用 为什么要设置上下拉电阻一、如何设置下拉电阻二、如何设置上拉电阻为什么要设置上下拉电阻 这里以高云FPGA的GW1N-UV2QN48C6/I5来举例,这个芯片的上电默认初始化阶段,引脚是弱上来模式,且模式固定不能通过软件的配置来改变。如下图所示: 上…

Openwrt指定延迟脚本

在某些情况下&#xff0c;我们需要对指定网络接口指定延迟&#xff0c;以达到我们想要实验的效果延迟。 脚本如下&#xff1a; #!/bin/bash # #初始化 tc qdisc del dev br-lan root echo "1. 添加延迟规则 2. 删除延迟规则" read -p "请选择操作&#xff1a;&q…

素数线性筛法 → 欧拉筛

【题目来源】https://www.acwing.com/problem/content/870/【题目描述】 给定一个正整数 n&#xff0c;请你求出 1∼n 中质数的个数。【输入格式】 共一行&#xff0c;包含整数 n。【输出格式】 共一行&#xff0c;包含一个整数&#xff0c;表示 1∼n 中质数的个数。【数据范围…

【数字实验室】时钟切换

大部分开发者使用 BUFGCTRL 或 BUFGMUX进行时钟切换&#xff0c;它们在时钟切换上可以提供无毛刺输出。然而&#xff0c;了解所涉及的原理是有好处的。 当然&#xff0c;无论我们在同步逻辑中使用哪种技术&#xff0c;重要的是要确保在进行时钟切换时输出上没有毛刺。任何故障都…

无涯教程-Perl - times函数

描述 此函数返回一个四元素列表,为当前进程及其子进程提供用户,系统,子进程和子系统时间。 语法 以下是此函数的简单语法- times返回值 此函数返回ARRAY,($usertime,$systemtime,$childsystem,$childuser) 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl -w($use…

一、ls 标准输出时出现乱码符号及解决办法

问题描述&#xff1a;采用 QSSh 登录远程主机时&#xff0c;执行 ls 指令&#xff0c;标准输出中出现乱码符号 如下&#xff0c;在成功 SSH 到远程主机后&#xff0c;执行 ls 指令&#xff0c;标准输出中出现一堆不认识的符号。 从标准输出来看&#xff0c;英文和中文并没有乱…

安科瑞无线测温产品在浙江某半导体项目的应用-安科瑞黄安南

摘 要&#xff1a;半导体被誉为“制造业的大脑”&#xff0c;在关系国家安全和国民经济命脉的主要行业和关键领域占据支配地位&#xff0c;是国民经济的重要支柱。随着数字技术的发展和数字经济在国民经济中所占比重越来越高&#xff0c;半导体产业的重要性还会进一步提升。安全…

文心一言 VS 讯飞星火 VS chatgpt (77)-- 算法导论7.3 2题

二、如果用go语言&#xff0c;在 RANDOMIZED-QUICKSORT 的运行过程中&#xff0c;在最坏情况下&#xff0c;随机数生成器 RANDOM 被调用了多少次?在最好情况下呢?以θ符号的形式给出你的答案? 文心一言&#xff1a; 在 RANDOMIZED-QUICKSORT 的运行过程中&#xff0c;最坏…

使用贝塞尔曲线算法制作曲线

一阶贝塞尔曲线 使用两个点绘制线段 p3p1(p2-p1)*t p1:起点;p2:终点;t:0-1;p3:线段L12上的点 两个点和t的变化(0-1)可得到一条线段 二阶贝塞尔曲线 使用三个点绘制曲线 p12p1(p2-p1)*t p23p2(p3-p2)*t p123p12(p23-p12)*t p12是线段L12上的点&#xff0c; p23是线段L23上的…

android:绘图 (android.graphics包)

android:绘图 View&#xff1a;组件&#xff0c;理解为画布 Drawable:所有可见对象的描述&#xff0c;理解为&#xff1a;素材类 Bitmap&#xff1a;图片类 Canvas&#xff1a;画笔 Paint&#xff1a;画笔样式与颜色、特效的集合 近期很多网友对Android用户界面的设计表示很感…

Lnton羚通关于如何解决nanoPC-T4 upgrade报错问题?

nanoPC-T4 在 ​​# sudo apt update 和 sudo apt upgrade​​升级或安装软件 ​​sudo apt install xxx​​时遇到以下问题&#xff1a;​​Failed to set up interface with /etc/hostapd/​ Setting up hostapd (2:2.6-15ubuntu2.8) ... Job for hostapd.service failed be…

学习 Linux 系统路线图

在计算机科学领域&#xff0c;Linux 操作系统以其稳定性、灵活性和卓越性能而受到广泛欢迎。要真正掌握 Linux 系统&#xff0c;我们需要深入了解其关键组成部分&#xff0c;包括系统、内存、进程、网络和存储等模块。让我们深入探索这些模块&#xff0c;以建立起对 Linux 系统…

【轻量级神经网络】ShuffleNetv1-2详解

文章目录 1、ShuffleNetV11.1、分组卷积1.2、channel shuffle1.3、ShuffleNet基本单元1.4、整体结构 2、ShuffleNetV22.1、基本单元2.2、整体结构 1、ShuffleNetV1 1.1、分组卷积 Group convolution是将输入层的不同特征图进行分组&#xff0c;然后采用不同的卷积核再对各个组…

KVM配置使用ovs网桥

KVM配置使用ovs网桥 1、安装openvswitch 2、启动服务 3、配置ovs 重启网络服务 systemctl restart network 4、 KVM配置使用ovs网桥 配置生效&#xff1a;virsh net-define br0.xml virsh net-start bro virsh net-autostart br0 5、虚…