嵌入式操作系統(tǒng)內(nèi)核原理和開發(fā)(中斷)_第1頁
嵌入式操作系統(tǒng)內(nèi)核原理和開發(fā)(中斷)_第2頁
嵌入式操作系統(tǒng)內(nèi)核原理和開發(fā)(中斷)_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、嵌入式操作系統(tǒng)內(nèi)核原理和開發(fā)(中斷)在我個(gè)人看來,中斷是 cpu最重要的特色。從某種意義上來說,沒有中斷就沒有嵌入式操作系統(tǒng)。一旦你明白了中斷的真正含義,你對(duì)操作系統(tǒng)的了解就算真正入門了。什么是中斷呢?我們可以看看單片機(jī)下面是怎么做的。1#include <REG51.h>2sbit LED = P1 人 6;3unsigned int led_enable = 0;4void Delay(unsignedint a)56unsignedint i;7while (a)S9a -;10for (i = 0; i < 1200; i+);111213void led_switc

2、h(void ) interrupt 0using 11415if (0 = led_enable)1617led_enable = 1;1S19else衛(wèi)21led_enable = 0;23EX0 = 1;void main( void )苫27EA = 1;袈EX0 = 1;29while (1)30if (led_enable)3132LED = 0;33Delay(100);峯LED = 1;35Delay(100);363738 上面的代碼是一段真實(shí)的 51單片機(jī)代碼。它完成的功能很簡(jiǎn)單,就是對(duì)led燈進(jìn)行點(diǎn)亮 處理。怎么解釋呢?在單片機(jī)上電后,我們發(fā)現(xiàn)一開始led二極管沒有發(fā)生閃

3、爍。在我們單擊按鍵之后,led開始出現(xiàn)間隙性閃爍的現(xiàn)象,之后再一次單擊按鍵,又可以發(fā)現(xiàn)led的閃爍現(xiàn)象消失了。為什么會(huì)出現(xiàn)這種現(xiàn)象?主要是因?yàn)槲覀儐螕舭存I的時(shí)候,在單片機(jī)的引腳處產(chǎn)生了中斷。查看到中斷的單片機(jī)此時(shí)就會(huì)跳轉(zhuǎn)到中斷向量表里面查找中斷處理函數(shù)。這里的按鍵中斷處理函數(shù)就是led_switch。處理完led_switch之后,單片機(jī)又會(huì)回到原來的main函數(shù)繼續(xù)執(zhí)行,所以整個(gè)中斷的過程就像沒有發(fā)生過一樣。因?yàn)樵趌ed_switch中我們對(duì)led_enable進(jìn)行了處理,所以就出現(xiàn)了我們?cè)谇懊嬲f過的各種現(xiàn)象。說到這,也許有的朋友會(huì)說,cpu的這種中斷屬性怎么才能在pc上面仿真出來呢?其實(shí)很

4、簡(jiǎn)單。linux系統(tǒng)本身就有一個(gè)優(yōu)秀的特性,那就是信號(hào)。只要我們?cè)O(shè)定相應(yīng)的信號(hào)和 處理函數(shù),那么linux系統(tǒng)就會(huì)在系統(tǒng)調(diào)度返回之前調(diào)用相應(yīng)的信號(hào)函數(shù)來處理。整個(gè)信號(hào) 處理的過程和中斷是一模一樣的。因?yàn)樵谔幚碇袛嗟臅r(shí)候,我們需要對(duì)cpu的現(xiàn)場(chǎng)進(jìn)行保存和恢復(fù)處理,而信號(hào)的處理也是一樣。 在信號(hào)處理前,系統(tǒng)肯定是處于內(nèi)核態(tài), 那么linux 系統(tǒng)肯定已經(jīng)為我們做好了現(xiàn)場(chǎng)的保護(hù)工作,處理完信號(hào)之后,系統(tǒng)本身又會(huì)恢復(fù)到原來的用戶態(tài),繼續(xù)執(zhí)行下面的代碼。所以linux自身也會(huì)默認(rèn)對(duì)原來的場(chǎng)景進(jìn)行恢復(fù)處理,就好象中斷返回一樣。39 #include <stdio.h>#include <

5、time.h>4| #include <sys/time.h>二.#include <stdlib.h>43 #include <signal.h>-!-! static int count = 0;-f: static struct itimerval oldtv; 筋 void set_timer()-思 struct itimerval itv;4?50515253 setitimer(ITIMER_REAL, &itv, & oldtv);55 void signal_handler( int m):亍count +;5&

6、;printf("%dn" , count);-1 int main()念signal(SIGALRM, signal_handler);(Sset_timer();6'while (count< 10000);住exit(0);迫return 1;(gdb) bt#0 signal_handler(m=14) at code.c: 23#1 <signal handler caller>#2 main() at code.c:32#include <stdio.h>#include <stdlib.h>#include &

7、lt;signal.h>#include <tchar.h>#include <Windows.h>void SignalHandler( int signal);printf( "Application over.n""J int main()< :i:-:typedef void (*SignalHandlerPointer)(int );齊 SignalHandlerPointer previousHandler;previousHandler = signal(SIGINT, SignalHandler);迫 while (1)囲Sleep(0);-如 exit(1);91 下面,我們首先編譯這一段代碼。接著在程序run之后,我們可以在 SignalHandler之處設(shè)置一個(gè)斷點(diǎn)。一切就緒完畢,再按下ctrl+c之后,系統(tǒng)就會(huì)在SignalHandler之處斷住。 此時(shí)單擊【Debug】->【Threads】,就可以看到這個(gè)情況。相信看到這里,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論