ucos和freeRTOS兩種臨界段處理機制

2021-10-12 06:29:09 字數 1389 閱讀 1485

首先了解一下和中斷有關的三個暫存器

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...