Xenomai-forge Tasks and IRQ example

#include <stdio.h>
#include <stdlib.h>

#include <sys/mman.h>
#include <alchemy/task.h>
#include <nucleus/intr.h>

#define IRQ_NUMBER 7  /* Intercept interrupt #7 */
#define TASK_STKSZ 0 /* Stack size (use default one) */
#define TASK_PRIO 99 /* Highest RT priority */
#define TASK_MODE 0 /* No flags */

static RT_INTR intr_desc;
static RT_TASK task_00;
static int count = 1;


#if 1
void cleanup (void)
{
  rt_intr_delete(&intr_desc);
  rt_task_delete(&task_desc);
}
#endif


#if 1

static void task_00_00 (void *cookie)
{
  int err;
  for (;;) {

    /* Wait for the next interrupt on channel #7. */
    err = rt_intr_wait(&intr_desc,TM_INFINITE);

    if (err > 0) {   //rt_intr_wait正常返回一个正数,代表未处理中断的数量
      /* Process interrupt. */
    }
  }

}

#endif



#if 1
static void task_00_01 (void *cookie)
{
  for (;;) {
  /* ... "cookie" should be NULL ... */
  fprintf(stderr, "task_00 is run %d", count);
  count++;
  }
}
#endif


#if 1
static void task_00_02 (void *cookie)
{
  for (;;) {
  /* ... "cookie" should be NULL ... */
  fprintf(stderr, "task_01 is run %d", count);
  count++;
  }
}
#endif


int main (int argc, char *argv[])
{
  int err;
  mlockall(MCL_CURRENT|MCL_FUTURE);
  /* ... */
 
  err = rt_intr_create(&intr_desc,"MyIrq",IRQ_NUMBER,0);
 
  err = rt_task_create(&task_00,
                       "Task_00_Name",
                       TASK_STKSZ,
                       TASK_PRIO,
                       TASK_MODE);
  if (!err)
  rt_task_start(&task_00,&task_00_00,NULL);
  rt_task_start(&task_00,&task_00_01,NULL);
  rt_task_start(&task_00,&task_00_02,NULL);

  rt_intr_enable(&intr_desc);    //开中断
  /* ... */
 
  cleanup ();
 
  exit(0);//return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值