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

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

3天內不再提示

STM32入門學習筆記之uCOS-II系統(tǒng)移植4

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

首先要做根據(jù)UCOSII中定義的OS_TICKS_PER_SEC來計算出SysTick的裝載值reload,開啟SysTick中斷,將reload值寫進SysTick的LOAD寄存器中,最后開啟SysTick,開啟SysTick后還要編寫其中斷服務函數(shù)。

③微秒級別延時函數(shù)

void delay_us( u16 nus )
{
#if SYSTEM_SUPPORT_OS
  u32 ticks, told, tnow, tcnt=0 ;
  u32 reload = SysTick->LOAD ;                  //LOAD的值
  ticks = nus*fac_us ;                                        //需要的節(jié)拍數(shù)
  OSSchedLock() ;                        //禁止調度,防止打斷us延時
  told = SysTick->VAL ;                                        //剛進入時的計數(shù)器值
  while( 1 )
  {
    tnow = SysTick->VAL ;
    if( tnow!=told )
    {
      //這里注意一下SYSTICK是一個遞減的計數(shù)器
      if( tnowelse
        tcnt += reload-tnow+told ;
      told = tnow ;
      //時間超過/等于要延遲的時間,則退出
      if( tcnt>=ticks )
        break ;
    }
  }
  OSSchedUnlock() ;                        //UCOSII的方式,恢復調度
#else
  u32 temp ;
  SysTick->LOAD = nus*fac_us ;                  //時間加載
  SysTick->VAL = 0x00 ;                      //清空計數(shù)器
  SysTick->CTRL = 0x01 ;                    //開始倒數(shù)
  do
  {
    temp = SysTick->CTRL ;
  }while( ( temp&0x01 )&&!( temp&( 1<<16 ) ) ) ;          //等待時間到達
  SysTick->CTRL = 0x00 ;                    //關閉計數(shù)器
  SysTick->VAL = 0x00 ;                      //清空計數(shù)器
#endif
}

④毫秒級別延時函數(shù)

void delay_ms( u16 nms )
{
#if SYSTEM_SUPPORT_OS
  //如果OS已經在跑了,并且不是在中斷里面(中斷里面不能任務調度)
  if( ( delay_osrunning==1 )&&( delay_osintnesting==0 ) )
  {
    //延時的時間大于OS的最少時間周期
    if( nms>=fac_ms )
      OSTimeDly( nms/fac_ms ) ;                //UCOSII延時
    nms %= fac_ms ;                      //延時太短,采用普通方式延時
  }
  delay_us( ( u32 )( nms*1000 ) ) ;                  //普通方式延時
#else
  u32 temp ;
  SysTick->LOAD = ( u32 )nms*fac_ms ;              //時間加載(SysTick->LOAD為24bit)
  SysTick->VAL = 0x00 ;                      //清空計數(shù)器
  SysTick->CTRL = 0x01 ;                    //開始倒數(shù)
  do
  {
    temp = SysTick->CTRL ;
  }while( ( temp&0x01 )&&!( temp&( 1<<16 ) ) ) ;          //等待時間到達
  SysTick->CTRL = 0x00 ;                    //關閉計數(shù)器
  SysTick->VAL = 0x00 ;                      //清空計數(shù)器
#endif
}

(5)usart1.c文件修改

①添加頭文件定義

#if SYSTEM_SUPPORT_OS

#include "includes.h"

#endif

②修改串口中斷服務函數(shù)

void USART1_IRQHandler()
{
#if SYSTEM_SUPPORT_OS
  OSIntEnter() ;
#endif
  //接收到數(shù)據(jù)
  if( USART1->SR&( 1<<5 ) )
  {
    if( USART1->DR=='\\n' )
    {
      USART1_Data.Len = USART1_Rx_Count ;
      USART1_Rx_Count = 0 ;
      USART1_Data.State = 1 ;
    }
    USART1_Data.Buffer[ USART1_Rx_Count ] = USART1->DR ;
    USART1_Rx_Count ++ ;
  }
#if SYSTEM_SUPPORT_OS
  OSIntExit() ;
#endif
}

23.3 實驗例程

例程:利用移植完成的ucos-ii系統(tǒng)新建兩個任務,并且在兩個任務中打印自定義的任務名稱。

#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "includes.h"
/****************************************************
Name    :Task01
Function  :任務1
Paramater  :None
Return    :None
****************************************************/
#define TASK01_PRIO  7                                          //設置任務優(yōu)先級
#define TASK01_SIZE  64                                          //設置任務堆棧大小
OS_STK TASK01_STK[ TASK01_SIZE ] ;                                    //任務堆棧
void Task01( void *pdata )
{
  while( 1 )
  {
    printf( "Task1 Run\\r\\n" ) ;
    delay_ms( 1000 ) ;
  }
}
/****************************************************
Name    :Task02
Function  :任務2
Paramater  :None
Return    :None
****************************************************/
#define TASK02_PRIO  6                                          //設置任務優(yōu)先級
#define TASK02_SIZE  64                                          //設置任務堆棧大小
OS_STK TASK02_STK[ TASK02_SIZE ] ;                                    //任務堆棧
void Task02( void *pdata )
{
  while( 1 )
  {
    printf( "Task2 Run\\r\\n" ) ;
    delay_ms( 2000 ) ;
  }
}
/****************************************************
Name    :Start
Function  :開始任務
Paramater  :None
Return    :None
****************************************************/
#define START_PRIO  10                                          //開始任務的優(yōu)先級設置為最低
#define START_SIZE  64                                          //設置任務堆棧大小
OS_STK START_STK[ START_SIZE ] ;                                    //任務堆棧
void Start( void *pdata )
{
    OS_CPU_SR cpu_sr=0 ;
  pdata = pdata ;
    OS_ENTER_CRITICAL() ;                                        //進入臨界區(qū)(無法被中斷打斷)
   OSTaskCreate( Task01, ( void * )0, ( OS_STK* )&TASK01_STK[ TASK01_SIZE-1 ], TASK01_PRIO ) ;
   OSTaskCreate( Task02, ( void * )0, ( OS_STK* )&TASK02_STK[ TASK02_SIZE-1 ], TASK02_PRIO ) ;
  OSTaskSuspend( START_PRIO ) ;                                    //掛起起始任務
  OS_EXIT_CRITICAL() ;                                        //退出臨界區(qū)(可以被中斷打斷)
}
/****************************************************
Name    :Main
Function  :主函數(shù)
Paramater  :None
Return    :None
****************************************************/
int main()
{
   STM32_Clock_Init( 9 ) ;                                        //系統(tǒng)時鐘設置
  SysTick_Init( 72 ) ;                                        //延時初始化
  USART1_Init( 72, 115200 ) ;                                      //串口初始化為115200
  OSInit() ;
   OSTaskCreate( Start, ( void * )0, ( OS_STK * )&START_STK[ START_SIZE-1 ], START_PRIO ) ;      //創(chuàng)建起始任務
  OSStart() ;
   while( 1 ) ;
}

將程序下載進單片機,打開串口助手可以看到以下的效果。

圖片

通過時間可以看出,Task2的任務2s打印一次數(shù)據(jù),Task1的任務1s打印一次數(shù)據(jù),和我們程序所寫一致,所以說明UCOS-II系統(tǒng)移植成功。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6030

    文章

    44491

    瀏覽量

    632029
  • 操作系統(tǒng)

    關注

    37

    文章

    6689

    瀏覽量

    123142
  • uCOS-Ⅱ
    +關注

    關注

    0

    文章

    9

    瀏覽量

    8581
收藏 人收藏

    評論

    相關推薦

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

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

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

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

    uCOS-II理解和學習路線

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

    掌握移植uCOS-II的規(guī)范方法

    本文的目的是希望讀者能夠通過本文的內容掌握移植uCOS-II 的規(guī)范方法。如果只是需要移植文件,可以直接去Micriμm的官網(wǎng)上下載。移植uCOS-
    發(fā)表于 08-23 08:50

    ucOS-II入門經典教程

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

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

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

    STM32平臺移植uCOS-II詳細說明-2012.11.13

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

    ucos-ii中文書籍

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

    ucOS-II入門經典教程

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

    uCOS-ii中文書

    學習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次下載