📄 os_cpu_c.c
字号:
/*********************************************************************************************************
** Small RTOS 51
** The Real-Time Kernel For Keil c51
**
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
**
** V1.20.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS_CPU_C.C
**创 建 人: 陈明计
**版 本: V1.20.0
**最后修改日期: 2003年8月17日
**描 述: Small RTOS在LPC2104/LPC2105/LPC2106上的移植代码C语言部分
**
**--------------历史版本信息----------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.20.0
** 日 期: 2003年8月13日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_CPU_C
#include "CONFIG.h"
uint32 * OSTsaksStack[OS_MAX_TASKS + 1]; /* 任务堆栈指针 */
/*********************************************************************************************************
** 函数名称: OSCPUInit
** 功能描述: Small RTOS 与系统相关的初始化
** 输 入: 无
** 输 出 : 无
** 全局变量: OSTsaksStack
** 调用模块:
**
** 作 者: 陈明计
** 日 期: 2003年8月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSCPUInit(void)
{
uint8 i;
for (i = 0; i <= OS_MAX_TASKS ; i++)
{
OSTsaksStack[i] = 0;
}
}
/*********************************************************************************************************
** 函数名称: OSTaskStkInit
** 功能描述: 任务堆栈初始化
** 输 入: task: 任务开始地址
** ptos: 堆栈指针
** TaskID: 任务ID
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年8月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSTaskStkInit(void (* task)(void), void *ptos, uint8 TaskID)
{
uint32 *stk;
TaskID = TaskID; /* 'TaskID' 没有使用。作用是避免编译器警告 */
stk = ptos; /* 获取堆栈指针 */
/* 建立任务环境,ADS1.2使用满递减堆栈 */
*stk = (uint32) task; /* pc */
*--stk = (uint32) 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 = 0; /* r0 */
*--stk = (USER_USING_MODE|0x00); /* spsr,允许 IRQ, FIQ 中断 */
*--stk = 0; /* 关中断计数器OsEnterSum; */
OSTsaksStack[TaskID] = stk;
}
/*********************************************************************************************************
** 函数名称: OSTaskStkDel
** 功能描述: 任务堆栈删除
** 输 入: 无
** 输 出 : 无
** 全局变量: OSTsaksStack
** 调用模块: **
** 作 者: 陈明计
** 日 期: 2003年8月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSTaskStkDel(uint8 TaskID)
{
OSTsaksStack[TaskID] = 0;
OSFindNextRunningTask();
}
/*********************************************************************************************************
** 函数名称: SWI_Exception
** 功能描述: 软中断异常处理程序,提供一些系统服务
**
** 输 入: SWI_Num:功能号
** Regs[0] 为第一个参数,也是返回值
** Regs[1] 为第二个参数
** Regs[2] 为第三个参数
** Regs[3] 为第四个参数
** 输 出: 根据功能而定
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年8月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
********************************************************************************************************/
void SWI_Exception(int SWI_Num, int *Regs)
{
uint32 *ptcb;
switch(SWI_Num)
{
//case 0x00: /* 任务切换函数OS_TASK_SW,参考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
}
Os_Enter_Sum++;
break;
case 0x03: /* 开中断函数OS_EXIT_CRITICAL(),参考os_cpu.h文件 */
if (--Os_Enter_Sum == 0)
{
__asm
{
MRS R0, SPSR
BIC R0, R0, #NoInt
MSR SPSR_c, R0
}
}
break;
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;
case 0x82: /* 任务是ARM代码 */
if (Regs[0] <= OS_MAX_TASKS)
{
ptcb = OSTsaksStack[Regs[0]];
if (ptcb != NULL)
{
ptcb[1] &= ~(1 << 5);
}
}
break;
case 0x83: /* 任务是THUMB代码 */
if (Regs[0] <= OS_MAX_TASKS)
{
ptcb = OSTsaksStack[Regs[0]];
if (ptcb != NULL)
{
ptcb[1] |= (1 << 5);
}
}
break;
default:
break;
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -