嵌入式开发板03---看门狗、编写启动代码
看門狗
一般CPU的設(shè)計(jì)在CPU啟動(dòng)后看門狗默認(rèn)是工作的,在S5pV210內(nèi)部的iROM代碼(BL0)中,其實(shí)已經(jīng)關(guān)過看門狗了。很多CPU內(nèi)部是沒有BL0的因此都要在啟動(dòng)代碼的前段自己寫代碼關(guān)閉看門狗。
如果看門狗沒有關(guān)閉,需要在啟動(dòng)代碼前段先去關(guān)閉看門狗。如果沒有關(guān)閉且沒有喂狗,看門狗就會(huì)復(fù)位。一般關(guān)閉看門狗,在需要時(shí)打開看門狗,一旦打開就必須提供喂狗。
在正常程序之前關(guān)閉看門狗,一般來說關(guān)閉看門狗越早越好。
因?yàn)閰R編語言的繁瑣性,所以在編寫程序時(shí),一般都是使用匯編編寫啟動(dòng)代碼,然后調(diào)用C語言的函數(shù)執(zhí)行。而匯編編寫的啟動(dòng)代碼,為C語言提供運(yùn)行時(shí)環(huán)境。C語言運(yùn)行時(shí)主要需要棧。
C語言與棧的關(guān)系:C語言中的局部變量都是用棧來實(shí)現(xiàn)的,如果匯編沒有為C預(yù)先設(shè)置合理合法的棧地址,C代碼中的局部變量就會(huì)落空,整個(gè)程序就死掉了。
在51等單片機(jī)中,由硬件初始化時(shí)提供了默認(rèn)的可用棧。在應(yīng)用程序編寫的C程序,編譯器gcc在鏈接時(shí)自動(dòng)添加一個(gè)頭,這個(gè)頭就是一段引導(dǎo)C程序能夠執(zhí)行一段匯編實(shí)現(xiàn)的代碼,這段代碼中完成了相應(yīng)的設(shè)計(jì)。
在ARM的37個(gè)寄存器中,每種模式下都有一個(gè)獨(dú)立的sp寄存器(r13)這樣避免了多個(gè)程序共用一個(gè)棧,當(dāng)一個(gè)程序崩潰時(shí),所有的同時(shí)崩潰。
s5pv210系統(tǒng)復(fù)位后直接默認(rèn)進(jìn)入SVC模式,所以直接設(shè)置sp即可。
CPU剛復(fù)位(剛啟動(dòng))外部的DRAM沒有初始化,所以的可用的內(nèi)存只有內(nèi)部的SRAM(不需初始化即可使用)因此只能在SRAM中找一段內(nèi)存來作為SVC的棧。
棧的類型分為四種:滿減棧,滿增棧,空減棧,空增棧
滿棧:先移動(dòng)sp指針,再存數(shù)據(jù)
在S5pv210中的SRAM數(shù)據(jù)手冊(cè)中,有專門的棧區(qū)域,因此,不需要我們自己去尋找棧的內(nèi)存,只要將sp指向該區(qū)域即可。通常我們使用棧都是使用滿減棧。所以令sp=0xd0037D80
具體的啟動(dòng)代碼的編寫和C語言函數(shù)的編寫如下:
首先在start.S中編寫啟動(dòng)代碼:
第一步:關(guān)閉看門狗
第二步:設(shè)置C語言的棧
第三步:調(diào)用C語言函數(shù)
第四步:死循環(huán)
具體代碼:
在led_upgrade.c文件中編寫C函數(shù),將之前使用匯編點(diǎn)亮的LED使用C語言再次點(diǎn)亮。
具體操作代碼如下:
在C代碼和匯編啟動(dòng)代碼編寫完成以后,需要在Makefile中做一點(diǎn)小小的改變
led.bin:start.o led_upgrade.o //在依賴部分需要添加C代碼的文件arm-none-linux-gnueabi-ld -Ttext 0x0 -o led.elf $^arm-none-linux-gnueabi-objcopy -O binary led.elf led.binarm-none-linux-gnueabi-objdump -D led.elf >led.dis%.o:%.Sarm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib//在編譯器后加-nostdlib意思是不使用標(biāo)準(zhǔn)庫進(jìn)行編譯,防止命名沖突。%.o:%.carm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlibclean:rm *.o *.elf *.bin *.dis -f總結(jié)
以上是生活随笔為你收集整理的嵌入式开发板03---看门狗、编写启动代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常微分方程matlab求解
- 下一篇: vivado环境下用Verilog语言实