簡體   English   中英

從freeRTOS運行應用程序

[英]Running applications from freeRTOS

我目前正在開發我公司正在開發的消費電子產品的操作系統。 我已經決定將freeRTOS作為我們操作系統的主干,並且正努力在操作系統中實現硬件功能。 但是,我遇到了一個關於在freeRTOS中運行第三方應用程序的問題。

最初我認為任務是一個應用程序,基本上你有“myapplication.c”和“myapplication.h”包含所有應用程序必需的函數,代碼將駐留在任務中的for(;;)循環中(作為一個主要的while循環)。 然后,當用戶決定運行該應用程序時,會將一個函數指針傳遞給隊列,然后我的app_launcher任務會使用第三方任務或應用程序創建新任務。

然而,這種方法的問題是操作系統已經被編譯並駐留在微控制器上,並且可以根據用戶的需要安裝和刪除應用程序......顯然,應用程序需要從操作系統進行編譯和執行。 在標准的unix機器上,我會使用fork之類的東西來選擇可執行文件並給它自己的進程。 但是我在freeRTOS中找不到類似的功能..我的另一個想法是接近應用程序開發的腳本語言,但我不知道如何啟動這些應用程序......

所以問題是,我如何讓freeRTOS運行尚未加入操作系統的第三方開發人員的應用程序?

FreeRTOS(以及大多數RTOS)不像通用操作系統(GPOS)那樣工作,它們通常不是為了動態加載和執行任意用戶提供的應用程序而設計的。 在大多數情況下,您使用RTOS是因為您需要硬實時響應,並且執行第三方代碼可能會對此造成影響。

大多數RTOS(包括FreeRTOS)不再是靜態鏈接庫,其中整個嵌入式應用程序與RTOS靜態鏈接並作為單個多線程程序執行。

同樣,許多RTOS(如FreeRTOS)的操作系統與Linux等GPOS的操作系統不同。 通常,可用的RTOS服務是實時調度程序,進程間通信(IPC),線程同步和定時器。 例如文件系統和網絡堆棧等中間件可以是可選擴展,也可以從第三方代碼集成。

FreeRTOS試圖實現目標的一個問題是,“任務”類似於“線程”,而不是GPOS過程模型意義上的“過程”。 任務通常在與其他任務相同的內存空間中運行,在任務之間沒有內存保護。 任務不是單獨的程序,而是單個應用程序中的線程。

如果您的目標沒有MMU,那么內存保護在任何情況下都可能受到限制,但您可能仍希望第三方應用程序在概念上獨立於操作系統。 如果您的處理器沒有MMU,則運行任意第三方動態加載的代碼可能是系統完整性,安全性和安全性的問題。 即使使用MMU,FreeRTOS等簡單的RTOS內核也不會使用它。

具有實時調度的操作系統可以作為單獨的進程動態加載和運行應用程序代碼,包括:

此外, VxWorks還能夠加載部分鏈接的目標代碼,並將其動態鏈接到已加載的代碼。 這在流程模型中並不相同,但更類似於動態鏈接庫。 在此上下文中值得一提的是,VxWorks shell可以通過名稱調用具有外部鏈接的任何函數。 因此,您可以加載實現函數的目標文件,然后運行該函數。 原則上你可以在FreeRTOS上實現相同的功能,但這並非易事。 shell是一回事,但動態加載和鏈接需要應用程序符號表作為目標駐留。

如果您不需要硬實時(或者您的實時要求是“軟”)並且您的目標具有足夠的資源,那么部署LinuxuClinux可能會更好地為嵌入式系統中使用的LinuxuClinux提供服務。

如果最終用戶需要運行的代碼與設備的目的緊密相關而不是“通用”本質,則允許最終用戶運行代碼的另一種可能性是集成腳本語言解釋器,例如Lua 在這種情況下,您只需從文件系統加載腳本並將其傳遞給腳本解釋器。 對於更通用的要求, Java VM可能是可能的。

根據要求,這是我找到問題的工作。 問題是從freeRTOS啟動其他應用程序。 這是通過利用newlib庫中的“System()”函數完成的。 因此,我可以將應用程序放在flash中直到需要,然后使用提供的newlib函數啟動它。 這也允許我動態啟動程序,而無需硬編碼應用程序的代碼或名稱,我只需要為System()提供一個字符串,指向應用程序在內存中的位置。

暫無
暫無

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

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