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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3674|回復: 1
打印 上一主題 下一主題
收起左側

stm32上ucosii的工作流程從啟動代碼到ucosii的匯編

[復制鏈接]
跳轉到指定樓層
樓主
ID:98924 發表于 2015-12-9 01:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  本文章介紹在stm32上也就是cortex m3核的基礎上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
        啟動代碼中,系統初始化完成,然后在 dummy exception中喚醒一些中斷,其中ucosii用到的系統滴答中斷和cpu任務掛起切換的中斷。按著箭頭往下走。
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
        關于這兩個函數的位置,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}


        這個就是關中斷,壓入堆棧切換任務,OSTCBCur就是當前要切換任務的指針。
        Sysytickhandler右鍵單擊即可進入他的實體定義,我們定義在it.c里邊,當然也有其他版本不在it.c里邊的。
        void SysTick_Handler(void)
        {
           OSIntEnter();  
           OSTimeTick();  
           OSIntExit();  
        }
        這個函數就是一個1s延時中斷,為ucosii提供時鐘心臟。
          
        接下來看main函數
        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里邊就一個外設初始化和ucosii初始化,OSStart();  是正式開始進入任務調度了,
        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     */
            }
        }
        開始時是吧優先級最高的賦給當前的任務指針OSTCBCur      ,然后進入OSStartHighRdy();這個函數,這個函數又在cpu_.a.asm里邊預定義。

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, 下載次數: 29)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:235503 發表于 2021-5-31 18:24 | 只看該作者
這寫的也太敷衍了。。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久草免费在线视频 | 99pao成人国产永久免费视频 | 亚洲三级免费看 | 日本一区二区三区在线观看 | 免费观看一级特黄欧美大片 | 蜜桃av一区二区三区 | 亚洲视频一区在线观看 | 自拍 亚洲 欧美 老师 丝袜 | 伊人爽| 国产激情视频在线免费观看 | 免费视频二区 | 亚洲精品一级 | 国产精品女人久久久 | 精品一区二区三区不卡 | 国产一区二区三区www | 在线观看国产视频 | 国产精品99999999 | 一区二区中文 | 久久在线看 | 一级欧美一级日韩片免费观看 | 97超碰站 | 色综合久久天天综合网 | 国产精品国产三级国产aⅴ浪潮 | 一二区视频 | 天天干视频 | 欧美一区二区大片 | 夜夜精品浪潮av一区二区三区 | 偷偷操视频 | 日本三级电影免费 | 综合色婷婷 | 国产情品| 色久五月| 国产成人精品一区二 | 欧美国产亚洲一区二区 | 国产精品国产三级国产aⅴ中文 | 亚洲精品视频一区二区三区 | 黄视频免费 | 欧美一级视频免费看 | 精品国产一区三区 | 亚洲综合大片69999 | 自拍在线 |