Zephyr内核到1.5版本的改进
生活随笔
收集整理的這篇文章主要介紹了
Zephyr内核到1.5版本的改进
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Zephyr內核從1.0到1.5版本發生了很大改變,這些改變給開發人員帶來了很大方便,具體如下:
①消除微內核和超微內核構建類型的分離
②消除微內核應用程序中的MDEF
③更簡單易用的內核API
④寬松了內核對象的使用限制
⑤通過合并重復的服務減少內存消耗
⑥通過減少上下文的切換減少開銷、提高性能
更加詳細的改變如下描述:
⑴應用程序設計相關
早期獨立的微內核和超微內核被合并到了一起,新的內核被命名為“the kernel”。因此,現在的Zephyr應用程序不需要為微內核和超微內核單獨設計,它們的應用程序是互相兼容的。
任務和纖程上下文被統一為一種類型,叫做線程。如果線程的優先級是負數,那么這個線程叫做“cooperative thread”,cooperative thread調度器遵循纖程調度算法。如果纖程的優先級是正數,那么這個線程叫做“preemptive thread”,preemptive thread調度器遵循任務調度器算法。這兩種類型線程受不同調度器調度、遵循不同的調度算法。
現在的內核對象可以同時被任務線程和纖程線程使用
現在的內核對象允許多線程等待同一個指定對象
現在的內核對象APIs是在調用線程上下文中執行的
因為去掉了MEDF,所以所有的內核對象都是在代碼中直接定義的
⑵內核APIs相關
大多數內核APIs都被重新命名或者改變了它們的參數,使得APIs看起來更加直觀、提高代碼一致性。現在大多數內核APIs都是以k_和K_作為前綴
現在在任務、纖程、或者是中斷服務函數中調用內核操作APIs是統一、相同的,而以前在不同環境需要調用不同APIs
現在大多數內核APIs返回零都表示操作成功、返回非零表示相應的錯誤碼
⑶線程相關
一個任務型線程可以通過臨時給調度器上鎖使自己變成不可搶占線程
現在可以給線程入口點函數傳入三個參數
現在可以延時線程的開始時間點,這個延時時間是可配置的
任務線程不在指定任務的終止處理函數,所以被終止時不能處理用戶指定操作
現在的應用程序可以通過私有的API來改變和任務線程相關的操作
現在的啟動代碼中,同時派生出了一個主線程和一個空閑線程
主線程執行系統初始化代碼之后調用main()函數,如果main()函數不存在,那么主線成功被終止
在空閑線程執行時,現在的初始化代碼可以執行阻塞式操作
⑷定時器相關
現在大多數內核APIs超時間隔都是以毫秒為單位,而不是系統時鐘為單位,這樣可以使代碼看起來更直觀。但是底層實現的時候,內核仍然是以系統時鐘為基準的。
現在的微內核和超微內核定時器對象被合并成為一個數據類型
⑸內存申請相關
微內核內存映射對象重新命名為“內存塊”,這正好和內存管理單元以等大小內存來管理的方式相符
通過內存塊和內存池可以很容易的實現內存對齊
現在在代碼中可以跟方便的定義一個內存池
現在可以通過malloc管理器在堆空間中申請空閑的內存空間
⑹同步相關
以前的微內核和超微內核信號量對象合并成一個統一數據類型,新的數據類型可用于互斥信號量和計數信號量中
在實現了select()或者poll()之前是不允許一個應用程序同時等待多個信號量的,如果想實現這種功能,應用程序必須以阻塞方式獨立測試每一個信號量是否可以使用
以前的微內核事件類型重新命名為“alert”,這是一種類似Unix風格的信號。由于信號量實現代碼的改進,目前alert效率還不如信號量。因此,alert應該在請求回調函數應用場景下使用
⑺數據傳輸相關
把以前微內核中的FIFO對象類型重新命名為消息隊列,這樣可以避免和超微內核的FIFO對象類型混淆
現在可以通過數據單元實現消息隊列中存儲數據的對齊功能
以前微內核中的消息郵箱對象類型去掉了顯式的設置優先級的概念,而現在消息郵箱對象的優先級和發送它的線程優先級相等
現在的消息郵箱對象類型可以通過消息緩沖區實現異步發送的功能
現在在管道對象緩沖區中可以指定數據對齊
①消除微內核和超微內核構建類型的分離
②消除微內核應用程序中的MDEF
③更簡單易用的內核API
④寬松了內核對象的使用限制
⑤通過合并重復的服務減少內存消耗
⑥通過減少上下文的切換減少開銷、提高性能
更加詳細的改變如下描述:
⑴應用程序設計相關
早期獨立的微內核和超微內核被合并到了一起,新的內核被命名為“the kernel”。因此,現在的Zephyr應用程序不需要為微內核和超微內核單獨設計,它們的應用程序是互相兼容的。
任務和纖程上下文被統一為一種類型,叫做線程。如果線程的優先級是負數,那么這個線程叫做“cooperative thread”,cooperative thread調度器遵循纖程調度算法。如果纖程的優先級是正數,那么這個線程叫做“preemptive thread”,preemptive thread調度器遵循任務調度器算法。這兩種類型線程受不同調度器調度、遵循不同的調度算法。
現在的內核對象可以同時被任務線程和纖程線程使用
現在的內核對象允許多線程等待同一個指定對象
現在的內核對象APIs是在調用線程上下文中執行的
因為去掉了MEDF,所以所有的內核對象都是在代碼中直接定義的
⑵內核APIs相關
大多數內核APIs都被重新命名或者改變了它們的參數,使得APIs看起來更加直觀、提高代碼一致性。現在大多數內核APIs都是以k_和K_作為前綴
現在在任務、纖程、或者是中斷服務函數中調用內核操作APIs是統一、相同的,而以前在不同環境需要調用不同APIs
現在大多數內核APIs返回零都表示操作成功、返回非零表示相應的錯誤碼
⑶線程相關
一個任務型線程可以通過臨時給調度器上鎖使自己變成不可搶占線程
現在可以給線程入口點函數傳入三個參數
現在可以延時線程的開始時間點,這個延時時間是可配置的
任務線程不在指定任務的終止處理函數,所以被終止時不能處理用戶指定操作
現在的應用程序可以通過私有的API來改變和任務線程相關的操作
現在的啟動代碼中,同時派生出了一個主線程和一個空閑線程
主線程執行系統初始化代碼之后調用main()函數,如果main()函數不存在,那么主線成功被終止
在空閑線程執行時,現在的初始化代碼可以執行阻塞式操作
⑷定時器相關
現在大多數內核APIs超時間隔都是以毫秒為單位,而不是系統時鐘為單位,這樣可以使代碼看起來更直觀。但是底層實現的時候,內核仍然是以系統時鐘為基準的。
現在的微內核和超微內核定時器對象被合并成為一個數據類型
⑸內存申請相關
微內核內存映射對象重新命名為“內存塊”,這正好和內存管理單元以等大小內存來管理的方式相符
通過內存塊和內存池可以很容易的實現內存對齊
現在在代碼中可以跟方便的定義一個內存池
現在可以通過malloc管理器在堆空間中申請空閑的內存空間
⑹同步相關
以前的微內核和超微內核信號量對象合并成一個統一數據類型,新的數據類型可用于互斥信號量和計數信號量中
在實現了select()或者poll()之前是不允許一個應用程序同時等待多個信號量的,如果想實現這種功能,應用程序必須以阻塞方式獨立測試每一個信號量是否可以使用
以前的微內核事件類型重新命名為“alert”,這是一種類似Unix風格的信號。由于信號量實現代碼的改進,目前alert效率還不如信號量。因此,alert應該在請求回調函數應用場景下使用
⑺數據傳輸相關
把以前微內核中的FIFO對象類型重新命名為消息隊列,這樣可以避免和超微內核的FIFO對象類型混淆
現在可以通過數據單元實現消息隊列中存儲數據的對齊功能
以前微內核中的消息郵箱對象類型去掉了顯式的設置優先級的概念,而現在消息郵箱對象的優先級和發送它的線程優先級相等
現在的消息郵箱對象類型可以通過消息緩沖區實現異步發送的功能
現在在管道對象緩沖區中可以指定數據對齊
總結
以上是生活随笔為你收集整理的Zephyr内核到1.5版本的改进的全部內容,希望文章能夠幫你解決所遇到的問題。