RTEMS 的 EVENT 和 中断的使用例子

#include <stdlib.h>
#include <stdio.h>
#include <rtems.h>
#include <bsp/irq.h>
#include <bsp/irq-generic.h>

#define LED_ON()  GPBDAT &=~ (1<<5)
#define LED_OFF() GPBDAT |=  1<<5

static rtems_id led1;
static rtems_id led2;

rtems_isr EINT0_handler (rtems_vector_number vector)
{
	//rtems_event_send (taskid, RTEMS_EVENT_1);
    GPBDAT ^= 1<<7;
    SRCPND = 1<<vector;
    INTPND = 1<<vector;
}

rtems_task led_task1(rtems_task_argument unused)
{
    rtems_status_code status;
    rtems_event_set event;

    printf("led_task1 Start!\n");
    while (1) {
        status = rtems_event_receive(
                RTEMS_EVENT_1,
                RTEMS_EVENT_ALL,
                RTEMS_NO_TIMEOUT,
                &event);
        //printf("led1 event_receive return : %x\n", status);
        GPBDAT ^= 1<<5;
    }
}

rtems_task led_task2(rtems_task_argument unused)
{
    rtems_status_code status;
    rtems_event_set event;

    printf("led_task2 Start!\n");
    while (1) {
        status = rtems_event_receive(
                RTEMS_EVENT_2,
                RTEMS_EVENT_ALL,
                RTEMS_NO_TIMEOUT,
                &event);
        //printf("led2 event_receive return : %x\n", status);
        GPBDAT ^= 1<<6;
    }
}


rtems_task Init(rtems_task_argument argument)
{
    rtems_status_code status;
 //   rtems_isr_entry old_handler;
    int count;

    printf("RTEMS 4.10.2 Start!\n");
    // port init
    GPBCON = (1<<(5*2)) | (1<<(6*2)) | (1<<(7*2));
    GPFCON = 0X02;
    INTMSK &= ~(1<<0);
    //
    status = rtems_interrupt_handler_install(
        BSP_EINT0,
        "EINT0",
        RTEMS_INTERRUPT_UNIQUE,
        (rtems_interrupt_handler) EINT0_handler,
        NULL
    );
    printf("Install EINT0 handler return : %x\n", status);
    // create task
    status = rtems_task_create(
        rtems_build_name('L', 'E','D','1'),
        11,
        RTEMS_MINIMUM_STACK_SIZE,
        RTEMS_DEFAULT_MODES,
        RTEMS_DEFAULT_ATTRIBUTES,
        &led1);
    status = rtems_task_start(led1, led_task1, 1);

    status = rtems_task_create(
        rtems_build_name('L', 'E','D','2'),
        12,
        RTEMS_MINIMUM_STACK_SIZE,
        RTEMS_DEFAULT_MODES,
        RTEMS_DEFAULT_ATTRIBUTES,
        &led2);
    status = rtems_task_start(led2, led_task2, 1);

    printf("RTEMS Init end\n");
    count = 0;
    while (1) {
    	rtems_task_wake_after(10);
        count++;
        if (count > 10) {
            count = 0;
            rtems_event_send(led1, RTEMS_EVENT_1);
        }
        rtems_event_send(led2, RTEMS_EVENT_2);
    }
}

/* configuration information */
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER

#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_MAXIMUM_TASKS 10

#define CONFIGURE_INIT

#include <rtems/confdefs.h>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值