📄 os.c
字号:
//////////////////////////////////////////////////////////////////
//
// Copyright (c) 2006-2010 walnutcy
// All Right Reserved.
//
// $Author walnutcy
// $Email walnutcy@163.com
// $Version v1.0
// $FileName
// $Since
// $Log
//
// DESCRIPTION
//
// History:
// <author> <time> <version > <desc>
// walnutcy 2006-11-22 0.1 建立
//////////////////////////////////////////////////////////////////
#include "os.h"
BOOL isNeedTaskSW;
OS_WALNUT gOs;
U8 gIdleTick;
U8 gIdleStack[25];
U8 gOsIntLevel;
BOOL gOsShedLock;
BOOL gOsMsgIntShed;
///////////////////////////////////////////////
// Name : OsTaskIdle (void)
// Function: 空闲任务
// Author : walnutcy
// Date : 2006-11-23
///////////////////////////////////////////////
void OsTaskIdle (void) REENTRANT
{
gIdleTick = 0;
isNeedTaskSW = 1;
while (1)
{
gIdleTick++;
if (isNeedTaskSW)
{
isNeedTaskSW = 0;
OSTaskSW();
}
// WDT_CONTR = 0x3C;//1.14s WatchDog
}
}
///////////////////////////////////////////////
// Name : OsInit (void)
// Function: OS初始化
// Author : walnutcy
// Date : 2006-11-23
///////////////////////////////////////////////
void OsInit (void) REENTRANT
{
U8 i;
gOs.osPrio = 0x0000;
gOs.taskNum = 0;
gOsIntLevel = 0;
gOsShedLock = 0;
gOsMsgIntShed = 0;
gOs.currTask = OS_TASK_MAX_NUM-1;
for (i=0;i<OS_TASK_MAX_NUM;i++)
{
gOs.tcb[i].state = OS_TASK_NULL;
}
OsTaskCreate((OS_TASK_MAX_NUM-1),OsTaskIdle,(U8)gIdleStack);
}
///////////////////////////////////////////////
// Name : OsInit (void)
// Function: OS初始化
// Author : walnutcy
// Date : 2006-11-23
///////////////////////////////////////////////
U8 OsStackInit (PFUNPROC fun,U8 stack) REENTRANT
{
IU8* stk = stack;
*stk++ = ((U16)fun)&0xFF; //PC.L
*stk++ = ((U16)fun)>>8; //PC.H
*stk++ = 0;
*stk++ = 0;
*stk++ = 0;
*stk++ = ((U16)fun)&0xFF; //DPL
*stk++ = ((U16)fun)>>8; //DPH
*stk++ = 0;
*stk++ = 0;
*stk++ = 0;
*stk++ = 0;
*stk++ = 0;
*stk++ = 0;
*stk++ = 0;
*stk = 0;
return stk;
}
///////////////////////////////////////////////
// Name : OsInit (void)
// Function: OS初始化
// Author : walnutcy
// Date : 2006-11-23
///////////////////////////////////////////////
CBOOL OsTaskCreate (U8 prio,PFUNPROC fun,U8 stack) REENTRANT
{
if (OS_TASK_MAX_NUM<=gOs.taskNum)
{ return C_FALSE;
}
if (OS_TASK_MAX_NUM<=prio)
{ return C_FALSE;
}
if (gOs.osPrio&(1<<prio))
{ return C_FALSE;//该优先级任务已经存在
}
EnterCritical();
gOs.osPrio |= (1<<prio);
gOs.taskNum++;
gOs.tcb[prio].state = OS_TASK_RDY;
gOs.tcb[prio].prio = prio;
gOs.tcb[prio].fun = fun;
gOs.tcb[prio].delay = 0;
stack = OsStackInit(fun,stack);
gOs.tcb[prio].sp = stack;
ExitCritical();
return C_TRUE;
}
///////////////////////////////////////////////
// Name : OsInit (void)
// Function: OS初始化
// Author : walnutcy
// Date : 2006-11-23
///////////////////////////////////////////////
void OsStart (void) REENTRANT
{ //启动IDLE任务
gOs.tcb[OS_TASK_MAX_NUM-1].sp -= 14;
gOs.tcb[OS_TASK_MAX_NUM-1].state = OS_TASK_RUN;
SP = gOs.tcb[OS_TASK_MAX_NUM-1].sp;
gOs.tcb[OS_TASK_MAX_NUM-1].fun();
}
///////////////////////////////////////////////
// Name : OsSendMsg (U8 msg)
// Function: 向任务发送消息
// Author : walnutcy
// Date : 2006-11-23
///////////////////////////////////////////////
CBOOL OsSendMsg (U8 msg) REENTRANT
{
if (OS_TASK_MAX_NUM<=msg)
{ return C_FALSE;
}
EnterCritical();
if (gOs.osPrio&(1<<msg))
{
if (OS_TASK_RUN!=gOs.tcb[msg].state)
{
gOs.tcb[msg].state = OS_TASK_RDY;
gOsMsgIntShed = 1;
}
}
ExitCritical();
if (0==gOsIntLevel)
{ gOsMsgIntShed = 0;
OSTaskSW();
}
}
///////////////////////////////////////////////
// Name : OsWaitMsg (void)
// Function: 当前任务一直等待,直到有新消息到
// Author : walnutcy
// Date : 2006-11-23
///////////////////////////////////////////////
void OsWaitMsg (void) REENTRANT
{
EnterCritical();
gOs.tcb[gOs.currTask].state = OS_TASK_WAIT;
ExitCritical();
OSTaskSW();
}
#ifdef OS_KILL
///////////////////////////////////////////////
// Name : OsFreeRes (U8 prio)
// Function: 释放资源(本机资源只有串口,如有其它,需修改)
// Author : walnutcy
// Date : 2006-11-23
///////////////////////////////////////////////
void OsFreeRes (U8 prio)
{
if (UART_PrinterNo()==prio)
{
UARTFreePrinter();
}
}
///////////////////////////////////////////////
// Name : OsTaskKill (U8 prio)
// Function: 杀死任务
// Author : walnutcy
// Date : 2006-11-23
///////////////////////////////////////////////
CBOOL OsTaskKill (U8 prio) REENTRANT
{
if (OS_TASK_MAX_NUM<=prio)
{ return C_FALSE;
}
if (!(gOs.osPrio&(1<<prio)))
{ return C_FALSE;//该优先级任务不存在
}
EnterCritical();
OsFreeRes (prio);
gOs.tcb[prio].state = OS_TASK_NULL;
gOs.taskNum--;
gOs.osPrio &= ~(1<<prio);
ExitCritical();
OSTaskSW();
return C_TRUE;
}
#endif
#ifdef OS_DELAY
///////////////////////////////////////////////
// Name : OsDelay (U8 delay)
// Function: 任务延迟时间(ms)
// Author : walnutcy
// Date : 2006-11-23
///////////////////////////////////////////////
void OsDelay (U8 delay) REENTRANT
{
if (0==delay)
{ return;
}
EnterCritical();
gOs.tcb[gOs.currTask].delay = delay;
gOs.tcb[gOs.currTask].state = OS_TASK_WAIT;
ExitCritical();
OSTaskSW();
}
///////////////////////////////////////////////
// Name : OsDealDelay (void)
// Function: 处理系统时间延迟
// Author : walnutcy
// Date : 2006-11-23
///////////////////////////////////////////////
void OsDealDelay (void) REENTRANT
{
U8 i;
for (i=0;i<OS_TASK_MAX_NUM;i++)
{
if (gOs.osPrio&(1<<i))
{
if (gOs.tcb[i].delay)
{
gOs.tcb[i].delay--;
if (0==gOs.tcb[i].delay)
{ //任务挂起
gOs.tcb[i].state = OS_TASK_RDY;
}
}
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -