1、RT_TASK 结构
当在Xenomai中创建实时任务时,RT_TASK结构将作为引用此任务的描述符。
struct RT_TASK {
uintptr_t handle;
pthread_t thread;
};
任务创建将会通过调用 rt_task_create函数进行创建:
int rt_task_create (RT_TASK *task, const char *name, int stack_size, int priority, int mode)
其中:*task 为指向RT_TASK 类型额结构体指针
*name为创建实时任务的名称
stack_size 新任务使用的堆栈大小
priority 设定任务的优先级,[0–99]
“mode” 是一组影响任务的标志,例如:
T_JOINABLE允许另一个任务在新任务结束时等待。此任务终止后,应调用rt_task_join(),以清除任何资源。
T_LOCK导致新任务在进入rt_task_start()指定的用户任务函数之前锁定该程序。需要从新任务调用rt_task_set_mode(),才能解除此锁。
任务创建过后则需要启动运行这个程序,任务将进入休眠状态则使用函数 rt_task_start()进行任务启动运行:
int rt_task_start (RT_TASK task, void()(void *arg) entry, void *arg)
其中:*task 为指向RT_TASK 类型结构的指针,该结构必须已由对RT_task_create()的调用初始化
“entry” 是此实时任务要执行的任务函数的地址
“arg” 是给任务函数的void类型指针参数
2、RT_TASK_INFO结构
int prio(任务优先级)
struct threadobj_stat stat(任务的状态)
char name [XNOBJECT_NAME_LEN](任务名)
pid_t pid
任务状态描述符,此结构用于保存实时任务的各种静态和运行时信息,这些信息由对rt_task_inquire()的调用填充。
rt_task_inquire()检索有关实时任务的信息,返回有关 Alchemy 任务的各种信息。此函数还可用于探测任务是否存在.
int rt_task_inquire ( RT_TASK * task, RT_TASK_INFO * info )
其中 * task 任务描述符,如果task为空,则返回有关当前任务的信息。注意:如果task为空则必为Alchemy 任务。
info 任务信息将写入的结构的地址
如果任务存在,则返回零。另外,如果信息为非空,则用任务信息填写info结构内容。
二、程序及结果分析
#include
#include
#include
#include
RT_TASK hello_task;
// 任务执行的功能函数
void helloWorld(void *arg)
{
RT_TASK_INFO curtaskinfo;
printf("Hello World!\n");
// 询问当前的任务
rt_task_inquire(NULL,&curtaskinfo);
// 打印出任务的名字
printf("Task name : %s \n", curtaskinfo.name);
}
int main(int argc, char* argv[])
{
char str[10];
printf("start task\n");
sprintf(str,"hello");
/* Create task
* Arguments: &task,
* name,
* stack size (0=default),
* priority,
* mode (FPU, start suspended, ...)
*/
rt_task_create(&hello_task, str, 0, 50, 0);
/* Start task
* Arguments: &task,
* task function,
* function argument
*/
rt_task_start(&hello_task, &helloWorld, 0);
}
由结果可知创建并运行了一个实时任务名叫 “hello” 的任务
Xenomai API为每个函数指定了在发生错误时生成的特定错误,但某些更加常见的错误比如一些函数传递了错误的参数。
但在xenomai 中定义了一个函数,strerror函数:
该函数包含在头文件 #include
strerror函数提供了一种方便的方法来停止程序并打印错误
eg:
我们将上述程序修改一处,使程序发生错误:
将 rt_task_start(&hello_task, &helloWorld, 0);
修改为 rt_task_start(NULL, &helloWorld, 0);
修改后的程序以及打印结果如下所示:
#include
#include
#include
#include
#include
RT_TASK hello_task;
// function to be executed by task
void helloWorld(void *arg)
{
RT_TASK_INFO curtaskinfo;
printf("Hello World!\n");
// inquire current task
rt_task_inquire(NULL,&curtaskinfo);
// print task name
printf("Task name : %s \n", curtaskinfo.name);
}
int main(int argc, char* argv[])
{
char str[10];
int retval;
printf("start task\n");
sprintf(str,"hello");
/* Create task
* Arguments: &task,
* name,
* stack size (0=default),
* priority,
* mode (FPU, start suspended, ...)
*/
rt_task_create(&hello_task, str, 0, 50, 0);
/* Start task
* Arguments: &task,
* task function,
* function argument
*/
// rt_task_start(&hello_task, &helloWorld, 0);
rt_task_start(NULL, &helloWorld, 0);
retval = rt_task_start(NULL, &helloWorld, 0);
if (retval < 0 )
{
printf("task_start error %d : %s\n",-retval,strerror(-retval));
} else {
printf("task_start success\n");
}
}
因此可利用此方法可以用于某些场合进行检查错误。