關於ucos問題

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)

 
發佈了50 篇原創文章 · 獲贊 10 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章