函数指针实现任务的调度
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数指针实现任务的调度
1、 建立任务
在这里我们定义任务如下:(注:各个任务都是一个过程)
void task0( void )
{
//Do the task
}
void task1( void )
{
//Do the task
}
……
void task7( void )
{
//Do the task
}
……
2、 定义指向函数指针类型
typedef void (*fp)(void);
3、 定义任务队列
#define MAXTASK 8; /*定义最大任务数*/
#define TASKMOD MAXTASK+1; /*定义务数的模*/
fp task_queue[MAXTASK]; /*线性表(数组)实现队列,数组中每个元素为函数指针*/ unsigned char rear =0; /*定义队尾(指针),任务从队尾进入*/
unsigned char front = 0; /*定义队头(指针),任务从队头出去*/
图1:循环队列示意图1
front(空)
rear
注:如图1所示,当rear=front 时表示队列为空,而当front+1=rear 的时候表示队列为满。为了区分空和满在队列我们多定义了一个空间,所以TASKMOD =MAXTASK+1。
4、 任务入队与出对
/*当有一个任务来到的时候,如果任务队列没有满,将任务加入队列尾部。*/ bool task_in(fp task)
{
usingned char p=( rear +1)% TASKMOD;
front rear
图2:循环队列示意图2 图3:循环队列示意图
3
front
if (!p= front)
{
task_queue[rear] = task;
rear = (++rear) % TASKMOD;
return 1;
}
else return 0;
}
/*当需要执行一个任务时,如果任务队列不为空,将队头任务取出并执行*/ bool run_next_task()
{
if (real != front )
{
task_queue[front]();/*执行任务*/
task_queue[front]=0;/*清除执行过的任务*/
front = (++front) % TASKMOD;
return 1;
}
else return 0;
}
5、示例:
/*源文件run.c 生成可执行文件run.exe*/
……
int main(int argc,char* argv[])
{
if(argc<2)
return 0;
for(int i=1;i { if(task_in(argv[i]);) printf(“%s load complete!\n”,argv[i]); else printf(“%s load failed!\n”,argv[i]); } …… for(int i=1;i if(run_next_task()) printf(“%s execute complete!\n”,argv[i]); else printf(“%s execute failed!\n”,argv[i]); } 在命令中输入: run task0 task1 task2; 结果显示(假设情况): task0 load complete! task1 load complete! task2 load complete! …. task0 execute complete! task1 execute complete! task2 execute complete!