我正在嘗試在 MPC5748G 上使用閃存 - 來自 NXP 的一個運行 FreeRTOS 10.0.1 的微控制器,我得到了一些我無法理解的行為。
我手動分配記憶體,分配似乎不起作用。但是,當使用“printf”時,我可以達到地址處的值——但只能來自同一個函式。(我正在使用指標的副本,以確保不會發生一些編譯器優化問題)
void vFlashTask(void* pvParameters){
vTaskDelay(1000);
FLASH_DRV_Init();
uint32_t* val_ptr;
uint32_t* val_ptr_cpy;
val_ptr = (uint32_t *)0xFB8000;
val_ptr_cpy = val_ptr;
*val_ptr = 444;
DBGPRINTF("Task| value at xFB8000:%d", *val_ptr_cpy);
getValTest();
vTaskDelay(1500);
vTaskDelete(NULL);
}
void getValTest(){
uint32_t* val_ptr;
val_ptr =(uint32_t *)0xfb8000;
DBGPRINTF("getValTest| value at xFB8000:%d", *val_ptr);
}
回饋(在 UART 終端中):
[../include/flash.c:26]: Task| value at xFB8000:444
[../include/flash.c:37]: getValTest| value at xFB8000:-1
我還附上了除錯器的螢屏截圖,它清楚地顯示了 xFB8000 的記憶體未初始化(它的值為 0xffffffff),但 printf 函式仍然設法列印正確的值(?)。

我的 DBGPRINTF 宏:
#define DBGPRINTF(f, ...) dbgPrintf("[%s:%d]: " f "\n", __FILE__, __LINE__, __VA_ARGS__)
void dbgPrintf(const char *format, ...){
va_list args;
va_start(args, format);
int len = vsnprintf((char*) uart_buffer, UART_BUFFER_SIZE - 1, format, args);
UART_SendDataBlocking(&uart_pal1_instance, (const char *)uart_buffer, len, UART_TIMEOUT);
va_end(args);
}
我真的很感激任何幫助或建議。
我的編譯器標志:
\S32DS_Power_v2.1\eclipse\../S32DS/software/S32_SDK_S32PA_RTM_3.0.3/rtos/FreeRTOS_PA/Source/portable/GCC/PowerPC" -I"C:\NXP\S32DS_Power_v2.1\eclipse\../S32DS/software/S32_SDK_S32PA_RTM_3.0.3/middleware/tcpip/tcpip_stack/ports/OS" -I"C:\NXP\S32DS_Power_v2.1\eclipse\../S32DS/software/S32_SDK_S32PA_RTM_3.0.3/middleware/tcpip/tcpip_stack/ports/platform/generic/gcc/setting" -I"C:\NXP\S32DS_Power_v2.1\eclipse\../S32DS/software/S32_SDK_S32PA_RTM_3.0.3/middleware/tcpip/wolfssl/wolfssl" -I"C:\NXP\S32DS_Power_v2.1\eclipse\../S32DS/software/S32_SDK_S32PA_RTM_3.0.3/middleware/tcpip/wolfssl" -I"C:\NXP\S32DS_Power_v2.1\eclipse\../S32DS/software/S32_SDK_S32PA_RTM_3.0.3/rtos/FreeRTOS_PA/Source" -I"C:\NXP\S32DS_Power_v2.1\eclipse\../S32DS/software/S32_SDK_S32PA_RTM_3.0.3/platform/pal/inc" -I"C:\NXP\S32DS_Power_v2.1\eclipse\../S32DS/software/S32_SDK_S32PA_RTM_3.0.3/platform/drivers/src/flash_c55" -O1 -g3 -Wall -c -fmessage-length=0 -msdata=eabi -mlra -funsigned-bitfields -ffunction-sections -fdata-sections -fno-common -Wno-address -mcpu=e200z4 -specs=nosys.specs -mbig -mvle -mregnames -mhard-float --sysroot="C:\NXP\S32DS_Power_v2.1\eclipse\../S32DS/build_tools/powerpc-eabivle-4_9/powerpc-eabivle/newlib"
uj5u.com熱心網友回復:
問題是寫入閃存 - 它尚未正確初始化。
使用 SDK 3.0.3 在 MPC5748g 上寫入閃存的正確方法如下:
- 保存閃存控制器快取
- 初始化閃存
- 檢查和保護UT塊
- 解鎖地址空間
- 擦除這個空間中的一個塊
- 檢查空格是否為空白
- 編程塊
- 驗證塊是否正確編程
- 編程資料的校驗和
- 恢復閃存控制器快取
printf 和指標的奇怪行為是由于編譯器優化造成的。將編譯器標志更改為 -O0(無優化)后,錯誤是一致的。
將指標標記為“易失性”時,可以實作相同的一致錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430738.html
上一篇:編譯器說變數未宣告,即使它已宣告
下一篇:在C中列印多維陣列
