xenomai任务测试

互联网 2022/7/9 7:21:00

点击查看代码 /** Copyright (C) 2019 BNIS * Make file 请参考过往博客 * 本例程在模块初始化时启动3个任务。在任务1中,实现了类似定时器 * 的定时功能,通过第2任务去结束第1任务,任务3启动后等待任务2结束再继续执行. * */#include <linux/module.h> #include…
点击查看代码
/*
 * Copyright (C) 2019 BNIS
*  Make file 请参考过往博客
*  本例程在模块初始化时启动3个任务。在任务1中,实现了类似定时器
*  的定时功能,通过第2任务去结束第1任务,任务3启动后等待任务2结束再继续执行.
*
*/
 
#include <linux/module.h>
#include <rtdm/driver.h>
#include <rtdm/testing.h>
 
 
MODULE_DESCRIPTION("---RTDM test helper module----");
MODULE_AUTHOR("bniss@aliyun.com");
MODULE_VERSION("0.1.0");
MODULE_LICENSE("GPL");
 
 
struct rtdm_basic_context {
  unsigned long number;
};
 
 
rtdm_task_t test_task1;
rtdm_task_t test_task2;
rtdm_task_t test_task3;
 
 nanosecs_abs_t initTm;
 rtdm_timer_t test_timer;
 rtdm_event_t event;
 int run  = 1 ;
 
static int rtdm_bnis_open(struct rtdm_fd *fd, int oflags)
{
  printk("#device_bnis is open .flag = %d. \n" , oflags ); //app-rt_dev_open(DEVICE_NAME, 0);
  return 0;
 
}
 
static void rtdm_bnis_close(struct rtdm_fd *fd)
{
   printk("#device_bnis close. \n");  app-rt_dev_close(DEVICE_NAME);
}
 
 
 
static struct rtdm_driver rtdm_bnis_driver = {
  .profile_info   = RTDM_PROFILE_INFO(rtdm_bnis_basic,
                RTDM_CLASS_TESTING,
                RTDM_SUBCLASS_RTDMTEST,
                RTTST_PROFILE_VER),
  .device_flags   =  RTDM_NAMED_DEVICE | RTDM_EXCLUSIVE,
  .device_count   = 2,
  .context_size   = sizeof(struct rtdm_basic_context),
  .ops = {
    .open   = rtdm_bnis_open,
    .close    = rtdm_bnis_close,
  },
};
 
 
 
static struct rtdm_device myDevice = {
 
    .driver = &rtdm_bnis_driver,
    .label = "bnis_rtdm",
 
};
 
static void task_msleep(uint64_t ms){
  uint64_t allNas = 1000000*ms;
   rtdm_task_sleep(allNas);
}
 
 
static void task_test_handler1(void *arg){
 
    int err,res ;
    uint64_t tmp,cnt;
   
    printk("======begin task1========%ld \n",rtdm_clock_read()-initTm);
    tmp = rtdm_clock_read();
    err = rtdm_task_set_period(NULL,0,500000000ULL);
    cnt = 0;
    while(  run > 0 ){
    res = rtdm_task_wait_period( NULL );
      printk("res = %d , cnt = %d ,period take = %ld" , res , cnt ,rtdm_clock_read() -tmp);
 
      tmp = rtdm_clock_read();
      if( res!=0)
        break;
      
      if(cnt++>20){
        break;
      }
    }
 
    printk("exit task1 ,cnt = %ld .run =%d ",cnt ,run );
 
}
 
 
 
static void task_test_handler2(void *arg)
{
     
  printk("======begin task2========%ld \n",rtdm_clock_read()-initTm);
  task_msleep(5000); //sleep 5 sec
  printk("=============destroy task1 in task2========\n");
  rtdm_task_destroy(&test_task1);
 
 exit:
   printk("=============exit task2========\n");
   rtdm_task_destroy(&test_task2); 
   
}
 
static void task_test_handler3(void *arg)
{
    printk("======begin task3========%ld \n",rtdm_clock_read()-initTm);
    rtdm_task_join(&test_task2); //wait on task2 exit
 exit:
    printk("=============exit task3========\n");
    rtdm_task_destroy(&test_task3); 
}
 
 
static int __init rtdm_test_init(void)
{
    printk("====init test for rtdm=========\n");
    rtdm_dev_register( &myDevice);
    initTm = rtdm_clock_read();
    rtdm_task_init(&test_task1, "rtdm_test_task1",task_test_handler1, NULL,0, 0);
    rtdm_task_init(&test_task2, "rtdm_test_task2",task_test_handler2, NULL,0, 0);
    rtdm_task_init(&test_task3, "rtdm_test_task3",task_test_handler3, NULL,0, 0);    
    return 0;
}
 
static void __exit rtdm_test_exit(void)
{
  printk("=======exit rtdm test =========\n");
  rtdm_dev_unregister(&myDevice);
}
 
module_init(rtdm_test_init);
module_exit(rtdm_test_exit);
###################################

本例子展示了xenomai的任务调度机制,和api应用。(执行insmod效果图)

本例程在模块初始化时启动3个任务,通过其功能逻辑从而了解api的作用。在任务1中,实现了类似定时器的定时功能,通过第2任务去结束第1任务,任务3启动后等待任务2结束再继续执行.

1)rtdm任务初始化函数原型 :

int rtdm_task_init( rtdm_task_t *task, const char *name,
rtdm_task_proc_t task_proc, void *arg,
int priority, nanosecs_rel_t period)

参数1,task为任务句柄;

参数2,name为可选任务名称;

参数3,task_proc为任务的回调函数;

参数4,arg为回调函数task_proc传递指针参数;

参数5,priority为任务的优先级,0为最低优先,99为最高优先,通过rtdm_task_set_priority设置任务优先级;

参数6,period循环任务的纳秒周期,非循环模式为0。使用rtdm_task_wait_period()来等待第一个和后续的周期性事件。

本函数启动调用了 xnthread_init(),xnthread_register(),xnthread_set_periodic() 和xnthread_start()。

在初始化一个任务后,任务句柄仍然有效,可以传递给RTDM服务直到 rtdm_task_destroy() 或者 rtdm_task_join()被调用。

2)rtdm任务加入函数原型 :

void rtdm_task_join(rtdm_task_t * task) ;

函数功能:等待某实时任务终止。其中task由rtdm_task_init(),目标任务task必须是未结束的,否则本函数永远无法结束返回。

3)rtdm任务等待函数原型:

int rtdm_task_wait_period(unsigned long * overruns_r);

函数功能:等待下一个实时任务周期。overruns_r为传入等待超时的时间变量地址。
————————————————
版权声明:本文为CSDN博主「wabil」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wabil/article/details/104264657

随时随地学软件编程-关注百度小程序和微信小程序
关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[xenomai任务测试]http://www.zyiz.net/tech/detail-333383.html

赞(0)
关注微信小程序
程序员编程王-随时随地学编程

扫描二维码或查找【程序员编程王】

可以随时随地学编程啦!

技术文章导航 更多>