/*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值
}