0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32入門學(xué)習(xí)筆記之uCOS-II系統(tǒng)移植3

jf_78858299 ? 來源:滑小稽筆記 ? 作者:電子技術(shù)園地 ? 2023-02-16 16:13 ? 次閱讀

⑤這兩個(gè)函數(shù)都用于任務(wù)切換,它們的本質(zhì)都是觸發(fā)PendSV中斷,具體切換過程在PendSV的中斷函數(shù)中進(jìn)行,其中OSCtxSw是任務(wù)級(jí)切換,OSIntCtxSw是中斷級(jí)切換,是從中斷退出時(shí)切換到一個(gè)任務(wù)中,從中斷切換到任務(wù)的過程中,CPU寄存器入棧工作已經(jīng)完成。

OSCtxSw
  PUSH    {R4, R5}
  LDR     R4, =NVIC_INT_CTRL        ;觸發(fā)PendSV異常
  LDR     R5, =NVIC_PENDSVSET
  STR     R5, [R4]              ;向NVIC_INT_CTRL寫入NVIC_PENDSVSET觸發(fā)PendSV中斷
  POP     {R4, R5}
  BX      LR
OSIntCtxSw
  PUSH    {R4, R5}
  LDR     R4, =NVIC_INT_CTRL        ;觸發(fā)PendSV異常
  LDR     R5, =NVIC_PENDSVSET
  STR     R5, [R4]              ;向NVIC_INT_CTRL寫入NVIC_PENDSVSET觸發(fā)PendSV中斷
  POP     {R4, R5}
  BX      LR
  NOP

⑥這部分代碼才是真正的任務(wù)切換函數(shù),通過觸發(fā)PendSV中斷來進(jìn)入該函數(shù)內(nèi)進(jìn)行任務(wù)切換

PendSV_Handler
  CPSID  I                                ;任務(wù)切換過程中必須關(guān)閉所有中斷
  MRS    R0, PSP                          ;如果在用PSP堆棧,則可以忽略保存寄存器
  CBZ    R0, PendSV_Handler_Nosave    ;如果PSP為0就轉(zhuǎn)移到PendSV_Handler_Nosave


  SUBS    R0, R0, #0x20                                        ;R0-=20H
  STM     R0, {R4-R11}


  LDR     R1, =OSTCBCur
  LDR     R1, [R1]
  STR     R0, [R1]


PendSV_Handler_Nosave
    PUSH    {R14}              ;保存R14的值
    LDR     R0, =OSTaskSwHook        ;調(diào)用OSTaskSwHook()
    BLX     R0
    POP     {R14}


    LDR     R0, =OSPrioCur
    LDR     R1, =OSPrioHighRdy
    LDRB    R2, [R1]
    STRB    R2, [R0]


    LDR     R0, =OSTCBCur
    LDR     R1, =OSTCBHighRdy
    LDR     R2, [R1]
    STR     R2, [R0]


    LDR     R0, [R2]              ;R0作為新任務(wù)的SP
    LDM     R0, {R4-R11}            ;從堆棧中恢復(fù)R4-R11
    ADDS    R0, R0, #0x20
    MSR     PSP, R0              ;用新任務(wù)的SP加載PSP
    ORR     LR, LR, #0x04          ;確保LR的bit2為1,返回后使用進(jìn)程堆棧
    CPSIE   I                ;開啟所有中斷
    BX      LR                ;中斷返回


  end

(2)os_cpu.h文件詳解

①這部分主要用于定義一些數(shù)據(jù)類型,其中重點(diǎn)關(guān)注OS_STK這個(gè)數(shù)據(jù)類型,我們?cè)诙x任務(wù)堆棧的時(shí)候就是該類型數(shù)據(jù),這是一個(gè)32位的數(shù)據(jù)類型,按字節(jié)算的話實(shí)際堆棧大小是我們定義的4倍。

typedef unsigned char  BOOLEAN;
typedef unsigned char  INT8U;
typedef signed   char  INT8S;
typedef unsigned short INT16U;
typedef signed   short INT16S;
typedef unsigned int   INT32U;
typedef signed   int   INT32S;
typedef float          FP32;
typedef double         FP64;


typedef unsigned int   OS_STK;
typedef unsigned int   OS_CPU_SR;

②這部分代碼定義了堆棧的增長(zhǎng)方向,任務(wù)機(jī)切換的宏定義OS_TASK_SW,如果OS_CRITICAL_METHOD被定義為3的話那么進(jìn)出臨界段的宏定義分別為OS_ENTER_CRITICAL和OS_EXIT_CRITICAL,這兩個(gè)函數(shù)都是用匯編語言編寫的

//OS_CRITICAL_METHOD = 1 :直接使用處理器的開關(guān)中斷指令來實(shí)現(xiàn)宏 
//OS_CRITICAL_METHOD = 2 :利用堆棧保存和恢復(fù)CPU的狀態(tài) 
//OS_CRITICAL_METHOD = 3 :利用編譯器擴(kuò)展功能獲得程序狀態(tài)字,保存在局部變量cpu_sr


#define  OS_CRITICAL_METHOD   3     //進(jìn)入臨界段的方法


#if OS_CRITICAL_METHOD == 3
#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();}
#define  OS_EXIT_CRITICAL()   {OS_CPU_SR_Restore(cpu_sr);}
#endif


void       OSCtxSw(void);
void       OSIntCtxSw(void);
void       OSStartHighRdy(void);
void       OSPendSV(void);


#if OS_CRITICAL_METHOD == 3u
OS_CPU_SR  OS_CPU_SR_Save(void);
void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr);
#endif
OS_CPU_EXT INT32U OSInterrputSum;

(3)sys.h文件修改

添加關(guān)于條件編譯的定義,在文件中添加以下代碼即可。

#define SYSTEM_SUPPORT_OS 1

當(dāng)宏定義為1的時(shí)候,編譯器在編譯的時(shí)候會(huì)只編譯滿足條件的代碼,當(dāng)為0時(shí),這部分代碼不會(huì)被編譯。

(4)delay.c文件修改

①添加Sys_Tick中斷服務(wù)函數(shù)與函數(shù)定義

#include "includes.h"
//支持UCOSII
#ifdef  OS_CRITICAL_METHOD
#define delay_osrunning    OSRunning              //OS是否運(yùn)行標(biāo)記,0,不運(yùn)行;1,在運(yùn)行
#define delay_ostickspersec  OS_TICKS_PER_SEC            //OS時(shí)鐘節(jié)拍,即每秒調(diào)度次數(shù)
#define delay_osintnesting  OSIntNesting                //中斷嵌套級(jí)別,即中斷嵌套次數(shù)
#endif
//systick中斷服務(wù)函數(shù),使用OS時(shí)用到
void SysTick_Handler()
{
  //OS開始跑了,才執(zhí)行正常的調(diào)度處理
  if( delay_osrunning==1 )
  {
    OSIntEnter() ;                        //進(jìn)入中斷
    OSTimeTick() ;                      //調(diào)用ucos的時(shí)鐘服務(wù)程序
    OSIntExit() ;                        //觸發(fā)任務(wù)切換軟中斷
  }
}

②時(shí)鐘初始化函數(shù)修改

void SysTick_Init( u8 SYSCLK )
{
#if SYSTEM_SUPPORT_OS
  u32 reload;
#endif
   SysTick->CTRL &= ~( 1<<2 ) ;                  //SYSTICK使用外部時(shí)鐘源
  fac_us = SYSCLK/8 ;                      //fac_us都需要使用
#if SYSTEM_SUPPORT_OS
  reload = SYSCLK/8 ;                      //每秒鐘的計(jì)數(shù)次數(shù),單位為K     
  reload *= 1000000/delay_ostickspersec ;              //根據(jù)delay_ostickspersec設(shè)定溢出時(shí)間
  fac_ms = 1000/delay_ostickspersec ;                //代表OS可以延時(shí)的最少單位
  SysTick->CTRL |= 1<<1 ;                    //開啟SYSTICK中斷
  SysTick->LOAD = reload ;                    //每1/delay_ostickspersec秒中斷一次
  SysTick->CTRL |= 1<<0 ;                    //開啟SYSTICK
#else
  fac_ms = ( u16 )fac_us*1000 ;                  //代表每個(gè)ms需要的systick時(shí)鐘數(shù)
#endif
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6023

    文章

    44376

    瀏覽量

    628449
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6545

    瀏覽量

    122747
  • uCOS-Ⅱ
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    8581
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ucos-II入門學(xué)習(xí)(基于cortex-M3

    ucos-II入門學(xué)習(xí)(基于cortex-M3
    發(fā)表于 08-12 17:41

    快速實(shí)現(xiàn)STM32移植ucos-ii

    快速實(shí)現(xiàn)STM32移植ucos-ii,歡迎大家一起學(xué)習(xí)[groupid=618]單片機(jī)項(xiàng)目開發(fā)設(shè)計(jì)群[/groupid]
    發(fā)表于 08-08 16:28

    UCOS-II系統(tǒng)移植問題

    這幾天剛剛開始學(xué)習(xí)UCOS-II系統(tǒng)移植,我用的是野火開發(fā)板。資料上說是對(duì)startup_stm32f10x_hd.s 文件進(jìn)行修改,但是我
    發(fā)表于 09-12 12:27

    對(duì)uCOS-II理解和學(xué)習(xí)路線

    最近為啦準(zhǔn)備嵌入式比賽,重拾stm32學(xué)習(xí)。再次學(xué)習(xí)也算基本掌握查看調(diào)用STM32固件庫v3.5啦,覺得這才算入門
    發(fā)表于 08-23 09:15

    ucOS-II入門經(jīng)典教程

    ucOS-II入門經(jīng)典教程,ucOS-II入門經(jīng)典教程
    發(fā)表于 11-06 10:07 ?0次下載

    盤古STM32F103開發(fā)板移植uCOS-II詳細(xì)說明

    盤古STM32F103開發(fā)板移植uCOS-II詳細(xì)說明
    發(fā)表于 03-02 17:29 ?13次下載

    STM32平臺(tái)移植uCOS-II詳細(xì)說明-2012.11.13

    STM32平臺(tái)移植uCOS-II詳細(xì)說明-2012.11.13
    發(fā)表于 03-04 15:31 ?12次下載

    ucos-ii中文書籍

    ucos-ii中文書(邵貝貝).rar 入門經(jīng)典書籍
    發(fā)表于 03-11 11:02 ?6次下載

    ucOS-II入門經(jīng)典教程

    ucOS-II入門經(jīng)典教程,感興趣可以看看。
    發(fā)表于 07-25 18:52 ?45次下載

    uCOS-ii中文書

    學(xué)習(xí)uCOS-ii的最好中文教材,uCOS-ii中文書(邵貝貝)
    發(fā)表于 08-24 18:31 ?0次下載

    uCOS-II原理1

    原理uCOS-II
    發(fā)表于 12-20 22:58 ?5次下載

    uCOS-II原理2

    uCOS-II原理2
    發(fā)表于 12-20 22:53 ?0次下載

    uCOS-II原理3

    uCOS-II原理3
    發(fā)表于 12-20 22:52 ?0次下載

    uCOS-II在MSP430移植

    uCOS-II在MSP430移植
    發(fā)表于 10-12 17:24 ?9次下載
    <b class='flag-5'>uCOS-II</b>在MSP430<b class='flag-5'>移植</b>

    手把手盤古STM32開發(fā)板移植uCOS-II教程

    手把手盤古STM32開發(fā)板移植uCOS-II教程
    發(fā)表于 10-16 09:38 ?22次下載