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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 移植ucosII到STM32F103ZE(四)

          移植ucosII到STM32F103ZE(四)

          作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏


          os_cpu_c.c
          ucosii 移植時(shí)需要我們寫 10個(gè)相當(dāng)簡(jiǎn)單的C 函數(shù)。
          OSInitHookBegin()
          OSInitHookEnd()
          OSTaskCreateHook()
          OSTaskDelHook()
          OSTaskIdleHook()
          OSTaskStatHook()
          OSTaskStkInit()
          OSTaskSwHook()
          OSTCBInitHook()
          OSTimeTickHook()
          這些函數(shù)除了 OSTaskStkInit(),都是一些 hook 函數(shù)。這些 hook 函數(shù)如果不使能的話,都不會(huì)用上,也都比較簡(jiǎn)單,看看就應(yīng)該明白了,所以就不介紹。
          下面就說(shuō)一說(shuō) OSTaskStkInit()。說(shuō)之前還是得先說(shuō)一下任務(wù)切換,因?yàn)槌跏蓟蝿?wù)堆棧,是為任務(wù)切換服務(wù)的。代碼在正常運(yùn)行時(shí),一行一行往下執(zhí)行,怎么才能跑到另一個(gè)任務(wù)(即函數(shù))執(zhí)行呢?首先大家可以回想一下中斷過(guò)程,當(dāng)中斷發(fā)生時(shí),原來(lái)函數(shù)執(zhí)行的地方(程序計(jì)數(shù)器PC、處理器狀態(tài)寄存器及所有通用寄存器,即當(dāng)前代碼的現(xiàn)場(chǎng))被保存到棧里面去了,然后開(kāi)始取中斷向量,跑到中斷函數(shù)里面執(zhí)行。執(zhí)行完了呢,想回到原來(lái)函數(shù)執(zhí)行的地方,該怎么辦呢,只要把棧中保存的原來(lái)函數(shù)執(zhí)行的信息恢復(fù)即可(把棧中保存的代碼現(xiàn)場(chǎng)重新賦給 cpu 的各個(gè)寄存器),一切就都回去了,好像什么事都沒(méi)發(fā)生一樣。這個(gè)過(guò)程大家應(yīng)該都比較熟悉,任務(wù)切換和這有什么關(guān)系,試想一下,如果有 3 個(gè)函數(shù) foo1(), foo2(), foo3() 都像是剛被中斷,現(xiàn)場(chǎng)保存到棧里面去了,而中斷返回時(shí)做點(diǎn)手腳(調(diào)度程序的作用),想回哪個(gè)回哪個(gè),是不是就做了函數(shù)(任務(wù))切換了。看到這里應(yīng)該有點(diǎn)明白 OSTaskStkInit()的作用了吧,它被任務(wù)創(chuàng)建函數(shù)調(diào)用,所以要在開(kāi)始時(shí),在棧中作出該任務(wù)好像剛被中斷一樣的假象。(關(guān)于任務(wù)切換的原理邵老師書中的 3.06 節(jié)有介紹)。
          那么中斷后棧中是個(gè)什么情形呢,<>中 9.1.1 有介紹,xPSR,PC,LR,R12,R3-R0 被自動(dòng)保存到棧中的,R11-R4如果需要保存,只能手工保存。因此 OSTaskStkInit()的工作就是在任務(wù)自己的棧中保存 cpu 的所有寄存器。這些值里 R1-R12 都沒(méi)什么意義,這里用相應(yīng)的數(shù)字代號(hào)(如 R1 用0x01010101)主要是方便調(diào)試。
          OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
          {
          OS_STK *stk;
          (void)opt;
          stk = ptos;


          *(stk) = (INT32U)0x01000000L;
          *(--stk) = (INT32U)task;
          *(--stk) = (INT32U)0xFFFFFFFEL;
          *(--stk) = (INT32U)0x12121212L;
          *(--stk) = (INT32U)0x03030303L;
          *(--stk) = (INT32U)0x02020202L;
          *(--stk) = (INT32U)0x01010101L;
          *(--stk) = (INT32U)p_arg;


          *(--stk) = (INT32U)0x11111111L;
          *(--stk) = (INT32U)0x10101010L;
          *(--stk) = (INT32U)0x09090909L;
          *(--stk) = (INT32U)0x08080808L;
          *(--stk) = (INT32U)0x07070707L;
          *(--stk) = (INT32U)0x06060606L;
          *(--stk) = (INT32U)0x05050505L;
          *(--stk) = (INT32U)0x04040404L;

          return (stk);
          }
          xPSR = 0x01000000L,xPSR T 位(第24 位)置 1,否則第一次執(zhí)行任務(wù)時(shí) Fault,
          PC 肯定得指向任務(wù)入口,
          R14 = 0xFFFFFFFEL,最低4位為E,是一個(gè)非法值,主要目的是不讓使用 R14,即任務(wù)是不能返回的。R0 用于傳遞任務(wù)函數(shù)的參數(shù),因此等于 p_arg。
          把 OS_CPU_SysTickHandler(), OS_CPU_SysTickInit()這兩個(gè)函數(shù)的內(nèi)容代碼注釋掉。
          os_cpu_c.c文件中的






          #define OS_CPU_CM3_NVIC_ST_CTRL (*((volatile INT32U *)0xE000E010))
          #define OS_CPU_CM3_NVIC_ST_RELOAD (*((volatile INT32U *)0xE000E014))
          #define OS_CPU_CM3_NVIC_ST_CURRENT (*((volatile INT32U *)0xE000E018))
          #define OS_CPU_CM3_NVIC_ST_CALL (*((volatile INT32U *)0xE000E01C))

          #define OS_CPU_CM3_NVIC_ST_CTRL_COUNT 0x00010000
          #define OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC 0x00000004
          #define OS_CPU_CM3_NVIC_ST_CTRL_INTEN 0x00000002
          #define OS_CPU_CM3_NVIC_ST_CTRL_ENABLE 0x00000001
          把上面這些宏定義也注釋掉,因?yàn)樗鼈兌加糜?OS_CPU_SysTickHandler(), OS_CPU_SysTickInit()。




          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: 移植ucosIISTM32F103Z

          評(píng)論


          技術(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); })();