rtai demo

/*gcc -o rtai_hello rtai_hello.c -I./realtime/include -L./realtime/lib -Wl,--rpath=./realtime/lib -lrtdm -llxrt -lpthread

 $sudo insmod $(targetdir)/modules/rtai_hal.ko
 $sudo insmod $(targetdir)/modules/rtai_sched.ko
 $sudo insmod $(targetdir)/modules/rtai_fifos.ko
 $sudo insmod $(targetdir)/modules/rtai_sem.ko
 $sudo insmod $(targetdir)/modules/rtai_shm.ko
 $sudo insmod $(targetdir)/modules/rtai_rtdm.ko
 $sudo ./rtai_hello
*/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <rtai_lxrt.h>

static int end=1;

void endHandler(intsig)    //信号处理函数
{
    end=0;              //使静态变量为0,这将是主函数的死循环被break
}

int main(void)
{
    RT_TASK*task=0;       //定义实时任务指针,用于指向被创建的实时性任务
    int period=0;        //定义周期变量,用于存储定时器的周期

    signal(SIGKILL,endHandler);      //连接几个主要关闭信号的信号处理函数
    signal(SIGTERM,endHandler);     //包括KILL 也即杀死进程信号,TERM关闭信号
    signal(SIGALRM,endHandler);     //这些信号被收到时将会break主程序的循环

    if(!(task=rt_task_init_schmod(nam2num("TEST"),0,0,0,SCHED_FIFO,0x0f)))  //初始化本进程
    {                                                              //为实时性任务
        printf("Can't initial thetask\n");
        exit(1);
    }

    mlockall(MCL_CURRENT|MCL_FUTURE);      //锁定本进程内存,防止本进程的内存页被换出
                                           //导致的实时性被破坏
    period=start_rt_timer(nano2count(10000));    //启动定时器,设置其定时周期/频率,
                                                   //根据定时器是否是oneshot
    rt_make_hard_real_time();       //使本任务为硬(hard)实时性任务
    rt_task_make_periodic(task,rt_get_time()+period*10,period*100);  //设置本任务的周期
  
    while(end)    //如果end为1则一直执行,end==0,则说明接收到了kill/term/alrm三个信号
    {             //中的一个,证明此进程被用户终止或alrm,则break此循环,结束此任务
        printf("Hello World!\n");   //打印字符,注意,此为syscall,会导致任务进入非实时性
                                    //状态,当此调用结束时将会重新返回到实时性状态
 
        /*
          在实际应用中如果你的任务是周期性执行的,请在此处填写需要执行的周期性过程。
          如果你的任务是需要等待某个事件、者信号量或者某个消息的到来,请你建立相应
          的事件、信号量、消息邮箱,并在此处等待相应的量,相应的量到来时执行你需要的
          操作。。。
        */

        rt_task_wait_period(); //使当前任务进入休眠,知道下一次执行周期到达被唤醒,
                               //如果execution time>= deadline则此函数不会使
                               //任务进入休眠状态
    }

    rt_make_soft_real_time();    //是任务进入软实时状态
    stop_rt_timer();               //停止定时器
    rt_task_delete(task);          //删除实时性任务,此时控制权将交回Linux

    printf("End of theApplication!\n");
    return 0;        //返回0值
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值