前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Real-time Xenomai 3 example 1

Real-time Xenomai 3 example 1

原创
作者头像
ZC_Robot机器人技术
发布2020-09-09 18:27:29
2.1K0
发布2020-09-09 18:27:29
举报

Xenomai 3.** have the following contexts

Xenomai
Xenomai
Alchemy API
Alchemy API

1 Creating a task & Starting a task

The exercises are based onXenomai 3using theAlchemy API.The example program below creates and starts a task, see also the task management services of the Alchemy API. The codes are

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

#include <alchemy/task.h>

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];

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

To compile the program ex01.c we use the following Makefile 

XENO_CONFIG := /usr/xenomai/bin/xeno-config

CFLAGS := $(shell $(XENO_CONFIG)   --posix --alchemy --cflags)
LDFLAGS := $(shell $(XENO_CONFIG)  --posix --alchemy --ldflags)

CC := gcc   
EXECUTABLE := ex01a

all: $(EXECUTABLE)

%: %.c
	$(CC) -o $@ $< $(CFLAGS) $(LDFLAGS)

clean: 
	rm -f $(EXECUTABLE)

Note that by adding the “posix” flag in the Makefile,printfis mapped tort_printfwhich puts text to be printed in a buffer. The actual printing is done by a non-real-time periodic thread.

2 Changing a global variable by two tasks

In the example below, two tasks (taskOne and taskTwo), are competing to update the value of a global variable, called "global." The objective of the program is to toggle the value of the global variable (1s and 0s). TaskOne increments the value of "global" and taskTwo decrements the value.

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

#include <alchemy/task.h>
#include <alchemy/timer.h>
#include <alchemy/sem.h>

#define ITER 10

static RT_TASK  t1;
static RT_TASK  t2;

int global = 0;

void taskOne(void *arg)
{
    int i;
    for (i=0; i < ITER; i++) {
        printf("I am taskOne and global = %d................\n", ++global);
    }
}

void taskTwo(void *arg)
{
    int i;
    for (i=0; i < ITER; i++) {
        printf("I am taskTwo and global = %d----------------\n", --global);
    }
}

int main(int argc, char* argv[]) {
    rt_task_create(&t1, "task1", 0, 1, 0);
    rt_task_create(&t2, "task2", 0, 1, 0);
    rt_task_start(&t1, &taskOne, 0);
    rt_task_start(&t2, &taskTwo, 0);
    return 0;
} 

3 Priority-Based Scheduling

#include <stdio.h>
   #include <signal.h>
   #include <unistd.h>
   #include <alchemy/task.h>
   #include <alchemy/sem.h>
   #include <alchemy/timer.h>
   
   #define NTASKS 3
   #define HIGH 52 /* high priority */
   #define MID 51 /* medium priority */
   #define LOW 50  /* low priority */

   RT_TASK demo_task[NTASKS];
   RT_SEM mysync;

   #define EXECTIME   2e8   // execution time in ns
   #define SPINTIME   1e7   // spin time in ns
   
   void demo(void *arg)
   {
       RTIME starttime, runtime;
       RT_TASK_INFO taskinfo;
       int num=*(int *)arg;
       printf("Task  : %d\n",num);
       rt_sem_p(&mysync,TM_INFINITE);
       runtime = 0;
       while(runtime < EXECTIME) {
         rt_timer_spin(SPINTIME);  // spin cpu doing nothing
         runtime = runtime + SPINTIME;
         printf("Running Task  : %d at ms : %d\n",num, runtime/1000000);
       }
       printf("End Task  : %d\n",num);
   }
   
   //startup code
   void startup()
   {
     int i;
     char  str[20] ;
     // semaphore to sync task startup on
     rt_sem_create(&mysync,"MySemaphore",0,S_FIFO);
      
     for(i=0; i < NTASKS; i++) {
       printf("start task  : %d\n",i);
       sprintf(str,"task%d",i);
       rt_task_create(&demo_task[i], str, 0, 50, 0);
       rt_task_start(&demo_task[i], &demo, &i);
     }
     // assign priorities to tasks
     rt_task_set_priority(&demo_task[0],LOW);
     rt_task_set_priority(&demo_task[1],MID);
     rt_task_set_priority(&demo_task[2],HIGH);
     printf("wake up all tasks\n");
     rt_sem_broadcast(&mysync);
   }
   
   int main(int argc, char* argv[])
   {
     startup();
     printf("\nType CTRL-C to end this program\n\n" );
     pause();
   }

4 Round-robin Scheduling

 #include <stdio.h>
   #include <signal.h>
   #include <unistd.h>
   #include <alchemy/task.h>
   #include <alchemy/sem.h>
   #include <alchemy/timer.h>

   #define NTASKS 3
   RT_TASK demo_task[NTASKS];
   RT_SEM mysync;

   #define EXECTIME   2e8   // execution time in ns
   #define SPINTIME   1e7   // spin time in ns
   
   void demo(void *arg) {
    RTIME starttime, runtime;
    int num=*(int *)arg;
    printf("Task  : %d\n",num);
    rt_sem_p(&mysync,TM_INFINITE);

    // let the task run RUNTIME ns in steps of SPINTIME ns
    runtime = 0;
    while(runtime < EXECTIME) {
      rt_timer_spin(SPINTIME);  // spin cpu doing nothing
      runtime = runtime + SPINTIME;
      printf("Running Task  : %d  at time : %d\n",num,runtime);
      }
    printf("End Task  : %d\n",num);
    }
   
  //startup code
    void startup() {
    int i;
    char  str[20] ;
    // semaphore to sync task startup on
    rt_sem_create(&mysync,"MySemaphore",0,S_FIFO);
    for(i=0; i < NTASKS; i++) {
      printf("start task  : %d\n",i);
      sprintf(str,"task%d",i);
      rt_task_create(&demo_task[i], str, 0, 50, 0);
      rt_task_start(&demo_task[i], &demo, &i);
    }
    printf("wake up all tasks\n");
    rt_sem_broadcast(&mysync);
    }

int main(int argc, char* argv[])
{
  startup();
  printf("\nType CTRL-C to end this program\n\n" );
  pause();
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 Creating a task & Starting a task
  • 2 Changing a global variable by two tasks
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档