打印

VSF介绍 - 闪灯的N种写法

[复制链接]
2173|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Simon21ic|  楼主 | 2017-1-23 02:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
App, LED, ST, pi, ev
本帖最后由 Simon21ic 于 2017-1-23 02:50 编辑

乘着有空就多写一些,这里不像“回”字的N种写法,VSF种的多任务,可以有不同的实现方式,资源占用,开发复杂性,灵活性都不同。这里就用闪灯操作,简单的展现一下几种多任务的实现方式。

1. callback实现方式,这个是目前比较推荐的,也是最简单的

static void usrapp_led_blink(void *p)
{
        struct usrapp_t *app = (struct usrapp_t *)p;
        if (app->led_on)
                vsfhal_gpio_clear(LED_PORT, 1 << LED_PIN);
        else
                vsfhal_gpio_set(LED_PORT, 1 << LED_PIN);
        app->led_on = !app->led_on;
}

void usrapp_init(struct usrapp_t *app)
{
        vsfhal_gpio_init(LED_PORT);
        vsfhal_gpio_config_pin(LED_PORT, LED_PIN, GPIO_OUTPP);
        vsfhal_gpio_clear(LED_PORT, 1 << LED_PIN);
        app->led_on = false;
        vsftimer_create_cb(1000, -1, usrapp_led_blink, app);
}

2. evt_handler实现方式,直接处理各种事件

static struct vsfsm_state_t *
        usrapp_led_evt_handler(struct vsfsm_t *sm, vsfsm_evt_t evt)
{
        struct usrapp_t *app = (struct usrapp_t *)sm->user_data;

        switch (evt)
        {
        case VSFSM_EVT_INIT:
                vsftimer_create(sm, 1000, -1, VSFSM_EVT_USER);
                break;
        case VSFSM_EVT_USER:
                if (app->led_on)
                        vsfhal_gpio_clear(LED_PORT, 1 << LED_PIN);
                else
                        vsfhal_gpio_set(LED_PORT, 1 << LED_PIN);
                app->led_on = !app->led_on;
                break;
        }
        return NULL;
}

void usrapp_init(struct usrapp_t *app)
{
        vsfhal_gpio_init(LED_PORT);
        vsfhal_gpio_config_pin(LED_PORT, LED_PIN, GPIO_OUTPP);
        vsfhal_gpio_clear(LED_PORT, 1 << LED_PIN);
        app->led_on = false;

        app->sm.init_state.evt_handler = usrapp_led_evt_handler;
        app->sm.user_data = app;
        vsfsm_init(&app->sm);
}

3. pt实现方式,共享堆栈的协程

static vsf_err_t usrapp_led_thread(struct vsfsm_pt_t *pt, vsfsm_evt_t evt)
{
        struct usrapp_t *app = (struct usrapp_t *)pt->user_data;

        vsfsm_pt_begin(pt);
        while (1)
        {
                vsfsm_pt_delay(pt, 1000);
                vsfhal_gpio_clear(LED_PORT, 1 << LED_PIN);
                vsfsm_pt_delay(pt, 1000);
                vsfhal_gpio_set(LED_PORT, 1 << LED_PIN);
        }
        vsfsm_pt_end(pt);
        return VSFERR_NONE;
}

void usrapp_init(struct usrapp_t *app)
{
        vsfhal_gpio_init(LED_PORT);
        vsfhal_gpio_config_pin(LED_PORT, LED_PIN, GPIO_OUTPP);
        vsfhal_gpio_clear(LED_PORT, 1 << LED_PIN);
        app->led_on = false;

        app->pt.thread = usrapp_led_thread;
        app->pt.user_data = app;
        vsfsm_pt_init(&app->sm, &app->pt);
}

4. setjmp/longjmp,独立堆栈的协程
不推荐,就不写了




相关帖子

沙发
犹豫的大三| | 2017-1-23 09:54 | 只看该作者
pt方式中,vsfsm_pt_begin(pt)抢占内核?vsfsm_pt_end(pt);释放内核?

使用特权

评论回复
板凳
Simon21ic|  楼主 | 2017-1-23 12:54 | 只看该作者
本帖最后由 Simon21ic 于 2017-1-23 12:57 编辑
犹豫的大三 发表于 2017-1-23 09:54
pt方式中,vsfsm_pt_begin(pt)抢占内核?vsfsm_pt_end(pt);释放内核?

PT是协作式调度,不抢占
现在还是简单展示一下,你可以自己看一下PT的原理,我以后再慢慢说明

使用特权

评论回复
地板
ianhom| | 2017-1-25 09:51 | 只看该作者
学习了~
我之前也试写过点小东西,https://github.com/ianhom/MOE
也是这三种风格的应用开发方式,还望大神多多指导

使用特权

评论回复
5
Simon21ic|  楼主 | 2017-1-25 17:06 | 只看该作者
ianhom 发表于 2017-1-25 09:51
学习了~
我之前也试写过点小东西,https://github.com/ianhom/MOE
也是这三种风格的应用开发方式,还望大神 ...

我看了一下介绍,很多想法和设计原理和VSF如出一辙,回头我仔细看一下代码

另外,你说的抢占式的问题,VSF里是怎么解决的:
https://bbs.21ic.com/icview-1190304-1-1.html

能够设计出这样的系统构架的,能力肯定不一般
有机会可以多交流,你可以在这里开个帖子介绍一下

使用特权

评论回复
6
ianhom| | 2017-1-26 08:15 | 只看该作者
版主谬赞,我的MOE远不及VSF成熟,还要多向版主请教学习。祝新年快乐:)

使用特权

评论回复
7
Simon21ic|  楼主 | 2017-1-26 12:56 | 只看该作者
ianhom 发表于 2017-1-26 08:15
版主谬赞,我的MOE远不及VSF成熟,还要多向版主请教学习。祝新年快乐:)

新年快乐,VSF只是做了早而已。有意思的是,同样的是参考了zstack的osal,contiki,QP等平台,得到的技术演变路线是何其相似。HAL,模块化设计等等的思想也正是VSF的设计原则。有机会多交流,我给你发了站内消息。

使用特权

评论回复
8
damifan| | 2017-3-8 14:54 | 只看该作者
一看名字就想起孔乙己

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

266

主题

2597

帖子

104

粉丝