生活随笔
收集整理的這篇文章主要介紹了
存储块的存储与释放
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
1 存儲塊的存儲與釋放
1.1 設計原理
獲取存儲塊:
- 有空閑存儲塊,直接取出空閑塊。
- 無空閑存儲塊,任務進入等待列表。
釋放存儲塊:
- 無任務等待,插入到空閑鏈表。
- 有任務等待,釋放等待隊列頭部的任務。
1.2 設計實現
獲取存儲塊:
無等待獲取存儲塊:
釋放存儲塊:
#include "tMemBlock.h"#include "tinyOS.h"
void tMemBlockInit
(tMemBlock
* memBlock
, uint8_t
* memStart
, uint32_t blockSize
, uint32_t blockCnt
)
{uint8_t
* memBlockStart
= (uint8_t
*)memStart
;uint8_t
* memBlockEnd
= memBlockStart
+ blockSize
* blockCnt
;if (blockSize
< sizeof(tNode
)){return;}tEventInit(&memBlock
->event
, tEventTypeMemBlock
);memBlock
->memStart
= memStart
;memBlock
->blockSize
= blockSize
;memBlock
->maxCount
= blockCnt
;tListInit(&memBlock
->blockList
);while (memBlockStart
< memBlockEnd
){tNodeInit((tNode
*)memBlockStart
);tListAddLast(&memBlock
->blockList
, (tNode
*)memBlockStart
);memBlockStart
+= blockSize
;}
}
uint32_t tMemBlockWait
(tMemBlock
* memBlock
, uint8_t
** mem
, uint32_t waitTicks
)
{uint32_t status
= tTaskEnterCritical();if (tListCount(&memBlock
->blockList
) > 0){*mem
= (uint8_t
*)tListRemoveFirst(&memBlock
->blockList
);tTaskExitCritical(status
);return tErrorNoError
;}else{tEventWait(&memBlock
->event
, currentTask
, (void *)0, tEventTypeMemBlock
, waitTicks
);tTaskExitCritical(status
);tTaskSched();*mem
= currentTask
->eventMsg
;return currentTask
->waitEventResult
;}
}
uint32_t tMemBlockNoWaitGet
(tMemBlock
* memBlock
, void ** mem
)
{uint32_t status
= tTaskEnterCritical();if (tListCount(&memBlock
->blockList
) > 0){*mem
= (uint8_t
*)tListRemoveFirst(&memBlock
->blockList
);tTaskExitCritical(status
);return tErrorNoError
;}else{tTaskExitCritical(status
);return tErrorResourceUnavaliable
;}
}
void tMemBlockNotify
(tMemBlock
* memBlock
, uint8_t
* mem
)
{uint32_t status
= tTaskEnterCritical();if (tEventWaitCount(&memBlock
->event
) > 0){tTask
* task
= tEventWakeUp(&memBlock
->event
, (void *)mem
, tErrorNoError
);if (task
->prio
< currentTask
->prio
){tTaskSched();}}else{tListAddLast(&memBlock
->blockList
, (tNode
*)mem
);}tTaskExitCritical(status
);
}
參考資料:
【李述銅】從0到1自己動手寫嵌入式操作系統
總結
以上是生活随笔為你收集整理的存储块的存储与释放的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。