您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 制造加工工艺 > LXRT-RTAI用户空间编程
LXRT——RTAI的用户空间编程目录一.rt_task_init_schmod(启用RTAI实时功能/实时任务的创建)............21.函数...........................................................22.参数...........................................................23.注意...........................................................24.示例代码.......................................................2二.实时任务定时器设置(rt_set_oneshot_mode等).......................31.rt_set_oneshot_mode............................................32.rt_set_periodic_mode...........................................33.start_rt_timer.................................................34.注意...........................................................35.示例代码.......................................................3三.rt_task_make_periodic(定期运行一个任务)..........................41.函数...........................................................42.参数...........................................................43.注意...........................................................4四.代码基础框架.......................................................41.Makefile.......................................................42.run............................................................43..runinfo.......................................................54.代码...........................................................5五.注意事项...........................................................71.所谓的LXRT实即LinuxRealTimemodule,不存在LXRTscheduler...72.LXRT下的硬实时相对于内核态下而言仍有若干微秒的差别............73.在进入和离开LXRT域这两段时间,系统的实时性是无法保证的。......84.LXRTTipsAndTricks...........................................8六.管道通讯...........................................................81.发送函数.......................................................92.接收函数.......................................................93.示例代码.......................................................9七.共享内存通讯......................................................121.创建函数......................................................122.Free函数.....................................................12一.rt_task_init_schmod(启用RTAI实时功能/实时任务的创建)实时任务的创建主要完成对代表实时任务实体的任务结构变量的初始化操作,包括分配任务栈、初始化任务栈、初始化链表指针等。1.函数RT_TASK*rt_task_init(unsignedlongname,intpriority,intstack_size,intmax_msg_size)RT_TASK*rt_task_init_schmod(unsignedlongname,intpriority,intstack_size,intmax_msg_size,intpolicy,intcpus_allowed)正如你可以看到的,有两个选项可以用来创建一个用户模式下的实时任务。在用户模式下,rt_task_init被认为是一个更简单但因此有限的捷径。总之他们都可以用于这个特定的目的。只是为了记录第一个被定义为以下的:RTAI_PROTO(RT_TASK*,rt_task_init,(unsignedlongname,intpriority,intstack_size,intmax_msg_size)){returnrt_task_init_schmod(name,priority,0,max_msg_size,SCHED_FIFO,0xFF);}它的意思是,它使用SCHED_FIFO策略并且设置cpu允许0XFF。他们创建一个新的实时任务在用户空间,或者更好的说法是,他们在用户空间为LINUX进程/任务创建了一个RTAI任务扩展。2.参数Name:任务名。Priority:任务优先级,0最高。stack_size:栈大小(不再被使用的遗留参数,只是为了可移植性才保留的)。默认值是512。max_msg_size:可为0,在这种情况下使用一个默认的内部值。默认值为256。为了适合你的需求,有可能需要设置一个更大的值。在这种情况下,要么合理设置宏MSG_SIZE来重新编译sys.c,要么在这里明确分配大点的尺寸。但是,注意这点,消息大小不是关键的。事实上在任何需要的时候,模块都会重新分配它,动态并且设置好了合适的大小。policy:调度策略,默认的是SCHED_FIFO,也可以设置成RT_SCHED_RR。RR只是在有多个使用相同的优先级并且不释放CPU的任务的时候使用,。在这种情况下,RR政策将会照顾它的平衡cpus_allowed:你想让任务运行的CPU。它是个bit。当RTAI希望一个任务静态地在一个特定的CPU上运行的时候,它是强制性的。注意,如果你想在任务创建之后改变CPU,这一举动将会杀死real_time。如果指定了更多的bit,RTAI通过尽量平衡这工作强迫任务运行在第一个可用的CPU上。//SMP用的3.注意消息有个动态内存增加,每次buffer大小溢出时,现有的都会被释放,RTAIreal_timeheap会新创建一个大约比原来大20%新buffer。这个操作显然是时间消费,所以为了最好的性能表现,强烈建议从最初始阶段就定义正确的大小。4.示例代码intmain(void){RT_TASK*Main_Task;if(!(Main_Task=rt_task_init_schmod(nam2num(MNTSK),0,0,0,SCHED_FIFO,0xF))){printf(CANNOTINITMAINTASK\n);exit(1);}return0;}二.实时任务定时器设置(rt_set_oneshot_mode等)在创建实时任务的过程中,主要通过3个函数对定时器进行设置,它们分别是:rt_set_oneshot_mode,rt_set_periodic_mode和start_rt_timer,下面分别对这3个函数进行分析。1.rt_set_oneshot_mode用于将定时器设置为单触发模式,所谓单触发模式,就是说,每当定时器产生一次中断后,系统都要根据目前系统任务对时间精度的要求情况对定时器重新进行编程,设定下一次触发的时间。rt_set_oneshot_mode完成的功能如下:1.调用stop_rt_timer停止定时器的运行;2.设置全局变量oneshot_timer的值为1;在时钟中断函数中,系统会检查oneshot_timer的值,判断定时器的工作模式,然后根据定时器的模式对定时器进行相应的操作。2.rt_set_periodic_modert_set_periodic_mode的操作与rt_set_oneshot_mode的类似,只不过它将oneshot_timer的值设为0,表示定时器应工作在周期模式;当定时器工作在周期模式下时,系统只要对定时器进行一次初始化,指定定时器产生中断的周期,以后就不再需要对定时器进行编程了。3.start_rt_timer根据设定的定时器运行模式对定时器进行初始化,它完成的主要功能如下:1.调用函数rt_request_timer注册时钟中断服务程序rt_timer_handler;2.初始化系统用于保存时间信息的结构rt_smp_times(就是前面所说的rt_times);3.调用rt_request_linux_irq注册一个Linux下的中断服务程序recover_jiffies,这个中断程序和Linux的时钟中断服务程序共享时钟中断,recover_jiffies用于补偿Linux所丢失的时钟中断(因为可能由于实时任务的运行,使Linux很长一段时间得不到运行的机会,无法响应时钟中断)。4.注意请注意,如果你不设置模式,默认是周期性的。使用stop_rt_timer停止定时器,会设置定时器返回默认的状态(即周期性的)。如果没有删除在使用的RTAI调度程序,你想确定在多模块上是单触发模式,在每一个start_rt_timer前总要调用rt_set_oneshot_mode。使用start_rt_timer(0),自动强制进入单触发模式。rt_is_hard_timer_runningAPI可以知道是否已经有个计时器在运行了,该函数应该小心使用,因为它会形成一个“race”情况。在使用任何与时间处理相关的函数前调用start_rt_timerAPI很重要,否则所有的值都被认为是错误的。实时任务(本文所指的实时任务,如果没有特别说明都是硬实时的)都是以Linux内核模块方式实现的,要实现一个实时任务,在模块初始化的时候要调用RTAI的任务创建函数初始化实时任务相关的数据和环境,指定定时器的运行模式(单触发模式或周期模式),初始化定时器,然后开始执行任务;需要注意的是,当没有加载任何RTAI的实时任务模块的时候,RTAI的任务调度和时钟中断都没有启动。5.示例代码#defineTICK_TIME1000000if((hard_timer_running=rt_is_hard_timer_running())){printf(Skiphardreal_timersetting...\n);sampling_interval=nano2count(TICK_TIME);}else{printf(Startingrealtimetimer...\n);rt_set_one
本文标题:LXRT-RTAI用户空间编程
链接地址:https://www.777doc.com/doc-4774034 .html