之前說(shuō)過(guò),VSF都是模塊化的設(shè)計(jì),這里就先介紹一下VSF中的基礎(chǔ)模塊。其中,有一些模塊會(huì)在以后詳細(xì)說(shuō)明,比如流模塊。基礎(chǔ)模塊位于vsf/component/fundation目錄下,提供一些不依賴構(gòu)架的基礎(chǔ)模塊和基礎(chǔ)工具。當(dāng)然,還有一些其他不依賴構(gòu)架的模塊和工具,比如位于crypto目錄下的各種加解密算法模塊等?;A(chǔ)模塊中,大部分都比較簡(jiǎn)單,可以自行看代碼研究。
- bittool:常用位操作相關(guān)的工具,包括位反序、字節(jié)反序、大小端的數(shù)據(jù)讀寫(xiě)、mskarr
- buffer:各種內(nèi)存結(jié)構(gòu)模塊,包括vsfq(權(quán)重隊(duì)列)、fifo、multibuf(多緩沖管理)、bufmgr(動(dòng)態(tài)內(nèi)存分配)、vsfpool(動(dòng)態(tài)池分配)
- list:列表模塊,模仿Linux中的列表的實(shí)現(xiàn)方式
- stream:流模塊,這個(gè)以后會(huì)專門(mén)章節(jié)著重介紹
bittool里,主要介紹一下mskarr,代碼如下:
void mskarr_set(uint32_t *arr, int bit)
{
arr[bit >> 5] |= (1 << (bit & 0x1F));
}
void mskarr_clr(uint32_t *arr, int bit)
{
arr[bit >> 5] &= ~(1 << (bit & 0x1F));
}
int mskarr_ffz(uint32_t *arr, int arrlen)
{
int i, tmp;
for (i = 0; i < arrlen; i++)
{
tmp = ffz(arr[i]);
if (tmp >= 0)
{
return (i << 5) + tmp;
}
}
return -1;
}
mskarr需要一個(gè)uin32_t的數(shù)組,可以set和clear指定位,并且可以通過(guò)ffz來(lái)找到第一個(gè)0位。一個(gè)典型的應(yīng)用,就是用于vsfpool池分配,用來(lái)標(biāo)記內(nèi)存池中的元素的分配情況。makarr的一位對(duì)應(yīng)內(nèi)存池里的一個(gè)元素。在USB主機(jī)協(xié)議棧用,也有一個(gè)mskarr,用來(lái)記錄已經(jīng)分配的設(shè)備地址,新設(shè)備連接后,通過(guò)ffz來(lái)尋找第一個(gè)可分配的地址。
buffer里,簡(jiǎn)單介紹以下幾個(gè)模塊:
- vsfq,帶權(quán)重的隊(duì)列。典型應(yīng)用是定時(shí)器模塊,定時(shí)器的超時(shí)時(shí)間作為權(quán)重,有新的定時(shí)器要入列的話,根據(jù)權(quán)重,自動(dòng)把最先觸發(fā)的放在隊(duì)列最前面。另一個(gè)典型應(yīng)用是tcpip里的tcp收發(fā)隊(duì)列,tcp報(bào)文里的sequence作為權(quán)重,報(bào)文入列時(shí),自動(dòng)根據(jù)sequence排序,使得窗口操作非常方便。
- multibuf,多緩沖管理。一般需要用到多緩沖的地方,都會(huì)用到這個(gè)模塊,甚至流模塊里,還有一個(gè)multibuf實(shí)現(xiàn)的流。典型應(yīng)用是USB的MSC設(shè)置里,使用多緩沖,可以實(shí)現(xiàn)USB接口和塊設(shè)備接口同時(shí)讀寫(xiě)數(shù)據(jù)(通過(guò)multibuf實(shí)現(xiàn)的流)。另外一個(gè)例子就是framebuffer驅(qū)動(dòng),產(chǎn)生的視頻幀用類似fifo的方式寫(xiě)入到multibuf,屏幕塊設(shè)備接口則是從multibuf里讀取最早的視頻幀數(shù)據(jù),并且顯示在屏幕上。
- bufmgr,動(dòng)態(tài)內(nèi)存分配。實(shí)測(cè)bufmgr的代碼量小于C語(yǔ)言的malloc。并且,bufmgr支持指定對(duì)齊的分配方式,比如OHCI模塊里,一些內(nèi)存有對(duì)齊的要求。另外,bugmgr還支持內(nèi)存guard,可以用于檢測(cè)內(nèi)存溢出。
- vsfpool,動(dòng)態(tài)池分配。vsfpool使用mskarr來(lái)標(biāo)記各個(gè)內(nèi)存塊的分配情況。并且,以宏模板的形式,方便的實(shí)現(xiàn)特定結(jié)構(gòu)的內(nèi)存池。