91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>接口技術>UCOSIII移植中的匯編接口函數講解

UCOSIII移植中的匯編接口函數講解

2017-12-06 | rar | 未知 | 次下載 | 1積分

資料介紹

 1:開始多任務函數 void OSStartHighRdy(void)
  在OSInit()初始化完畢之后,會調用OSStart(),在OS開始函數里面會調用void OSStartHighRdy(void)函數,這是一個純匯編編寫的函數,在os_cpu_a.s這個匯編文件里面實現,具體的如下,我已經給每一句代碼都添加了注釋。
    ; 開始多任務
  ; void OSStartHighRdy(void)
  ;
  ; 注意 : 1) 這個函數觸發了一個PendSV異常,導致第一個任務開始運行。
  ;
  ; 2) OSStartHighRdy() 必須:
  ; a) 設置PendSV的優先級為最低;
  ; b) 初始化進程堆棧指針PSP等于0, 表明這是第一次上下文切換;
  ; c) 設置主堆棧指針等于OS_CPU_ExceptStkBase
  ; d) 觸發PendSV異常;
  ; e) 使能中斷,任務開始運行。
    ;********************************************************************************************************
  ; 開始多任務
  ; void OSStartHighRdy(void)
  ;
  ; 注意 : 1) 這個函數觸發了一個PendSV異常,導致第一個任務開始運行。
  ;
  ; 2) OSStartHighRdy() 必須:
  ; a) 設置PendSV的優先級為最低;
  ; b) 初始化進程堆棧指針PSP等于0, 表明這是第一次上下文切換;
  ; c) 設置主堆棧指針等于OS_CPU_ExceptStkBase
  ; d) 觸發PendSV異常;
  ; e) 使能中斷,任務開始運行。
  ;********************************************************************************************************
  OSStartHighRdy
  ; 設置PendSV中斷優先級
  LDR R0, =NVIC_SYSPRI14
  LDR R1, =NVIC_PENDSV_PRI
  STRB R1, [R0] ;*R0=R1(低字節),因為表達優先級只需要8bit
  ; 初始化PSP=0
  MOVS R0, #0 ; 把0加載到R0
  MSR PSP, R0 ; 把R0的值加載到特殊寄存器PSP
  ; 初始化MSP地址
  LDR R0, =OS_CPU_ExceptStkBase ; 把OS_CPU_ExceptStkBase這個指針變量的地址加載到R0
  LDR R1, [R0] ; *R0 = R1,實際上就是把OS_CPU_ExceptStkBase的值加載到R1
  MSR MSP, R1 ; 把R1的值加載到MSP,此時MSP=OS_CPU_ExceptStkBase
  ; 觸發PendSV異常 (進入上下文切換)
  LDR R0, =NVIC_INT_CTRL
  LDR R1, =NVIC_PENDSVSET
  STR R1, [R0] ; *R0 = R1
  ; 打開中斷
  CPSIE I
  ; 正常情況下,永遠不會運行到這,因為這是一個死循環
  OSStartHang
  B OSStartHang
  1:PendSV 異常服務函數 void OS_CPU_PendSVHandler(void)
?
OS_CPU_PendSVHandler
????CPSID ??I ?????????????????????????????????????????????????????????; 關中斷,執行上下文切換的時候不能被中斷,屬于臨界段
????MRS ????R0, PSP ???????????????????????????????????????????????; 加載PSP(即R13)的值到R0
????CBZ ????R0, OS_CPU_PendSVHandler_nosave ????; R0的值為0則跳轉到OS_CPU_PendSVHandler_nosave; CBZ:比較,如果結果為0就跳轉
???????????????????????????????????????????????????????????????????????????; 第一次進行上下文切換的時候PSP等于0,所以要進行跳轉
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????SUBS ???R0, R0, #0x20 ????????????????????????????????????; 壓棧之前先調整堆棧指針,要壓棧的寄存器R4-R11有8個,所以偏移為8*0x04=0x20
????STM ????R0, {R4-R11} ??????????????????????????????????????; 手動將R4-R11壓棧
?
????; 實現 OSTCBCurPtr->OSTCBStkPtr = SP;
????LDR ????R1, =OSTCBCurPtr ?????????????????????????????; R1=&OSTCBCurPtr,這個時候R1里面存的是OSTCBCurPtr這個指針變量的地址 ???????????????
????LDR ????R1, [R1] ????????????????????????????????????????????; R1=*R1=OSTCBCurPtr,這個時候,R1等于OSTCBCurPtr這個指針變量
????STR ????R0, [R1] ????????????????????????????????????????????; *R1=R0,這個時候OSTCBCurPtr指向的TCB的第一個成員(即OSTCBCurPtr->OSTCBStkPtr)等于R0
????????????????????????????????????????????????????????????????????????; R0又是一開始進行壓棧的PSP,所以OSTCBCurPtr->OSTCBStkPtr = SP
????????????????????????????????????????????????????????????????????????; 程序運行到這個點上,進入上下文切換的過程已經保存好了
OS_CPU_PendSVHandler_nosave
????PUSH ???{R14} ??????????????????????????????????????????????; 保存 LR exc_return 的值
????LDR ????R0, =OSTaskSwHook ????????????????????????; 調用OSTaskSwHook()
????BLX ????R0
????POP ????{R14}
?
????; 實現 OSPrioCur = OSPrioHighRdy;
????LDR ????R0, =OSPrioCur ???????????????????????????????; R0=&OSPrioCur ???????????????????????????????
????LDR ????R1, =OSPrioHighRdy ????????????????????????; R1=&OSPrioHighRdy
????LDRB ???R2, [R1] ????????????????????????????????????????; R2=*R1(低字節),因為優先級是8bit的,所以是低字節
????STRB ???R2, [R0] ?????????????????????????????????????????; R0=*R2(低字節),因為優先級是8bit的,所以是低字節
?
????; 實現 OSTCBCurPtr = OSTCBHighRdyPtr;
????????????????LDR ????R0, =OSTCBCurPtr ???????????????; R0=&OSTCBCurPtr ?????????????????????????????????
????LDR ????R1, =OSTCBHighRdyPtr ????????????????????; R1=&OSTCBHighRdyPtr
????LDR ????R2, [R1] ??????????????????????????????????????????; R2=*R1
????STR ????R2, [R0] ??????????????????????????????????????????; R0=*R2
?
????LDR ????R0, [R2] ?????????????????????????????????????????; R0等于新的進程的SP; SP = OSTCBHighRdyPtr->StkPtr
??????????????????????????????????????????????????????????????????????; R2=OSTCBHighRdyPtr,則[R2]=*R2=OSTCBHighRdyPtr=StkPtr,因為TCB的第一個成員就是StkPtr
????LDM ????R0, {R4-R11} ?????????????????????????????????; 從新的堆棧中彈出R4-R11
????ADDS ???R0, R0, #0x20 ???????????????????????????????; 重新調整堆棧指針,R4-R11為8個寄存器,每個寄存器為四個字節,8*4=32=0X20
????MSR ????PSP, R0 ?????????????????????????????????????????; 更新PSP的值
????ORR ????LR, LR, #0x04 ???????????????????????????????; 判斷LR寄存器的位4是否為1,確保異常返回用用的是PSP
????CPSIE ??I ???????????????????????????????????????????????????; 打開中斷,上下文切換結束
????BX ?????LR ??????????????????????????????????????????????????; 異常返回
?
????END ?????????????????????????????????????????????????????????; 匯編程序結束
  ; 只有在特權級下,才可以訪問下面三個寄存器
  ; PRIMASK :這是個只有單一比特的寄存器。 在它被置 1 后,就關掉所有可屏蔽的異常,只剩下 NMI 和硬 fault 可以響應。它的缺省值是 0,表示沒有關中斷。
  ; FAULTMASK:這是個只有 1 個位的寄存器。當它置 1 時,只有 NMI 才能響應,所有其它的異常,甚至是硬 fault,也通通閉嘴。它的缺省值也是 0,表示沒有關異常。
  ; BASEPRI :這個寄存器最多有 9 位( 由表達優先級的位數決定)。它定義了被屏蔽優先級的閾值。當它被設成某個值后,所有優先級號大于等于此值的中斷都被關(優先級號
  ; 越大,優先級越低)。但若被設成 0,則不關閉任何中斷, 0 也是缺省值。
  ;
  ; 為了快速的開關中斷,CM3專門設置了一條CPS指令,有4種用法
  ; CPSID I //PRIMASK = 1, ;關中斷
  ; CPSIE I //PRIMASK = 0, ;開中斷
  ; CPSID F //FAULTMASK = 1, ;關異常
  ; CPSIE F //FAULTMASK = 0, ;開異常
?
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1常用電子元器件集錦
  2. 1.72 MB   |  24489次下載  |  免費
  3. 2ssd1306單片 CMOS OLED/PLED 驅動芯片中文手冊
  4. 1.66 MB   |  5次下載  |  1 積分
  5. 3高壓MOS管MDD12N65F/MDD12N65P數據手冊
  6. 2.36 MB   |  4次下載  |  免費
  7. 4PC2456高壓浪涌抑制器控制器數據手冊
  8. 3.03 MB   |  4次下載  |  免費
  9. 5Brocade-300光纖交換機配置手冊
  10. 0.27 MB   |  2次下載  |  1 積分
  11. 6FP6195 60V、800mA、480KHz異步降壓轉換器規格書
  12. 0.88 MB   |  2次下載  |  免費
  13. 7松下 rq-sx3隨身聽電路圖資料
  14. 2.93 MB   |  2次下載  |  5 積分
  15. 8中低壓MOS管2N7002數據手冊
  16. 3.77 MB   |  1次下載  |  免費

本月

  1. 1常用電子元器件集錦
  2. 1.72 MB   |  24489次下載  |  免費
  3. 2三相逆變主電路的原理圖和PCB資料合集免費下載
  4. 27.35 MB   |  111次下載  |  1 積分
  5. 3運算放大器基本電路中文資料
  6. 1.30 MB   |  16次下載  |  免費
  7. 4蘋果iphone 11電路原理圖
  8. 4.98 MB   |  12次下載  |  5 積分
  9. 5常用電子元器件介紹
  10. 3.21 MB   |  10次下載  |  免費
  11. 6EMC電路設計工程師必備的EMC基礎
  12. 0.42 MB   |  6次下載  |  2 積分
  13. 7ssd1306單片 CMOS OLED/PLED 驅動芯片中文手冊
  14. 1.66 MB   |  5次下載  |  1 積分
  15. 8索尼-EJ1000 CD隨身聽電路原圖資料
  16. 6.28 MB   |  4次下載  |  5 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935130次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
  4. 1.48MB  |  420064次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233089次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191390次下載  |  10 積分
  9. 5十天學會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183345次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81591次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73816次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65989次下載  |  10 積分
主站蜘蛛池模板: 国产papa| 99久久99久久精品国产 | 婷婷成人丁香五月综合激情 | 国产婷婷综合在线精品尤物 | 天堂网www天堂在线网 | 成人亚洲网站www在线观看 | 亚洲综合精品香蕉久久网97 | 黄色片啪啪 | 国产高清免费在线观看 | 99午夜高清在线视频在观看 | 天堂网www中文天堂在线 | 操白虎美女 | 亚洲天堂2013 | 国产成人啪午夜精品网站男同 | 综合激情六月 | 国产精品久久久久久久久齐齐 | 黄色有码视频 | 色婷婷视频 | 亚洲国产成人最新精品资源 | 国产精品视频第一区二区三区 | 午夜影院性| 亚洲精品老司机综合影院 | 香蕉视频色版在线观看 | 四虎影裤 | 在线观看视频在线观看 | 日本黄色电影在线 | 国产精品高清一区二区三区不卡 | 一级毛片女人喷潮 | 日本69sex护士wwxx| 色吧五月婷婷 | 天堂网资源 | 国产黄色小视频 | 久久久午夜精品 | 亚洲一区二区福利视频 | 免费高清在线视频色yeye | 在线视频精品视频 | 国产欧美一区二区日本加勒比 | 久久综合欧美成人 | 国产在线一卡 | 久久精品屋 | 99在线国产视频 |