xenomai 应用开发 1:创建并运行一个实时任务 --WT

一、创建一个实时任务

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);
}
   
   

xenomai 应用开发 1:创建并运行一个实时任务 --WT_第1张图片
由结果可知创建并运行了一个实时任务名叫 “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");
  }
}

在这里插入图片描述

因此可利用此方法可以用于某些场合进行检查错误。

你可能感兴趣的:(嵌入式)