中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

編寫ISR最基本的原則是什么

發布時間:2021-12-22 10:20:37 來源:億速云 閱讀:207 作者:小新 欄目:互聯網科技

這篇文章將為大家詳細講解有關編寫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最基本的原則是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

isr
AI

安泽县| 远安县| 博罗县| 岗巴县| 麟游县| 孟连| 韶关市| 大田县| 和顺县| 临江市| 聊城市| 延边| 延寿县| 清原| 聂荣县| 图木舒克市| 惠州市| 临澧县| 华容县| 永修县| 德兴市| 鄂伦春自治旗| 六枝特区| 洛南县| 揭西县| 琼海市| 湘阴县| 文安县| 高台县| 南靖县| 乐东| 浦城县| 柯坪县| 临海市| 库尔勒市| 峡江县| 南木林县| 克山县| 始兴县| 会宁县| 平远县|