1.
軟體中斷swi
swi(software interrupt)軟體中斷,由使用者定義的中斷指令.可以用於使用者模式下的程式呼叫特權操作指令.在實時作業系統中可以通過該機制實現系統呼叫.
乙個 swi 所做的一切就是把模式改變成超級使用者並設定 pc 來執行在位址 &08 處的下乙個指令!
程式設計異常通常叫做軟中斷.軟中斷是通訊程序之間用來模擬硬中斷的一種訊號通訊方式。中斷源發中斷請求或軟中斷訊號後,cpu或接收程序在適當的時機自動進行中斷處理或完成軟中斷訊號對應的功能.
軟中斷是軟體實現的中斷,也就是程式執行時其他程式對它的中斷;而硬中斷是硬體實現的中斷,是程式執行時裝置對它的中斷。
1.軟中斷發生的時間是由程式控制的,而硬中斷發生的時間是隨機的
2.軟中斷是由程式呼叫發生的,而硬中斷是由外設引發的
3.硬體中斷處理程式要確保它能快速地完成它的任務,這樣程式執行時才不會等待較長時間
2.
軟體中斷使用的始末
2.1
swi指令
swi immed_24
其中,immed_24位24位立即數
2.2
ads編譯器中軟中斷的規定
ads編譯器規定,使用者可使用關鍵字__swi作為字首來宣告乙個利用軟中斷的呼叫,其格式如下:
__swi(
功能號) 返回值型別名稱(引數列表);
其中關鍵字__swi後面的括號中的字段叫做軟中斷的功能編號。系統是根據這個編號在軟中斷服務程式戶中來確定應執行的程式段的。使用者可以在使用者程式中像呼叫乙個普通函式那樣實現軟中斷的呼叫。只是該「函式」沒有普通函式那樣明顯的函式實現體。至於軟體中斷具體的函式實體後面會講到。
利用軟中斷服務程式可以規避由於arm處在不同工作模式時所造成的訪問限制(如資源的訪問限制)。
2.3
在uc/os-ii中軟中斷來實現的函式的宣告
函式註冊軟中斷號
__swi(0x00) void os_task_sw(void); /*
任務級任務切換函式*/
__swi(0x01) void __osstarthighrdy(void); /*
執行優先順序最高的任務*/
__swi(0x02) void os_enter_critical(void); /*
關中斷*/
__swi(0x03) void os_exit_critical(void); /*
開中斷*/
__swi(0x40) void *getosfunctionaddr(int index); /*
獲取系統服務函式入口*/
__swi(0x41) void *getusrfunctionaddr(int index); /*
獲取自定義服務函式入口*/
__swi(0x42) void osisrbegin(void); /*
中斷開始處理*/
__swi(0x43) int osisrneedswap(void); /*
判斷中斷是否需要切換*/
__swi(0x80) void changetosy**ode(void); /*
任務切換到系統模式*/
__swi(0x81) void changetousrmode(void); /*
任務切換到使用者模式*/
__swi(0x82) void taskisarm(int8u prio); /*
任務**是
arm***/
__swi(0x83) void taskisthumb(int8u prio); /* 任務**是thumb */
這些函式不是通常意義上的函式,只是可以讓使用者在應用程式中使用這些「函式名」去引發乙個攜帶功能號的軟中斷swi,即ads編譯器在編譯這些函式時,把他們編譯成swi指令的二進位制**。
注:軟中斷功能號為0x00、0x01的函式使用組合語言寫的,而其他的函式是用c語言寫的。具體**見下面。
注:遵照atpcs函式呼叫標準,乙個
swi呼叫允許帶1~4個字型引數和1~4個字型返回值,觸發swi呼叫時四個引數依次儲存在r0~r3中,返回值也存於r0~r3內。所以在軟中斷服務程式中應函式所需要的引數按順序儲存到r0~r3中。
2.4
軟中斷具體實現始末
以兩個具體的函式呼叫來說明軟中斷具體的實現。乙個是任務級切換函式void os_task_sw(void),乙個是任務模式切換函式void changetosy**ode(void).
2.4.1.
從啟動**中開始
硬體平台為arm7核心。當有軟中斷發生(即呼叫2.2中某乙個函式時)時,系統首先自動調轉到0x0008處執行。
1、第一級中斷向量
area init,code,readonly
entry
b resethandler ;for debug
b handlerundef ;handlerundef
b handlerswi ;swi interrupt handler
b handlerpabort ;handlerpabort
b handlerdabort ;handlerdabort
b . ;handlerreserved
b handlerirq
b handlerfiq
2、巨集展開
繼續找handlerswi。
handlerswi handler handleswi
3、記憶體第二級中斷向量
再找handleswi。
^ _isr_startaddress
handlereset # 4
handleundef # 4
handleswi # 4
handlepabort # 4
handledabort # 4
handlereserved # 4
handleirq # 4
handlefiq # 4
現在我們知道軟中斷的服務程式跑到了記憶體中去了,我們可以編寫相應的**來實現不同功能號下的不同功能。
2.4.2.
在檔案os_cpu_a.s中編寫軟中斷服務程式
1、軟中斷服務**。
handleswi
ldr sp, stacksvc;
stmfd sp!, ;// s***b,保護現場
mov r1, sp ;// 若swi呼叫帶參,將r1指向第二個引數
;// 遵照atpcs標準,第乙個引數存於r0中
mrs r3, spsr
tst r3, #0x20 ;//檢查時arm還是thumb指令
stmfd sp!, ;// spsr入棧
ldrneh r0, [lr,# -2] ;// thumb指令時執行,獲取swi指令碼
bicne r0, r0, #0xff00 ;// 獲取swi number
;// r0 now contains swi number
;// r1 now contains pointer to stacked registers
ldreq r0, r0, #0xff000000;//ro中存放著軟中斷的功能號
cmp r0, #1;
ldrlo pc, =osintctxsw ;//ldrlo=ldrcc r0=0
時跳轉到組合語言處理
ldreq pc, =__osstarthighrdy ;//r0=1
時跳轉到組合語言處理
bl swi_exception ;// r0>1
時跳轉,呼叫c編寫的swi處理函式
ldmfd sp!, ^ ;// 恢復現場
我們可以看出當呼叫2.2中某乙個函式並且函式具有兩個引數時,函式的第乙個引數存放在r0中,第二個引數存放在r1中。
2、osintctxsw的實現
osintctxsw
ldr r2, [sp,#20]
…//具體**間參考文獻[1]p218
3、__osstarthighrdy的實現
//具體**間參考文獻[1]p219
2.4.3.
在檔案os_cpu_c.c中編寫軟中斷服務程式
為了使uc/os-ii的一些底層系統函式在呼叫時與處理器工作模式無關,所以在移植時採用軟中斷來實現.除了功能號01、02的軟中斷函式是用組合語言,其他的軟中斷函式都是用c語言編寫的.
void swi_exception( int swi_num,//軟中斷功能號
int *regs //為指向堆疊中儲存暫存器的值的指標 )
} 3.
參考文獻
[1] 任哲.嵌入式實時作業系統uc/os-ii原來及應用.北京:北京航空航天大學出版社,2005.8
[2] labrosse jean j. 嵌入式實時作業系統uc/os-ii(第二版). 邵貝貝等譯. 北京: 北京航空航天大學出版社,2003
Ucos II 的移植之一
ucos ii 的移植之一要使 c os 正常執行,處理器必須滿足以下要求 1.處理器的c編譯器能產生可重入 2.用c語言就可以開啟和關閉中斷。3.處理器支援中斷,並且能產生定時中斷 通常在10至 100hz之間 4.處理器支援能夠容納一定量資料 可能是幾千位元組 的硬體堆疊 5.處理器有將堆疊指標...
移植UCOSII注意的問題
移植ucosii其實並不難,現在網上的資料又那麼多。但是要弄懂要花上不少時間。現在來說說移植需要注意的幾個問題吧。參考文件 pendsv 主要應用於系統任務切換 nvic 負責晶元的中斷管理 準備 micrium software ucos ii可以參考我上篇的建立工程,在上篇的工程結構基礎上我新建...
UC OS II的中斷和時鐘
3.1.1 uc os ii 的中斷過程 為了記錄中斷巢狀的層數,uc os ii 定義了乙個全域性變數 osintnesting 兩個重要函式 osintenter 和osintexit 函式osintenter 的作用就是把全域性變數 osintnesting加1 被用於記錄中斷巢狀層數。voi...