欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 牛人自制的STM32實(shí)時(shí)操作系統(tǒng) [打印本頁(yè)]

作者: IKNOW    時(shí)間: 2020-4-10 10:30
標(biāo)題: 牛人自制的STM32實(shí)時(shí)操作系統(tǒng)
作者
https://bbs.csdn.net/topics/300000723
實(shí)現(xiàn)硬件 STM32F10vet6


1,內(nèi)存使用量統(tǒng)計(jì)
硬件系統(tǒng)啟動(dòng)使用:
系統(tǒng)堆棧(系統(tǒng)啟動(dòng)的時(shí)候需要使用)        80個(gè)字節(jié)

操作系統(tǒng)內(nèi)核使用:
任務(wù)表                                    96+16個(gè)字節(jié)   
                                注:20個(gè)字節(jié)/任務(wù) * 8(默認(rèn)任務(wù)個(gè)數(shù))
                                
信號(hào)量                                    32個(gè)字節(jié)
                                注:4個(gè)字節(jié)/信號(hào)量 * 8(默認(rèn)信號(hào)量個(gè)數(shù))

消息隊(duì)列                                54個(gè)字節(jié)
                                注: 默認(rèn)8條消息/隊(duì)列 * 3 (默認(rèn)3個(gè)消息隊(duì)列)
                                
空閑任務(wù)(Idle)                        96個(gè)字節(jié)   
                                注:每個(gè)任務(wù)最少需要96個(gè)字節(jié)的堆棧,推薦256個(gè)字節(jié)
                    
RAM使用統(tǒng)計(jì):
一個(gè)原始的系統(tǒng)總共占用內(nèi)存約為400個(gè)字節(jié)
其中內(nèi)核占用內(nèi)存不到300個(gè)字節(jié)

(注:根據(jù)armlink指示,另外還有96個(gè)字節(jié)的數(shù)據(jù)用于LIBSPACE.O文件,
這個(gè)查明,其實(shí)是開發(fā)環(huán)境在為main主函數(shù)初始化的時(shí)候用到)


2,代碼量(包括ROM里面的只讀數(shù)據(jù))統(tǒng)計(jì)
內(nèi)核                            1200 個(gè)字節(jié)
信號(hào)量                            300 個(gè)字節(jié)
消息隊(duì)列                        500 個(gè)字節(jié)

ROM使用統(tǒng)計(jì)
原始的系統(tǒng)代碼小于2K
其中內(nèi)核代碼小于1.2K

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

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


  5. /*當(dāng)前運(yùn)行的任務(wù)*/
  6. TCB                        *BenOSCurTCB;

  7. /*當(dāng)前準(zhǔn)備新運(yùn)行的任務(wù)*/
  8. TCB                 *BenOSNewTCB;

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


  10. /*無(wú)聊,所以把堆棧初始化模塊用匯編寫一遍,但愿性能會(huì)高點(diǎn)*/
  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指令集中無(wú)串操作指令,不過(guò)可以用字對(duì)齊進(jìn)行優(yōu)化*/
  76. /*考慮到Thumb2指令中,32位指令執(zhí)行效率并不高,所以這里暫時(shí)不作優(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表中取一個(gè)空閑的節(jié)點(diǎn),給新任務(wù)使用*/
  92. /*對(duì)BenOSTCBTable表這個(gè)有序表進(jìn)行插入排序*/
  93. /*將優(yōu)先級(jí)高的任務(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)先級(jí)比較低,則向后繼續(xù)找*/
  108.                 if (pTCB->CurPriority >= prio)
  109.                 {
  110.                         continue;
  111.                 }
  112.                 else /*pTCB->CurPriority < prio 找到了該插入的位置了*/
  113.                 {  
  114.                         /*保存當(dāng)前位置*/
  115.                         orgIndex = index;

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

  120.                                 /*將前一個(gè)節(jié)點(diǎn)的數(shù)據(jù),保存到當(dāng)前節(jié)點(diǎn)*/
  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í)鐘中斷函數(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),必須將所有時(shí)延都--*/
  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)度進(jìn)去的就緒任務(wù)*/
  163.                 if (flagFirstTask==0)
  164.                 {
  165.                         /*找到了最高優(yōu)先級(jí)的任務(wù),
  166.                           并且比當(dāng)前任務(wù)優(yōu)先級(jí)高*/
  167.                         if (BenOSCurTCB->CurPriority < pTCB->CurPriority)
  168.                         {
  169.                                 flagFirstTask = 1;
  170.                                 BenOSNewTCB = pTCB;
  171.                                 continue;
  172.                         }

  173.                         /*找到了比當(dāng)前優(yōu)先級(jí)低的任務(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)先級(jí)的任務(wù),
  190.                           并且跟當(dāng)前任務(wù)優(yōu)先級(jí)相等*/
  191.                         if (BenOSCurTCB->CurPriority == pTCB->CurPriority)
  192.                         {
  193.                                 /*該任務(wù)在當(dāng)前任務(wù)之后*/
  194.                                 if ((pTCB > BenOSCurTCB)||(pTCB == BenOSCurTCB))
  195.                                 {       
  196.                                         flagFirstTask = 1;
  197.                                         BenOSNewTCB = pTCB;
  198.                                         continue  ;               
  199.                                 }       
  200.                                 /*在當(dāng)前任務(wù)之前或者就是當(dāng)前任務(wù)
  201.                                   則還需要繼續(xù)向后搜索第一個(gè)同優(yōu)先級(jí)的任務(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ù)堆棧默認(rèn)為128個(gè)字節(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)啟動(dòng)(并且將優(yōu)先級(jí)較低的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.         /*從當(dāng)前任務(wù)向后遍歷,
  301.         第一個(gè)最大的優(yōu)先級(jí)的任務(wù)
  302.         就是需要調(diào)度進(jìn)去的任務(wù)*/
  303.         for (index = 0; index < TaskNUM;index++)
  304.         {
  305.                 pTCB = BenOSTCBTable+index;

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

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

  324.                 /*找到了比當(dāng)前優(yōu)先級(jí)低的任務(wù)*/
  325.                 if (BenOSCurTCB->CurPriority > pTCB->CurPriority)
  326.                 {
  327.                     /*如果當(dāng)前任務(wù)之前有同優(yōu)先級(jí)的就緒任務(wù),
  328.                           則選擇該任務(wù),否則就使用*/
  329.                         if (BenOSNewTCB == NULL)
  330.                         {
  331.                                 BenOSNewTCB = pTCB;
  332.                         }                                                  
  333.                         break;
  334.                 }
  335.                        
  336.                 /*找到了最高優(yōu)先級(jí)的任務(wù),
  337.                   并且跟當(dāng)前任務(wù)優(yōu)先級(jí)相等*/
  338.                 if (BenOSCurTCB->CurPriority == pTCB->CurPriority)
  339.                 {
  340.                         /*該任務(wù)在當(dāng)前任務(wù)之后*/
  341.                         if ((pTCB > BenOSCurTCB))
  342.                         {       
  343.                                 BenOSNewTCB = pTCB;
  344.                                 break  ;               
  345.                         }       
  346.                         /*在當(dāng)前任務(wù)之前或者就是當(dāng)前任務(wù)
  347.                           則還需要繼續(xù)向后搜索第一個(gè)同優(yōu)先級(jí)的任務(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ù)運(yùn)行
  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)先級(jí)就是需要調(diào)度進(jìn)去的任務(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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

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


作者: nsj21n    時(shí)間: 2020-4-11 08:29
大神級(jí),學(xué)習(xí)了!
作者: HWL0541    時(shí)間: 2020-4-11 09:09
真是牛人,頂一下
作者: smartphone    時(shí)間: 2020-4-12 12:26
看技術(shù)帖雖然一點(diǎn)都不懂 但是要頂
作者: 007.7    時(shí)間: 2021-6-11 17:40
從B站評(píng)論過(guò)來(lái)頂一下啊
作者: act117    時(shí)間: 2023-4-20 10:06
B站來(lái)的,學(xué)習(xí)了
作者: li64331218    時(shí)間: 2023-4-20 14:43
必須頂起啊!辛苦了
作者: odddouglas    時(shí)間: 2024-7-16 15:40
頂, 前來(lái)學(xué)習(xí)觀望
作者: huaishang    時(shí)間: 2024-7-16 16:41

大神級(jí),學(xué)習(xí)了!
作者: sfd123    時(shí)間: 2024-7-19 07:26
厲害啊!膜拜一個(gè)!
作者: Ubuntu312    時(shí)間: 2024-8-6 08:56
我看有人說(shuō)是從B站找過(guò)來(lái)的,請(qǐng)問(wèn)一下有視頻的鏈接嗎,能分享一下觀摩一二嗎。
作者: 西點(diǎn)鐘靈毓秀    時(shí)間: 2024-8-6 09:26
還是下載來(lái)看看,適不適合自己試用




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1