您好,登錄后才能下訂單哦!
小編給大家分享一下vxworks如何實現內核對象的靜態實例化,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
VxWorks的內核對象可以動態創建,也可以靜態實例化。
靜態實例化,指的是使用VxWorks的宏在編譯時(compile-time)聲明變量,這樣編譯器就會為其分配空間,而不是運行時(run-time)再動態申請空間。因此在系統啟動過程中,就可以初始化對象了
而動態申請,需要系統啟動后,調用運行時內存分配機制;對應的動態刪除,需要調用內存釋放機制,通常也就是malloc()與free()函數。這種動態行為,存在著內存不足的風險,并且會減緩甚至阻塞調用者的執行,因此對系統性能有一定影響
看一下動態與靜態的偽代碼對比
編譯時聲明的對象,如果沒有賦初值,并不會消耗系統鏡像的空間,編譯器只是把它放到鏡像的BSS段里
可執行程序包括代碼段(也稱文本段)、數據段、BSS段。BSS(Block Started by Symbol)是指用來存放程序中未初始化的全局變量和靜態變量的一塊內存區域。特點是:可讀寫的,在程序執行之前BSS段自動清0。所以,未初始的全局變量在程序執行之前已經都被初始化為0了
靜態實例化的優勢:
性能與確定性
簡化應用邏輯,不用考慮動態申請失敗
靜態聲明不會失敗,除非整個程序超出系統內存的范圍
VxWorks系統可以裁剪掉動態申請的相關函數,減小系統尺寸
因此,靜態實例化更適用于實時系統的需求。并且在多數嵌入式系統中(OS不限于VxWorks),系統對象從始至終需要一直存在,也就不需要動態刪除,甚至有些系統(例如CERT OS)都不支持內存的動態使用。
VxWorks專門提供了一些宏來實例化對象,包括:任務、信號量、消息隊列、看門狗
任務
宏VX_TASK(name,stackSz)用來在編譯時聲明任務對象,兩個參數分別是任務名(不能為NULL)和棧尺寸(大于0的常量)
宏VX_TASK_INITIALIZE()用來初始化VX_TASK()聲明的任務,并將其置于suspend狀態,其參數和返回值與taskSpawn()一致
宏VX_TASK_INSTANTIATE()用來初始化VX_TASK()聲明的任務,并將其置于ready狀態,其參數和返回值與taskSpawn()一致
注意在宏中換行時,為了確保宏的正常展開,使用了"\"
信號量
宏VX_BINARY_SEMAPHORE(name)、VX_COUNTING_SEMAPHORE(name)、VX_MUTEX_SEMAPHORE(name)、VX_READ_WRITE_SEMAPHORE(name,numReaders)分別用于編譯時聲明四種信號量,然后須使用相應的semXInitialize()進行完整實例化。semXInitialize()的第一個參數是name,后面的參數與semXCreate()的相同。因此,實例化過程如下
消息隊列
宏VX_MSG_Q(name, max_msgs, max_msg_len)用于編譯時聲明消息隊列,然后使用msgQInitialize ()進行完整實例化。msgQInitialize()的第一個參數是name,后面的參數與msgQCreate()的相同。因此,實例化過程如下
看門狗
宏VX_WDOG(name)用于編譯時聲明看門狗,然后使用wdInitialize()進行完整實例化。wdInitialize()的參數就是name。因此,實例化過程如下
以上是“vxworks如何實現內核對象的靜態實例化”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。