函数指针实现任务的调度

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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!

相关文档
最新文档