gpt4 book ai didi

c - 重新映射函数指针

转载 作者:行者123 更新时间:2023-11-30 18:34:10 26 4
gpt4 key购买 nike

我有以下代码,需要重新映射(重新定义)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,我想将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;
}

请帮我找出问题所在以及如何实现这一目标。

最佳答案

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

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

然后我意识到C_FLASH_FUNCTION_ADDRESS不是直接函数的地址,而是指向函数的指针的地址(多了一层间接层)。

解决办法就很明显了:

#define C_FLASH_FUNCTION_ADDRESS (&ptemp)

就这些了...

<小时/>

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

关于c - 重新映射函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53184259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com