作者
https://bbs.csdn.net/topics/300000723
實現(xiàn)硬件 STM32F10vet6
1,內(nèi)存使用量統(tǒng)計
硬件系統(tǒng)啟動使用:
系統(tǒng)堆棧(系統(tǒng)啟動的時候需要使用) 80個字節(jié)
操作系統(tǒng)內(nèi)核使用:
任務(wù)表 96+16個字節(jié)
注:20個字節(jié)/任務(wù) * 8(默認任務(wù)個數(shù))
信號量 32個字節(jié)
注:4個字節(jié)/信號量 * 8(默認信號量個數(shù))
消息隊列 54個字節(jié)
注: 默認8條消息/隊列 * 3 (默認3個消息隊列)
空閑任務(wù)(Idle) 96個字節(jié)
注:每個任務(wù)最少需要96個字節(jié)的堆棧,推薦256個字節(jié)
RAM使用統(tǒng)計:
一個原始的系統(tǒng)總共占用內(nèi)存約為400個字節(jié)
其中內(nèi)核占用內(nèi)存不到300個字節(jié)
(注:根據(jù)armlink指示,另外還有96個字節(jié)的數(shù)據(jù)用于LIBSPACE.O文件,
這個查明,其實是開發(fā)環(huán)境在為main主函數(shù)初始化的時候用到)
2,代碼量(包括ROM里面的只讀數(shù)據(jù))統(tǒng)計
內(nèi)核 1200 個字節(jié)
信號量 300 個字節(jié)
消息隊列 500 個字節(jié)
ROM使用統(tǒng)計
原始的系統(tǒng)代碼小于2K
其中內(nèi)核代碼小于1.2K
單片機源程序如下:
- #include "BenOSCore.h"
- /*當前OS中所有的任務(wù)*/
- I8U TaskNUM=0;
- TCB BenOSTCBTable[MAX_TASK_NUM];
- /*當前運行的任務(wù)*/
- TCB *BenOSCurTCB;
- /*當前準備新運行的任務(wù)*/
- TCB *BenOSNewTCB;
- I8U BenOSScheLock=0; /* 0 = enable */
- /*無聊,所以把堆棧初始化模塊用匯編寫一遍,但愿性能會高點*/
- __asm STACK_TYPE *BenOSTaskStkInit (void (*task),STACK_TYPE *ptos)
- {
- THUMB
- PRESERVE8
- PUSH {R4-R6,LR}
- MOV R4,R0
- MOV R0,R1
- MOV R5,#0x1000000
- STR R5,[R0,#0]
- SUBS R0,R0,#4
- STR R4,[R0,#0]
-
- MVN R5,#1
- SUBS R0,R0,#4
- STR R5,[R0,#0]
-
- MOV R5,#0x2
- SUBS R0,R0,#4
- STR R5,[R0,#0]
-
- MOV R5,#0x3
- SUBS R0,R0,#4
- STR R5,[R0,#0]
-
- MOV R5,#0x4
- SUBS R0,R0,#4
- STR R5,[R0,#0]
- ASRS R5,R5,#1
- SUBS R0,R0,#4
- STR R5,[R0,#0]
-
- SUBS R0,R0,#4
- STR R1,[R0,#0]
-
- MOV R5,#0x5
- SUBS R0,R0,#4
- STR R5,[R0,#0]
- MOV R5,#0x6
- SUBS R6,R0,#4
- MOV R0,R6
- STR R5,[R6,#0]
-
- MOV R5,#0x7
- SUBS R0,R0,#4
- STR R5,[R0,#0]
-
- MOV R5,#0x8
- SUBS R0,R0,#4
- STR R5,[R0,#0]
- MOV R5,#0x8
- SUBS R0,R0,#4
- STR R5,[R0,#0]
- MOV R5,#0x10
- SUBS R0,R0,#4
- STR R5,[R0,#0]
- MOV R5,#0x11
- SUBS R0,R0,#4
- STR R5,[R0,#0]
- MOV R5,#0x12
- SUBS R6,R0,#4
- MOV R0,R6
- STR R5,[R6,#0]
- POP {R4-R6,PC}
- }
- /*Thumb2指令集中無串操作指令,不過可以用字對齊進行優(yōu)化*/
- /*考慮到Thumb2指令中,32位指令執(zhí)行效率并不高,所以這里暫時不作優(yōu)化*/
- void _mem_clr (I8U *pdest, I32 size)
- {
- while (size > 0) {
- *pdest++ = (I8)0;
- size--;
- }
- }
- void _mem_copy (I8U *pdest, I8U *psrc, I16U size)
- {
- while (size > 0) {
- *pdest++ = *psrc++;
- size--;
- }
- }
- /*在TCB表中取一個空閑的節(jié)點,給新任務(wù)使用*/
- /*對BenOSTCBTable表這個有序表進行插入排序*/
- /*將優(yōu)先級高的任務(wù)放在前面*/
- TCB* BenOSGetFreeTCB(PRIORITY_TYPE prio)
- {
- TCB *pTCB;
- I32 index=0,orgIndex;
- pTCB = &(BenOSTCBTable[0]);
- for (index = 0;index < TaskNUM+1;index++)
- {
- pTCB = BenOSTCBTable+index;
- /*已經(jīng)是空閑TCB了,就直接使用*/
- if (NULL == pTCB->pStackTop)
- {
- return (TCB*)pTCB;
- }
- /*若新任務(wù)優(yōu)先級比較低,則向后繼續(xù)找*/
- if (pTCB->CurPriority >= prio)
- {
- continue;
- }
- else /*pTCB->CurPriority < prio 找到了該插入的位置了*/
- {
- /*保存當前位置*/
- orgIndex = index;
- /*從當前節(jié)點遍歷到最后一個使用了的節(jié)點*/
- for( index = TaskNUM+1 ; index > orgIndex ; index-- )
- {
- pTCB = BenOSTCBTable+index;
- /*將前一個節(jié)點的數(shù)據(jù),保存到當前節(jié)點*/
- _mem_copy((I8U *)(pTCB),(I8U *)(pTCB-1),sizeof(TCB));
- }
- _mem_clr((I8U *)(pTCB-1),sizeof(TCB)) ;
-
- return (TCB*)(pTCB-1);
- }
- }
- return (TCB*)NULL;
- }
- /*
- *時鐘中斷函數(shù)
- */
- void SysTick_Handler()
- {
- I8 index;
- TCB *pTCB;
- I8U flagFirstTask=0;
- INT_Stat stat = 0;
- stat = BenOS_INT_Save();
- /*初始化*/
- BenOSNewTCB = NULL;
- /*禁止調(diào)度*/
- if (BenOSScheLock != 0)
- {
- BenOS_INT_Restore(stat);
- return;
- }
- for (index = 0;index < TaskNUM;index++)
- {
- pTCB = BenOSTCBTable+index;
- /*該任務(wù)在睡眠狀態(tài),必須將所有時延都--*/
- if (pTCB->TCBDelay > 0)
- {
- pTCB->TCBDelay--;
- continue;
- }
- /*該任務(wù)被掛起*/
- if (pTCB->TaskStat == BenOS_Task_Pend)
- {
- continue;
- }
- /*是否找到了應(yīng)該調(diào)度進去的就緒任務(wù)*/
- if (flagFirstTask==0)
- {
- /*找到了最高優(yōu)先級的任務(wù),
- 并且比當前任務(wù)優(yōu)先級高*/
- if (BenOSCurTCB->CurPriority < pTCB->CurPriority)
- {
- flagFirstTask = 1;
- BenOSNewTCB = pTCB;
- continue;
- }
- /*找到了比當前優(yōu)先級低的任務(wù)*/
- if (BenOSCurTCB->CurPriority > pTCB->CurPriority)
- {
- if (BenOSNewTCB == NULL)
- {
- flagFirstTask = 1;
- BenOSNewTCB = pTCB;
- continue ;
- }
- else
- {
- flagFirstTask = 1;
- continue ;
- }
- }
-
- /*找到了最高優(yōu)先級的任務(wù),
- 并且跟當前任務(wù)優(yōu)先級相等*/
- if (BenOSCurTCB->CurPriority == pTCB->CurPriority)
- {
- /*該任務(wù)在當前任務(wù)之后*/
- if ((pTCB > BenOSCurTCB)||(pTCB == BenOSCurTCB))
- {
- flagFirstTask = 1;
- BenOSNewTCB = pTCB;
- continue ;
- }
- /*在當前任務(wù)之前或者就是當前任務(wù)
- 則還需要繼續(xù)向后搜索第一個同優(yōu)先級的任務(wù)*/
- if ((pTCB < BenOSCurTCB)
- &&(BenOSNewTCB == NULL))
- {
- BenOSNewTCB = pTCB;
- continue;
- }
- }
- continue;
- }
-
- }
- if (BenOSNewTCB != BenOSCurTCB)
- {
- BenOSCtxSw();
- }
- BenOS_INT_Restore(stat);
- }
- /*
- *在非中斷中 調(diào)度新的任務(wù) 并且切換
- */
- void BenOSTaskSche()
- {
- INT_Stat stat = 0;
- stat = BenOS_INT_Save();
- if (BenOSScheLock != 0)
- {
- BenOS_INT_Restore(stat);
- return;
- }
- if (BenOSNewTCB != BenOSCurTCB)
- {
- BenOSCtxSw();
- }
- BenOS_INT_Restore(stat);
- }
- /*
- * 創(chuàng)建新的任務(wù)
- */
- TASK_TYPE* BenOSCreateTask(void* task, STACK_TYPE *stack,PRIORITY_TYPE prio)
- {
- TCB *pTCB;
- INT_Stat stat = 0;
-
- stat = BenOS_INT_Save();
-
- pTCB = BenOSGetFreeTCB(prio);
- if (NULL == pTCB)
- {
- BenOS_INT_Restore(stat);
- return NULL;
- }
- pTCB->pStackTop = BenOSTaskStkInit(task, stack);
- pTCB->CurPriority = prio;
- pTCB->TCBDelay = 0;
-
- TaskNUM++;
- BenOS_INT_Restore(stat);
- return pTCB;
- }
- /*idle任務(wù)堆棧默認為128個字節(jié)*/
- STACK_TYPE idleStack[IDLE_TASK_STACK_SIZE];
- I32U IdleConuter=0;
- void BenOSIdleTask()
- {
- INT_Stat stat = 0;
- while(1)
- {
- stat = BenOS_INT_Save();
- IdleConuter++;
- BenOS_INT_Restore(stat);
- }
- }
- /*操作系統(tǒng)啟動(并且將優(yōu)先級較低的IDLE任務(wù)創(chuàng)建)*/
- void BenOSStart()
- {
- INT_Stat stat = 0;
-
- stat = BenOS_INT_Save();
- BenOSCurTCB = BenOSTCBTable;
- if (BenOSCurTCB == NULL)
- {
- BenOS_INT_Restore(stat);
- return;
- }
- BenOS_INT_Restore(stat);
- BenOSCreateTask((void*)BenOSIdleTask,&idleStack[IDLE_TASK_STACK_SIZE-1],0);
-
- BenOSStartTask();
- }
- void BenOSTimeDly (I32 ticks)
- {
- INT_Stat stat = 0;
- I8 index;
- TCB *pTCB;
-
- stat = BenOS_INT_Save();
- BenOSCurTCB->TCBDelay = ticks;
- BenOSNewTCB = NULL;
- /*從當前任務(wù)向后遍歷,
- 第一個最大的優(yōu)先級的任務(wù)
- 就是需要調(diào)度進去的任務(wù)*/
- for (index = 0; index < TaskNUM;index++)
- {
- pTCB = BenOSTCBTable+index;
- /*跳過睡眠任務(wù)*/
- if (pTCB->TCBDelay != 0)
- {
- continue;
- }
- /*跳過掛起任務(wù)*/
- if (pTCB->TaskStat == BenOS_Task_Pend)
- {
-
- continue;
- }
- /*找到了最高優(yōu)先級的任務(wù),
- 并且比當前任務(wù)優(yōu)先級高*/
- if (BenOSCurTCB->CurPriority < pTCB->CurPriority)
- {
- BenOSNewTCB = pTCB;
- break;
- }
- /*找到了比當前優(yōu)先級低的任務(wù)*/
- if (BenOSCurTCB->CurPriority > pTCB->CurPriority)
- {
- /*如果當前任務(wù)之前有同優(yōu)先級的就緒任務(wù),
- 則選擇該任務(wù),否則就使用*/
- if (BenOSNewTCB == NULL)
- {
- BenOSNewTCB = pTCB;
- }
- break;
- }
-
- /*找到了最高優(yōu)先級的任務(wù),
- 并且跟當前任務(wù)優(yōu)先級相等*/
- if (BenOSCurTCB->CurPriority == pTCB->CurPriority)
- {
- /*該任務(wù)在當前任務(wù)之后*/
- if ((pTCB > BenOSCurTCB))
- {
- BenOSNewTCB = pTCB;
- break ;
- }
- /*在當前任務(wù)之前或者就是當前任務(wù)
- 則還需要繼續(xù)向后搜索第一個同優(yōu)先級的任務(wù)*/
- if (((pTCB < BenOSCurTCB)||(pTCB == BenOSCurTCB))
- &&(BenOSNewTCB == NULL))
- {
- BenOSNewTCB = pTCB;
- continue;
- }
- }
-
- }
- BenOS_INT_Restore(stat);
- BenOSTaskSche();
- }
- /*
- * 初始化任務(wù)數(shù)據(jù),并創(chuàng)建IDLE任務(wù)
- */
- I8 BenOSInit()
- {
- I32 index=0;
- INT_Stat stat = 0;
-
- stat = BenOS_INT_Save();
- for (index = 0;index < MAX_TASK_NUM;index++)
- {
- _mem_clr((I8U*)BenOSTCBTable,sizeof(TCB)*MAX_TASK_NUM);
- }
- for(index=0;index<MAX_SEM_NUM;index++)
- {
- BenOSSemaphore[index] = -1;
- }
- for (index=0;index<MAX_QUEUE_NUMBER;index++)
- {
- MsgQueueFlag[index]=0;
- }
- BenOSCurTCB = NULL;
- BenOSNewTCB = NULL;
- BenOS_INT_Restore(stat);
- return BenOS_OK;
- }
- /*
- * 恢復(fù)任務(wù)運行
- */
- void BenOSTaskResume(TASK_TYPE *task)
- {
- I32 index=0;
- TCB *pTCB;
- INT_Stat stat = 0;
-
- stat = BenOS_INT_Save();
- task->TaskStat = BenOS_Task_Run;
- /*從頭向后遍歷,第一最大的優(yōu)先級就是需要調(diào)度進去的任務(wù)*/
- for (index = 0 ; index < TaskNUM;index++)
- {
- pTCB = BenOSTCBTable+index;
- if ((pTCB->TCBDelay == 0) && (pTCB->TaskStat !=BenOS_Task_Pend) )
- {
- BenOSNewTCB = pTCB;
- break;
- }
- }
-
- BenOS_INT_Restore(stat);
- BenOSTaskSche();
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
系統(tǒng).7z
(143.71 KB, 下載次數(shù): 75)
2020-4-10 13:20 上傳
點擊文件名下載附件
benOS 下載積分: 黑幣 -5
|