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