我有以下代码需要重新映射(重新定义)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;
}
请帮助我找出问题所在以及如何实现。
答案 0 :(得分:2)
您应该学习如何使用调试器。
我只是在调试器下运行您的代码,该错误立即显而易见:在调用execute_this
之后,ptemp
和pPointerToFunc
的值是不同的。
然后我意识到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;
}
尝试使用此代码,并让我知道,以便我可以添加其他详细信息。