您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關編寫ISR最基本的原則是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
編寫ISR最基本的原則就是:盡可能短。代碼少是一方面,更重要的是ISR里不能調用可能阻塞或延遲的操作。
因為ISR不在常規任務上下文中運行,并且沒有TCB,而是所有ISR共享一個棧(ISR_STACK_SIZE)。因此,ISR不能調用可能阻塞的函數。例如,它們不能申請信號量,因為信號量不可用時,內核會嘗試將申請者切換到阻塞狀態;不過,ISR可以釋放信號量。另外,內存機制malloc()和free()會使用信號量,所以ISR里也不能調用這些函數,以及任何Create或Delete機制。ISR也不能通過VxWorks驅動程序執行I/O操作。盡管在I/O系統中沒有固定的限制,但大多數設備驅動程序需要任務上下文,因為它們可能會等待設備的反饋。一個重要的例外是VxWorks的管道機制(Pipe),ISR可以使用Pipe進行寫操作。ISR還可以調用VxWorks的一些機制來將消息打印到系統控制臺:logMsg()、kprintf()和kputs()。
ISR不能調用使用浮點協處理器的機制。這是因為在VxWorks中,由intConnect()創建的中斷驅動程序代碼不保存和恢復浮點寄存器。如果ISR必須要使用浮點指令,則需要使用fppArchLib中的函數顯式保存和還原浮點協處理器的寄存器。
ISR中調用C++語句時要特別小心。intConnect()機制要求在發生中斷時執行函數的地址,但不能使用非靜態成員函數的地址,因此必須實現靜態成員函數。而且不能在ISR代碼中實例化或刪除對象。ISR中執行的C++代碼應該限制為嵌入式C++,不應使用exception或RTTI (Run-Time Type Identification)。
ISR不應該直接訪問共享數據區(shared data region)。ISR繼承它搶占的任務的內存上下文,如果該任務沒有映射該共享數據區,則它無法訪問該內存,并導致異常。為了可靠地訪問共享數據區,ISR可以將相關操作交給映射了該共享數據區的任務。
那么ISR中可以調用哪些機制或函數呢
bLib | 所有函數 |
errnoLib | errnoGet(), errnoSet() |
eventLib | eventSend() |
fppArchLib | fppSave(), fppRestore() |
intLib | intContext(), intCount(), intVecSet(), intVecGet() |
intArchLib | intLock(), intUnlock() |
logLib | logMsg() |
lstLib | 除lstFree(),所有函數 |
mathALib | 使用fppSave()/fppRestore()時,所有函數 |
msgQLib | msgQSend() |
rngLib | 除rngCreate()/rngDelete(),所有函數 |
pipeDrv | write() |
selectLib | selWakeup(), selWakeupAll() |
semLib | semFlush(),非互斥信號量的semGive() |
semPxLib | sem_post() |
sigLib | kill() |
taskLib | taskSuspend(), taskResume(), taskPrioritySet(), taskPriorityGet(), taskIdVerify(), taskIdDefault(), taskIsReady(), taskIsSuspended(), taskIsPended(), taskIsDelayed(), taskTcb() |
tickLib | tickAnnounce(), tickSet(), tickGet() |
tyLib | tyIRd(), tyITx() |
vxLib | vxTas(), vxMemProbe() |
wdLib | wdStart(), wdCancel() |
中斷到任務的通信機制
共享內存。ISR可以與任務代碼共享變量、緩沖區和環形緩沖區
信號量。ISRs可以釋放信號量,任務可以接收或等待這些信號量(互斥信號量和VxMP共享信號量除外)
消息隊列。ISR可以向消息隊列發送消息(使用VxMP的共享消息隊列除外)。如果隊列已滿,則丟棄該消息。msgQSend (msgQId, buffer, nBytes, NO_WAIT,priority)
管道。ISR可以向管道發送消息。如果管道已滿,則丟棄該消息
信號。ISR可以向任務發送信號,從而導致其信號處理程序的異步調度
VxWorks Event。ISR可以向任務發送VxWorks Event
關于“編寫ISR最基本的原則是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。