打印

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

[复制链接]
1249|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vsfopen|  楼主 | 2018-6-19 12:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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表示函数调用结束,脚本可以继续运行。

使用特权

评论回复

相关帖子

沙发
skyerwlb| | 2020-2-22 20:00 | 只看该作者
怎么这么多AD者!

使用特权

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

本版积分规则

90

主题

325

帖子

8

粉丝