1. 程式人生 > >tiny4412 裸機程式 三、關閉看門狗和呼叫C程式

tiny4412 裸機程式 三、關閉看門狗和呼叫C程式

一、原理說明

上是章中大家可能有會覺得奇怪,CPU不是有看門狗嘛?為什麼CPU沒有復位,程式還能正常工作呢?

檢視Eyxnos4412的手冊,第5章簡要的說明了其啟動順序,如下圖3-1所示是Eyxnos4412啟動順序圖,這裡雖然沒有說的很清楚,但內部iROM和BL1程式中是起一些初始化時鐘,DRAM等工作的,其也可能已經使看門狗不工作了。所以上一章程式中,我們也沒有人為的關閉看門狗,程式也能正常工作。這一節,我們嘗試自己關閉開門狗後再點亮LED燈。

看門狗的作用在於監控CPU的執行,保證在諸如噪音和系統錯誤等這樣的故障干擾情況下能

儘快恢復正常工作。看門狗與PWM定時器都能實現定時的功能,兩者的區別在於看門狗能發出復位訊號而PWM定時器不能,後面將會有具體的章節講解看門狗的定時和復位功能,這裡我們只是簡單的將其關閉,然後跳轉呼叫一個C程式。


圖3-1、Exynos4412啟動順序圖

二、程式說明

完整程式碼見目錄2_led_s_wtd。

1. start.S

與程式碼1_led_s_wtd相比,在程式碼2_led_s_wtd中,start.S多了兩點不一樣的地方:

1)  手動關閉了看門狗,只需往暫存器WTCON寫入0即可;

2)  呼叫了C函式實現延時的功能,以測試IROM中的固化程式碼是否設定了棧;

2. delay.c

內含一個普通的C語言延時函式,程式碼如下:

void delay(int r0)

{

volatile int count = r0;

while (count--);

}

彙編呼叫C函式時,當引數個數不超過4個,使用r0~r3這4個暫存器來傳遞引數;如果引數個數超過4個,剩餘的引數通過棧來傳遞,delay()只有1個引數,所以用r0來傳遞。另外,volatile是為了避免編譯器自動幫我們優化掉這段程式碼造成無法延時。 Makefile和sd_fuse裡的程式與上一章程式並沒有差異,以後若程式碼與前一個目錄的程式碼相比沒有發生變化則將不再贅述。

三、完整的燒寫過程

已將SD卡插入電腦,假設linux識別了SD卡,其識別號為sdb。執行下面命令:

# chmod 777 –R 2_leds_s_wtd 

# cd 2_leds_s_wtd

# make

# cd sd_fuse

# make

# ./ fast_fuse /dev/sdb

四、上電實驗

將SD卡插入到Tiny4412板上子,將啟動開關設定拔到SD卡啟動端,上電,開機,可以看到4個LED燈正常閃爍,說明手動關閉看門狗成功,同時證明IROM中的固化程式碼已經設定了棧。為什麼程式成功呼叫C函式就說明了IROM的固化程式碼設定了棧呢?是因為彙編中呼叫C函式時,引數的傳遞、現場的儲存和恢復、臨時變數的儲存等都需要使用到棧,在delay()函式中變數count就是臨時變數,程式執行成功說明棧已經設定好了,更詳細的解釋將會留到下一章。