eCos核心API與核心實現的銜接

2021-06-20 13:19:19 字數 1705 閱讀 1079

mingdu.zheng gmail com

ecos核心api是以c函式以及c結構體的形式提供的,ecos的核心是使用c++類實現的,kernel/.../src/common/kapi.cxx將c++類實現銜接到c函式及c結構體,實現c和c++銜接的秘訣在於重構new操作符, new操作符過載的注釋稱之為 magic new function,確實挺magic的。

new操作符過載(kernel/.../src/common/kapi.cxx:82

inline void *operator new(size_t size, void *ptr)

這個神奇函式的實現看起來一點都不神奇,僅僅是將它的第二個引數照搬返回。 new操作符的第乙個函式總是被new物件的大小,這裡的第二個引數 ptr 是過載附加的。 常規的new實現將會在這裡呼叫malloc函式分配記憶體空間,然後返回malloc分配的記憶體空間指標。 僅僅觀察這個神奇函式的本身並看不出它的神奇之處,再看看對它的引用吧,以比較簡單的互斥量為例。

互斥量初始化函式(kernel/.../src/common/kapi.cxx:1050

externc void cyg_mutex_init(

cyg_mutex_t *mutex /* mutex to init */

) __throw

應用程式在呼叫cyg_mutex_init前,首先定義乙個全域性的cyg_mutex_t的結構體,然後將該結構體的位址傳遞給cyg_mutex_init函式。 也就是說,mutex指標指向一塊記憶體,該記憶體大小等於cyg_mutex_t結構體的大小。 觀察cyg_mutex_init函式的第2行**,這裡的new操作符引用的是上面過載過的new操作符,new操作符的第1個引數總是size而且是自動傳入的, 就像c++類成員函式的this引數一樣,第2個引數,也就是**中的第1個引數是指向cyg_mutex_t的指標,再回顧一下過載的new操作符**, 你看出來了嗎?新建的cyg_mutex類例項被儲存在傳入的cyg_mutex_t結構體例項的儲存空間內,也就是說cyg_mutex例項和cyg_mutex_t例項是重疊的, 我懷疑我是否已經解釋清楚,但是我只能解釋到這裡啦。然後再看這個函式的第1行**,這行**檢查cyg_mutex_t型別和cyg_mutex型別的大小是否一致, 這是必須的,如果cyg_mutex型別所需的儲存空間比cyg_mutex_t型別多顯然會產生記憶體破壞,不僅大小要一致,連對應的成員變數排列次序都要求是一致的, 但是沒有辦法讓編譯器檢查兩個型別的成員變數排列次序。 可以檢視cyg_mutex類定義(kernel/.../include/mutex.hxx:66)和cyg_mutex_t結構體定義 (kernel/.../include/kapidata.h:515)手動檢查一下這兩個型別的成員變數排列次序。

互斥量加鎖函式(kernel/.../src/common/kapi.cxx:1066

externc cyg_bool_t cyg_mutex_lock( cyg_mutex_t *mutex ) __throw

api傳入的是cyg_mutex_t結構體指標,將這個指標轉換成cyg_mutex類指標, 然後使用該cyg_mutex類指標引用cyg_mutex類成員函式實現具體的加鎖。

原文見:

JAVA UDP核心API講解

1 datagramsocket 由於接受與傳送udp的類 2 負責傳送乙個udp包,或者接受udp包 3 不同於tcp,udp並沒有別合併到socket 當中 4 可以接受,可以傳送,不需要去堅挺每個客戶端 5 datagramsocket int port 建立乙個指定的埠的實列。資料 是這個埠...

spark sql核心API整理

核心api sparksession spark入口 統一封裝sparkconf,sparkcontext,sqlcontext,配置執行引數,讀取檔案,建立資料,使用sql dataset 統一dataset介面,其中dataframe dataset row 基本實現了類似rdd的所有運算元 c...

HBase核心開發API

初始化 配置資訊 before public void init catch exception e 關閉資源 after public void close catch ioexception e if connection null catch ioexception e 建立命名空間 test...