[英]stm32f4 - copy a function from the flash to the ram on runtime
我的stm32f4有问题,我正在尝试将函数从闪存复制到内存(某种 POC)。 当函数非常简单(增加计数器)时,我设法让它工作,但是当我试图从我复制到 ram 的函数中调用 flash 函数时,控制器会出现硬故障
这又是一个纯粹的 POC ......我也不能使用__ramfunc
因为我需要在运行时使用它......
代码是这样的:
void dummy_func2()
{
var2++;
}
void dummy_func()
{
var++;
dummy_func2();
}
void copy()
{
memcpy(buffer, (void*)((uint32_t)&dummy_func & ~1), 100);
run_func = (pFunc) &buffer[1];
}
void main()
{
copy();
while(1)
{
run_func();
}
}
谢谢! 😊
你的问题是你不能......将指向成员函数的指针转换为空? 并且不能……将指向函数的指针转换为空?
技术细节:void*指针是指向数据的指针,函数指针指向函数。 该语言不要求函数和数据位于同一地址空间中,...
您可以做的是使用链接器将某些函数放置在闪存内的某些位置,并编写一个函数以从该特定内存空间加载。 这可以按照此处和此处所示进行。
它涉及使用您的自定义名称创建一个新的内存区域。 在示例中,这是MY_MEMORY
MEMORY
{
FLASH (rx) : ORIGIN = 0x0, LENGTH = 128K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 32k
MY_MEMORY (rx) : ORIGIN = 0x20000, LENGTH = 128k
}
然后声明一个可用于在其中放置函数(或数据)的部分。
__etext = .;
.mysection :
{
. = ALIGN(4);
__mysection_start__ = .;
*(.mysection*)
__mysection_end__ = .;
} > MY_MEMORY
您需要为链接描述文件添加大小检查以增加安全性,以免内存区域溢出。
/* Check if FLASH usage exceeds FLASH size */
ASSERT( LENGTH(FLASH) >= (__etext + SIZEOF(.data)), "FLASH memory overflowed !")
/* Check if MY_MEMORY usage exceeds MY_MEMORY size */
ASSERT( LENGTH(MY_MEMORY) >= (__mysection_end__ - __mysection_start__), "MY_MEMORY memory overflowed !")
现在您可以在某个内存部分中找到一个函数并从中读取数据。
#define LOCATE_FUNC __attribute__((__section__(".mysection")))
void LOCATE_FUNC Delay(uint32_t dlyTicks)
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.