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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

詳解基于51單片機的small rtos(2)

作者:佚名   來源:本站原創   點擊數:  更新時間:2012年01月15日   【字體:

    我們繼續上篇。上篇我漏了個開總中斷忘說了。
  開中斷。  對了調試的時候吧任務A的睡眠給隱掉。因為一步一步來學習嘛!  當開了中斷,于是開始執行定時器0中斷,定時器中的代碼一個是OSTimeTick();  執行任務時間片的分配。這里注意了,我自個寫的時候調試出現問題才發現的。他是先判斷是否有時間片,有則--,然后再判斷是否為0為0則 OSIntSendSignal(TaskId)。  OSIntSendSignal就是把任務置為就緒的沒什么,有必要提的就是關中斷和開中斷。這個為了避免產生中斷導致不可預知的錯誤。 然后回到定時器0的中斷服務程序中,執行OSIntExit()。然后轉到==》OSIntCtxSw ==》  C_OSCtxSw  ==》LoadCtx    然后就切換到任務B 。現在我開始慢慢的分析這幾個函數,因為這里是需要慢慢講解的。首先從原理上講下。定時器中斷時依次把
PC+ACC+B+DPTR+PWD+r0-r7  共15個字節 ,然后OSIntCtxSw 這個函數會判斷當前任務是空閑任務的還是任務ABC中一個,如果是任務函數則棧頂指針  sp=sp-4; 如果是空閑的就sp=sp-17 置相應的中斷方式標志位     OSCtxSw  內存塊的重新布局。 LoadCtx    加載任務環境 。 
 現在開始從代碼調試中看下。 
定時器0中斷前                                                                               

        
 

 中斷后    然后查看  內存 按推斷應該是sp-15 個字節  =i:0x16     如圖   你可以看出 中斷服務程序保存環境是按什么次序入棧的。帥吧~~~

然后執行OSIntExit()壓入    0x0256  

     

 

   15+2 =17個字節然后  再跳轉到 OSIntCtxSw  

  17+2 個字節 =2+13+4

 

 這里開始用51

匯編寫的,這里是經常執行的代碼必須有效率。 在OSIntCtxSw    判斷當前任務是什么性質的,現在這個是任務A隨意是sp=sp-4 并置中斷類型標志位,清任務運行標志位,LMJP  OSCtxSw  首先壓入一個中斷計數,然后開始吧 【前任務+1的存放地址 ----下個任務+1的地址】 這里有個第優先級上還存放了個任務就是為符合這個處理方式。吧括號中的數據整個搬到上圖sp后面,然后吧修改后的函數首地址重新分配 OSTsakStackBotton存放   然后把下個任務切換成當前任務,他的內存空間就是現在SP ---任務+1之間的空間。  這里的堆棧是從低到高分配的和PC里不一樣。然后還做了個清中斷標志的操作  壓入  LoadCtx    的函數地址的棧然后RETI 這個主要是清掉中斷標志,然后跳轉到環境加載函數 。然后LoadCtx    就把堆棧中下個任務的地址直接RET返回給$P于是就切換到下個任務了。 優先級低的也差不對這樣處理的。

 

為了模擬跳轉到任務B   在中斷前加  extern uint8 OSTaskRuning;  在 OSIntExit(); 前+OSTaskRuning &=~OSMapTbl[0];  這樣就模擬跳轉到任務B

  嘿嘿,不好意思 +了那么入棧的數據就有變化了。但是數目應該沒變,我就不重新截圖了。

sp 0x28  ,

OSIntCtxSw 執行后SP-4


 

放B的地址可以通過

 


 

看到i:0xF7是存儲的B的首地址,


 

 

數據塊應該是 【A+1】-    【B+1】之間的數據整個搬到當前sp+1后面 搬移后的內存分布 


 

 

后面  中斷計數 00  +搬過來的B-C間的2個字節 C7  03這個正好是B任務的首地重新修改存放函數首地址的數組

 

 
 

這里可以跳轉到LoadCtx     吧任務切到任務B中。 

至此通過中斷任務切換已經完畢,此時可以向下如果任務中有數據在其中,那么這樣做會不會丟失數據,其實仔細想想就可以了解,不會的。
本例源代碼下載:http://www.zg4o1577.cn/f/small_rtos1.12.1.zip


接下篇:

    這篇就講解信號來模擬軟中斷,切換任務。
     吧上篇的操作權清掉,然后程序到任務A后會通過睡眠信號,進入OSWait()處理。這里程序主動放棄任務的使用CPU的權利 OSClearSignal (),OSSched()來進入到OSCtxSw  這個函數中,然后他來設置中斷的性質標志位。==》C_OSCtxSw  ==》LoadCtx  加載環境來達到切換任務的目的。
     這個沒上面的那個復雜,就是在LoadCtx  的時候會根據中斷的標志位來跳過寄存器的恢復。因為軟中段是不會吧寄存器的數據保存到堆棧中這是為什么呢?嘿嘿,這個讓我糾結了半小時,其實很簡單。他這個事主動放棄的,如果再次執行就是重新運行這個任務,那么這個任務中用到得數據部就全初始化了嗎。嘿嘿,所以沒必要保存寄存器中的數據。
     呵呵這個我就不截圖也不具體說了,有了上篇這個應該很快就能看明白。信號量可能更新慢了點,因為本人自己寫的代碼才寫到這里而已,就在出差前才調試好的。當然我寫的有點亂很多變量都是自起的名字,而且還加了自己想到得一些奇怪的想法的代碼,這代碼我不提供,所以我按RTOS代碼解析每步的。

 

關閉窗口

相關文章

主站蜘蛛池模板: 久久香蕉网 | 精品视频一区二区三区四区 | 高清不卡毛片 | 国产精品久久9 | 亚洲视频免费一区 | 亚洲天堂一区 | 亚洲精品456 | 欧美黑人一级爽快片淫片高清 | 成人黄色在线观看 | 91视频网址 | 午夜精品一区 | 国产香蕉视频 | 中午字幕在线观看 | 日韩欧美三区 | 亚洲综合大片69999 | 黄色一级大片在线免费看产 | 精品国产乱码久久久久久果冻传媒 | 午夜在线视频一区二区三区 | 久久日韩粉嫩一区二区三区 | 欧美日本一区二区 | 视频一区二区中文字幕 | 欧美二区在线 | 天天干人人 | 国产日韩欧美一区二区 | 精品久久久久久红码专区 | 美国一级毛片a | 岛国在线免费观看 | www.天堂av.com| 亚洲精品一区在线 | 色综合桃花网 | 看片国产| 久久夜夜 | 亚洲精品一区二区三区四区高清 | 国产精品海角社区在线观看 | 精品久久久久久 | 色综合天天天天做夜夜夜夜做 | 国产午夜亚洲精品不卡 | 欧美精品一区在线发布 | 欧美在线视频一区二区 | 操操操操操 | 一区二区三区不卡视频 |