task相关函数的功能和用法Word格式.docx
- 文档编号:17816361
- 上传时间:2022-12-10
- 格式:DOCX
- 页数:44
- 大小:37.90KB
task相关函数的功能和用法Word格式.docx
《task相关函数的功能和用法Word格式.docx》由会员分享,可在线阅读,更多相关《task相关函数的功能和用法Word格式.docx(44页珍藏版)》请在冰豆网上搜索。
task_flags_tflags
关于任务的一些附加信息,一般定义为0,及标示为默认的行为具体如下表:
Taskflags
Taskbehavior
Target
创建一个OS20的默认的task.
任何
task_flags_high_priority_process
创建一个高优先级的人进程(在ST20C1中被忽视).
ST20C2
task_flags_suspended
Createthetaskalreadysuspended.
返回值:
如果创建成功返回指向该结构体的指针,否则返回NULL。
功能描述:
此函数为创建一个具有给定优先级的任务。
应用举例:
#include<
stdio.h>
#include<
stdlib.h>
ostime.h>
task.h>
semaphor.h>
#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;
j<
Params->
Count;
j++)
semaphore_signal(Params->
Ready);
task_delay(ONE_SECOND);
}
intmain()
task_t*Task;
structsig_paramsparams;
Task=task_create(signal_task,&
params,
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的指针。
返回任务的数据指针,如果任务为空则返回当前正在运行任务的数据指针。
此函数调用返回该任务的数据指针。
#definerunning1
#defineUSER_PRIORITY2
task_t*Task1;
voidtask1(void)
while(running)
{
task_data(task_t*task1)
task_delay(1000);
}
{
Task1=task_create((void(*)(void*))task1,
NULL,
USER_WS_SIZE,
USER_PRIORITY,
"
low"
0);
printf("
task1iscreated!
\n"
);
if(NULL==Task1)
printf("
exit(EXIT_FAILURE);
while(running)
}
3.task_data_set(byHJ)
void*task_data_set(task_t*Task,void*NewData);
指向任务结构task_t的指针。
void*NewData
新的指向数据的指针。
返回该任务先前的(设置新的数据指针之前)数据指针,如果所设置的任务为空则返回正在运行的任务(此时数据指针已被跟新)之前的数据指针。
此函数设置任务的新的数据指针如果被设置的任务为空则设置当前正在运行的任务的数据指针。
#include<
while(running)
task_data_set(Task1,(void*)0x00000001);
task_delay(1000);
Task1=task_create(
(void(*)(void*))task1,
NULL,
USER_WS_SIZE,
USER_PRIORITY,
"
0);
if(NULL==Task1)
printf("
}
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所指向的单元。
int*level;
task_context_tcontxt;
contxt=task_context(&
Task1,level);
printf("
printf("
exit(EXIT_FAILURE);
while(running)
5.task_create_sl(byHJ)
task_t*task_create_sl(void(*Function)(void*),
void*Param,
void*StaticLink,
task_flags_tflags);
void*StaticLink
当调用Function是需要用到此静态链接,即程序静态的地址。
其他参数同task_create。
与task_create()功能相同,不同的是此函数多了个静态链接地址。
6.task_delay(byWX)
voidtask_delay(clock_tdelay);
clock_tdelay
任务延迟的时间段。
无。
调用此函数,使任务等待一段指定的时间,这段时间以tick(滴答)为单位,即任务延迟这段时间后才继续执行。
如果给出的时间为负值,则不延迟。
7.task_delay_until(byWX)
voidtask_delay_until(clock_tdelay);
任务延迟到delay指定的时刻再执行。
调用此函数,使任务等待,直到参数指定的时刻再继续执行。
与task_delay不同,task_delay_until中参数给出的是绝对的时间点。
如果参数中的时刻在当前时刻之前,则不延迟。
6,7这两个函数应用于在一个特定的时刻引起某个事件。
一个高优先级的任务可以等待一段时间,这段时间过后,如果运行着的任务的优先级比他低,他便会抢占使用CPU。
#include<
ostime.h>
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函数。
stdio.h>
stdlib.h>
task.h>
voidTask1(void)
while
(1)
debugmessage("
task1\n"
task_delay(2000);
task_exit(-1);
voidTask2(void)
task2\n"
}
intmain(void)
task_t*task1,*task2;
task1=task_create((void(*)(void*))Task1,0,1024,7,"
Task1"
task2=task_create((void(*)(void*))Task2,0,1024,7,"
Task2"
while
(1)
task_delay(20000);
运行结果:
(先打印10遍task1,以后全是task2)
task1
task2
…
10.task_id(byWX)
task_t*task_id(void);
返回一个指向当前任务结构体的指针。
获取当前任务的相关信息。
对于OS20系统中高优先级的任务调用task_id函数,会花费很长的执行时间,而且他也不能被中断服务程序调用。
为了避免这些问题,可以使用task_context函数。
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<
debug.h>
#include"
task.h"
inti=0;
voidTask1(void)
while(i<
50)
{
i++;
debugmessage("
task_delay(2000);
intmain(void)
task_t*task;
inta=0;
intkill=0;
task=task_create((void(*)(void*))Task1,0,1024,7,"
while(a<
3)
a++;
kill=task_kill(task,0,0);
kill=%d\n"
kill);
kill=0
kill=-1
12.task_immortal(byZDW)
voidtask_immortal(void);
无
无
task_immortal函数可以保护当前task不被kill,如果在task_immortal的同时task_kill,当前task不会马上死掉,直到出现task_mortal后。
task_immortal()
(疑问:
为什么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不会被释放。
debug.h"
task_lock();
while(i<
i++;
task_unlock();
while
(1)
voidmain(void)
task_t*task;
task=task_create((void(*)(void*))Task1,0,1024,7,"
task=task_create((
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- task 相关 函数 功能 用法