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表示函数调用结束,脚本可以继续运行。
|