用ram实现寄存器堆_纯C语言实现bootloader
生活随笔
收集整理的這篇文章主要介紹了
用ram实现寄存器堆_纯C语言实现bootloader
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
之前有用很少一部分匯編實現過bootloader,但經過后來慢慢改進,發現是可以用純C語言實現嵌入式操作系統的引導。
下面是之前對不能完全使用C語言引導系統的幾點說明:
1、C程序中所有的代碼都是以函數的形式出現,而函數定義通常會用到參數和在函數里面定義一堆局部變量,而這些變量一旦過多時,寄存器就無法全部保存,此時就會將剩下的變量存到堆棧里面,即,SP寄存器所指向的內存里面,而此時的SP寄存器并未賦初值,也就沒有確切的內存地址可用。所以需要用到堆棧的前提是SP堆棧指針已經有了明確指向,否則就是非法訪問內存,那么SP的設置又離不開匯編。2、一般bootloader都會分成多階段完成,而第一階段的運行內存空間和第二階段的內存運行空間往往相差很遠,所以如果要從第一階段跳轉到第二階段,那么就是必要用絕對轉移,也就是給PC寄存器直接賦值的那種方式,而C語言中用的是函數調用,而函數調用全部都是相對跳轉,也就是相對于當前PC地址跳到另一個偏移地址。這里并不是說相對跳轉的距離不夠,而是地址空間分配有問題。一般第一階段代碼都是與地址不相關的,而所有的兩階段程序都被鏈接到統一地址空間,所謂統一就是一二階段不能分家,但不分家不可能,如果都不分家,那就不叫兩階段或多階段了,就直接是單階段啟動。那么要給PC寄存器賦值,也是離不開匯編的。
3、當然還有,在運行bootloader第二階段代碼之前要用到動態內存,它不像靜態內存可以直接使用,動態內存是一種廉價的RAM,是需要先初始化后才能使用的,這就必然導致在運行真正的應用程序之前有一段程序會在靜態內存中先執行。不過對動態內存的初如化是很容易使用C語言實現的,無需堆棧的支持。
所以根據以上三點分析,發現重點就是前兩條,也就是怎樣在C語言中實現對寄存器的訪問,我之前做的bootloader雖然沒有用到匯編文件,但使用了內嵌匯編來做,感覺還是有匯編存在,對于不懂匯編的人看起來還是不夠爽快。后來想到了定義寄存器變量,所以就這么干了,這次使用了兩個寄存器變量(分別是R13和R15)實現了純C語言的bootloader。第一階段代碼可以參考如下:
register整個工程到http://iask.sina.com.cn/u/2487717952/ish下載。
需要注意的是:第一個標號的名稱一般默認為_start ,但也可以取別的名,可能會有警告,本標號是否會被鏈接到第一個地址,主要取決于lds和Makefile是怎么寫的,請參考源碼工程。整個源碼參考vivi和u-boot完成,代碼量很小,只是完成了操作系統的引導,并不支持下載功能,其實添加一種下載模式就是完成一個驅動再加上一個下載協議,大家可以自己往里面加。
喜歡濤哥文章的可以動動小手,點個贊哦!
總結
以上是生活随笔為你收集整理的用ram实现寄存器堆_纯C语言实现bootloader的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java cron表达式_Java 程序
- 下一篇: 多元经验模态分解_环境激励桥梁模态参数识