首先要做根據UCOSII中定義的OS_TICKS_PER_SEC來計算出SysTick的裝載值reload,開啟SysTick中斷,將reload值寫進SysTick的LOAD寄存器中,最后開啟SysTick,開啟SysTick后還要編寫其中斷服務函數。
③微秒級別延時函數
void delay_us( u16 nus )
{
#if SYSTEM_SUPPORT_OS
u32 ticks, told, tnow, tcnt=0 ;
u32 reload = SysTick->LOAD ; //LOAD的值
ticks = nus*fac_us ; //需要的節拍數
OSSchedLock() ; //禁止調度,防止打斷us延時
told = SysTick->VAL ; //剛進入時的計數器值
while( 1 )
{
tnow = SysTick->VAL ;
if( tnow!=told )
{
//這里注意一下SYSTICK是一個遞減的計數器
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 ; //清空計數器
SysTick->CTRL = 0x01 ; //開始倒數
do
{
temp = SysTick->CTRL ;
}while( ( temp&0x01 )&&!( temp&( 1<<16 ) ) ) ; //等待時間到達
SysTick->CTRL = 0x00 ; //關閉計數器
SysTick->VAL = 0x00 ; //清空計數器
#endif
}
④毫秒級別延時函數
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 ; //清空計數器
SysTick->CTRL = 0x01 ; //開始倒數
do
{
temp = SysTick->CTRL ;
}while( ( temp&0x01 )&&!( temp&( 1<<16 ) ) ) ; //等待時間到達
SysTick->CTRL = 0x00 ; //關閉計數器
SysTick->VAL = 0x00 ; //清空計數器
#endif
}
(5)usart1.c文件修改
①添加頭文件定義
#if SYSTEM_SUPPORT_OS
#include "includes.h"
#endif
②修改串口中斷服務函數
void USART1_IRQHandler()
{
#if SYSTEM_SUPPORT_OS
OSIntEnter() ;
#endif
//接收到數據
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系統新建兩個任務,并且在兩個任務中打印自定義的任務名稱。
#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "includes.h"
/****************************************************
Name :Task01
Function :任務1
Paramater :None
Return :None
****************************************************/
#define TASK01_PRIO 7 //設置任務優先級
#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 //設置任務優先級
#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 //開始任務的優先級設置為最低
#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() ; //進入臨界區(無法被中斷打斷)
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() ; //退出臨界區(可以被中斷打斷)
}
/****************************************************
Name :Main
Function :主函數
Paramater :None
Return :None
****************************************************/
int main()
{
STM32_Clock_Init( 9 ) ; //系統時鐘設置
SysTick_Init( 72 ) ; //延時初始化
USART1_Init( 72, 115200 ) ; //串口初始化為115200
OSInit() ;
OSTaskCreate( Start, ( void * )0, ( OS_STK * )&START_STK[ START_SIZE-1 ], START_PRIO ) ; //創建起始任務
OSStart() ;
while( 1 ) ;
}
將程序下載進單片機,打開串口助手可以看到以下的效果。
通過時間可以看出,Task2的任務2s打印一次數據,Task1的任務1s打印一次數據,和我們程序所寫一致,所以說明UCOS-II系統移植成功。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
單片機
+關注
關注
6032文章
44521瀏覽量
633129 -
操作系統
+關注
關注
37文章
6742瀏覽量
123194 -
uCOS-Ⅱ
+關注
關注
0文章
9瀏覽量
8585
發布評論請先 登錄
相關推薦
UCOS-II系統移植問題
這幾天剛剛開始學習UCOS-II系統移植,我用的是野火開發板。資料上說是對startup_stm32f10x_hd.s 文件進行修改,但是我
發表于 09-12 12:27
掌握移植uCOS-II的規范方法
本文的目的是希望讀者能夠通過本文的內容掌握移植uCOS-II 的規范方法。如果只是需要移植文件,可以直接去Micriμm的官網上下載。移植uCOS-
發表于 08-23 08:50
評論