繁体   English   中英

stm32f4 - 在运行时将函数从闪存复制到内存

[英]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)
{
  
}

请注意,本教程是从 silabs ChrisM Q/A 页面复制的,因此不是我的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM