<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                在內核初始化的時候,會調用mem_init()函數進行內存堆的初始化,內存堆初始化主要的過程就是對上述所屬的內存堆組織結構進行初始化,主要設置內存堆的起始地址,以及初始化空閑列表。根據用戶配置的宏定義進行相關處室,配置不同其實現也不同(可能為空),該函數源碼具體見代碼清單 5-10。 ``` 1 void 2 mem_init(void) 3 { 4 struct mem *mem; 5 6 LWIP_ASSERT("Sanity check alignment", 7 (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT - 1)) == 0); 8 9 /* align the heap */ 10 ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER); (1) 11 /* initialize the start of the heap */ 12 mem = (struct mem *)(void *)ram; (2) 13 mem->next = MEM_SIZE_ALIGNED; (3) 14 mem->prev = 0; (4) 15 mem->used = 0; (5) 16 /* initialize the end of the heap */ 17 ram_end = ptr_to_mem(MEM_SIZE_ALIGNED); (6) 18 ram_end->used = 1; (7) 19 ram_end->next = MEM_SIZE_ALIGNED; 20 ram_end->prev = MEM_SIZE_ALIGNED; 21 MEM_SANITY(); 22 23 /* initialize the lowest-free pointer to the start of the heap */ 24 lfree = (struct mem *)(void *)ram; (8) 25 26 MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED); 27 28 if (sys_mutex_new(&mem_mutex) != ERR_OK) (9) 29 { 30 LWIP_ASSERT("failed to create mem_mutex", 0); 31 } 32 } ``` * (1):內存堆空間對齊,LWIP_RAM_HEAP_POINTER宏定義就是ram_mem,內存堆對齊后的起始地址被記錄在ram中。 * (2):在內存堆起始位置放置一個mem類型的結構體,因為初始化后的內存堆就是一個大的空閑內存塊,每個空閑內存塊的前面都需要放置一個mem結構體。 * (3):下一個內存塊的偏移量為MEM_SIZE_ALIGNED,這相對于直接到內存堆的結束地址了。 * (4):上一個內存塊為空。 * (5):標記未被使用。 * (6):指針移動到內存堆末尾的位置,并且在那里放置一個mem類型的結構體,并初始化表示內存堆結束的內存塊。 * (7):標記已經使用了該內存塊,因為結束的地方是沒有內存塊的,不能被分配出去,只能表示已經使用。同時mem結構體的next與prev字段都指向自身,此處僅表示已經到了內存堆的結束的地方,并無內存可以分配。 * (8):空閑內存塊鏈表指針指向內存堆的起始地址,因為當前只有一個內存塊。 * (9):創建一個內存堆分配時候使用的互斥量,如果是無操作系統的情況,該語句等效于空。 經過mem_init()函數后,內存堆會被初始化為兩個內存塊,第一個內存塊的大小就是整個內存堆的大小,而第二個內存塊就是介紹內存塊,其大小為0,并且被標記為已使用狀態,無法進行分配。值得注意的是,系統在運行的時候,隨著內存的分配與釋放,lfree指針的指向地址不斷改變,都指向內存堆中低地址空閑內存塊,而ram_end則不會改變,它指向系統中最后一個內存塊,也就是內存堆的結束地址。初始化完成的示意圖具體見圖 5-4。 ![](https://box.kancloud.cn/c2c4cee9fa1ad91cef8386f3f67705a9_509x634.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看