/****************************************Copyright (c)****************************************************
** ZLG-MCU Development Co., LTD.
**
** http://www.zlgmcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: tiny_os_51_core.c
** Latest modified Date: 2009-11-13
** Latest Version: 1.3
** Descriptions: TinyOs51教学操作系统内核管理代码
** 编译工具为SDCC,主要编译参数为:小模式、所有函数编译成可重入、
** 整形和长整型编译成可重入
**--------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2009-11-12
** Version: 1.0b
** Descriptions: The original version
**--------------------------------------------------------------------------------------------------------
** Modified by: Chenmingji
** Modified date: 2009-11-13
** Version: 1.0
** Descriptions: 用自编写的setjmp()、longjmp()函数替代相应的库函数。
**--------------------------------------------------------------------------------------------------------
** Modified by: Chenmingji
** Modified date: 2009-11-13
** Version: 1.1
** Descriptions: 把协作式多任务更新为时间片轮询式多任务。
**--------------------------------------------------------------------------------------------------------
** Modified by: Chenmingji
** Modified date: 2009-11-13
** Version: 1.2
** Descriptions: 增加信号量处理
**--------------------------------------------------------------------------------------------------------
** Modified by: Chenmingji
** Modified date: 2009-11-13
** Version: 1.3
** Descriptions: 增加消息邮箱处理
*********************************************************************************************************/
#include ".\tiny_os_51_cfg.h"
#include ".\tiny_os_51.h"
/*********************************************************************************************************
任务状态
*********************************************************************************************************/
#define __TN_TASK_FLG_DEL 0x00 /* 任务被删除 */
#define __TN_TASK_FLG_RDY 0x01 /* 任务就绪 */
#define __TN_TASK_FLG_DLY 0x02 /* 任务延时 */
#define __TN_TASK_FLG_SEM 0x04 /* 任务等待信号量 */
#define __TN_TASK_FLG_MSG 0x08 /* 任务等待消息邮箱 */
/*********************************************************************************************************
任务控制块
*********************************************************************************************************/
struct tn_os_tcb {
jmp_buf jbTaskContext; /* 任务上下文 */
unsigned char ucTaskStat; /* 任务状态 */
unsigned int uiTicks; /* 任务延时时间 */
data void *pvEvent; /* 等待的事件 */
};
typedef struct tn_os_tcb TN_OS_TCB;
/*********************************************************************************************************
全局变量定义
*********************************************************************************************************/
static data TN_OS_TCB __GtcbTasks[TN_OS_MAX_TASKS]; /* 任务控制块数组 */
static data TN_OS_TASK_HANDLE __GthTaskCur; /* 当前任务句柄 */
code unsigned char __GucVer = 13; /* TinyOS51版本 */
/*********************************************************************************************************
** Function name: tnOsInit
** Descriptions: 操作系统初始化
** input parameters: none
** output parameters: none
** Returned value: none
*********************************************************************************************************/
void tnOsInit (void)
{
TN_OS_TASK_HANDLE thTask; /* 操作的任务 */
for (thTask = 0; thTask < TN_OS_MAX_TASKS; thTask++) {
__GtcbTasks[thTask].ucTaskStat = __TN_TASK_FLG_DEL; /* 任务处于删除状态 */
__GtcbTasks[thTask].uiTicks = 0; /* 无限延时 */
__GtcbTasks[thTask].pvEvent = (data void *)0; /* 无等待事件 */
}
__GthTaskCur = 0; /* 初始任务为0号任务 */
}
/*********************************************************************************************************
** Function name: tnOsStart
** Descriptions: 启动操作系统
** input parameters: none
** output parameters: none
** Returned value: none
*********************************************************************************************************/
void tnOsStart (void)
{
EA = 1; /* 允许中断 */
longjmp(__GtcbTasks[0].jbTaskContext); /* 执行0号任务 */
}
/*********************************************************************************************************
** Function name: __tnOsSched
** Descriptions: 任务调度:执行下一个任务
** input parameters: none
** output parameters: none
** Returned value: none
*********************************************************************************************************/
static void __tnOsSched (void)
{
TN_OS_TASK_HANDLE thTask; /* 操作的任务 */
char cTmp1;
TN_OS_TASK_HANDLE thTmp2;
volatile data char *pucTmp3 = (void *)0;
thTmp2 = __GthTaskCur;
/*
* 执行下一个任务
*/
EA = 0;
for (thTask = 0; thTask < TN_OS_MAX_TASKS; thTask++) {
thTmp2++;
if (thTmp2 >= TN_OS_MAX_TASKS) {
thTmp2 = 0;
}
if ((__GtcbTasks[thTmp2].ucTaskStat & __TN_TASK_FLG_RDY) != 0) {
cTmp1 = setjmp(__GtcbTasks[__GthTaskCur].jbTaskContext); /* 保存当前任务上下文 */
if (cTmp1 == 0) {
__GthTaskCur = thTmp2;
longjmp(__GtcbTasks[thTmp2].jbTaskContext); /* 执行指定任务 */
}
EA = 1;
return;
}
}
EA = 1;
/*
* 等待本任务就绪
*/
pucTmp3 = (volatile data char *)(&(__GtcbTasks[thTmp2].ucTaskStat));
while ((*pucTmp3 & __TN_TASK_FLG_RDY) == 0) {
}
}
/*********************************************************************************************************
** Function name: tnOsTaskCreate
** Descriptions: 创建任务
** input parameters: pfuncTask: 任务函数
** pucStk: 堆栈位置,堆栈至少要16个字节
** output parameters: none
** Returned value: 任务句柄, -1为失败
********************************************************************************************