在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 詳解基于51單片機的small rtos

            詳解基于51單片機的small rtos

            作者: 時間:2012-08-10 來源:網絡 收藏
            陳明計,這個人有必要要認識下,因為small rtos 是他寫的,他根據ucos的原理寫的。這個small rtos是可以再上運行的,但是受ARM內存的限制。作為單片機開發(fā)的時刻都得想著內存的問題,因為51芯片資源有限。 好了不廢話開始學習的旅程
            首先你可以在51hei下個small rtos 源代碼http://www.51hei.com/f/small_rtos1.12.1.zip或者跟我一步一步寫。 keil51的工具編譯代碼后會生成一個.m51的文件,這個文件要學會去看,因為他把你的一些內存分配的地址和函數的地址都會以列表顯示出來。
            操作系統(tǒng)的任務其實都是一個死循環(huán)。我們寫的操作系統(tǒng)其實就是把$P單片機的指針指向任務的首地址而已。那么首地址我們必須要保存下來以便任務切換的時候使用在small rtos 中時保存在 OSTsakStackBotton[]這個數組內部的。那么我們怎樣獲取到任務的首地址呢,在這里 他是靜態(tài)存放到數組內的。即 void (*code TaskFuction[OS_MAX_TASKS])(void)={TaskA,TaskB,TaskC}; 這個事一個函數指針存放的數組,看不明白的你可以查下資料。 這里他保存了3個函數的地址 。
            通過編譯后查看.m51文件也可以看到相關信息。(這個是我編譯后的文件默認是在E:temp當然你可以改下路徑)
            CODE 03A4H 000AH UNIT ?PR?TASKA?EXT1
            CODE 03AEH 000AH UNIT ?PR?TASKB?EXT1
            CODE 03B8H 000AH UNIT ?PR?TASKC?EXT1
            C:03B7H PUBLIC TaskFuction
            通過上述的可以看出 TaskFuction首地址在 C:03CBH 那么程序運行后可以直接翻看C:03B7H地址 看接下來的地址內是否存放點擊瀏覽下一頁

            核對下應該是和.m51一致的。 任務首地址有了,然后我們看下他的代碼。mian()里面沒什么代碼就是定時器0的初始化,還有就是OSStart() 這個函數.這個函數其實就是初始化堆棧并把系統(tǒng)切到任務A 的函數。至于怎么處理關鍵的堆棧如何處理。我們來仔細看下. 我這里運行到mian()函數棧頂指針點擊瀏覽下一頁

            至于你想知道為什么是0x15看下.m51

            點擊瀏覽下一頁
            這里其實已經告訴你了。第0組工作寄存器8個+8個DATA數據定義。然后mian()調用OSStart()

            點擊瀏覽下一頁
            跳轉到OSStart() 里點擊瀏覽下一頁
            這里看出壓入了2個字節(jié)(51是字節(jié)),點擊瀏覽下一頁

            從內存中可以看出壓入的是下個代碼的地址。 聰明的可能已經看出來了,吧任務A的地址替換這里的86 03 ,那么執(zhí)行RET就可以跳轉到任務A中去執(zhí)行代碼。到這里是不是讓你來勁了? 然后我們繼續(xù)。點擊瀏覽下一頁 這個STACK 是什么,呵呵在匯編部分的代碼如下:

            點擊瀏覽下一頁
            這里重,并定義了一個內存單元,至于他的位置看.m51點擊瀏覽下一頁

            是不是很巧合,剛好在存放main()函數指針的RAM地址那,但是仔細想想這是理所當然的,但是你也可以也可以想辦法不怎么巧合,但是這樣充分利用 RAM空間吧任務A的覆蓋main入棧的指針式最好的。 然后下面代碼應該很好理解。吧任務的首地址存到隨機變動的OSTsakStackBotton中,這里還加了個空閑任務的函數指針。然后開始部署各個任務的堆??臻g。 他壓入任務A的首地址然后把棧頂指針知道任務A的高地址中,然后從尾部開始存放底0,優(yōu)先級任務,0,任務C,0,任務B。那么中間的空代碼部分就可以作為任務A可以使用的內存塊。然后就跳轉到任務A中執(zhí)行代碼

            至此我已經把第一個任務切換,解析出來了。

            聲控燈相關文章:聲控燈原理


            評論


            相關推薦

            技術專區(qū)

            關閉