vsfvm文档(二)扩展接口的实现

[复制链接]
 楼主| vsfopen 发表于 2018-6-19 12:31 | 显示全部楼层 |阅读模式
vsfvm作为简单的粘结剂,需要用户实现各种扩展应用模块,然后由vsfvm来实现功能的配置。

vsfvm的扩展模块,可以实现为面向对象,可以实现阻塞的接口(实际运行的时候,并不会阻塞系统)。这里先用几个典型的应用环境做一下介绍。
  1. // tickclk implementation
  2. static enum vsfvm_ret_t vsfvm_ext_tickclk_getms(struct vsfvm_thread_t *thread)
  3. {
  4.         struct vsfvm_var_t *result = vsfvm_get_func_argu(thread, 0);

  5.         result->uval32 = vsfhal_tickclk_get_ms();
  6.         return VSFVM_RET_FINISHED;
  7. }

  8. // timer implementation
  9. static enum vsfvm_ret_t vsfvm_ext_timer_delayms(struct vsfvm_thread_t *thread)
  10. {
  11.         if (!thread->sm.init_state.evt_handler)
  12.         {
  13.                 struct vsfvm_var_t *timeout = vsfvm_get_func_argu_ref(thread, 0);

  14.                 thread->sm.init_state.evt_handler = vsfvm_ext_evt_handler;
  15.                 thread->sm.user_data = thread;
  16.                 vsfsm_init(&thread->sm);
  17.                 if (!vsftimer_create(&thread->sm, timeout->uval32, 1, VSFSM_EVT_USER))
  18.                         return VSFVM_RET_ERROR;
  19.                 return VSFVM_RET_PEND;
  20.         }
  21.         else
  22.         {
  23.                 vsfsm_fini(&thread->sm);
  24.                 thread->sm.init_state.evt_handler = NULL;
  25.                 return VSFVM_RET_FINISHED;
  26.         }
  27. }


vsfvm_ext_tickclk_getms用来得到系统启动后的ms数。
struct vsfvm_var_t是vsfvm中的基本变量的数据结构,vsfvm_get_func_argu用于得到调用函数时候的参数。
vsfvm_get_func_argu和vsfvm_get_func_argu_ref的区别是,vsfvm_get_func_argu只是得到指定位置的参数变量,而vsfvm_get_func_argu_ref会得到参数引用的实际变量(如果指定位置的参数是引用的话,如果不是应用的话,和vsfvm_get_func_argu完全一样)。
函数调用的返回值,需要通过vsfvm_get_func_argu(thread, 0)得到,函数的返回值,放在函数第一个参数的位置。
最后,return VSFVM_RET_FINISHED表示函数调用结束,脚本可以继续运行。
skyerwlb 发表于 2020-2-22 20:00 | 显示全部楼层
怎么这么多AD者!

90

主题

325

帖子

8

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

90

主题

325

帖子

8

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