VSF介绍 - 闪灯的N种写法

[复制链接]
2575|7
 楼主| Simon21ic 发表于 2017-1-23 02:24 | 显示全部楼层 |阅读模式
App, LED, ST, pi, ev
本帖最后由 Simon21ic 于 2017-1-23 02:50 编辑

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

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

  1. static void usrapp_led_blink(void *p)
  2. {
  3.         struct usrapp_t *app = (struct usrapp_t *)p;
  4.         if (app->led_on)
  5.                 vsfhal_gpio_clear(LED_PORT, 1 << LED_PIN);
  6.         else
  7.                 vsfhal_gpio_set(LED_PORT, 1 << LED_PIN);
  8.         app->led_on = !app->led_on;
  9. }

  10. void usrapp_init(struct usrapp_t *app)
  11. {
  12.         vsfhal_gpio_init(LED_PORT);
  13.         vsfhal_gpio_config_pin(LED_PORT, LED_PIN, GPIO_OUTPP);
  14.         vsfhal_gpio_clear(LED_PORT, 1 << LED_PIN);
  15.         app->led_on = false;
  16.         vsftimer_create_cb(1000, -1, usrapp_led_blink, app);
  17. }

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

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

  5.         switch (evt)
  6.         {
  7.         case VSFSM_EVT_INIT:
  8.                 vsftimer_create(sm, 1000, -1, VSFSM_EVT_USER);
  9.                 break;
  10.         case VSFSM_EVT_USER:
  11.                 if (app->led_on)
  12.                         vsfhal_gpio_clear(LED_PORT, 1 << LED_PIN);
  13.                 else
  14.                         vsfhal_gpio_set(LED_PORT, 1 << LED_PIN);
  15.                 app->led_on = !app->led_on;
  16.                 break;
  17.         }
  18.         return NULL;
  19. }

  20. void usrapp_init(struct usrapp_t *app)
  21. {
  22.         vsfhal_gpio_init(LED_PORT);
  23.         vsfhal_gpio_config_pin(LED_PORT, LED_PIN, GPIO_OUTPP);
  24.         vsfhal_gpio_clear(LED_PORT, 1 << LED_PIN);
  25.         app->led_on = false;

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

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

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

  4.         vsfsm_pt_begin(pt);
  5.         while (1)
  6.         {
  7.                 vsfsm_pt_delay(pt, 1000);
  8.                 vsfhal_gpio_clear(LED_PORT, 1 << LED_PIN);
  9.                 vsfsm_pt_delay(pt, 1000);
  10.                 vsfhal_gpio_set(LED_PORT, 1 << LED_PIN);
  11.         }
  12.         vsfsm_pt_end(pt);
  13.         return VSFERR_NONE;
  14. }

  15. void usrapp_init(struct usrapp_t *app)
  16. {
  17.         vsfhal_gpio_init(LED_PORT);
  18.         vsfhal_gpio_config_pin(LED_PORT, LED_PIN, GPIO_OUTPP);
  19.         vsfhal_gpio_clear(LED_PORT, 1 << LED_PIN);
  20.         app->led_on = false;

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

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
也是这三种风格的应用开发方式,还望大神多多指导
 楼主| 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

能够设计出这样的系统构架的,能力肯定不一般
有机会可以多交流,你可以在这里开个帖子介绍一下
ianhom 发表于 2017-1-26 08:15 来自手机 | 显示全部楼层
版主谬赞,我的MOE远不及VSF成熟,还要多向版主请教学习。祝新年快乐:)
 楼主| Simon21ic 发表于 2017-1-26 12:56 | 显示全部楼层
ianhom 发表于 2017-1-26 08:15
版主谬赞,我的MOE远不及VSF成熟,还要多向版主请教学习。祝新年快乐:)

新年快乐,VSF只是做了早而已。有意思的是,同样的是参考了zstack的osal,contiki,QP等平台,得到的技术演变路线是何其相似。HAL,模块化设计等等的思想也正是VSF的设计原则。有机会多交流,我给你发了站内消息。
damifan 发表于 2017-3-8 14:54 | 显示全部楼层
一看名字就想起孔乙己
您需要登录后才可以回帖 登录 | 注册

本版积分规则

266

主题

2597

帖子

104

粉丝
快速回复 在线客服 返回列表 返回顶部