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

一、相关概念

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

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

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

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

总结:

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

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);

测试代码,如下:

扫描二维码关注公众号,回复: 16852579 查看本文章
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为奇数。

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

猜你喜欢

转载自blog.csdn.net/weixin_46158019/article/details/132353447