作者
https://bbs.csdn.net/topics/300000723
實現(xiàn)硬件 STM32F10vet6
1,內存使用量統(tǒng)計
硬件系統(tǒng)啟動使用:
系統(tǒng)堆棧(系統(tǒng)啟動的時候需要使用) 80個字節(jié)
操作系統(tǒng)內核使用:
任務表 96+16個字節(jié)
注:20個字節(jié)/任務 * 8(默認任務個數(shù))
信號量 32個字節(jié)
注:4個字節(jié)/信號量 * 8(默認信號量個數(shù))
消息隊列 54個字節(jié)
注: 默認8條消息/隊列 * 3 (默認3個消息隊列)
空閑任務(Idle) 96個字節(jié)
注:每個任務最少需要96個字節(jié)的堆棧,推薦256個字節(jié)
RAM使用統(tǒng)計:
一個原始的系統(tǒng)總共占用內存約為400個字節(jié)
其中內核占用內存不到300個字節(jié)
(注:根據(jù)armlink指示,另外還有96個字節(jié)的數(shù)據(jù)用于LIBSPACE.O文件,
這個查明,其實是開發(fā)環(huán)境在為main主函數(shù)初始化的時候用到)
2,代碼量(包括ROM里面的只讀數(shù)據(jù))統(tǒng)計
內核 1200 個字節(jié)
信號量 300 個字節(jié)
消息隊列 500 個字節(jié)
ROM使用統(tǒng)計
原始的系統(tǒng)代碼小于2K
其中內核代碼小于1.2K
單片機源程序如下:
- #include "BenOSCore.h"
- /*當前OS中所有的任務*/
- I8U TaskNUM=0;
- TCB BenOSTCBTable[MAX_TASK_NUM];
- /*當前運行的任務*/
- TCB *BenOSCurTCB;
- /*當前準備新運行的任務*/
- 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é)點,給新任務使用*/
- /*對BenOSTCBTable表這個有序表進行插入排序*/
- /*將優(yōu)先級高的任務放在前面*/
- 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;
- }
- /*若新任務優(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;
- /*禁止調度*/
- if (BenOSScheLock != 0)
- {
- BenOS_INT_Restore(stat);
- return;
- }
- for (index = 0;index < TaskNUM;index++)
- {
- pTCB = BenOSTCBTable+index;
- /*該任務在睡眠狀態(tài),必須將所有時延都--*/
- if (pTCB->TCBDelay > 0)
- {
- pTCB->TCBDelay--;
- continue;
- }
- /*該任務被掛起*/
- if (pTCB->TaskStat == BenOS_Task_Pend)
- {
- continue;
- }
- /*是否找到了應該調度進去的就緒任務*/
- if (flagFirstTask==0)
- {
- /*找到了最高優(yōu)先級的任務,
- 并且比當前任務優(yōu)先級高*/
- if (BenOSCurTCB->CurPriority < pTCB->CurPriority)
- {
- flagFirstTask = 1;
- BenOSNewTCB = pTCB;
- continue;
- }
- /*找到了比當前優(yōu)先級低的任務*/
- if (BenOSCurTCB->CurPriority > pTCB->CurPriority)
- {
- if (BenOSNewTCB == NULL)
- {
- flagFirstTask = 1;
- BenOSNewTCB = pTCB;
- continue ;
- }
- else
- {
- flagFirstTask = 1;
- continue ;
- }
- }
-
- /*找到了最高優(yōu)先級的任務,
- 并且跟當前任務優(yōu)先級相等*/
- if (BenOSCurTCB->CurPriority == pTCB->CurPriority)
- {
- /*該任務在當前任務之后*/
- if ((pTCB > BenOSCurTCB)||(pTCB == BenOSCurTCB))
- {
- flagFirstTask = 1;
- BenOSNewTCB = pTCB;
- continue ;
- }
- /*在當前任務之前或者就是當前任務
- 則還需要繼續(xù)向后搜索第一個同優(yōu)先級的任務*/
- if ((pTCB < BenOSCurTCB)
- &&(BenOSNewTCB == NULL))
- {
- BenOSNewTCB = pTCB;
- continue;
- }
- }
- continue;
- }
-
- }
- if (BenOSNewTCB != BenOSCurTCB)
- {
- BenOSCtxSw();
- }
- BenOS_INT_Restore(stat);
- }
- /*
- *在非中斷中 調度新的任務 并且切換
- */
- 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)建新的任務
- */
- 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任務堆棧默認為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任務創(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;
- /*從當前任務向后遍歷,
- 第一個最大的優(yōu)先級的任務
- 就是需要調度進去的任務*/
- for (index = 0; index < TaskNUM;index++)
- {
- pTCB = BenOSTCBTable+index;
- /*跳過睡眠任務*/
- if (pTCB->TCBDelay != 0)
- {
- continue;
- }
- /*跳過掛起任務*/
- if (pTCB->TaskStat == BenOS_Task_Pend)
- {
-
- continue;
- }
- /*找到了最高優(yōu)先級的任務,
- 并且比當前任務優(yōu)先級高*/
- if (BenOSCurTCB->CurPriority < pTCB->CurPriority)
- {
- BenOSNewTCB = pTCB;
- break;
- }
- /*找到了比當前優(yōu)先級低的任務*/
- if (BenOSCurTCB->CurPriority > pTCB->CurPriority)
- {
- /*如果當前任務之前有同優(yōu)先級的就緒任務,
- 則選擇該任務,否則就使用*/
- if (BenOSNewTCB == NULL)
- {
- BenOSNewTCB = pTCB;
- }
- break;
- }
-
- /*找到了最高優(yōu)先級的任務,
- 并且跟當前任務優(yōu)先級相等*/
- if (BenOSCurTCB->CurPriority == pTCB->CurPriority)
- {
- /*該任務在當前任務之后*/
- if ((pTCB > BenOSCurTCB))
- {
- BenOSNewTCB = pTCB;
- break ;
- }
- /*在當前任務之前或者就是當前任務
- 則還需要繼續(xù)向后搜索第一個同優(yōu)先級的任務*/
- if (((pTCB < BenOSCurTCB)||(pTCB == BenOSCurTCB))
- &&(BenOSNewTCB == NULL))
- {
- BenOSNewTCB = pTCB;
- continue;
- }
- }
-
- }
- BenOS_INT_Restore(stat);
- BenOSTaskSche();
- }
- /*
- * 初始化任務數(shù)據(jù),并創(chuàng)建IDLE任務
- */
- 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;
- }
- /*
- * 恢復任務運行
- */
- 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)先級就是需要調度進去的任務*/
- 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黑下載附件…………
復制代碼
所有資料51hei提供下載:
系統(tǒng).7z
(143.71 KB, 下載次數(shù): 75)
2020-4-10 13:20 上傳
點擊文件名下載附件
benOS
|