/*********************************************************************************************************
* XiaoHuOS
* 实时内核
*
* Copyright faty2009@foxmail.com
* 版权所有
*
* 文件名 : XiaoHuOSCore.ASM
* 作者 : LiuCChong
* 时间 :2017年2月8日 15:24:07
*********************************************************************************************************/
#include "XiaoHuOS.h"
#include "uart.h"
idata OS_STK* OSPrioHighestTaskCur;
idata OS_STK* OSCurrentTaskCur;
idata OS_TASK OSRunning;
idata OS_TCB OSTask_Tcb[MaxTaskNum] = {0};
OS_STK OSTask_Stk[MaxTaskNum][MaxStkSize] = {0}; /* task stacks */
idata OS_TASK OSTask_Rdy_Table = 0x00;
idata OS_TASK OSSuspendedTable = 0x00;
idata OS_TIME OSSysTickCounts = 0x00;
idata uint8 OSCriticalTimes = 0x00;
idata uint8 OSIntNesting = 0x00;
idata OS_TASK OSCurrentTaskID = 0x00;
idata OS_TASK OSIdleTaskID = 0x00;
OS_TASK Task_Ocp_Table = 0x00; // 分配一个任务就在这里标志1,删除在相应位标志0
uint8 TH0R = 0, TL0R = 0;
/*************************************************************************
* 系统节拍设置函数,参数为毫秒数
*************************************************************************/
void getTHL(unsigned char timex)
{
unsigned int tmp = 0;
tmp = (timex * 11059200)/(12*1000);
TH0R = (65536-tmp)/256;
TL0R = (65536-tmp)%256;
}
/*************************************************************************
* 空闲任务,由系统创建的最低优先级,不可挂起,不可删除
*************************************************************************/
void OSIdleTask(void)
{
while(1)
{
// 可添加代码
}
}
/*************************************************************************
* 系统初始化
*************************************************************************/
void OSInit(void)
{
getTHL(1000/OS_TICKS_PER_SECOND);
TMOD &= 0xf0;
TMOD |= 0x01;
TH0 = TH0R;
TL0 = TL0R;
ET0 = 1;
TR0 = 0;
EA = 0;
OSTask_Rdy_Table = 0x00;
Task_Ocp_Table = 0x00;
OSRunning = 0x00;
OSSuspendedTable = 0x00;
OSSysTickCounts = 0x00;
OSCriticalTimes = 0x00;
OSCurrentTaskID = 0x00;
OSIntNesting = 0x00;
OSCreatTask(&OSIdleTaskID, OSIdleTask, 0xff);
}
/*************************************************************************
* 获取最高优先级的就绪任务的 ID
*************************************************************************/
void OSGetHighestPrioTask(OS_TASK* taskID) reentrant
{
uint8 i = 0;
OS_TASK taskPrio = 0xff;
OSEnterCritical();
i = 0;
taskPrio = 0xff;
*taskID = 0;
if(Task_Ocp_Table!=0)
{
while(i<MaxTaskNum)
{
if(OSTask_Rdy_Table&(0x01<<i))
{
if(OSTask_Tcb[i].Task_Prio < taskPrio)
{
taskPrio = OSTask_Tcb[i].Task_Prio;
*taskID = i;
}
}
i++;
}
}
else
*taskID = ERR;
OSExitCritical();
}
/*************************************************************************
* 挂起(暂停)指定 ID 的任务
*************************************************************************/
void OSSuspendTask(OS_TASK taskId) reentrant
{
OSEnterCritical();
if((0x01<<taskId)&OSTask_Rdy_Table) // 指定 ID 的任务是就绪任务
{
OSTask_Rdy_Table &= ~(0x01<<taskId);
OSSuspendedTable |= 0x01<<taskId;
if((taskId == OSCurrentTaskID) && (taskId != OSIdleTaskID)) // 如果挂起的是自身,并且不是空闲任务
{
OSSWExitCritical();
OSTaskSchedule();
}
}
else
OSExitCritical();
}
/*************************************************************************
* 恢复指定 ID 的任务
*************************************************************************/
void OSResumeTask(OS_TASK taskId) reentrant
{
OSEnterCritical();
if((0x01<<taskId)&Task_Ocp_Table)
{
if(OSSuspendedTable &(0x01<<taskId))
{
OSTask_Rdy_Table |= 0x01<<taskId;
OSSuspendedTable &= ~(0x01<<taskId);
}
//OSTaskSchedule();
}
OSExitCritical();
}
/*************************************************************************
* 删除指定 ID 的任务
*************************************************************************/
void OSDeleteTask(OS_TASK taskId) reentrant
{
OSEnterCritical();
if((0x01<<taskId)&Task_Ocp_Table)
{
if(taskId != OSIdleTaskID) // 如果不是空闲任务
{
OSSuspendedTable &= ~(0x01<<taskId);
OSTask_Rdy_Table &= ~(0x01<<taskId);
Task_Ocp_Table &= ~(0x01<<taskId);
if(taskId == OSCurrentTaskID) // 如果删除的是自身
{
OSSWExitCritical();
#ifdef __UART_H__
release_printer(taskId); // 如果不加入uart,这句没用
#endif
OSTaskSchedule();
}
}
}
OSExitCritical();
}
/*************************************************************************
* 初始化任务堆栈,堆栈顺序基于XiaoHuOSCore里的顺序
*************************************************************************/
OS_STK *OSStkInit(void (*pTask)(void) reentrant, OS_STK* ptos) reentrant
{
OS_STK *stk;
stk = ptos; //用户堆栈最低有效地址
*stk++ = 15; //用户堆栈长度
*stk++ = (uint16)pTask & 0xFF; //任务地址低8位
*stk++ = (uint16)pTask >> 8; //任务地址高8位
*stk++ = 0x00;
*stk++ = 0x00;
*stk++ = 0x00;
*stk++ = 0x00;
*stk++ = 0x00;
*stk++ = 0x00;
*stk++ = 0x00;
*stk++ = 0x00;
*stk++ = 0x01;
*stk++ = 0x00;
*stk++ = 0x00;
*stk++ = 0x00;
*stk++ = 0x00;
*stk++ = (uint16) (ptos+MaxStkSize) >> 8; //?C_XBP 仿真堆栈指针高8位
*stk++ = (uint16) (ptos+MaxStkSize) & 0xFF; //?C_XBP 仿真堆栈指针低8位
return ((void *)ptos);
}
/*************************************************************************
* 创建任务,参数分别为:
* 返回的任务ID 任务函数指针 任务优先级
*************************************************************************/
void OSCreatTask(OS_TASK* TaskID, OS_TASK (*pTask)(void) reentrant, OS_TASK TaskPrio) reentrant
{
static uint8 i = 0x00;
OSEnterCritical();
i = 0x00;
while(0x01<<i)
{
if((Task_Ocp_Table&(0x01<<i)) == 0)
break;
i++;
}
if((0x01<<i)==0)
{
TaskID = ERR;
OSExitCritical();
return ; // 没有空位
}
*TaskID = i;
Task_Ocp_Table |= 0x01<<i;
OSTask_Rdy_Table |= 0x01<<i;
OSStkInit((void(*)())pTask,OSTask_Stk[i]);
OSTask_Tcb[i].Task_Stk = OSTask_Stk[i];
OSTask_Tcb[i].Task_Prio = TaskPrio;
OSTask_Tcb[i].Task_Delay = 0;
OSExitCritical();
}
/*************************************************************************
* 任务调度函数
*************************************************************************/
void OSTaskSchedule(void) reentrant
{
static OS_TASK tempTaskID;
OSEnterCritical();
OSGetHighestPrioTask(&tempTaskID);
if(tempTaskID != ERR)
OSCurrentTaskID = tempTaskID;
if(OSRunning == 0) // 任务第一次运行
{
OSCurrentTaskCur = OSTask_Stk[OSCurrentTaskID];
OSPrioHighestTaskCur = OSCurrentTaskCur;
TR0 = 1;
OSSWExitCritical();
OSStartHighPrioTask();
}
else
{
OSPrioHighestTaskCur = OSTask_Stk[OSCurrentTaskID];
OSSWExitCritical();
OSTaskSwitch();
}
OSExitCritical();
}
/***************************************************************
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
小虎OS.rar (24个子文件)
小虎OS
XiaoHuOS_uvproj.bak 14KB
XiaoHuOSCore.lst 17KB
XiaoHuOS.uvproj 14KB
XiaoHuOS.m51 35KB
Resource
XiaoHuOS.c 10KB
XiaoHuOSCore.asm 5KB
UART.h 829B
XiaoHuOS.h 3KB
UART.c 4KB
main.c 2KB
STARTUP.A51 5KB
XiaoHuOS.uvopt 72KB
STARTUP.LST 12KB
main.lst 5KB
XiaoHuOS.lst 20KB
UART.lst 8KB
OutPuts
UART.obj 8KB
XiaoHuOS.obj 21KB
XiaoHuOS_4.plg 822B
XiaoHuOS 33KB
XiaoHuOS.hex 11KB
XiaoHuOSCore.obj 2KB
XiaoHuOS.lnp 153B
main.obj 7KB
共 24 条
- 1
IT刘小虎
- 粉丝: 54
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页