本来是为了一个商业项目准备的,大概花了3天时间,包括简单的测试。但不一定会在项目中使用。这里就发布一些信息,看看这个东西有没有意义(估计只适合于特定应用)。
SVM是一个简单的虚拟机程序,体积非常小,并且可以定制(一般而言,是需要定制后才能适合某种应用的)。在AVR上使用GCC -Os优化下,代码占用空间为4KB多一点。整个代码完全基于递归的方法来实现命令语句的解析,内置了基本的数值计算和逻辑计算,还有部分简单的内存复制、比较等函数。并且可以定制很多特殊的功能函数。
SVM中的域
SVM的内存管理是通过域来实现的,域其实是一个“内存块”,用D表示,可以定义每个域的访问函数、访问权限和长度。需要那些域是可以根据需要定制的。域+索引可以用来指向域中的某个地址,比如P(5)指P域中的第5号数据(从0开始)。这里大概举例一些域:
1.#域:特殊的域,用来指定常数,表示方法# (常数)
2.NULL域:长度为0,表示空,用于赋值语句的左指,表示只计算,不赋值。
3.系统参数域:用于存放各种系统参数,各个虚拟机进程可以共享该域。
4.系统事件域:用于控制各个系统事件,使得SVM可以支持多进程共同运行(下面会介绍)。
5.当前进程参数域
6.临时数据域
7.根据需要的其他域
SVM语句
只包含7种语句,并且可以更具需要定制特殊的处理语句:
1.赋值‘A’
左值必须是域,右值是函数
2.进程调用‘R’
3.循环‘L’
相当于while(1)
4.条件‘I’
如果后面的函数计算结果!=0,则运行定义的下一层的代码
5.循环退出‘B’
相当于break
6.循环继续‘C’
相当于continue
7.调用退出‘E’
相当于return
8.定制的其他功能,调用速度快
SVM中的函数
SVM的所有操作都用函数来实现,域是函数(带一个参数表示序号,这样常数也是函数),函数的参数也是函数(除了常数域函数‘#’和定制的特殊函数例外)。这样使得整个对表达式的计算,完全基于嵌套的方式实现。可以定制一些特殊的函数,用于实现特殊的功能,这些特殊的函数可以用来控制和相应系统事件。
SVM中的流程控制与系统事件控制 -- 实现多实例同时运行(共享堆栈方式)
可以实现某些特殊函数,比如delay_ms毫秒延时函数,当调用这个函数的时候,会返回一个“系统错误”,调用函数会层层上传这个“系统错误”。在主调用函数返回后,检测这个特殊的“系统错误”,并检测系统事件域中的设置,启动某个操作(这个是定时器的操作,当特定的ms数时候,会引发一个系统事件)。这个时候,相当于进程已经停止(并且释放了占用的堆栈),可以运行其他进程。当某个系统事件到来(这里是延时完成),并且其他进程退出或者也在等待状态,这时,就调用原来等待的那个进程,调用函数会更具记录下的原先delay_ms函数的调用流程,快速进入到等待的delay_ms函数,并继续运行。一个特殊的事件:调试事件也是通过这个方法实现的。也就是因为了可以这个实现,使得程序调试起来非常简单,3天就可以搞定并完成基本测试。
下面举一些代码作为例子:
调试事件的实现方法:
err = SVM_execute(execute_data, execute_data + sizeof(execute_data), envi, SVM_EXIT_ON_END);
if (err != SVM_ERR_OK)
{
if (err == SVM_ERR_WAIT_EVENT)
{
// waiting system event
event_buffer[0xFF] = event_buffer[0xFE];
envi->cur_flow_level = 0;
goto go;
}
// err occurs
}
说明:event_buffer的最后2个字节定义为调试事件,当成运行掉调试指令时,会退出运行,这时可以查看内存。然后再次调用SVM_ececute的时候,程序会根据记录的流程来快速跳过已经执行过的语句,进入调试指令,并继续运行。
SVM_EXIT_ON_END指程序运行完最后一条指令就跳出,还有一个选项是SVM_LOOP_ON_END,用于循环体,表示执行完最后一条语句,重新开始执行。
envi是该进程的运行环境,包括各种域的设置,运行流程控制结构。
闪灯(D函数控制流水灯):
代码中的常数,会自动翻译成#(常数)格式
L; // while(1)
p(1); // 延时1s
D(1); // LED_ON
p(1); // 延时1s
D(0); // LED_OFF
另一种方式:
A(V(0), 0); // V[0] = 0;
L;
p(1);
D(V(0));
A(V(0), +(V(0), 1)) // V[0] = V[0] + 1
各部分C语言代码长度(带一些注释,{}各占用一整行):
SVM系统层:476行
数字计算和逻辑计算函数:150行
部分特殊函数(内存赋值、比较、调试函数、域全局设置函数、延时函数、Checksum函数):341行
文章评论(0条评论)
登录后参与讨论