task相关函数的功能和用法.docx

上传人:b****5 文档编号:12088246 上传时间:2023-04-17 格式:DOCX 页数:52 大小:37.85KB
下载 相关 举报
task相关函数的功能和用法.docx_第1页
第1页 / 共52页
task相关函数的功能和用法.docx_第2页
第2页 / 共52页
task相关函数的功能和用法.docx_第3页
第3页 / 共52页
task相关函数的功能和用法.docx_第4页
第4页 / 共52页
task相关函数的功能和用法.docx_第5页
第5页 / 共52页
点击查看更多>>
下载资源
资源描述

task相关函数的功能和用法.docx

《task相关函数的功能和用法.docx》由会员分享,可在线阅读,更多相关《task相关函数的功能和用法.docx(52页珍藏版)》请在冰豆网上搜索。

task相关函数的功能和用法.docx

task相关函数的功能和用法

task相关函数的功能和用法

版本号

整理人

整理日期

备注

V1.0

胡军、王雪、张达蔚、

吴旻、张丽丽、白艳滨

2008-7-10

初稿(培训讨论后整理)

1.task_create(byHJ)

·原型:

task_t*task_create(void(*Function)(void*),

 void*Param,

  size_tStackSize,

  intPriority,

  constchar*Name,

  task_flags_tflags);

·参数:

void(*Function)(void*)

指向任务函数的入口即函数名。

void*Param

提供给Function的入口参数,如果参数较多,可以组合成结够体,再提供此结构体的地址作为参数即可。

size_tStackSize

任务所用的栈的大小。

intPriority

创建任务的优先级。

constchar*Name

任务的名称,主要是用来标示任务队列里的不同任务。

task_flags_tflags

关于任务的一些附加信息,一般定义为0,及标示为默认的行为具体如下表:

Taskflags

Taskbehavior

Target

0

创建一个OS20的默认的task.

任何

task_flags_high_priority_process

创建一个高优先级的人进程(在ST20C1中被忽视).

ST20C2

task_flags_suspended

Createthetaskalreadysuspended.

任何

·返回值:

如果创建成功返回指向该结构体的指针,否则返回NULL。

·功能描述:

此函数为创建一个具有给定优先级的任务。

·应用举例:

#include

#include

#include

#include

#include

#defineONE_SECOND100

#defineUSER_PRIORITY1

#defineUSER_WS_SIZE2048

structsig_params

{

semaphore_t*Ready;

intCount;

};

voidsignal_task(void*p)

{

structsig_params*Params=(structsig_params*)p;

intj;

for(j=0;jCount;j++)

{

semaphore_signal(Params->Ready);

task_delay(ONE_SECOND);

}

}

intmain()

{

task_t*Task;

structsig_paramsparams;

Task=task_create(signal_task,¶ms,

USER_WS_SIZE,USER_PRIORITY,"Signal",0);

if(Task==NULL)

{

printf("Error:

create.Unabletocreatetask\n");

exit(EXIT_FAILURE);

}

}

2.task_data(byHJ)

·原型:

void*task_data(task_t*Task);

·参数:

task_t*Task

指向任务接构task_t的指针。

·返回值:

返回任务的数据指针,如果任务为空则返回当前正在运行任务的数据指针。

·功能描述:

此函数调用返回该任务的数据指针。

·应用举例:

#include

#include

#include

#definerunning1

#defineUSER_WS_SIZE2048

#defineUSER_PRIORITY2

task_t*Task1;

voidtask1(void)

{

while(running)

{

task_data(task_t*task1)

task_delay(1000);

}

}

intmain()

{

Task1=task_create((void(*)(void*))task1,

NULL,

USER_WS_SIZE,

USER_PRIORITY,

"low",

0);

printf("task1iscreated!

\n");

if(NULL==Task1)

{

printf("Error:

create.Unabletocreatetask\n");

exit(EXIT_FAILURE);

}

while(running)

{

task_delay(1000);

}

}

 

3.task_data_set(byHJ)

·原型:

void*task_data_set(task_t*Task,void*NewData);

·参数:

task_t*Task

指向任务结构task_t的指针。

void*NewData

新的指向数据的指针。

·返回值:

返回该任务先前的(设置新的数据指针之前)数据指针,如果所设置的任务为空则返回正在运行的任务(此时数据指针已被跟新)之前的数据指针。

·功能描述:

此函数设置任务的新的数据指针如果被设置的任务为空则设置当前正在运行的任务的数据指针。

·应用举例:

#include

#include

#include

#definerunning1

#defineUSER_WS_SIZE2048

#defineUSER_PRIORITY2

task_t*Task1;

voidtask1(void)

{

while(running)

{

task_data_set(Task1,(void*)0x00000001);

task_delay(1000);

}

}

intmain()

{

Task1=task_create(

(void(*)(void*))task1,

NULL,

USER_WS_SIZE,

USER_PRIORITY,

"low",

0);

printf("task1iscreated!

\n");

if(NULL==Task1)

{

printf("Error:

create.Unabletocreatetask\n");

exit(EXIT_FAILURE);

}

while(running)

{

task_delay(1000);

}

}

 

4.task_context(byHJ)

·原型:

task_context_ttask_context(task_t**task,int*level)

·参数:

task_t**task

返回的任务描述。

int*level

返回的中断水平。

·返回值:

一个os20的任务,一个高优先级的进程还是一个中断。

·功能描述:

该函数返回一个被调用上下文的描述,是否为一个任务,一个中断或者一个高优先级的进程,主要有下面三个值来表明:

当为OS20task时,返回task_context_task;

当为interrupthandler时,返回task_context_interrupt;

当为highpriorityprocess对于ST20C2内核时,返回task_context_hpp。

需要说明的是,如果返回的task不为空则说明被调用的是一个os20的任务或者一个高优先级的进程,则相应的task_t信息被写入task所指向的内容,同样的如果level不为空则说明为一个中断,并且中断水平被写入level所指向的单元。

·应用举例:

#include

#include

#include

#definerunning1

#defineUSER_WS_SIZE2048

#defineUSER_PRIORITY2

task_t*Task1;

int*level;

task_context_tcontxt;

voidtask1(void)

{

while(running)

{

contxt=task_context(&Task1,level);

task_delay(1000);

}

}

intmain()

{

Task1=task_create((void(*)(void*))task1,

NULL,

USER_WS_SIZE,

USER_PRIORITY,

"low",

0);

printf("task1iscreated!

\n");

if(NULL==Task1)

{

printf("Error:

create.Unabletocreatetask\n");

exit(EXIT_FAILURE);

}

while(running)

{

task_delay(1000);

}

}

 

5.task_create_sl(byHJ)

·原型:

task_t*task_create_sl(void(*Function)(void*),

  void*Param,

  void*StaticLink,

  size_tStackSize,

  intPriority,

  constchar*Name,

  task_flags_tflags);

·参数:

void*StaticLink

当调用Function是需要用到此静态链接,即程序静态的地址。

其他参数同task_create。

·返回值:

如果创建成功返回指向该结构体的指针,否则返回NULL。

·功能描述:

与task_create()功能相同,不同的是此函数多了个静态链接地址。

6.task_delay(byWX)

·原型:

voidtask_delay(clock_tdelay);

·参数:

clock_tdelay

任务延迟的时间段。

·返回值:

无。

·功能描述:

调用此函数,使任务等待一段指定的时间,这段时间以tick(滴答)为单位,即任务延迟这段时间后才继续执行。

如果给出的时间为负值,则不延迟。

7.task_delay_until(byWX)

·原型:

voidtask_delay_until(clock_tdelay);

·参数:

clock_tdelay

任务延迟到delay指定的时刻再执行。

·返回值:

无。

·功能描述:

调用此函数,使任务等待,直到参数指定的时刻再继续执行。

与task_delay不同,task_delay_until中参数给出的是绝对的时间点。

如果参数中的时刻在当前时刻之前,则不延迟。

6,7这两个函数应用于在一个特定的时刻引起某个事件。

一个高优先级的任务可以等待一段时间,这段时间过后,如果运行着的任务的优先级比他低,他便会抢占使用CPU。

·应用举例:

#include

#include

#include

#include

clock_ttime;

time=time_now();

while

(1)

{

time=time_plus(time,delay);

task_delay_until(time);

initiate_regular_event();

}

8.task_delete(byWX)

·原型:

inttask_delete(task_t*task);

·参数:

task_t*task

指向要删除的task结构体的指针。

·返回值:

int类型,-1表示调用失败;0表示调用成功。

·功能描述:

在任务列表中移除此任务,并且使系统回收其占用的资源。

一个任务只有在结束后才可以被delete,否则task_delete调用会失败。

用task_creat创建的task在使用task_delete后系统自动调用memory_deallocate函数释放所占内存,如果用task_init创建的task,用完task_delete后还需手动释放其所占内存。

9.task_exit(byWX)

·原型:

voidtask_exit(intparam);

·参数:

intparam

自定义的整型数,传递给onexithandler。

·返回值:

无。

·功能描述:

终止当前任务。

任务终止既可以通过函数的返回,也可以通过task_exit调用来实现。

这两种情况下都可以指定退出状态,前一种情况,退出状态即函数的返回值,如果调用task_exit,则退出状态通过参数来指定。

然后这个值被用于onexit_handler函数。

·应用举例:

#include

#include

#include

voidTask1(void)

{

while

(1)

{

debugmessage("task1\n");

debugmessage("task1\n");

debugmessage("task1\n");

debugmessage("task1\n");

debugmessage("task1\n");

debugmessage("task1\n");

debugmessage("task1\n");

debugmessage("task1\n");

debugmessage("task1\n");

debugmessage("task1\n");

task_delay(2000);

task_exit(-1);

}

}

voidTask2(void)

{

while

(1)

{

debugmessage("task2\n");

debugmessage("task2\n");

debugmessage("task2\n");

debugmessage("task2\n");

debugmessage("task2\n");

task_delay(2000);

}

}

intmain(void)

{

task_t*task1,*task2;

task1=task_create((void(*)(void*))Task1,0,1024,7,"Task1",0);

task2=task_create((void(*)(void*))Task2,0,1024,7,"Task2",0);

while

(1)

{

task_delay(20000);

}

}

运行结果:

(先打印10遍task1,以后全是task2)

task1

task1

task1

task1

task1

task1

task1

task1

task1

task1

task2

task2

task2

task2

task2

task2

task2

task2

 

10.task_id(byWX)

·原型:

task_t*task_id(void);

·参数:

无。

·返回值:

返回一个指向当前任务结构体的指针。

·功能描述:

获取当前任务的相关信息。

对于OS20系统中高优先级的任务调用task_id函数,会花费很长的执行时间,而且他也不能被中断服务程序调用。

为了避免这些问题,可以使用task_context函数。

·应用举例:

#include

#include

#include

voidtask_exit(intparam)

{

task_t*Task;

FATAL_ERROR_IF_INTERRUPT();

FATAL_ERROR_IF_LOCKED();

Task=task_id();

task_exit_generic(Task,param,task_exit_flags_safe_exit);

}

 

11.task_kill(byZDW)

·原型:

inttask_kill(task_t*task, intstatus,task_kill_flags_tflags);

·参数:

task_t*task

要被强制终止的task

intstatus

这个task的出口位置

task_kill_flags_tflags

标记

·返回值:

如果task被成功kill掉返回0,否则返回-1 。

·功能描述:

强制终止一个task,kill只会终止task,并不会delete掉task,可以在kill后delete,如下:

voidtidy_up(task_t*task,intstatus)

{

 task_kill(task,status,0);

 task_wait(&task,1,TIMEOUT_INFINITY);

 task_delete(task);

}

·应用举例:

#include

#include"task.h"

#include

inti=0;

voidTask1(void)

{

while(i<50)

{

i++;

debugmessage("task1\n");

task_delay(2000);

}

}

intmain(void)

{

task_t*task;

inta=0;

intkill=0;

task=task_create((void(*)(void*))Task1,0,1024,7,"Task1",0);

while(a<3)

{

task_delay(2000);

a++;

kill=task_kill(task,0,0);

printf("kill=%d\n",kill);

}

}

运行结果:

task1

kill=0

kill=-1

kill=-1

12.task_immortal(byZDW)

·原型:

voidtask_immortal(void);

·参数:

·返回值:

·功能描述:

task_immortal函数可以保护当前task不被kill,如果在task_immortal的同时task_kill,当前task不会马上死掉,直到出现task_mortal后。

·应用举例:

#include

#include"task.h"

#include

inti=0;

voidTask1(void)

{

task_immortal()

while(i<50)

{

i++;

debugmessage("task1\n");

task_delay(2000);

}

}

intmain(void)

{

task_t*task;

inta=0;

intkill=0;

task=task_create((void(*)(void*))Task1,0,1024,7,"Task1",0);

while(a<3)

{

task_delay(2000);

a++;

kill=task_kill(task,0,0);

printf("kill=%d\n",kill);

}

}

运行结果:

task1

kill=0

task1

kill=0

task1

kill=0

(疑问:

为什么kill仍然返回0?

13.task_lock(byZDW)

·原型:

voidtask_lock(void);

·参数:

·返回值:

·功能描述:

让task独占CPU资源。

task_lock函数防止当前task没完成前cpu被其他task抢占。

task_lock被调用时一定要和task_unlock成对使用,否则会产生死锁。

task_lock可以被嵌套使用,但是同时必须相等数量的task_unlock,否则task_lock不会被释放。

·应用举例:

#include"task.h"

#include"debug.h"

inti=0;

voidTask1(void)

{

task_lock();

while(i<50)

{

i++;

debugmessage("task1\n");

}

task_unlock();

}

voidTask2(void)

{

while

(1)

{

debugmessage("task2\n");

}

}

voidmain(void)

{

task_t*task;

task=task_create((void(*)(void*))Task1,0,1024,7,"Task1",0);

task=task_create((

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 成考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1