簡體   English   中英

在 C 中的引導加載程序和應用程序之間共享一個變量

[英]Sharing a variable between bootloader and application in C

我想在引導加載程序和應用程序之間共享一個變量(一個 boolean 就足夠了)。 引導加載程序應寫入 boolean 而應用程序應讀取它。

我以為我可以將 1 或 0 寫入某個地址(0x40000100),如下所示:

uint8_t *microType = (uint8_t *)0x40000100;

microType = 1;

這樣對嗎?

作為微處理器,我正在使用 NXP MPC5645C 提前謝謝你。

  1. 您需要在引導加載程序和應用程序 linker 腳本中創建該部分。 它是必需的編譯器,並且 linker 不會在 memory 的這個塊中放置任何其他變量。 最好的地方是 RAM 的開頭或結尾,因為其他部分不能有“間隙”。 部分應該有固定地址並且是 linker 腳本中定義的第一個(或最后一個,如果它位於 RAM 的末尾)。

然后您只需創建變量並將它們放在這些部分中。

為此,您需要在絕對地址處設置和保留一個專用 RAM 段。 您顯然不能使用0x40000100因為它指向堆棧的中間並且堆棧不能用於此目的。 您也不能只對位於.bss/.data 中的東西使用任何變量標識符,因為無論何時更改程序,該標識符都可能轉換為不同的物理地址。

此外,您不應該依賴在復位后保留 RAM 中的值,因此如果您執行引導加載程序,然后 MCU 復位並執行應用程序,這對於 MPC56 的任務/安全關鍵型應用程序的平均類型來說不是一個好主意。通常用於。 NXP 微控制器具有在“軟復位”(例如看門狗超時)時在 RAM 中保存變量的定義明確的值的傳統,但我不記得這是否適用於 MPC56。

此外,如果要在重置之間保留該值,則必須考慮如何手動初始化此自定義 RAM 段。 這樣做意味着您必須調整 CRT 代碼,這並非易事。 您需要在上電復位和類似操作時將段歸零,但在看門狗復位等時保持不變。

至於如何制作自定義 memory 段,這取決於工具鏈。 在 Codewarrior 中,您必須調整 linker 腳本(.lcf 文件),在 MEMORY 下方創建一個MEMORY范圍並在SECTIONS下方添加一個GROUP 小心 alignment; 預計至少有 32 位 alignment 但可能還有其他考慮因素(查看友好手冊)。 然后在實際的變量聲明中添加一些 icky pragma,如下所示:

#pragma section RW ".my_section"
__declspec(section ".my_section") 
volatile uint32_t the_variable;

一旦你做到了這一點,這個變量應該可以從引導加載程序和應用程序中訪問。 它必須是volatile的,以便編譯應用程序的編譯器不會對永遠不會被寫入的變量做出奇怪的假設。

  1. 代碼應該是

    uint8_t *microType = (uint8_t *)0x40000100;

    *微類型 = 1;

  2. 確保您的 kernel 的地址是合法的。

  3. 在 x86 中,如果加載器傳遞了一些參數,它將使用寄存器來存儲它們。 對於您的平台,您可以研究調用約定以查看可用的寄存器,然后使用內聯匯編來存儲參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM