VSF中的基礎(chǔ)模塊

之前說(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)單,可以自行看代碼研究。

  1. bittool:常用位操作相關(guān)的工具,包括位反序、字節(jié)反序、大小端的數(shù)據(jù)讀寫(xiě)、mskarr
  2. buffer:各種內(nèi)存結(jié)構(gòu)模塊,包括vsfq(權(quán)重隊(duì)列)、fifo、multibuf(多緩沖管理)、bufmgr(動(dòng)態(tài)內(nèi)存分配)、vsfpool(動(dòng)態(tài)池分配)
  3. list:列表模塊,模仿Linux中的列表的實(shí)現(xiàn)方式
  4. 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è)模塊:

  1. 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排序,使得窗口操作非常方便。
  2. 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ù),并且顯示在屏幕上。
  3. 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)存溢出。
  4. vsfpool,動(dòng)態(tài)池分配。vsfpool使用mskarr來(lái)標(biāo)記各個(gè)內(nèi)存塊的分配情況。并且,以宏模板的形式,方便的實(shí)現(xiàn)特定結(jié)構(gòu)的內(nèi)存池。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容