關於ucos問題

2021-06-15 20:18:11 字數 1998 閱讀 9304

1)

我想問一下斑竹,4510在跑ucos時,除了ucos自己的*.c *.s檔案以外,是不是要需要另外的bootloader??

也就是說,幾乎所有的**在arm上執行時,都需要有bios??

而不僅僅uclinux需要?

不一定都要有bootloader,需要寫乙個啟動**,和核心編譯在一起就可以了:

編譯時應該在放在第乙個檔案位置編譯

啟動**需要完成如下工作:

設定 異常向量表,即在 0x0 – 0x1c 位置放置7條跳轉指令(其中 0x14 為空)

分別實現每種異常的處理程式,其中包括 reset_handler、undefined_handler、swi_handler、prefetch_handler、abort_handler、irq_handler、fiq_handler。

程式從 reset_handler 進入後,需要首先進行相關硬體的初始化操作,例如 初始化sdram、cpu speed、interrupt controller、uart、timer 等。

建立每種異常狀態下的系統堆疊,為了簡單起見可以只在 svc 態 和 irq 態下的建立堆疊:setup_svc_stack ,setup_irq_stack。

強制 arm 處理器狀態轉換為 svc 管理態。

跳轉到uc/os-ii **的 main 入口,實際上是編譯鏈結後產生的 __main 入口。

(2)

編譯器ads設定的ro_base是0x0c000000,也就是把ucos所有**(*.c;*.s)全部編譯到以ro_base為起點的空間中了,但是在44b0x中0x0c000000是ram的起始位置,也就是說所有**編譯到ram空間了。剛開機時,pc肯定指向0x0的,所以,程式如何能跳轉到ram中的ro_base(0x0c00000)中呢?

我覺得肯定有bootloader在起作用,將執行**從flash中拷貝到ram中,再設定pc指標為0x0c000000。

0x0c0000中的指令是b resethandler應該就是ucos的啟動指令了

編譯的這個檔案,是要在ram中執行的,所以ro_base才要設定為ram的首位址0x0c000000,只有這樣,編譯出來的**才是基於0x0c000000空間之上的。

再者bootloader肯定要起作用,一是拷貝img到ram,二是處理各種中斷

(3)現在想把嵌入式作業系統移植進去(例如ucos)怎麼做?它又沒有bios,如何把嵌入式作業系統和應用程式都寫到儲存器上,而且在執行作業系統後馬上執行應用程式?莫非可以把作業系統後和應用程式在一起編譯後在寫入目標機?

(4)不過我最想確認的還是44b0x跑ucos需要不需要bootloader?

還是直接可以用移植ucos時自帶的那個44binit.s就足以?

我個人認為除了上面那個44binit.s之外,還有別的程式在起作用,因為整個ucos系統的檔案,包括(*.c,*.s)都在編譯鏈結的時候分配到0xc000000以後的區域。

如果沒有別的程式,例如bootloader之類的,那麼即使將最終生成的ucos.bin燒到flsah中,也是不能執行的,因為第一條指令是:

b resethandler

而resethandler是被連線到0xc000000(ram區域)以後了,此時ram中什麼東西也沒有,一開始執行就會出錯的。

(5)

uc os學習之路 一 初識uc os

實時作業系統是指當外界事件或資料產生時,能在規定的時間內進行處理並作出相應。實時作業系統有一下基本特徵 現廣泛使用的實時作業系統有很多種,它們具體的比較可以參考 從其 檔案的布局就能大致地了解uc os iii系統的各個功能,及使用方法。uc os iii是uc os中與處理器無關的檔案,其中 該目...

uC OS 的中斷 uC OS學習筆記(三)

1.常見名詞 a 中斷服務子程式 應中斷請求而執行的程式 b 中斷向量 中斷服務子程式的入口位址 2.uc os的中斷過程 系統接收到中斷請求後,如果這時cpu處於中斷允許狀態,系統就會立刻終止正在執行的任務,而按照中斷向量的指向執行中斷服務子程式。對於可剝奪型核心uc os而言,中斷服務子程式執行...

uC OS 的訊息佇列 uC OS學習筆記(七)

1.訊息佇列的介紹 使用訊息佇列可在任務之間傳遞多條訊息。訊息佇列相當於訊息郵箱集合,乙個郵箱只能在任務間傳遞一條訊息,而訊息佇列則可以傳遞多條訊息。訊息佇列由三部分組成 事件控制塊 訊息佇列和訊息。2.訊息佇列的操作 a 建立訊息佇列 qsqcreate void start,int16u siz...