2016-07-29 59 views
0

我正在爲使用相對複雜的通信接口的ARM Cortex-M3編寫啓動加載程序;這與實際應用程序使用的相同。該應用程序使用Keil的RTX作爲其內核,通信棧依賴於它。當然使用GCC。Keil RTX啓動時的控制

引導加載程序執行以下基本步驟:

  1. 在啓動時,一個有效的應用圖片檢查;如果沒有可用的,則進入升級模式;
  2. 它檢查按鈕按鈕作爲進入升級模式的請求;如果發現,它進入升級模式。
  3. 找到一個有效的圖像,並沒有升級請求,它「啓動」應用程序。

這是相當簡化的,但它充分描述了我們的目的情況。

令人驚訝的證明困難的最後一個問題是啓動應用程序。這個想法是禁用中斷,設置向量表,堆棧指針,並跳轉到新向量表中的應用程序的重置向量。所有這些工作只是桃色,除了不久之後,我得到一個硬性故障。

通過實驗,如果我在一個簡單的引導程序(不使用RTX或當然,通信堆棧)中執行此操作,那麼引導到應用程序工作正常。所以看來RTX是個問題。

事情是,真正的引導程序在進入升級模式之前不需要RTX。所以明顯的做法是在我們確定需要之前不啓動RTX;然而,它似乎被入侵到了啓動代碼中,所以當我進入bootloader代碼時,已經太晚了;的確,bootloader的main()函數已經是一個線程了!

最好的方法似乎是不開始RTX(太糟糕了,我沒有使用FreeRTOS!),直到我需要它;然而,這似乎需要一些黑客攻擊。另一種方法是以某種方式禁用所有中斷和異常,但由於某種原因,我還沒有成功。有沒有人有這兩種方法的例子?

+0

因此,引導程序和應用程序都是基於RTX的?如果是這樣,最好的選擇可能是完全改變計劃 - 將所有內容鏈接到一個程序中,運行初始檢查作爲啓動任務,然後啓動「升級」或「應用程序」任務爲適當。通過不重複單獨的「引導加載程序」和「應用程序」映像之間的「相對複雜的」通信代碼,這也可以節省您的閃存空間。 – Notlikethat

+0

似乎需要從RAM或其他程序運行,並覆蓋引導加載程序(因爲它是正在上傳的應用程序的一部分!);恐怕,這會使系統太過混亂。但有趣的想法。很明顯,當我說「相對複雜」時,我誤導了你;雖然它很複雜,但並不是很大 - 我的引導程序大約是20 KB,我的應用程序是80 KB,並且該設備有1 MB! – Bob

回答

0

萬一有人遇到這種情況,解決方案其實很簡單。我只是在system_efm32gg.c文件中定製了SystemInit()函數!雖然_efm32gg是供應商特定的,但似乎system_X.c是一個廣泛使用的ARM構造 - 至少,我已經在ST,NXP和EnergyMicro/SiliconLab中看到過 - 所以這是一個體面的一般方法。

我應該早知道! 嘆息