簡體   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