學習ARM開發 22

2021-08-22 02:16:21 字數 1223 閱讀 2421

關閉中斷與開啟中斷

中斷是一種高效的對話機制,但有時並不想程式執行的過程中中斷執行,比如正在列印東西

,但程式突然中斷了,又讓另外乙個程式輸出列印內容,這樣在印表機上就會亂得不得了,

同時有兩份以上的檔案交錯地列印在一張紙上。像不可剝奪的資源,就一定要關閉中斷,讓

它占有這個資源。在arm裡,沒有像x86那樣有清除中斷指令cli。那麼在arm裡是怎麼樣實現

關中斷和開中斷的呢?下面就來看看arm的關中斷和開中斷實現。

/////函式名稱: lock

//函式功能: 關中斷函式。

//輸入引數:

//輸出引數:

//返 回 值:

//開發人員: 蔡軍生

//時 間: 2006/02/13

//修改說明:

/////

void lock(void)

" );

asm volatile ( "mrsr0, cpsr" );

asm volatile ( "orr r0,r0,#0xc0" );

asm volatile ( "msr cpsr_cxsf,r0" );

asm volatile ( "ldmia sp!," );

}上面這段程式是通過設定cpsr的第6,7位來實現的,因為第6,7位是設定為1時,就不再響應

中斷。///

//函式名稱: unlock

//函式功能: 開中斷函式。

//輸入引數:

//輸出引數:

//返 回 值:

//開發人員: 蔡軍生

//時 間: 2006/02/13

//修改說明:

/////

void unlock(void)

" );

asm volatile ( "mrsr0, cpsr" );

asm volatile ( "bic r0,r0,#0xc0" );

asm volatile ( "msr cpsr_cxsf,r0" );

asm volatile ( "ldmia sp!," );

}上面是重新開中斷的命令,同樣是設定cpsr的第6,7位,但它的值是0,就可接收中斷了。

如果在多個任務之間進行共享資料,一般是需要使用關中斷和開中斷實現資料同步的,其實

中這種關中斷和開中斷,就是進入臨界區和退出臨界區。

如果是像pc機那樣有多個cpu的話,關中斷並不能防止這種情況。

學習ARM開發20 21

學習arm開發 20 os的任務切換 有了前面的tick中斷,那麼基本的任務切換條件已經是 萬事俱備,只欠東風 了。不過,這個 東風 也是很難搞得懂的,只有不斷地通過實踐才會找到合適的方法。現在我就需要去找這個東風了,就是解決不同的任務切換的問題。從簡單到複雜,這是任何事物的認識過程,也是行之有效的...

學習ARM開發 5

學習arm開發 5 蔡軍生 2005 07 16 寫於深圳 上一次說到要學習uboot的 但在看之前,首先要知道目標機器的程式設計資源,這裡的資源,是指s3c44b0所提供的執行程式的資源,對任何嵌入式軟體開發,都首先要對硬體有乙個很好的了解,這跟pc機的程式設計是大不一樣的。因為pc機都已經發展了...

學習ARM開發 9

學習arm開發 9 上一次把引導的彙編看完,已經準備c的執行環境,下面就開始學習c的源程式,從start.s檔案裡到跳檔案 lib arm board.c裡執行.引導程式從彙編start.s裡跳到這裡執行。蔡軍生 2005 07 19 void start armboot void 宣告乙個全域性指...