乙個特殊的中斷 SVCall

2021-08-11 07:50:00 字數 3191 閱讀 6899

簡述:一種由程式進行觸發的中斷,預設開啟

起源:svc(系統服務呼叫,亦簡稱系統呼叫)多用於在作業系統之上的軟體開發中。svc 用於產生系統函式的呼叫請求。例如,作業系統不讓使用者程式直接訪問硬體,而是通過提供一些系統服務函式,使用者程式使用 svc 發出對系統服務函式的呼叫請求,以這種方法呼叫它們來間接訪問硬體。因此,當使用者程式想要控制特定的硬體時,它就會產生乙個 svc 異常,然後作業系統提供的 svc 異常服務例程得到執行,它再呼叫相關的作業系統函式,後者完成使用者程式請求的服務。

用途:可以通過設定,使得一段**能夠被某些中斷打斷,而不能被另外一些中斷打斷,比如可用於確保模擬iic的時序不被打斷而造成通訊失敗

注意:

在c中使用svcall

svc服務函式使用堆疊進行引數傳遞,故c語言版的svc服務函式需要乙個彙編操作,用於把堆疊中的引數提取到暫存器中

__asm void svc_handler(void) //

該函式名在keil中同usart2_irqhandler等等

////

pwdsf[0] = r0 , pwdsf[1] = r1

//pwdsf[2] = r2 , pwdsf[3] = r3

//pwdsf[4] = r12, pwdsf[5] = lr

//pwdsf[6] = 返回位址(入棧的pc)

//pwdsf[7] = xpsr

unsigned long svc_handler(unsigned int*pwdsf)

//注意,這個函式返回的其實不是0!進一步地,灰色的文字只是用於哄編譯器開心的,具體參考cortex-m3權威指南p169

view code

如何觸發中斷?

step1.宣告函式(__svc會自動生成對應函式)//__svc時keil裡的乙個巨集

unsigned long __svc(0x03) callsvc3(unsigned long svc_r0, unsigned long

svc_r1, unsigned

long svc_r2, unsigned long svc_r3);

step2.呼叫函式

unsigned long svcret; //

系統服務的返回值

svcret=callsvc3(p0, p1, p2, p3); //

呼叫3號系統服務,並且傳遞4個引數,依次為:p1,p2,p3,p4,再接收返回值到svcret中(別忘了,這個返回值的來歷不尋常)

簡述:一種由程式進行觸發的中斷,預設開啟

起源:svc(系統服務呼叫,亦簡稱系統呼叫)多用於在作業系統之上的軟體開發中。svc 用於產生系統函式的呼叫請求。例如,作業系統不讓使用者程式直接訪問硬體,而是通過提供一些系統服務函式,使用者程式使用 svc 發出對系統服務函式的呼叫請求,以這種方法呼叫它們來間接訪問硬體。因此,當使用者程式想要控制特定的硬體時,它就會產生乙個 svc 異常,然後作業系統提供的 svc 異常服務例程得到執行,它再呼叫相關的作業系統函式,後者完成使用者程式請求的服務。

用途:可以通過設定,使得一段**能夠被某些中斷打斷,而不能被另外一些中斷打斷,比如可用於確保模擬iic的時序不被打斷而造成通訊失敗

注意:

在c中使用svcall

svc服務函式使用堆疊進行引數傳遞,故c語言版的svc服務函式需要乙個彙編操作,用於把堆疊中的引數提取到暫存器中

__asm void svc_handler(void) //

該函式名在keil中同usart2_irqhandler等等

////

pwdsf[0] = r0 , pwdsf[1] = r1

//pwdsf[2] = r2 , pwdsf[3] = r3

//pwdsf[4] = r12, pwdsf[5] = lr

//pwdsf[6] = 返回位址(入棧的pc)

//pwdsf[7] = xpsr

unsigned long svc_handler(unsigned int*pwdsf)

//注意,這個函式返回的其實不是0!進一步地,灰色的文字只是用於哄編譯器開心的,具體參考cortex-m3權威指南p169

view code

如何觸發中斷?

step1.宣告函式(__svc會自動生成對應函式)//__svc時keil裡的乙個巨集

unsigned long __svc(0x03) callsvc3(unsigned long svc_r0, unsigned long

svc_r1, unsigned

long svc_r2, unsigned long svc_r3);

step2.呼叫函式

unsigned long svcret; //

系統服務的返回值

svcret=callsvc3(p0, p1, p2, p3); //

呼叫3號系統服務,並且傳遞4個引數,依次為:p1,p2,p3,p4,再接收返回值到svcret中(別忘了,這個返回值的來歷不尋常)

51422中使用:

svcall(sd_ble_gap_adv_data_set, uint32_t, sd_ble_gap_adv_data_set(uint8_t const * const p_data, uint8_t dlen, uint8_t const * const p_sr_data, uint8_t srdlen));

這個svcall在使用mdk時是這麼定義的:

#define svcall(number, return_type, signature) return_type __svc(number) signature

似乎是使用了cortex-m0的svc機制實現softdevice。

乙個比較特殊的字元

位置在鍵盤中數字鍵 1 的左邊,其上檔符號是 使用shift鍵可以換擋為英文輸入法後,單機該鍵即可輸入。由於計算機顯示的原因,反單引號非常容易和單引號 混淆。一 反單引號是西方符號,主要用在linux的bash中。同時在數學軟體mathematica中也有應用。1.在bash中,其用法同 一樣,用 ...

乙個PCI中斷非同步的問題

最近發現由於pci資料傳輸錯誤導致io request得到的資料不正確,這種現象讓我們思考,為什麼系統都已經發現了pci錯誤,io request還能正確結束呢?按照慣例思考,pci傳輸出錯,io request就應該fail掉,但是,事實不是這樣。難道這個問題和pci的中斷非同步有關係?因此,這裡...

乙個特殊異常的問題

乙個特殊異常的問題 delphi windows sdk api 程式涉及到 多執行緒 list 整個程式也還沒看懂 只知道執行大概5天左右後 就報錯 顯示如下 access violation at address 00d24081 in module borlndmm.dll write of ...