重映射功能指针

时间:2018-11-07 05:58:47

标签: c pointers type-conversion

我有以下代码需要重新映射(重新定义)C_FLASH_FUNCTION_ADDRESS。

int main(void) {
    // your code goes here

    execute_this();

    pPointerToFunc = (void *)*(uint32_t *)C_FLASH_FUNCTION_ADDRESS;

    pPointerToFunc();

    return 0;
}

我需要重新定义C_FLASH_FUNCTION_ADDRESS的原因是C_FLASH_FUNCTION_ADDRESS是FLASH存储器中存储某些其他功能的地址的某个位置。由于我没有FLASH,因此我想将C_FLASH_FUNCTION_ADDRESS重新定义为RAM中的某个地址。出于任何原因,我都不必更改此行:pPointerToFunc = (void *)*(uint32_t *)C_FLASH_FUNCTION_ADDRESS;

我尝试使用下面的代码来执行此操作,但是编译时会发生运行时错误。

#include <stdio.h>

void Testing_pOP_Start(void)
{
    printf("Inside");
    return;
}

typedef unsigned int uint32_t;

#define C_FLASH_FUNCTION_ADDRESS (ptemp)

void (*pPointerToFunc)(void);

unsigned long ptemp;

void execute_this(void)
{
    ptemp = (unsigned long)(&Testing_pOP_Start);
}


int main(void) {
    // your code goes here

    execute_this();

    pPointerToFunc = (void *)*(uint32_t *)C_FLASH_FUNCTION_ADDRESS;

    pPointerToFunc();

    return 0;
}

请帮助我找出问题所在以及如何实现。

3 个答案:

答案 0 :(得分:2)

您应该学习如何使用调试器。

我只是在调试器下运行您的代码,该错误立即显而易见:在调用execute_this之后,ptemppPointerToFunc的值是不同的。

然后我意识到C_FLASH_FUNCTION_ADDRESS不直接是函数的地址,而是函数的指针的地址(多1个间接级别)。

随后的修复很明显:

#define C_FLASH_FUNCTION_ADDRESS (&ptemp)

仅此而已...


我正在使用在线编译器不是不学习使用调试器的正当理由。您可以找到免费的编译器,调试器是必不可少的工具。

答案 1 :(得分:1)

  

C_FLASH_FUNCTION_ADDRESS在闪存中的某个位置

因此,C_FLASH_FUNCTION_ADDRESS是闪存中的地址

但是#define C_FLASH_FUNCTION_ADDRESS (ptemp)读取存储在ptemp中的

您需要这两个更改之一。 获取ptemp地址(但它被强制转换为另一类型,uint32_t而不是unsigned long,类型必须相同且足以存储地址,请使用{ {1}}。

intptr_t

或读取并强制转换值本身

#define C_FLASH_FUNCTION_ADDRESS (&ptemp)
...
pPointerToFunc = (void *)*C_FLASH_FUNCTION_ADDRESS;

更新

  

无论我做什么,都不得更改此行-   #define C_FLASH_FUNCTION_ADDRESS (ptemp) ... pPointerToFunc = (void *)C_FLASH_FUNCTION_ADDRESS;   可以吗?

使用第一个方法,但pPointerToFunc = (void *)*(uint32_t *)C_FLASH_FUNCTION_ADDRESS; 必须ptemp-与(固定)行中的强制类型相同。

uint32_t

确保32位指针(使用32位编程环境,对于64位OS和gcc,如果安装了32位支持,则可以使用#define C_FLASH_FUNCTION_ADDRESS (&ptemp) ... uint32_t long ptemp; ... pPointerToFunc = (void *)*(uint32_t *)C_FLASH_FUNCTION_ADDRESS;

答案 2 :(得分:0)

摘自您对我的评论的答复:

“我应该可以使用pPointerToFunc调用Testing_pOP_Start()”

我认为,您正在尝试实现以下目标:

#include <stdio.h>

void Testing_pOP_Start(void)
{
    printf("Inside");
    return;
}

typedef void (*C_FLASH_FUNCTION_ADDRESS)(void);
C_FLASH_FUNCTION_ADDRESS pPointerToFunc= &Testing_pOP_Start;

int main(void)
{
     // your code goes here

    pPointerToFunc();

    return 0;
}

尝试使用此代码,并让我知道,以便我可以添加其他详细信息。