[英]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.