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

標題: stm32上ucosii的工作流程從啟動代碼到ucosii的匯編 [打印本頁]

作者: heila    時間: 2015-12-9 01:16
標題: stm32上ucosii的工作流程從啟動代碼到ucosii的匯編
  本文章介紹在stm32上也就是cortex m3核的基礎(chǔ)上ucosii是如何運行起來的。
        打卡啟動代碼 xx_cl.s
          
        首先stm32起來后首先進入啟動代碼,
        ; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP
        啟動代碼中,系統(tǒng)初始化完成,然后在 dummy exception中喚醒一些中斷,其中ucosii用到的系統(tǒng)滴答中斷和cpu任務(wù)掛起切換的中斷。按著箭頭往下走。
DebugMon_Handler\
                PROC
                EXPORT  DebugMon_Handler           [WEAK]
                B       .
                ENDP
OS_CPU_PendSVHandler\
                PROC
                EXPORT  OS_CPU_PendSVHandler             [WEAK]
                B       .
                ENDP
SysTick_Handler PROC
                EXPORT  SysTick_Handler            [WEAK]
                B       .
                ENDP
        關(guān)于這兩個函數(shù)的位置,OS_CPU_PendSVHandler這個在os_cpu_a.asm里邊有實體定義
       
OS_CPU_PendSVHandler
    CPSID   I                                                   ; Prevent interruption during context switch
    MRS     R0, PSP                                             ; PSP is process stack pointer
    CBZ     R0, OS_CPU_PendSVHandler_nosave                     ; Skip register save the first time

    SUBS    R0, R0, #0x20                                       ; Save remaining regs r4-11 on process stack
    STM     R0, {R4-R11}

    LDR     R1, =OSTCBCur                                       ; OSTCBCur->OSTCBStkPtr = SP;
    LDR     R1, [R1]
    STR     R0, [R1]                                            ; R0 is SP of process being switched out

                                                                ; At this point, entire context of process has been saved
OS_CPU_PendSVHandler_nosave
    PUSH    {R14}                                               ; Save LR exc_return value
    LDR     R0, =OSTaskSwHook                                   ; OSTaskSwHook();
    BLX     R0
    POP     {R14}


        這個就是關(guān)中斷,壓入堆棧切換任務(wù),OSTCBCur就是當前要切換任務(wù)的指針。
        Sysytickhandler右鍵單擊即可進入他的實體定義,我們定義在it.c里邊,當然也有其他版本不在it.c里邊的。
        void SysTick_Handler(void)
        {
           OSIntEnter();  
           OSTimeTick();  
           OSIntExit();  
        }
        這個函數(shù)就是一個1s延時中斷,為ucosii提供時鐘心臟。
          
        接下來看main函數(shù)
        int main(void)  
        {  
           INT8U ret = 0;           
            BspInit();      
           OSInit();       //uCOS-II           
              ret = OSTaskCreate(      Start_Task,
                                       (void*)0,    &Start_TaskStk[PRIO_START_TASK_STK_SIZE-1],  
                               PRIO_START_TASK); /   
         if(ret != OS_ERR_NONE)
            {
                
          
                 OSStart();            
        }
          
        Main里邊就一個外設(shè)初始化和ucosii初始化,OSStart();  是正式開始進入任務(wù)調(diào)度了,
        void OSStart (void)
        {
           if (OSRunning == OS_FALSE) {
               OS_SchedNew();                               /* Find highestpriority's task priority number   */
               OSPrioCur     = OSPrioHighRdy;
               OSTCBHighRdy  =OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready torun    */
               OSTCBCur      = OSTCBHighRdy;
               OSStartHighRdy();                            /* Execute targetspecific code to start task     */
            }
        }
        開始時是吧優(yōu)先級最高的賦給當前的任務(wù)指針OSTCBCur      ,然后進入OSStartHighRdy();這個函數(shù),這個函數(shù)又在cpu_.a.asm里邊預(yù)定義。

OSStartHighRdy
    LDR     R0, =NVIC_SYSPRI14                                  ; Set the PendSV exception priority
    LDR     R1, =NVIC_PENDSV_PRI
    STRB    R1, [R0]

    MOVS    R0, #0                                              ; Set the PSP to 0 for initial context switch call
    MSR     PSP, R0

    LDR     R0, =OSRunning                                      ; OSRunning = TRUE
    MOVS    R1, #1
    STRB    R1, [R0]

    LDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)
    LDR     R1, =NVIC_PENDSVSET
    STR     R1, [R0]

    CPSIE   I                                                   ; Enable interrupts at processor level

OSStartHang
    B       OSStartHang  
        程序能順利的跑到這里基本就ok了。

        文檔下載地址 ucosii的運行過程.pdf (174.88 KB, 下載次數(shù): 29)


作者: cyxiaotian    時間: 2021-5-31 18:24
這寫的也太敷衍了。。




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产在线天堂 | 成人av一区二区三区在线观看 | 亚洲欧美国产高清va在线播放 | 91亚洲精品在线 | 精品国产999久久久免费 | 成人aaaa | 男女裸体无遮挡做爰 | 国产精品一级二级 | 日韩一区二区三区在线 | 国产在线观看精品 | 在线看日韩| 欧美精品在线免费观看 | 国产精品第一区 | 韩国av免费 | 欧美日韩| 福利片在线观看 | 九月色婷婷 | 欧美精产国品一二三区 | 中文字幕在线免费 | 一区二区三区在线播放 | 欧美亚洲一区二区三区 | 久久私人影院 | 蜜桃色999 | av网在线观看 | 国产午夜精品福利 | 黄色片中文字幕 | 国产一区二区精品丝袜 | 亚洲永久免费视频 | 成人免费视频网址 | 日本在线视频观看 | 午夜| 久久av片 | 国产高清视频 | 亚洲砖区区免费 | 成人国产精品一区二区 | 伊人操 | 亚洲精品蜜桃 | 久艹在线| 99cao| 午夜激情网 | 欧美在线不卡 |