<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          UCOS移植心得

          作者: 時間:2016-11-27 來源:網(wǎng)絡 收藏


          然后是OSIntCtxSw():完成中斷級任務切換,大部分和上一個函數(shù)一樣

          _OSIntCtxSw:

          CALL _OSTaskSwHook




          //OSUCBCur=OSTCBHighRdy

          R1=_OSTCBCur

          R2=[_OSTCBHighRdy]

          [R1]=R2



          //OSPrioCur=OSPrioHighRdy

          R1=[_OSPrioHighRdy]

          [_OSPrioCur]=R1



          R1=[_OSTCBHighRdy]

          SP=[R1]



          POP R1 FROM [SP]

          [_InterruptC]=R1

          CMP R1,0//查看是否需要關(guān)中斷處理

          JE KAI1//如果不需要則直接返回

          IRQ OFF//需要就關(guān)中斷

          KAI1:POP R1,R5 FROM [SP]

          RETI

          還有一個是OSTickISR():

          這個函數(shù)其實不是必須叫這個名字,可以根據(jù)具體情況改變的,在uCOS_II.h里面關(guān)于函數(shù)原型的部分可以看到,它的原型是條件編譯的,只要你定義一個OS_ISR_PROTO_EXT,編譯器就不會再去編譯這個原型了,定義OS_ISR_PROTO_EXT意味著你告訴編譯器你將自己另寫中斷函數(shù)的,不再使用OSTickISR(),同時由于OSCtxSw()和OSTickISR()使用相同的

          條件編譯,你還必須再自己在OS_CPU.H里面寫一條語句:#defineOS_TASK_SW()OSCtxSw();這樣的話,就在任務切換時將調(diào)用你編寫的函數(shù)(不過我開始沒有定義那個OS_ISR_PROTO_EXT時也沒有出現(xiàn)問題,所以這塊我也不太肯定)


          我自己寫的中斷函數(shù)是針對凌陽的,代碼如下:


          _IRQ6:

          PUSH R1,R5 TO [SP]

          R1=0x0002

          [P_INT_Clear]=R1//清中斷標志



          CALL _Clear_Dog//俗稱喂狗



          R1=[_OSIntNesting]

          R1+=1

          [_OSIntNesting]=R1

          CMP R1,1

          JNE TCB//查看是否發(fā)生中斷嵌套,

          R1=[_InterruptC]//如果沒有嵌套,則保存當前任務的中斷計數(shù)器

          PUSH R1 TO [SP]//及任務堆棧地址

          R2=[_OSTCBCur]

          [R2]=SP


          TCB:CALL _OSTimeTick

          CALL _OSIntExit


          R1=[_OSIntNesting]//如果能執(zhí)行到此,則說明不需要任務切換

          CMP R1,0//查看是否發(fā)生過中斷嵌套

          JNE TCB1//如果發(fā)生過,則沒有保存中斷計數(shù)器

          POP R1 FROM [SP]//否則需要彈出中斷計數(shù)器調(diào)整堆棧指針

          [_InterruptC]=R1

          TCB1:POPR1,R5 FROM [SP]

          RETI


          OS_CPU.H:

          在這個文件里面主要就是定義數(shù)據(jù)類型,一樣的數(shù)據(jù)不同的CPU有不同的位數(shù),在這里就是要定義移植過程中的數(shù)據(jù)位數(shù)問題,還有就是定義堆棧的生長方式,及OS_ENTER_CRITICAL( ),OS_EXIT_CRITICAL( ),OS_TASK_SW( ),也都是比較簡單的問題,比較容易處理,不多廢話

          雖然說編譯器有時候出些莫名其妙的問題,但我還是要說用好你的IDE真的是太重要了,象我在開始時老有問題,我不知道到底哪有毛病,懷疑是在保存堆棧指針時有問題,因為那一塊盡是一堆的指針操作,我開始不知道怎么用那個變量查看窗口,就沒辦法確定我是否操作正確,最后比不得已,弄了半天學會了,通過那個窗口查看變量后,才確定自己真的是錯在那了……


          再有一個小小的經(jīng)驗就是像這種比較大的東西你要step調(diào)試真的很暈,我是自己搭了個小小的測試平臺(其實就是8個發(fā)光二極管),連到B口,建立任務直接看結(jié)果,很簡單,但真的很管用!

          上一頁 1 2 下一頁

          關(guān)鍵詞: UCOS移植心

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();