vsfvm作为简单的粘结剂,需要用户实现各种扩展应用模块,然后由vsfvm来实现功能的配置。
vsfvm的扩展模块,可以实现为面向对象,可以实现阻塞的接口(实际运行的时候,并不会阻塞系统)。这里先用几个典型的应用环境做一下介绍。
- // tickclk implementation
- static enum vsfvm_ret_t vsfvm_ext_tickclk_getms(struct vsfvm_thread_t *thread)
- {
- struct vsfvm_var_t *result = vsfvm_get_func_argu(thread, 0);
- result->uval32 = vsfhal_tickclk_get_ms();
- return VSFVM_RET_FINISHED;
- }
- // timer implementation
- static enum vsfvm_ret_t vsfvm_ext_timer_delayms(struct vsfvm_thread_t *thread)
- {
- if (!thread->sm.init_state.evt_handler)
- {
- struct vsfvm_var_t *timeout = vsfvm_get_func_argu_ref(thread, 0);
- thread->sm.init_state.evt_handler = vsfvm_ext_evt_handler;
- thread->sm.user_data = thread;
- vsfsm_init(&thread->sm);
- if (!vsftimer_create(&thread->sm, timeout->uval32, 1, VSFSM_EVT_USER))
- return VSFVM_RET_ERROR;
- return VSFVM_RET_PEND;
- }
- else
- {
- vsfsm_fini(&thread->sm);
- thread->sm.init_state.evt_handler = NULL;
- return VSFVM_RET_FINISHED;
- }
- }
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表示函数调用结束,脚本可以继续运行。
|