久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7156|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

牛人自制的STM32實時操作系統(tǒng)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:507431 發(fā)表于 2020-4-10 10:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
作者
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

單片機源程序如下:
  1. #include "BenOSCore.h"

  2. /*當前OS中所有的任務(wù)*/
  3. I8U                        TaskNUM=0;
  4. TCB                        BenOSTCBTable[MAX_TASK_NUM];


  5. /*當前運行的任務(wù)*/
  6. TCB                        *BenOSCurTCB;

  7. /*當前準備新運行的任務(wù)*/
  8. TCB                 *BenOSNewTCB;

  9. I8U                   BenOSScheLock=0;            /* 0 = enable                 */


  10. /*無聊,所以把堆棧初始化模塊用匯編寫一遍,但愿性能會高點*/
  11. __asm    STACK_TYPE *BenOSTaskStkInit (void (*task),STACK_TYPE *ptos)
  12. {
  13.                  THUMB
  14.                  PRESERVE8

  15.                  PUSH     {R4-R6,LR}
  16.          MOV      R4,R0

  17.          MOV      R0,R1
  18.          MOV      R5,#0x1000000
  19.          STR      R5,[R0,#0]

  20.          SUBS     R0,R0,#4
  21.          STR      R4,[R0,#0]
  22.          
  23.          MVN      R5,#1
  24.          SUBS     R0,R0,#4
  25.          STR      R5,[R0,#0]
  26.          
  27.          MOV      R5,#0x2
  28.          SUBS     R0,R0,#4
  29.          STR      R5,[R0,#0]
  30.          
  31.          MOV      R5,#0x3
  32.          SUBS     R0,R0,#4
  33.          STR      R5,[R0,#0]
  34.          
  35.          MOV      R5,#0x4
  36.          SUBS     R0,R0,#4
  37.          STR      R5,[R0,#0]

  38.                  ASRS     R5,R5,#1
  39.          SUBS     R0,R0,#4
  40.          STR      R5,[R0,#0]
  41.          
  42.          SUBS     R0,R0,#4
  43.          STR      R1,[R0,#0]
  44.          
  45.          MOV      R5,#0x5
  46.          SUBS     R0,R0,#4
  47.          STR      R5,[R0,#0]

  48.          MOV      R5,#0x6
  49.          SUBS     R6,R0,#4
  50.          MOV      R0,R6
  51.          STR      R5,[R6,#0]
  52.          
  53.          MOV      R5,#0x7
  54.          SUBS     R0,R0,#4
  55.          STR      R5,[R0,#0]
  56.          
  57.          MOV      R5,#0x8
  58.          SUBS     R0,R0,#4
  59.          STR      R5,[R0,#0]

  60.          MOV      R5,#0x8
  61.          SUBS     R0,R0,#4
  62.          STR      R5,[R0,#0]

  63.          MOV      R5,#0x10
  64.          SUBS     R0,R0,#4
  65.          STR      R5,[R0,#0]

  66.          MOV      R5,#0x11
  67.          SUBS     R0,R0,#4
  68.          STR      R5,[R0,#0]

  69.          MOV      R5,#0x12
  70.          SUBS     R6,R0,#4
  71.          MOV          R0,R6
  72.          STR      R5,[R6,#0]
  73.          POP      {R4-R6,PC}

  74. }


  75. /*Thumb2指令集中無串操作指令,不過可以用字對齊進行優(yōu)化*/
  76. /*考慮到Thumb2指令中,32位指令執(zhí)行效率并不高,所以這里暫時不作優(yōu)化*/
  77. void  _mem_clr (I8U *pdest, I32 size)
  78. {
  79.     while (size > 0) {
  80.         *pdest++ = (I8)0;
  81.         size--;
  82.     }
  83. }

  84. void  _mem_copy (I8U *pdest, I8U *psrc, I16U size)
  85. {
  86.     while (size > 0) {
  87.         *pdest++ = *psrc++;
  88.         size--;
  89.     }
  90. }

  91. /*在TCB表中取一個空閑的節(jié)點,給新任務(wù)使用*/
  92. /*對BenOSTCBTable表這個有序表進行插入排序*/
  93. /*將優(yōu)先級高的任務(wù)放在前面*/
  94. TCB* BenOSGetFreeTCB(PRIORITY_TYPE prio)
  95. {
  96.         TCB        *pTCB;
  97.         I32        index=0,orgIndex;

  98.         pTCB = &(BenOSTCBTable[0]);
  99.         for (index = 0;index < TaskNUM+1;index++)
  100.         {
  101.                 pTCB = BenOSTCBTable+index;

  102.                 /*已經(jīng)是空閑TCB了,就直接使用*/
  103.                 if (NULL == pTCB->pStackTop)
  104.                 {
  105.                         return        (TCB*)pTCB;
  106.                 }

  107.                 /*若新任務(wù)優(yōu)先級比較低,則向后繼續(xù)找*/
  108.                 if (pTCB->CurPriority >= prio)
  109.                 {
  110.                         continue;
  111.                 }
  112.                 else /*pTCB->CurPriority < prio 找到了該插入的位置了*/
  113.                 {  
  114.                         /*保存當前位置*/
  115.                         orgIndex = index;

  116.                         /*從當前節(jié)點遍歷到最后一個使用了的節(jié)點*/
  117.                         for( index = TaskNUM+1 ; index > orgIndex ; index-- )
  118.                         {
  119.                                 pTCB = BenOSTCBTable+index;

  120.                                 /*將前一個節(jié)點的數(shù)據(jù),保存到當前節(jié)點*/
  121.                                 _mem_copy((I8U *)(pTCB),(I8U *)(pTCB-1),sizeof(TCB));
  122.                         }
  123.                         _mem_clr((I8U *)(pTCB-1),sizeof(TCB))  ;
  124.                                
  125.                         return (TCB*)(pTCB-1);               

  126.                 }
  127.         }

  128.         return        (TCB*)NULL;
  129. }

  130. /*
  131. *時鐘中斷函數(shù)
  132. */
  133. void SysTick_Handler()
  134. {
  135.         I8        index;
  136.         TCB                *pTCB;
  137.         I8U        flagFirstTask=0;
  138.         INT_Stat  stat = 0;

  139.         stat = BenOS_INT_Save();

  140.     /*初始化*/
  141.         BenOSNewTCB = NULL;

  142.         /*禁止調(diào)度*/
  143.         if (BenOSScheLock != 0)
  144.         {
  145.                 BenOS_INT_Restore(stat);
  146.                 return;
  147.         }

  148.         for (index = 0;index < TaskNUM;index++)
  149.         {
  150.                 pTCB = BenOSTCBTable+index;

  151.                 /*該任務(wù)在睡眠狀態(tài),必須將所有時延都--*/
  152.                 if (pTCB->TCBDelay > 0)
  153.                 {
  154.                         pTCB->TCBDelay--;
  155.                         continue;
  156.                 }

  157.                 /*該任務(wù)被掛起*/
  158.                 if (pTCB->TaskStat == BenOS_Task_Pend)       
  159.                 {
  160.                         continue;
  161.                 }

  162.                 /*是否找到了應(yīng)該調(diào)度進去的就緒任務(wù)*/
  163.                 if (flagFirstTask==0)
  164.                 {
  165.                         /*找到了最高優(yōu)先級的任務(wù),
  166.                           并且比當前任務(wù)優(yōu)先級高*/
  167.                         if (BenOSCurTCB->CurPriority < pTCB->CurPriority)
  168.                         {
  169.                                 flagFirstTask = 1;
  170.                                 BenOSNewTCB = pTCB;
  171.                                 continue;
  172.                         }

  173.                         /*找到了比當前優(yōu)先級低的任務(wù)*/
  174.                         if (BenOSCurTCB->CurPriority > pTCB->CurPriority)
  175.                         {
  176.                                 if (BenOSNewTCB == NULL)
  177.                                 {
  178.                                         flagFirstTask = 1;
  179.                                         BenOSNewTCB = pTCB;
  180.                                         continue  ;       
  181.                                 }
  182.                                 else
  183.                                 {
  184.                                         flagFirstTask = 1;
  185.                                         continue  ;               
  186.                                 }
  187.                         }
  188.                        
  189.                         /*找到了最高優(yōu)先級的任務(wù),
  190.                           并且跟當前任務(wù)優(yōu)先級相等*/
  191.                         if (BenOSCurTCB->CurPriority == pTCB->CurPriority)
  192.                         {
  193.                                 /*該任務(wù)在當前任務(wù)之后*/
  194.                                 if ((pTCB > BenOSCurTCB)||(pTCB == BenOSCurTCB))
  195.                                 {       
  196.                                         flagFirstTask = 1;
  197.                                         BenOSNewTCB = pTCB;
  198.                                         continue  ;               
  199.                                 }       
  200.                                 /*在當前任務(wù)之前或者就是當前任務(wù)
  201.                                   則還需要繼續(xù)向后搜索第一個同優(yōu)先級的任務(wù)*/
  202.                                 if ((pTCB < BenOSCurTCB)
  203.                                      &&(BenOSNewTCB == NULL))
  204.                                 {
  205.                                          BenOSNewTCB = pTCB;
  206.                                          continue;
  207.                                 }
  208.                         }


  209.                         continue;
  210.                 }

  211.                
  212.         }
  213.         if (BenOSNewTCB != BenOSCurTCB)
  214.         {
  215.                 BenOSCtxSw();
  216.         }
  217.         BenOS_INT_Restore(stat);
  218. }

  219. /*
  220. *在非中斷中 調(diào)度新的任務(wù) 并且切換
  221. */
  222. void BenOSTaskSche()
  223. {
  224.         INT_Stat  stat = 0;

  225.         stat = BenOS_INT_Save();
  226.         if (BenOSScheLock != 0)
  227.         {
  228.                 BenOS_INT_Restore(stat);
  229.                 return;
  230.         }               

  231.         if (BenOSNewTCB != BenOSCurTCB)
  232.         {
  233.                 BenOSCtxSw();
  234.         }
  235.         BenOS_INT_Restore(stat);
  236. }

  237. /*
  238. * 創(chuàng)建新的任務(wù)
  239. */
  240. TASK_TYPE*  BenOSCreateTask(void* task, STACK_TYPE *stack,PRIORITY_TYPE prio)
  241. {
  242.         TCB        *pTCB;
  243.         INT_Stat  stat = 0;
  244.        
  245.         stat = BenOS_INT_Save();
  246.        
  247.         pTCB = BenOSGetFreeTCB(prio);

  248.         if (NULL == pTCB)
  249.         {
  250.                 BenOS_INT_Restore(stat);
  251.                 return        NULL;
  252.         }


  253.         pTCB->pStackTop = BenOSTaskStkInit(task, stack);

  254.         pTCB->CurPriority = prio;

  255.         pTCB->TCBDelay = 0;
  256.        
  257.         TaskNUM++;
  258.         BenOS_INT_Restore(stat);
  259.         return pTCB;
  260. }

  261. /*idle任務(wù)堆棧默認為128個字節(jié)*/
  262. STACK_TYPE        idleStack[IDLE_TASK_STACK_SIZE];

  263. I32U         IdleConuter=0;

  264. void BenOSIdleTask()
  265. {
  266.         INT_Stat                  stat = 0;

  267.         while(1)
  268.         {
  269.                 stat = BenOS_INT_Save();
  270.                 IdleConuter++;
  271.                 BenOS_INT_Restore(stat);
  272.         }
  273. }


  274. /*操作系統(tǒng)啟動(并且將優(yōu)先級較低的IDLE任務(wù)創(chuàng)建)*/
  275. void BenOSStart()
  276. {
  277.         INT_Stat  stat = 0;
  278.        
  279.         stat = BenOS_INT_Save();

  280.         BenOSCurTCB = BenOSTCBTable;
  281.         if (BenOSCurTCB == NULL)
  282.         {
  283.                 BenOS_INT_Restore(stat);
  284.                 return;
  285.         }

  286.         BenOS_INT_Restore(stat);

  287.         BenOSCreateTask((void*)BenOSIdleTask,&idleStack[IDLE_TASK_STACK_SIZE-1],0);
  288.        
  289.         BenOSStartTask();
  290. }


  291. void  BenOSTimeDly (I32 ticks)
  292. {
  293.         INT_Stat  stat = 0;
  294.         I8          index;
  295.         TCB                  *pTCB;
  296.        
  297.         stat = BenOS_INT_Save();
  298.         BenOSCurTCB->TCBDelay = ticks;

  299.         BenOSNewTCB = NULL;

  300.         /*從當前任務(wù)向后遍歷,
  301.         第一個最大的優(yōu)先級的任務(wù)
  302.         就是需要調(diào)度進去的任務(wù)*/
  303.         for (index = 0; index < TaskNUM;index++)
  304.         {
  305.                 pTCB = BenOSTCBTable+index;

  306.                 /*跳過睡眠任務(wù)*/
  307.                 if (pTCB->TCBDelay != 0)
  308.                 {
  309.                         continue;
  310.                 }
  311.                 /*跳過掛起任務(wù)*/
  312.                 if  (pTCB->TaskStat == BenOS_Task_Pend)       
  313.                 {                               
  314.   
  315.                         continue;
  316.                 }

  317.                 /*找到了最高優(yōu)先級的任務(wù),
  318.                   并且比當前任務(wù)優(yōu)先級高*/
  319.                 if (BenOSCurTCB->CurPriority < pTCB->CurPriority)
  320.                 {
  321.                         BenOSNewTCB = pTCB;
  322.                         break;
  323.                 }

  324.                 /*找到了比當前優(yōu)先級低的任務(wù)*/
  325.                 if (BenOSCurTCB->CurPriority > pTCB->CurPriority)
  326.                 {
  327.                     /*如果當前任務(wù)之前有同優(yōu)先級的就緒任務(wù),
  328.                           則選擇該任務(wù),否則就使用*/
  329.                         if (BenOSNewTCB == NULL)
  330.                         {
  331.                                 BenOSNewTCB = pTCB;
  332.                         }                                                  
  333.                         break;
  334.                 }
  335.                        
  336.                 /*找到了最高優(yōu)先級的任務(wù),
  337.                   并且跟當前任務(wù)優(yōu)先級相等*/
  338.                 if (BenOSCurTCB->CurPriority == pTCB->CurPriority)
  339.                 {
  340.                         /*該任務(wù)在當前任務(wù)之后*/
  341.                         if ((pTCB > BenOSCurTCB))
  342.                         {       
  343.                                 BenOSNewTCB = pTCB;
  344.                                 break  ;               
  345.                         }       
  346.                         /*在當前任務(wù)之前或者就是當前任務(wù)
  347.                           則還需要繼續(xù)向后搜索第一個同優(yōu)先級的任務(wù)*/
  348.                         if (((pTCB < BenOSCurTCB)||(pTCB == BenOSCurTCB))
  349.                              &&(BenOSNewTCB == NULL))
  350.                         {
  351.                                  BenOSNewTCB = pTCB;
  352.                                  continue;
  353.                         }

  354.                 }

  355.        
  356.         }
  357.         BenOS_INT_Restore(stat);
  358.         BenOSTaskSche();       
  359. }

  360. /*
  361. * 初始化任務(wù)數(shù)據(jù),并創(chuàng)建IDLE任務(wù)
  362. */

  363. I8 BenOSInit()
  364. {
  365.         I32        index=0;
  366.         INT_Stat  stat = 0;
  367.        
  368.         stat = BenOS_INT_Save();

  369.         for (index = 0;index < MAX_TASK_NUM;index++)
  370.         {
  371.                 _mem_clr((I8U*)BenOSTCBTable,sizeof(TCB)*MAX_TASK_NUM);
  372.         }                               

  373.         for(index=0;index<MAX_SEM_NUM;index++)
  374.         {       
  375.                 BenOSSemaphore[index] = -1;
  376.         }

  377.         for (index=0;index<MAX_QUEUE_NUMBER;index++)
  378.         {
  379.                 MsgQueueFlag[index]=0;
  380.         }

  381.         BenOSCurTCB = NULL;               
  382.         BenOSNewTCB = NULL;

  383.         BenOS_INT_Restore(stat);
  384.         return        BenOS_OK;

  385. }

  386. /*
  387. * 恢復(fù)任務(wù)運行
  388. */
  389. void BenOSTaskResume(TASK_TYPE *task)
  390. {
  391.         I32        index=0;
  392.         TCB                  *pTCB;
  393.         INT_Stat  stat = 0;
  394.        
  395.         stat = BenOS_INT_Save();
  396.         task->TaskStat = BenOS_Task_Run;
  397.                 /*從頭向后遍歷,第一最大的優(yōu)先級就是需要調(diào)度進去的任務(wù)*/
  398.         for (index = 0 ; index < TaskNUM;index++)
  399.         {
  400.                 pTCB = BenOSTCBTable+index;
  401.                 if ((pTCB->TCBDelay == 0) && (pTCB->TaskStat !=BenOS_Task_Pend)          )
  402.                 {       
  403.                         BenOSNewTCB = pTCB;
  404.                         break;
  405.                 }
  406.         }
  407.        
  408.         BenOS_INT_Restore(stat);       

  409.         BenOSTaskSche();       
  410. }

  411. ……………………

  412. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
系統(tǒng).7z (143.71 KB, 下載次數(shù): 75)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏13 分享淘帖 頂3 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:64089 發(fā)表于 2020-4-11 08:29 | 只看該作者
大神級,學習了!
回復(fù)

使用道具 舉報

板凳
ID:91165 發(fā)表于 2020-4-11 09:09 | 只看該作者
真是牛人,頂一下
回復(fù)

使用道具 舉報

地板
ID:53978 發(fā)表于 2020-4-12 12:26 | 只看該作者
看技術(shù)帖雖然一點都不懂 但是要頂
回復(fù)

使用道具 舉報

5#
ID:476903 發(fā)表于 2021-6-11 17:40 | 只看該作者
從B站評論過來頂一下啊
回復(fù)

使用道具 舉報

6#
ID:1072895 發(fā)表于 2023-4-20 10:06 | 只看該作者
B站來的,學習了
回復(fù)

使用道具 舉報

7#
ID:291668 發(fā)表于 2023-4-20 14:43 | 只看該作者
必須頂起啊!辛苦了
回復(fù)

使用道具 舉報

8#
ID:1129103 發(fā)表于 2024-7-16 15:40 | 只看該作者
頂, 前來學習觀望
回復(fù)

使用道具 舉報

9#
ID:25103 發(fā)表于 2024-7-16 16:41 | 只看該作者

大神級,學習了!
回復(fù)

使用道具 舉報

10#
ID:169559 發(fā)表于 2024-7-19 07:26 | 只看該作者
厲害啊!膜拜一個!
回復(fù)

使用道具 舉報

11#
ID:1130105 發(fā)表于 2024-8-6 08:56 | 只看該作者
我看有人說是從B站找過來的,請問一下有視頻的鏈接嗎,能分享一下觀摩一二嗎。
回復(fù)

使用道具 舉報

12#
ID:87000 發(fā)表于 2024-8-6 09:26 | 只看該作者
還是下載來看看,適不適合自己試用
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩国产精品一区二区三区 | 精品二区 | 成人av网站在线观看 | 久久综合久久综合久久综合 | 国产精品性做久久久久久 | 日韩国产中文字幕 | 亚洲精品欧美精品 | 国产精品久久久久久妇女6080 | 欧美啪啪| 盗摄精品av一区二区三区 | 成人在线免费电影 | 中文字幕av一区二区三区 | 伊人狠狠干| 欧美精品久久 | 在线观看成人av | 二区av | 天天操夜夜爽 | 三级免费毛片 | 久草在线 | 亚洲精品电影 | 欧美日韩理论 | 一区二区三区精品在线视频 | 在线播放第一页 | 欧美区精品 | 亚洲精品国产成人 | 中文字幕综合在线 | av在线一区二区三区 | 99免费| 99国内精品久久久久久久 | 黄色国产视频 | 一级a性色生活片久久毛片波多野 | 91在线第一页 | 国产精品综合色区在线观看 | 精品在线一区 | 国产精品久久久久无码av | 国产伦精品一区二区三区精品视频 | www.9191.com| 自拍偷拍亚洲视频 | 亚洲国产欧美在线 | 亚洲精品乱码久久久久久蜜桃 | 91在线视频播放 |