首先了解一下和中斷有關的三個暫存器
ucos臨界段
cpu_critical_enter()
; 關閉中斷
cpu_critical_exit()
; 開啟中斷
os_cfg_isr_post_deferred_en ==
1 osschedlocknestingctr 用於中斷巢狀
由於osschedlocknestingctr 屬於共享資源 保證原子性 , 在進行操作之前需要進行關閉中斷
os_critical_enter
()
進入臨界段** 鎖排程器 , 仍能中斷 。主要保護任務間的共享資源
os_critical_exit
() 退出臨界段
os_cfg_isr_post_deferred_en ==
0#define os_critical_enter() cpu_critical_enter() 通關開關中斷的方式實現對**保護
中斷和任務間的共享資源不能通過關排程器的方式 ,需採用關中斷的方式 。
當然最好選擇佇列。
freertos臨界段
是向―暫存器basepri寫入巨集, 低於configmax_syscall_interrupt_priority的中斷就會被遮蔽
freertos 中斷服務程式要呼叫freertos的核心api介面則中斷
優先順序低於配置巨集(configmax_syscall_interrupt_priority)
的值。 高於巨集的中斷不能呼叫核心api介面。 freertos不允許臨界
區無法遮蔽的中斷呼叫系統api,防止低優先順序的中斷巢狀
為什麼兩種機制有這麼大的不同呢?
兩個執行緒如果同時處理核心物件 ,則系統可能發生紊亂(中斷也算作乙個執行緒) 。
freertos :
核心api在處理鍊錶操作時會進入臨界段,遮蔽低優先順序的中斷,執行緒和中斷不可能同時呼叫核心api,所以低優先順序的中斷可以呼叫(末尾帶有isr),而高優先順序不能呼叫。 高優先順序處理類似於乙個前後臺系統。低configmax_syscall_interrupt_priority的中斷之間不會巢狀以保證系統api的操作的」原子性「。
ucos :
核心物件api中在操作鍊錶時進入關閉中斷 cpu_critical_enter()
此時不能響應中斷。 所以中斷和執行緒不會同時操作核心物件 。任務和中斷的核心物件api無差別。
兩種if判斷
上海面試三 下面是c語言中兩種if語句判斷方式。請問哪種寫法更好?為什麼?int a if a1 第一種判斷方式 if 1a 第二判斷方式 答 這是個主觀題,不過多數人認為第二種好。從執行效率上講,第二種效率更高。另外,在編寫 時如果不小心將 寫成 即變成 1 a 這時編譯器將會給出錯誤提示。而如果...
C DLL匯出的兩種方式和鏈結的兩種方式
第一種 匯出方式 extern c declspec dllexport int plus int x,int y extern c declspec dllexport int sub int x,int y extern c declspec dllexport int mul int x,in...
c 兩種Transaction和用法
c 兩種transaction和用法 第一種 petshopprofileprovider.cs中的用法 sqlconnection conn new sqlconnection sqlhelper.connectionstringprofile conn.open sqltransaction t...