生活随笔
收集整理的這篇文章主要介紹了
存储块的存储与释放
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 1 存儲(chǔ)塊的存儲(chǔ)與釋放
- 1.1 設(shè)計(jì)原理
- 1.2 設(shè)計(jì)實(shí)現(xiàn)
1 存儲(chǔ)塊的存儲(chǔ)與釋放
1.1 設(shè)計(jì)原理
獲取存儲(chǔ)塊:
- 有空閑存儲(chǔ)塊,直接取出空閑塊。
- 無空閑存儲(chǔ)塊,任務(wù)進(jìn)入等待列表。
釋放存儲(chǔ)塊:
- 無任務(wù)等待,插入到空閑鏈表。
- 有任務(wù)等待,釋放等待隊(duì)列頭部的任務(wù)。
1.2 設(shè)計(jì)實(shí)現(xiàn)
獲取存儲(chǔ)塊:
無等待獲取存儲(chǔ)塊:
釋放存儲(chǔ)塊:
#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自己動(dòng)手寫嵌入式操作系統(tǒng)
總結(jié)
以上是生活随笔為你收集整理的存储块的存储与释放的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。