RTAI用户空间编程

(转载)LXRT代码框架 (RTAI的用户空间编程)  

2008-10-24 17:49:02|  分类: 实时linux |  标签: |字号 订阅

LXRT代码框架 (RTAI的用户空间编程) [原创]

RTAI是我的本科毕业设计题目,刚入手不久,抛转引玉吧。中国做这个的人不算太少,但是都是在写论文,写完了就扔了。黄洋兄不错,开了个RTAI空间,我们大家也多努力,把自己的东西放上来,more people,more power!

还有,哪位有用Xenomai的,请跟我联系。我们一起来研究。

这篇文章是给会使用RTAI内核模块编程后,对LXRT user space编程感兴趣的人看的代码框架。

LXRT的好处很多拉,用户空间保护下运行实时任务最吸引人,可以使用库函数,可是就是代码有点麻烦。我这边提供个框架。可能有些括号有问题,我在win下,没有调试。

 

========================================

前面先准备三个文件

 1   ============= Makefile  ===里面少了些TAB 估计运行不了

 =====可以去RTAI Showroom看看例子=======

prefix := $(shell /usr/realtime/bin/rtai-config --prefix)

CC = $(shell /usr/realtime/bin/rtai-config --cc)

LXRT_CFLAGS = $(shell /usr/realtime/bin/rtai-config --lxrt-cflags)

LXRT_LDFLAGS = $(shell /usr/realtime/bin/rtai-config --lxrt-ldflags)

all:prog_name

prog_name: prog_name.c

$(CC) $(LXRT_CFLAGS) -o $@ $< $(LXRT_LDFLAGS)

clean: rm -f *.o prog_name

.PHONY: clean

 

 

2  ============== run      ===========

------------实际上是调用rtai-load来运行的 -----------------

${DESTDIR}/usr/realtime/bin/rtai-load

 

 

 3 ====          .runinfo     =====  隐藏文件   == rtai-load根据这个来运行======

/*prog_name是你可执行程序的名字 后面是加载库lxrt sem mbx msg fifos,你根据需要删减*/

prog_name:lxrt+sem+mbx+msg+fifos:!./prog_name; popall:control_c

 

PS:

有时候编译还要人工指定库位置 这个问题我自己还没有解决 估计是--lxrt这边改?

//You will need to link with /usr/local/realtime/lib/liblxrt.a to resolve undefined symbols if you do not inline the RTAI function calls.

 

 

 

4   ============= 下面终于进入代码了 prog_name  =====

==为了增强代码例子可读性 一些变量没有设置 可以自己设为0,1=======

  #include <sched.h>

  #include <stdio.h>

  #include <stdlib.h>

  #include <fcntl.h>

  #include      <rtai_lxrt.h>

 

 

  int main(void)

  {

    RT_TASK* task;                                    // Stores a handle.任务指针

    int priority=0;                                        // Highest

    int stack_size=0;                                   // Use default (512)

    int msg_size=0;                                    // Use default (256)

 

    /*-------任务初始化-------------*/

    static RT_TASK *pstMainBuddy;

  pstMainBuddy = rt_task_init_schmod( nam2num( "Name" ),   /* 任务名          */

                                                               0,                         /* 任务优先级 0最高*/

                                                               stack_size,            /* 栈大小          */

                                                               0,                       /* max_msg_size    */

                                                        SCHED_FIFO,              /* 调度策略         */

                                                               0 );                   /* cpus_allowed SMP用的*/

 

 

   //设置优先级和调度算法 这里他用SCHED_FIFO,而SCHED_OTHER(基于时间片)优先会低些

   // 这个Name就是实时任务的标识  nam2num 是把名字转为name id 以免命名冲突

 

  if( pstMainBuddy == NULL)

  {

    fprintf( stderr, "%s: Error creating the main buddy!\n", pcArgV[0] );

    exit( 1 );

  }

    /*-------设置时钟-------------*/

 

   if (oneshot)

      rt_set_oneshot_mode();                               //8254一次性计时模式

    else

      rt_set_periodic_mode();                              //周期模式

 

   // <period_in_nanosecs> is the clock rate of the realtime scheduler

    // (rt_timer) in nano seconds.

 

    //设置周期   period_in_nanosecs变量是纳秒单位

 

    period = (int) nano2count((RTIME)period_in_nanosecs);

    start_rt_timer(period);                     //启动计时器 一个period来个中断 记得用完要关掉

 

    // Periodic HardRT tasks are able to run now. 

   /*------------  设置为硬实时  ----------------- */

 

    if (hard_realtime) {

      rt_make_hard_real_time();

    }

 

/*----------设置 任务周期 -----------------*/

 

    //rt_task_make_periodic() determines when rt_wait_period() will wake the first time.

    /*   设置 任务周期                                                          */

    /*   这里解释一下 下面的rt_wait_period()是主动放弃CPU 等待下次调度         */

    /*   这个下次调度是什么时候? 就是rt_task_make_periodic设置的。             */

    /*   hrt_task是任务指针; 第二个参数是启动时间;                                    */

    /*   rt_get_time()是现在时间,加上个period就是一个period后启动循环         */

    /*   第三个参数是任务循环周期                                                               */

 

    rt_task_make_periodic(hrt_task, rt_get_time() + period, period);

 

 

   /* ------------你自己需要的代码 从这里开始  ----------------*/

 

    while (continue)

    {

      // put periodic functionality here

      /* 你的周期任务就在这边拉!*/

      rt_wait_period();//上面说了 主动放弃CPU 等待下次调度

    }

 

//------------      收尾        ------------------

 

   if (hard_realtime)

   {

      ////Return a hard real time Linux process, or pthread to the standard Linux behavior.

     //将实时任务或者线程返回到标准linux的状态 

      rt_make_soft_real_time();

    }

 

    rt_task_delete(task);//删除任务

    return 0;

  }

你可能感兴趣的:(RTAI用户空间编程)