?? os_core.c
字號(hào):
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSFindNextRunningTask(void)
{
OS_TCB_PRIO *tcbp;
uint8 temp;
temp = OSHighPrio; /* 從優(yōu)先級(jí)OSHighPrio處開始查找 */
tcbp = &(OSTCBPrioTbl[temp]);
while (1)
{
if (tcbp->TcbNext != NULL) /* 相應(yīng)的優(yōu)先級(jí)有任務(wù)就緒 */
{
OSTCBHighRdy = tcbp->TcbNext; /* 獲取將要運(yùn)行的任務(wù)的TCB */
OSHighPrio = temp; /* 設(shè)置下次查找起始點(diǎn) */
if (OSTickCnt == 0) /* 沒(méi)有任務(wù)需要時(shí)間服務(wù)延時(shí) */
if (tcbp->OSTCBDly != 0) /* 新優(yōu)先級(jí)需要輪詢服務(wù) */
{
/* 啟動(dòng)時(shí)間服務(wù) */
OSTickCnt = tcbp->OSTCBDly;
OSTickThisCnt = OSTickCnt;
}
break;
}
tcbp++;
temp++;
}
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函數(shù)名稱: OSCtxSw
** 功能描述: 堆棧處理函數(shù)
** 輸 入: 無(wú)
** 輸 出: 無(wú)
** 作 者: 焦進(jìn)星
** 日 期: 2007年12月30日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSCtxSw(void)
{
asm("PUSH __zero_reg__ \n\t"); //R1入棧
asm("PUSH __tmp_reg__ \n\t"); //R0入棧
asm("PUSH R16 \n\t"); //SREG入棧
asm("PUSH R18 \n\t");
asm("PUSH R19 \n\t");
asm("PUSH R20 \n\t");
asm("PUSH R21 \n\t");
asm("PUSH R22 \n\t");
asm("PUSH R23 \n\t");
asm("PUSH R24 \n\t");
asm("PUSH R25 \n\t");
asm("PUSH R26 \n\t");
asm("PUSH R27 \n\t");
asm("PUSH R30 \n\t");
asm("PUSH R31 \n\t");
asm("OSIntCtxSw : \n\t"); //當(dāng)中斷要求調(diào)度,直接進(jìn)入這里
asm("PUSH R28 \n\t"); //R28與R29入棧(中斷時(shí)未入棧)
asm("PUSH R29 \n\t");
asm("in r28, 0x3d \n\t"); //這四條指令不可省
asm("in r29, 0x3e \n\t");
asm("sbiw r28, 0x01 \n\t");
asm("out 0x3e, r29 \n\t");
asm("out 0x3d, r28 \n\t");
OSTCBCur->OSTCBStkPtr=(uint8 *) SP; //堆棧指針變換
OSTCBCur = OSTCBHighRdy;
SP=(uint16)(OSTCBCur->OSTCBStkPtr);
asm("in r28, 0x3d \n\t");
asm("in r29, 0x3e \n\t");
asm("adiw r28, 0x01 \n\t");
asm("out 0x3e, r29 \n\t");
asm("out 0x3d, r28 \n\t");
//寄存器出棧
asm("POP R28 \n\t"); //這四條指令不可省
asm("POP R29 \n\t");
asm("POP R31 \n\t");
asm("POP R30 \n\t");
asm("POP R27 \n\t");
asm("POP R26 \n\t");
asm("POP R25 \n\t");
asm("POP R24 \n\t");
asm("POP R23 \n\t");
asm("POP R22 \n\t");
asm("POP R21 \n\t");
asm("POP R20 \n\t");
asm("POP R19 \n\t");
asm("POP R18 \n\t");
asm("POP R16 \n\t");
asm("POP __tmp_reg__ \n\t"); //R0 出棧
asm("POP __zero_reg__ \n\t"); //R1 出棧
asm("OUT __SREG__,R16 \n\t"); //恢復(fù)SREG
asm("RET \n\t"); //返回,不主動(dòng)開中斷!!!
//出棧完成
}
/*********************************************************************************************************
** 函數(shù)名稱: OSIntEnter
** 功能描述: 中斷進(jìn)入處理函數(shù)
** 輸 入: 無(wú)
** 輸 出: 無(wú)
** 無(wú)
** 作 者: 焦進(jìn)星
** 日 期: 2007年12月30日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSIntEnter(void)
{
SREGTEMP=*((uint8 * )SP+15); /* 使已入堆棧的SREG置開中斷位 */
SREGTEMP|=0x80;
*((uint8 * )SP+15)=SREGTEMP; /* 中斷入棧13個(gè)加子程序調(diào)用入棧2個(gè) */
OSIntNesting++; /* 中斷嵌套加一 */
sei(); /* 開中斷 */
}
/*********************************************************************************************************
** 函數(shù)名稱: OSIntExit
** 功能描述: 中斷退出處理函數(shù),在此進(jìn)行中斷后的任務(wù)切換
** 輸 入: 無(wú)
** 輸 出: TRUE:需要進(jìn)行任務(wù)切換
** FALSE:不需要進(jìn)行任務(wù)切換
** 作 者: 陳明計(jì)
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 焦進(jìn)星
** 日 期: 2007年12月30日
** 描 述: 移植到AVR系列芯片,適用于atmega16/32等
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSIntExit(void)
{
OS_ENTER_CRITICAL();
OsEnterSum = 0; /* 因?yàn)樵谥袛嘀校躁P(guān)中斷計(jì)數(shù)器為0 */
/* 中斷嵌套處理 */
if (OSIntNesting > 0)
{
OSIntNesting--;
}
if (OSIntNesting == 0)
{
OSFindNextRunningTask();
if (OSTCBCur != OSTCBHighRdy)
{
asm("POP R17 \n\t"); /* 去除因調(diào)用子程序而入棧的PC和因臨界而的入棧的R16 */
asm("POP R17 \n\t");
asm("POP R16 \n\t");
asm("RJMP OSIntCtxSw \n\t"); /* 跳到中斷的調(diào)度 */
}
}
return 0;
}
/*********************************************************************************************************
** 函數(shù)名稱: OSSched
** 功能描述: 非中斷的任務(wù)切換函數(shù)
** 輸 入: 無(wú)
** 輸 出: OS_NO_ERR
** 作 者: 陳明計(jì)
** 日 期: 2005年6月10日
**------------------------------------------------------------------------------------------------------
** 修改人: 焦進(jìn)星
** 日 期: 2007年12月30日
** 描 述: 移植到AVR系列芯片,適用于atmega16/32等
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSSched(void)
{
if (OSIntNesting == 0) /* 是否是中斷中調(diào)用 */
{
OSFindNextRunningTask();
if (OSTCBCur != OSTCBHighRdy)
{
OS_TASK_SW();
}
}
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函數(shù)名稱: SIGNAL(SIG_OVERFLOW0)
** 功能描述: 系統(tǒng)定時(shí)中斷函數(shù)
** 輸 入: 無(wú)
** 輸 出: 無(wú)
** 無(wú)
** 作 者: 焦進(jìn)星
** 日 期: 2007年12月30日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
SIGNAL(SIG_OVERFLOW0)
{
OSIntEnter();
OSTimeTick();
TCNT0=0xDD;
OSIntExit();
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -