作者
https://bbs.csdn.net/topics/300000723
實現硬件 STM32F10vet6
1,內存使用量統計
硬件系統啟動使用:
系統堆棧(系統啟動的時候需要使用) 80個字節
操作系統內核使用:
任務表 96+16個字節
注:20個字節/任務 * 8(默認任務個數)
信號量 32個字節
注:4個字節/信號量 * 8(默認信號量個數)
消息隊列 54個字節
注: 默認8條消息/隊列 * 3 (默認3個消息隊列)
空閑任務(Idle) 96個字節
注:每個任務最少需要96個字節的堆棧,推薦256個字節
RAM使用統計:
一個原始的系統總共占用內存約為400個字節
其中內核占用內存不到300個字節
(注:根據armlink指示,另外還有96個字節的數據用于LIBSPACE.O文件,
這個查明,其實是開發環境在為main主函數初始化的時候用到)
2,代碼量(包括ROM里面的只讀數據)統計
內核 1200 個字節
信號量 300 個字節
消息隊列 500 個字節
ROM使用統計
原始的系統代碼小于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指令集中無串操作指令,不過可以用字對齊進行優化*/
- /*考慮到Thumb2指令中,32位指令執行效率并不高,所以這里暫時不作優化*/
- 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表中取一個空閑的節點,給新任務使用*/
- /*對BenOSTCBTable表這個有序表進行插入排序*/
- /*將優先級高的任務放在前面*/
- TCB* BenOSGetFreeTCB(PRIORITY_TYPE prio)
- {
- TCB *pTCB;
- I32 index=0,orgIndex;
- pTCB = &(BenOSTCBTable[0]);
- for (index = 0;index < TaskNUM+1;index++)
- {
- pTCB = BenOSTCBTable+index;
- /*已經是空閑TCB了,就直接使用*/
- if (NULL == pTCB->pStackTop)
- {
- return (TCB*)pTCB;
- }
- /*若新任務優先級比較低,則向后繼續找*/
- if (pTCB->CurPriority >= prio)
- {
- continue;
- }
- else /*pTCB->CurPriority < prio 找到了該插入的位置了*/
- {
- /*保存當前位置*/
- orgIndex = index;
- /*從當前節點遍歷到最后一個使用了的節點*/
- for( index = TaskNUM+1 ; index > orgIndex ; index-- )
- {
- pTCB = BenOSTCBTable+index;
- /*將前一個節點的數據,保存到當前節點*/
- _mem_copy((I8U *)(pTCB),(I8U *)(pTCB-1),sizeof(TCB));
- }
- _mem_clr((I8U *)(pTCB-1),sizeof(TCB)) ;
-
- return (TCB*)(pTCB-1);
- }
- }
- return (TCB*)NULL;
- }
- /*
- *時鐘中斷函數
- */
- 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;
- /*該任務在睡眠狀態,必須將所有時延都--*/
- if (pTCB->TCBDelay > 0)
- {
- pTCB->TCBDelay--;
- continue;
- }
- /*該任務被掛起*/
- if (pTCB->TaskStat == BenOS_Task_Pend)
- {
- continue;
- }
- /*是否找到了應該調度進去的就緒任務*/
- if (flagFirstTask==0)
- {
- /*找到了最高優先級的任務,
- 并且比當前任務優先級高*/
- if (BenOSCurTCB->CurPriority < pTCB->CurPriority)
- {
- flagFirstTask = 1;
- BenOSNewTCB = pTCB;
- continue;
- }
- /*找到了比當前優先級低的任務*/
- if (BenOSCurTCB->CurPriority > pTCB->CurPriority)
- {
- if (BenOSNewTCB == NULL)
- {
- flagFirstTask = 1;
- BenOSNewTCB = pTCB;
- continue ;
- }
- else
- {
- flagFirstTask = 1;
- continue ;
- }
- }
-
- /*找到了最高優先級的任務,
- 并且跟當前任務優先級相等*/
- if (BenOSCurTCB->CurPriority == pTCB->CurPriority)
- {
- /*該任務在當前任務之后*/
- if ((pTCB > BenOSCurTCB)||(pTCB == BenOSCurTCB))
- {
- flagFirstTask = 1;
- BenOSNewTCB = pTCB;
- continue ;
- }
- /*在當前任務之前或者就是當前任務
- 則還需要繼續向后搜索第一個同優先級的任務*/
- 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);
- }
- /*
- * 創建新的任務
- */
- 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個字節*/
- 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);
- }
- }
- /*操作系統啟動(并且將優先級較低的IDLE任務創建)*/
- 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;
- /*從當前任務向后遍歷,
- 第一個最大的優先級的任務
- 就是需要調度進去的任務*/
- for (index = 0; index < TaskNUM;index++)
- {
- pTCB = BenOSTCBTable+index;
- /*跳過睡眠任務*/
- if (pTCB->TCBDelay != 0)
- {
- continue;
- }
- /*跳過掛起任務*/
- if (pTCB->TaskStat == BenOS_Task_Pend)
- {
-
- continue;
- }
- /*找到了最高優先級的任務,
- 并且比當前任務優先級高*/
- if (BenOSCurTCB->CurPriority < pTCB->CurPriority)
- {
- BenOSNewTCB = pTCB;
- break;
- }
- /*找到了比當前優先級低的任務*/
- if (BenOSCurTCB->CurPriority > pTCB->CurPriority)
- {
- /*如果當前任務之前有同優先級的就緒任務,
- 則選擇該任務,否則就使用*/
- if (BenOSNewTCB == NULL)
- {
- BenOSNewTCB = pTCB;
- }
- break;
- }
-
- /*找到了最高優先級的任務,
- 并且跟當前任務優先級相等*/
- if (BenOSCurTCB->CurPriority == pTCB->CurPriority)
- {
- /*該任務在當前任務之后*/
- if ((pTCB > BenOSCurTCB))
- {
- BenOSNewTCB = pTCB;
- break ;
- }
- /*在當前任務之前或者就是當前任務
- 則還需要繼續向后搜索第一個同優先級的任務*/
- if (((pTCB < BenOSCurTCB)||(pTCB == BenOSCurTCB))
- &&(BenOSNewTCB == NULL))
- {
- BenOSNewTCB = pTCB;
- continue;
- }
- }
-
- }
- BenOS_INT_Restore(stat);
- BenOSTaskSche();
- }
- /*
- * 初始化任務數據,并創建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;
- /*從頭向后遍歷,第一最大的優先級就是需要調度進去的任務*/
- 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提供下載:
系統.7z
(143.71 KB, 下載次數: 75)
2020-4-10 13:20 上傳
點擊文件名下載附件
benOS
|