/*******filename:xiaohw*****
author:xiaohw
Datetime:20090324 21:58
***********/
#include<windows.h>
#include "MMSystem.h"
#include "setjmptest.h"
#include<stdio.h>
#define TIMER_INTERVAL 10
#define TIMER_ACCURACY 1
task_manage GloablMyTaskManage;
MMRESULT g_timer_wid;
void main();
void CALLBACK mtimer_task(UINT wTimerID,UINT nMsg,DWORD dwUser,DWORD dw1,DWORD dw2)
{
unsigned char i;
for(i=0;i<=MAXTASK-1;i++)
{
if(DELAY==GloablMyTaskManage.taskTcp[i].status)
{
GloablMyTaskManage.taskTcp[i].sleepTimeCount= (GloablMyTaskManage.taskTcp[i].sleepTimeCount-10)>0 ?(GloablMyTaskManage.taskTcp[i].sleepTimeCount-10):0;
}
}
}
void mtimer_sys_init()
{
g_timer_wid= timeSetEvent(TIMER_INTERVAL, TIMER_ACCURACY, mtimer_task, NULL, TIME_PERIODIC );
}
TASKID FindNextReadTask()/****查找下个应该运行的任务******/
{
unsigned char i;
for(i=0;i<=MAXTASK-1;i++)/**向后查找(优先级低)**/
{
if(READY==GloablMyTaskManage.taskTcp[i].status||AWAKENING==GloablMyTaskManage.taskTcp[i].status)
{
return i;
}
if((DELAY==GloablMyTaskManage.taskTcp[i].status)&&(0==GloablMyTaskManage.taskTcp[i].sleepTimeCount))
{
return i;
}
}
return MAXTASK-1;
}
void InitTaskManage()/***初始化任务管理器,将main函数作为最低优先级的任务****/
{
int i=0;
GloablMyTaskManage.taskTcp[MAXTASK-1].status=READY;
GloablMyTaskManage.taskTcp[MAXTASK-1].sleepTimeCount=0;
GloablMyTaskManage.taskTcp[MAXTASK-1].TaskFunction=main;
for(;i<=MAXTASK-2;i++)
{
GloablMyTaskManage.taskTcp[i].status=DELETED;
GloablMyTaskManage.taskTcp[i].sleepTimeCount=0;
GloablMyTaskManage.taskTcp[i].TaskFunction=NULL;
}
GloablMyTaskManage.curRunTaskID=MAXTASK-1;
}
TASKID CreatMyTask(FUNCTASK fun,unsigned char priority)/****创建任务***/
{
if(priority>=(MAXTASK-1)||priority<0)
{
return -1;
}
if(GloablMyTaskManage.taskTcp[priority].status!=DELETED)
{
return -1;
}
GloablMyTaskManage.taskTcp[priority].sleepTimeCount=0;
GloablMyTaskManage.taskTcp[priority].status=READY;
GloablMyTaskManage.taskTcp[priority].TaskFunction=fun;
return priority;
}
int DestoryMyTask(TASKID taskid)/****销毁任务******/
{
if(MAXTASK-1<taskid||taskid<0)
{
return -1;
}
GloablMyTaskManage.taskTcp[taskid].status=DELETED;
GloablMyTaskManage.taskTcp[taskid].sleepTimeCount=0;
GloablMyTaskManage.taskTcp[taskid].TaskFunction=NULL;
return 1;
}
void MyTaskSleep(unsigned int mstime)
{
unsigned char temp;
GloablMyTaskManage.taskTcp[GloablMyTaskManage.curRunTaskID].status=DELAY;
GloablMyTaskManage.taskTcp[GloablMyTaskManage.curRunTaskID].sleepTimeCount=mstime;
temp=FindNextReadTask();
GloablMyTaskManage.curRunTaskID=temp;
if(DELAY==GloablMyTaskManage.taskTcp[temp].status||AWAKENING==GloablMyTaskManage.taskTcp[temp].status)/***唤起和延时的任务,使用跳转***/
{
longjmp(GloablMyTaskManage.taskTcp[temp].Task_Env,0);
}
else if(READY==GloablMyTaskManage.taskTcp[temp].status)/**就绪的任务是第一次调用,直接执行他的功能函数***/
{
(GloablMyTaskManage.taskTcp[temp].TaskFunction)();
}
else
{
printf("temp=%d\n",temp);
printf("error\n");
}
}
void MyTaskSuspend()/****任务自身挂起****/
{
unsigned char temp;
GloablMyTaskManage.taskTcp[GloablMyTaskManage.curRunTaskID].status=SUSPEND;
temp=FindNextReadTask();
GloablMyTaskManage.curRunTaskID=temp;
if(DELAY==GloablMyTaskManage.taskTcp[temp].status)
{
longjmp(GloablMyTaskManage.taskTcp[temp].Task_Env,0);
}
else if(READY==GloablMyTaskManage.taskTcp[temp].status)
{
printf("exec\n");
(GloablMyTaskManage.taskTcp[temp].TaskFunction)();
}
else
{
printf("temp=%d\n",temp);
printf("error\n");
}
}
int MyTaskResume(TASKID taskid)/*****唤醒任务*****/
{
if(SUSPEND==GloablMyTaskManage.taskTcp[GloablMyTaskManage.curRunTaskID].status)
{
GloablMyTaskManage.taskTcp[GloablMyTaskManage.curRunTaskID].status=AWAKENING;
return 1;
}
return -1;
}
void task1()
{
while (1) {
if(setjmp(GloablMyTaskManage.taskTcp[GloablMyTaskManage.curRunTaskID].Task_Env)==0)
{
MyTaskSleep(100);
}
else
{
printf("task1\n");
continue;
}
}
}
void task2()
{
while (1) {
if(setjmp(GloablMyTaskManage.taskTcp[GloablMyTaskManage.curRunTaskID].Task_Env)==0)
{
MyTaskSleep(100);
}
else
{
printf("task2\n");
continue;
}
}
}
void task3()
{
while (1) {
if(setjmp(GloablMyTaskManage.taskTcp[GloablMyTaskManage.curRunTaskID].Task_Env)==0)
{
MyTaskSleep(100);
}
else
{
printf("task3\n");
continue;
}
}
}
void main()
{
TASKID task1ID,task2ID,task3ID;
InitTaskManage();
mtimer_sys_init();
task1ID=CreatMyTask(task1,3);
task2ID=CreatMyTask(task2,2);
task3ID=CreatMyTask(task3,5);
while (1) {
if(setjmp(GloablMyTaskManage.taskTcp[GloablMyTaskManage.curRunTaskID].Task_Env)==0)
{
MyTaskSleep(100);
}
else
{
continue;
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
使用setjmp,longjmp函数模拟多任务实时操作系统
共14个文件
pdb:2个
dsp:1个
cpp:1个
4星 · 超过85%的资源 需积分: 50 11 下载量 87 浏览量
2009-03-24
22:00:43
上传
评论
收藏 181KB RAR 举报
温馨提示
使用c标准库里面的setjmp,longjmp来模拟嵌入式操作系统中的任务。可以在单线程里面运行多个任务。在vc6.0中调试通过。对深入了解嵌入式多任务环境很有帮助
资源推荐
资源详情
资源评论
收起资源包目录
setjmp.rar (14个子文件)
setjmp
setjmp.dsw 535B
setjmp.dsp 4KB
setjmptest.h 1KB
setjmp.ncb 153KB
Debug
setjmp.ilk 70KB
vc60.pdb 76KB
setjmp.obj 21KB
vc60.idb 145KB
setjmp.pdb 425KB
setjmp.exe 92KB
setjmp.pch 211KB
setjmp.plg 1KB
setjmp.cpp 5KB
setjmp.opt 48KB
共 14 条
- 1
资源评论
- tyt_xa2012-09-30开阔思路,不错
xioahw
- 粉丝: 31
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功