首先要做根據(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)移植成功。
-
單片機
+關注
關注
6030文章
44491瀏覽量
632029 -
操作系統(tǒng)
+關注
關注
37文章
6689瀏覽量
123142 -
uCOS-Ⅱ
+關注
關注
0文章
9瀏覽量
8581
發(fā)布評論請先 登錄
相關推薦
評論