?? rtos.c
字號:
函數功能: 任務等待信號量,掛起
入口參數: Index:信號量序號;Timeout:等待時間
出口參數: 無
有關說明: 當Timeout==0xffff時,為無限等待
創建時間: 2007年3月3日
修改時間:
************************************************************************************************************************/
Uint_8bit OSTaskSemPend(Uint_8bit Index,Uint_16bit Timeout)
{
if(Sem[Index].OSEventState) /*信號量有效 */
{
if(Sem[Index].OSEventType == 0) /*如果為獨占型 */
{
Sem[Index].OSEventState = 0x00; /*信號量被獨占,不可用*/
}
}
else
{ /*加入信號的任務等待表*/
OS_ENTER_CRITICAL();
Sem[Index].OSTaskPendTbl |= 0x01<<OSPrioCur;
TCB[OSPrioCur].OSWaitTick = Timeout; /*定義等待超時 */
OSRdyTbl &= ~(0x01<<OSPrioCur); /*從任務就緒表中去除 */
OS_EXIT_CRITICAL();
OSSched(); /*重新調度 */
if(TCB[OSPrioCur].OSWaitTick==0 ) /*超時,未能拿到資源 */
{
return 0;
}
}
return 1;
}
/************************************************************************************************************************
函數名稱: OSSemPost
函數原型: void OSSemPost(Uint_8bit Index)
函數功能: 發送一個信號量,可以從任務或中斷發送,
* 發送完了信號量之后不進行任務調度,推薦在中斷中調用
入口參數: Index:信號量的序號
出口參數: 無
有關說明: 如果有任務在等待該信號量則將該任務就緒,沒有任務等待則僅僅是把信號量置為有效
創建時間: 2007年3月3日
修改時間:
************************************************************************************************************************/
void OSSemPost(Uint_8bit Index)
{
if(Sem[Index].OSEventType) /*當要求的信號量是共享型 */
{
OS_ENTER_CRITICAL();
Sem[Index].OSEventState=0x01; /*使信號量有效 */
OSRdyTbl |=Sem [Index].OSTaskPendTbl; /*使在等待該信號的所有任務就緒*/
Sem[Index].OSTaskPendTbl=0; /*清空所有等待該信號的等待任務*/
OS_EXIT_CRITICAL();
}
else /*當要求的信號量為獨占型 */
{
Uint_8bit i;
i=0;
while ((i < OS_TASKS) && (!(Sem[Index].OSTaskPendTbl & (0x01<<i))))
{
i++;
/*
找出信號量等待列表中任務優先級最高的任務
*/
}
if(i < OS_TASKS) /*如果有任務需要 */
{
OS_ENTER_CRITICAL();
Sem[Index].OSTaskPendTbl &= ~(0x01<<i); /*從等待表中去除 */
OSRdyTbl |= 0x01<<i; /*任務就緒 */
OS_EXIT_CRITICAL();
}
else /*沒有任務等待該信號量 */
{
Sem[Index].OSEventState = 1; /*使信號量有效 */
}
}
}
/************************************************************************************************************************
函數名稱: OSTaskSemPost
函數原型: void OSTaskSemPost(Uint_8bit Index)
函數功能: 從任務發送一個信號量,并進行調度
入口參數: Index:信號量的序號
出口參數: 無
有關說明: 在任務中調用
創建時間: 2007年3月3日
修改時間:
************************************************************************************************************************/
void OSTaskSemPost(Uint_8bit Index)
{
OSSemPost(Index);
OSSched();
}
/************************************************************************************************************************
函數名稱: OSSemClean
函數原型: void OSSemClean(Uint_8bit Index)
函數功能: 清除一個信號量,只對共享型的有用。 對于獨占型的信號量,在任務占用后,就變得不可以用了
入口參數: Index:信號量的序號
出口參數: 無
有關說明:
創建時間: 2007年3月3日
修改時間:
************************************************************************************************************************/
void OSSemClean(Uint_8bit Index)
{
Sem[Index].OSEventState = 0; /*要求的信號量無效*/
}
/************************************************************************************************************************
函數名稱: TCN0Init
函數原型: void TCN0Init(void)
函數功能: 初始化定時器0
入口參數: 無
出口參數: 無
有關說明: 定時器T0是任務時鐘
創建時間: 2007年3月3日
修改時間:
************************************************************************************************************************/
void TCN0Init(void)
{
TCCR0 = 0;
TCCR0 |= 5; /* 1024預分頻 fout7200hz */
TIMSK |= (1<<TOIE0); /* T0溢出中斷允許 */
TCNT0 = 183; /* 置計數起始值 */
}
/************************************************************************************************************************
函數名稱: OSFindPrioHighRdy
函數原型: void OSFindPrioHighRdy (void)
函數功能: 找出任務就緒表中的最高優先級的任務
入口參數: 無
出口參數: 無
有關說明:
創建時間: 2007年3月7日
修改時間:
************************************************************************************************************************/
void OSFindPrioHighRdy (void)
{
Uint_8bit OSNextTaskPrio;
OSNextTaskPrio = 0;
while ((OSNextTaskPrio < OS_TASKS) && (!(OSRdyTbl & (0x01<<OSNextTaskPrio))))
{
OSNextTaskPrio++;
/*
找出信號量等待列表中任務優先級最高的任務
*/
}
OSPrioHighRdy = OSNextTaskPrio;
}
/************************************************************************************************************************
函數名稱: OSIntEnter
函數原型: void OSIntEnter(void)
函數功能: 進入中斷時調用此函數
入口參數: 無
出口參數: 無
有關說明:
創建時間: 2007年3月7日
修改時間:
************************************************************************************************************************/
void OSIntEnter(void)
{
OS_ENTER_CRITICAL();
if(OSIntNesting<255)
{
OSIntNesting++; /*中斷嵌套加1 */
}
OS_EXIT_CRITICAL();
}
/************************************************************************************************************************
函數名稱: OSIntExit
函數原型: void OSIntExit(void)
函數功能: 從中斷中退出時調用此函數,如果中斷讓更高優先級的任務就緒就進行任務調度
入口參數: 無
出口參數: 無
有關說明: OSIntEnter()和OSIntExit()要成對出現使用
創建時間: 2007年3月7日
修改時間:
************************************************************************************************************************/
void OSIntExit(void)
{
OS_ENTER_CRITICAL();
if(OSIntNesting>0)
{
OSIntNesting--; /*中斷嵌套減1 */
}
if(OSIntNesting == 0)
{
OSFindPrioHighRdy(); /*找出就緒表中優先級最高的任務*/
if(OSPrioHighRdy != OSPrioCur)
{
OS_EXIT_CRITICAL();
IntSwitch(); /*進行任務調度 */
return;
}
}
OS_EXIT_CRITICAL();
}
/************************************************************************************************************************
函數名稱: SIGNAL(SIG_OVERFLOW0)
函數原型: SIGNAL(SIG_OVERFLOW0)
函數功能: 定時器0溢出中斷處理
入口參數: 無
出口參數: 無
有關說明: 用來為需要延時的任務進行任務延時
創建時間: 2007年3月3日
修改時間:
************************************************************************************************************************/
SIGNAL(SIG_OVERFLOW0)
{
OSIntEnter();
char usage;
Uint_8bit i;//uh,ul;
for(i=0;i < OS_TASKS;i++) /*刷新各任務時鐘 */
{
if(TCB[i].OSWaitTick && (TCB[i].OSWaitTick != 0xffff))
{
TCB[i].OSWaitTick--;
if(TCB[i].OSWaitTick == 0) /*當任務時鐘到時,必須是由定時器減時的才行*/
{
OSRdyTbl |= (0x01<<i); /*使任務可以重新運行 */
OSIntSchedReq(); /*中斷中要求切換任務 */
}
}
}
TCNT0=184;
if(timeint++>=200)
{ usage=100-ostimes;
timeint=0;
display_1str(0,0,usage);
ostimes=0;
OSIdleCtr=0;
}
OSIntExit();
}
/************************************************************************************************************************
函數名稱: void IdleTask(void)
函數原型: void IdleTask(void)
函數功能: 空閑任務,當其他任務沒有就緒的時候運行
入口參數: 無
出口參數: 無
有關說明: 系統開始運行的時候是從運行空閑任務開始的。該任務不能刪除
創建時間: 2007年3月3日
修改時間:
************************************************************************************************************************/
void IdleTask(void)
{
OSSched();
while(1)
{
OS_ENTER_CRITICAL();
OSIdleCtr++;
if(OSIdleCtr>1280)
{ostimes++;
OSIdleCtr=0;}
OS_EXIT_CRITICAL();
OSSched();
}
}
/************************************************************************************************************************
函數名稱: OInit
函數原型: void OInit (void)
函數功能: 初始化任務時鐘和一些系統全局變量,建立空閑任務
入口參數: 無
出口參數: 無
有關說明:
創建時間: 2007年3月5日
修改時間:
************************************************************************************************************************/
void OSInit (void)
{
OSRdyTbl=0;
OSIntNesting=0;
ostimes=0;
DDRC|=0x38;
LCD_Init();
settxt();
TCN0Init();
OSTaskCreate(IdleTask,&Stack[Total_Stack_Size-1],OS_TASKS);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -