?? os_cpu_c.c
字號(hào):
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機(jī)發(fā)展有限公司
** 研 究 所
** 產(chǎn)品一部
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: os_cpu_c.c
**創(chuàng) 建 人: 陳明計(jì)
**最后修改日期: 2003年7月8日
**描 述: μCOS-II在lpc210x上的移植代碼C語(yǔ)言部分,包括任務(wù)堆棧初始化代碼和鉤子函數(shù)等
** 用ads1.2編譯,必須使用ARM方式編譯
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: 陳明計(jì)
** 版 本: 1.0
** 日 期: 2003年6月5日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陳明計(jì)
** 版 本: 1.1
** 日 期: 2003年6月13日
** 描 述: 增加函數(shù)IsrEnIRQ,使函數(shù)OSTaskStkInit代碼更簡(jiǎn)潔
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陳明計(jì)
** 版 本: 1.2
** 日 期: 2003年6月19日
** 描 述: 增加軟中斷服務(wù)函數(shù)
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陳明計(jì)
** 版 本: 1.3
** 日 期: 2003年7月8日
** 描 述: 去除不必要的函數(shù)IsrEnIRQ
**
**--------------當(dāng)前版本修訂------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define OS_CPU_GLOBALS
#include "config.h"
/*********************************************************************************************************
** 函數(shù)名稱: OSTaskStkInit
** 功能描述: 任務(wù)堆棧初始化代碼,本函數(shù)調(diào)用失敗會(huì)使系統(tǒng)崩潰
** 輸 入: task : 任務(wù)開(kāi)始執(zhí)行的地址
** pdata :傳遞給任務(wù)的參數(shù)
** ptos :任務(wù)的堆棧開(kāi)始位置
** opt :附加參數(shù),當(dāng)前版本對(duì)于本函數(shù)無(wú)用,具體意義參見(jiàn)OSTaskCreateExt()的opt參數(shù)
** 輸 出: 棧頂指針位置
** 全局變量:
** 調(diào)用模塊:
**
** 作 者: 陳明計(jì)
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陳明計(jì)
** 日 期: 2003年6月13日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
opt = opt; /* 'opt' 沒(méi)有使用。作用是避免編譯器警告 */
stk = ptos; /* 獲取堆棧指針 */
/* 建立任務(wù)環(huán)境,ADS1.2使用滿遞減堆棧 */
*stk = (OS_STK) task; /* pc */
*--stk = (OS_STK) task; /* lr */
*--stk = 0; /* r12 */
*--stk = 0; /* r11 */
*--stk = 0; /* r10 */
*--stk = 0; /* r9 */
*--stk = 0; /* r8 */
*--stk = 0; /* r7 */
*--stk = 0; /* r6 */
*--stk = 0; /* r5 */
*--stk = 0; /* r4 */
*--stk = 0; /* r3 */
*--stk = 0; /* r2 */
*--stk = 0; /* r1 */
*--stk = (unsigned int) pdata; /* r0,第一個(gè)參數(shù)使用R0傳遞 */
*--stk = (USER_USING_MODE|0x00); /* spsr,允許 IRQ, FIQ 中斷 */
*--stk = 0; /* 關(guān)中斷計(jì)數(shù)器OsEnterSum; */
return (stk);
}
/*********************************************************************************************************
** 函數(shù)名稱: SWI_Exception
** 功能描述: 軟中斷異常處理程序,提供一些系統(tǒng)服務(wù)
**
** 輸 入: SWI_Num:功能號(hào)
** Regs[0] 為第一個(gè)參數(shù),也是返回值
** Regs[1] 為第二個(gè)參數(shù)
** Regs[2] 為第三個(gè)參數(shù)
** Regs[3] 為第四個(gè)參數(shù)
** 輸 出: 根據(jù)功能而定
**
** 全局變量: 無(wú)
** 調(diào)用模塊: 無(wú)
**
** 作 者: 陳明計(jì)
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陳明計(jì)
** 日 期: 2003年6月19日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陳明計(jì)
** 日 期: 2003年6月24日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if OS_SELF_EN > 0
extern int const _OSFunctionAddr[];
extern int const _UsrFunctionAddr[];
#endif
void SWI_Exception(int SWI_Num, int *Regs)
{
OS_TCB *ptcb;
switch(SWI_Num)
{
//case 0x00: /* 任務(wù)切換函數(shù)OS_TASK_SW,參考o(jì)s_cpu_s.s文件 */
// break;
//case 0x01: /* 啟動(dòng)任務(wù)函數(shù)OSStartHighRdy,參考o(jì)s_cpu_s.s文件 */
// break;
case 0x02: /* 關(guān)中斷函數(shù)OS_ENTER_CRITICAL(),參考o(jì)s_cpu.h文件 */
__asm
{
MRS R0, SPSR
ORR R0, R0, #NoInt
MSR SPSR_c, R0
}
OsEnterSum++;
break;
case 0x03: /* 開(kāi)中斷函數(shù)OS_EXIT_CRITICAL(),參考o(jì)s_cpu.h文件 */
if (--OsEnterSum == 0)
{
__asm
{
MRS R0, SPSR
BIC R0, R0, #NoInt
MSR SPSR_c, R0
}
}
break;
#if OS_SELF_EN > 0
case 0x40:
/* 返回指定系統(tǒng)服務(wù)函數(shù)的地址 */
/* 函數(shù)地址存于數(shù)組_OSFunctionAddr中*/
/* 數(shù)組_OSFunctionAddr需要另外定義 */
/* Regs[0] 為第一個(gè)參數(shù),也是返回值 */
/* Regs[1] 為第二個(gè)參數(shù) */
/* Regs[2] 為第三個(gè)參數(shù) */
/* Regs[3] 為第四個(gè)參數(shù) */
/* 僅有一個(gè)參數(shù)為系統(tǒng)服務(wù)函數(shù)的索引 */
Regs[0] = _OSFunctionAddr[Regs[0]];
break;
case 0x41:
/* 返回指定用戶的服務(wù)函數(shù)的地址 */
/* 函數(shù)地址存于數(shù)組_UsrFunctionAddr中*/
/* 數(shù)組_UsrFunctionAddr需要另外定義 */
/* Regs[0] 為第一個(gè)參數(shù),也是返回值 */
/* Regs[1] 為第二個(gè)參數(shù) */
/* Regs[2] 為第三個(gè)參數(shù) */
/* Regs[3] 為第四個(gè)參數(shù) */
/* 僅有一個(gè)參數(shù)為用戶服務(wù)函數(shù)的索引 */
Regs[0] = _UsrFunctionAddr[Regs[0]];
break;
case 0x42: /* 中斷開(kāi)始處理 */
OSIntNesting++;
break;
case 0x43: /* 判斷中斷是否需要切換 */
if (OSTCBHighRdy == OSTCBCur)
{
Regs[0] = 0;
}
else
{
Regs[0] = 1;
}
break;
#endif
case 0x80: /* 任務(wù)切換到系統(tǒng)模式 */
__asm
{
MRS R0, SPSR
BIC R0, R0, #0x1f
ORR R0, R0, #SYS32Mode
MSR SPSR_c, R0
}
break;
case 0x81: /* 任務(wù)切換到用戶模式 */
__asm
{
MRS R0, SPSR
BIC R0, R0, #0x1f
ORR R0, R0, #USR32Mode
MSR SPSR_c, R0
}
break;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -