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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

ucos到stm32(一)

[復制鏈接]
跳轉到指定樓層
樓主
ID:104287 發表于 2016-1-31 01:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
      /**********************************戰艦版實例**************************************/
P80:μc/osⅡ時鐘
  硬件定時器中斷(使用了STM32中的Systick中斷)每產生一次,μc/osⅡ時鐘就會進入一次系統中斷服務程序(OSTickISR()),系統中斷服務程序通過調用OSTimeTick()來完成系統每個時鐘節拍所要完成的工作(包括遍歷每個任務控制塊將其延時參數減1等)。
任哲版教材P87鉤子函數在戰艦的對應源碼:
鉤子函數的使用(以OSTimerTickHook為例):
Step1:發生硬件時鐘中斷時會調用右圖的鉤子函數(在os_cpu.c文件中)。但是調用的該函數實現的條件是:
需要到os_cfg.h中把這兩個宏#define成>0。
P88:OSTimeDly
在OSTimeDly中完成OSTCBCur->OSTCBDly(任務延時寄存器)的寫入并進行一次任務切換:



關于 μc/osⅡ的疑難:
·μc/osⅡ的時鐘OSTimeTick()是怎么與STM32的SysTick關聯起來的?
戰艦開發板配套程序中在main()中有delay_init()(delay.c下)函數,其原代碼如下:
void delay_init()         
{
#ifdef OS_CRITICAL_METHOD         //如果OS_CRITICAL_METHOD定義了,說明使用ucosII了.
        u32 reload;
#endif
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //選擇外部時鐘  HCLK/8
        fac_us=SystemCoreClock/8000000;        //為系統時鐘的1/8  
         
#ifdef OS_CRITICAL_METHOD         //如果OS_CRITICAL_METHOD定義了,說明使用ucosII了.
        reload=SystemCoreClock/8000000;                //每秒鐘的計數次數 單位為K           
        reload*=1000000/OS_TICKS_PER_SEC;//根據OS_TICKS_PER_SEC設定溢出時間
                                                        //reload為24位寄存器,最大值:16777216,在72M下,約合1.86s左右
        fac_ms=1000/OS_TICKS_PER_SEC;//代表ucos可以延時的最少單位           
        SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;           //開啟SYSTICK中斷
        SysTick->LOAD=reload;         //每1/OS_TICKS_PER_SEC秒中斷一次        
       SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;          //開啟SYSTICK   
#else
        fac_ms=(u16)fac_us*1000;//非ucos下,代表每個ms需要的systick時鐘數   
#endif
}        
可見delay_init()開啟了STM32的SYSTICK中斷,下面繼續找SYSTICK的中斷服務程序(同樣也在delay.c),代碼如下:
void SysTick_Handler(void)
{                                   
OSIntEnter();                //進入中斷,其作僅僅是將判斷中斷層數是否達到255否則OSIntNesting++
OSTimeTick();       //調用ucos的時鐘服務程序               
OSIntExit();        //觸發任務切換軟中斷
}
發現OSTimeTick(); 在        SYSTICK的中斷服務程序被調用,現在μc/osⅡ的時鐘OSTimeTick()就與STM32的SysTick關聯了起來。
OSIntExit (void)的作用除了執行了OSIntNesting--之外       還進行了一次中斷級任務調度OSIntCtxSw()       。
·OSIntCtxSw()切換任務的原理:
Step1:SIntCtxSw()觸發了一次軟件中斷,代碼如下
;/**************************************************************************************
;* 函數名稱: OSIntCtxSw
;* 功能描述: 中斷級任務切換(其實是進行了一次軟件中斷)
;* 參    數: None
;* 返 回 值: None
;***************************************************************************************/
OSIntCtxSw
                PUSH    {R4, R5}
        LDR     R4, =NVIC_INT_CTRL ;觸發PendSV異常 (causes context switch)
                                                                        ;NVIC_INT_CTRL就是軟件中斷控制寄存器
        LDR     R5, =NVIC_PENDSVSET  ;NVIC_PENDSVSET是觸發軟件中斷的值.
        STR     R5, [R4]     ;將R5中的字數據寫入以R4為地址的存儲器中就發生了PendSV中斷
                POP     {R4, R5}
        BX      LR
        NOP
Step2:執行完了step后會進入軟件中斷服務函數,代碼(在os_cpu_aasm中)如下
;/**************************************************************************************
;* 函數名稱: OSPendSV
;*
;* 功能描述: 該函數實際上完成了cpu各寄存器的壓棧和新任務堆棧向cpu的進棧;
;* 參    數: None
;*
;* 返 回 值: None
;***************************************************************************************/
PendSV_Handler  ;軟件中斷服務函數
    CPSID   I      ; Prevent interruption during context switch
    MRS     R0, PSP   ; PSP is process stack pointer 如果在用PSP堆棧,則可以忽略保存寄存器,參考CM3權威中的雙堆棧-白菜注
    CBZ     R0, PendSV_Handler_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; =OSTCBCur就是取的OSTCBCur
;首地址,即任務控制塊的堆棧。
    LDR     R1, [R1]
    STR     R0, [R1]   ; R0 is SP of process being switched out

   


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频999 | 成人免费一区二区三区视频网站 | 午夜欧美一区二区三区在线播放 | 一区二区三区国产好的精 | 国产精品呻吟久久av凹凸 | av在线伊人 | 99成人在线视频 | 欧美激情在线观看一区二区三区 | 国产真实精品久久二三区 | 国产剧情一区 | 国产精品免费观看 | 国产成人精品一区二区三区四区 | 欧美一级黄色免费看 | 欧美精品久久久久久久久老牛影院 | japan21xxxxhd美女 日本欧美国产在线 | 黑人久久 | 人人射人人 | 国产精品18hdxxxⅹ在线 | 成人自拍视频网站 | www.天天干.com | 国产精品一区二区av | 男女黄网站| 亚洲精品第一国产综合野 | 亚洲欧美日韩在线一区二区 | 日本一区二区高清视频 | 久久国产精品久久国产精品 | 综合第一页 | 国产一区在线免费 | 久久人体 | 国产欧美一区二区三区久久 | 日本久久综合网 | 美日韩精品 | 91看片网 | 黄网站涩免费蜜桃网站 | 欧美大片黄 | 精品日韩在线 | 亚洲视频在线播放 | 亚洲欧美中文日韩在线v日本 | 二区在线视频 | 波多野结衣电影一区 | 日韩一区二区三区在线视频 |