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