This is a port of the mruby/c tutorial Chapter 03 to the mbed environment.
For details, refer to the following.
http://www.s-itoc.jp/activity/research/mrubyc/mrubyc_tutorial/436
Note:There is a change in rtt0.h from the original source in the mruby/c. It was necessary for inclusion in C ++ source.
mrubyc/vm.h@0:33feccbba3ff, 2017-02-15 (annotated)
- Committer:
- tk_takateku
- Date:
- Wed Feb 15 01:03:35 2017 +0000
- Revision:
- 0:33feccbba3ff
Commit before publishing
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tk_takateku | 0:33feccbba3ff | 1 | /*! @file |
tk_takateku | 0:33feccbba3ff | 2 | @brief |
tk_takateku | 0:33feccbba3ff | 3 | mruby bytecode executor. |
tk_takateku | 0:33feccbba3ff | 4 | |
tk_takateku | 0:33feccbba3ff | 5 | <pre> |
tk_takateku | 0:33feccbba3ff | 6 | Copyright (C) 2015 Kyushu Institute of Technology. |
tk_takateku | 0:33feccbba3ff | 7 | Copyright (C) 2015 Shimane IT Open-Innovation Center. |
tk_takateku | 0:33feccbba3ff | 8 | |
tk_takateku | 0:33feccbba3ff | 9 | This file is distributed under BSD 3-Clause License. |
tk_takateku | 0:33feccbba3ff | 10 | |
tk_takateku | 0:33feccbba3ff | 11 | Fetch mruby VM bytecodes, decode and execute. |
tk_takateku | 0:33feccbba3ff | 12 | |
tk_takateku | 0:33feccbba3ff | 13 | </pre> |
tk_takateku | 0:33feccbba3ff | 14 | */ |
tk_takateku | 0:33feccbba3ff | 15 | |
tk_takateku | 0:33feccbba3ff | 16 | #ifndef MRBC_SRC_VM_H_ |
tk_takateku | 0:33feccbba3ff | 17 | #define MRBC_SRC_VM_H_ |
tk_takateku | 0:33feccbba3ff | 18 | |
tk_takateku | 0:33feccbba3ff | 19 | #include <stdint.h> |
tk_takateku | 0:33feccbba3ff | 20 | #include "value.h" |
tk_takateku | 0:33feccbba3ff | 21 | #include "vm_config.h" |
tk_takateku | 0:33feccbba3ff | 22 | |
tk_takateku | 0:33feccbba3ff | 23 | #ifdef __cplusplus |
tk_takateku | 0:33feccbba3ff | 24 | extern "C" { |
tk_takateku | 0:33feccbba3ff | 25 | #endif |
tk_takateku | 0:33feccbba3ff | 26 | |
tk_takateku | 0:33feccbba3ff | 27 | |
tk_takateku | 0:33feccbba3ff | 28 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 29 | /*!@brief |
tk_takateku | 0:33feccbba3ff | 30 | |
tk_takateku | 0:33feccbba3ff | 31 | */ |
tk_takateku | 0:33feccbba3ff | 32 | typedef struct IREP { |
tk_takateku | 0:33feccbba3ff | 33 | int16_t unused; //! unused flag |
tk_takateku | 0:33feccbba3ff | 34 | struct IREP *next; //! irep linked list |
tk_takateku | 0:33feccbba3ff | 35 | |
tk_takateku | 0:33feccbba3ff | 36 | uint8_t *code; |
tk_takateku | 0:33feccbba3ff | 37 | mrb_object *ptr_to_pool; |
tk_takateku | 0:33feccbba3ff | 38 | uint8_t *ptr_to_sym; |
tk_takateku | 0:33feccbba3ff | 39 | |
tk_takateku | 0:33feccbba3ff | 40 | int16_t nlocals; |
tk_takateku | 0:33feccbba3ff | 41 | int16_t nregs; |
tk_takateku | 0:33feccbba3ff | 42 | int16_t rlen; |
tk_takateku | 0:33feccbba3ff | 43 | int32_t ilen; |
tk_takateku | 0:33feccbba3ff | 44 | |
tk_takateku | 0:33feccbba3ff | 45 | int16_t iseq; |
tk_takateku | 0:33feccbba3ff | 46 | |
tk_takateku | 0:33feccbba3ff | 47 | } mrb_irep; |
tk_takateku | 0:33feccbba3ff | 48 | |
tk_takateku | 0:33feccbba3ff | 49 | |
tk_takateku | 0:33feccbba3ff | 50 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 51 | /*!@brief |
tk_takateku | 0:33feccbba3ff | 52 | |
tk_takateku | 0:33feccbba3ff | 53 | */ |
tk_takateku | 0:33feccbba3ff | 54 | typedef struct CALLINFO { |
tk_takateku | 0:33feccbba3ff | 55 | mrb_irep *pc_irep; |
tk_takateku | 0:33feccbba3ff | 56 | uint32_t pc; |
tk_takateku | 0:33feccbba3ff | 57 | uint32_t reg_top; |
tk_takateku | 0:33feccbba3ff | 58 | uint8_t n_args; // num of args |
tk_takateku | 0:33feccbba3ff | 59 | } mrb_callinfo; |
tk_takateku | 0:33feccbba3ff | 60 | |
tk_takateku | 0:33feccbba3ff | 61 | |
tk_takateku | 0:33feccbba3ff | 62 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 63 | /*!@brief |
tk_takateku | 0:33feccbba3ff | 64 | |
tk_takateku | 0:33feccbba3ff | 65 | */ |
tk_takateku | 0:33feccbba3ff | 66 | typedef struct VM { |
tk_takateku | 0:33feccbba3ff | 67 | mrb_irep *irep; // irep linked list |
tk_takateku | 0:33feccbba3ff | 68 | |
tk_takateku | 0:33feccbba3ff | 69 | uint8_t vm_id; // vm_id : 1..n |
tk_takateku | 0:33feccbba3ff | 70 | int16_t priority; // |
tk_takateku | 0:33feccbba3ff | 71 | const uint8_t *mrb; // bytecode |
tk_takateku | 0:33feccbba3ff | 72 | |
tk_takateku | 0:33feccbba3ff | 73 | mrb_irep *pc_irep; // PC |
tk_takateku | 0:33feccbba3ff | 74 | int16_t pc; // PC |
tk_takateku | 0:33feccbba3ff | 75 | |
tk_takateku | 0:33feccbba3ff | 76 | int reg_top; |
tk_takateku | 0:33feccbba3ff | 77 | mrb_value regs[MAX_REGS_SIZE]; |
tk_takateku | 0:33feccbba3ff | 78 | int callinfo_top; |
tk_takateku | 0:33feccbba3ff | 79 | mrb_callinfo callinfo[MAX_CALLINFO_SIZE]; |
tk_takateku | 0:33feccbba3ff | 80 | |
tk_takateku | 0:33feccbba3ff | 81 | mrb_class *target_class; |
tk_takateku | 0:33feccbba3ff | 82 | mrb_object *top_self; // ? |
tk_takateku | 0:33feccbba3ff | 83 | |
tk_takateku | 0:33feccbba3ff | 84 | int32_t error_code; |
tk_takateku | 0:33feccbba3ff | 85 | |
tk_takateku | 0:33feccbba3ff | 86 | volatile int8_t flag_preemption; |
tk_takateku | 0:33feccbba3ff | 87 | } mrb_vm; |
tk_takateku | 0:33feccbba3ff | 88 | |
tk_takateku | 0:33feccbba3ff | 89 | |
tk_takateku | 0:33feccbba3ff | 90 | |
tk_takateku | 0:33feccbba3ff | 91 | mrb_irep *new_irep(mrb_vm *vm); |
tk_takateku | 0:33feccbba3ff | 92 | struct VM *vm_open(void); |
tk_takateku | 0:33feccbba3ff | 93 | void vm_close(struct VM *vm); |
tk_takateku | 0:33feccbba3ff | 94 | void vm_boot(struct VM *vm); |
tk_takateku | 0:33feccbba3ff | 95 | int vm_run(struct VM *vm); |
tk_takateku | 0:33feccbba3ff | 96 | |
tk_takateku | 0:33feccbba3ff | 97 | |
tk_takateku | 0:33feccbba3ff | 98 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 99 | /*!@brief |
tk_takateku | 0:33feccbba3ff | 100 | Get 32bit value from memory big endian. |
tk_takateku | 0:33feccbba3ff | 101 | |
tk_takateku | 0:33feccbba3ff | 102 | @param s Pointer of memory. |
tk_takateku | 0:33feccbba3ff | 103 | @return 32bit unsigned value. |
tk_takateku | 0:33feccbba3ff | 104 | */ |
tk_takateku | 0:33feccbba3ff | 105 | inline static uint32_t bin_to_uint32( const void *s ) |
tk_takateku | 0:33feccbba3ff | 106 | { |
tk_takateku | 0:33feccbba3ff | 107 | uint8_t *s1 = (uint8_t *)s; |
tk_takateku | 0:33feccbba3ff | 108 | uint32_t ret; |
tk_takateku | 0:33feccbba3ff | 109 | |
tk_takateku | 0:33feccbba3ff | 110 | ret = *s1++; |
tk_takateku | 0:33feccbba3ff | 111 | ret = (ret << 8) + *s1++; |
tk_takateku | 0:33feccbba3ff | 112 | ret = (ret << 8) + *s1++; |
tk_takateku | 0:33feccbba3ff | 113 | ret = (ret << 8) + *s1; |
tk_takateku | 0:33feccbba3ff | 114 | return ret; |
tk_takateku | 0:33feccbba3ff | 115 | } |
tk_takateku | 0:33feccbba3ff | 116 | |
tk_takateku | 0:33feccbba3ff | 117 | |
tk_takateku | 0:33feccbba3ff | 118 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 119 | /*!@brief |
tk_takateku | 0:33feccbba3ff | 120 | Get 16bit value from memory big endian. |
tk_takateku | 0:33feccbba3ff | 121 | |
tk_takateku | 0:33feccbba3ff | 122 | @param s Pointer of memory. |
tk_takateku | 0:33feccbba3ff | 123 | @return 16bit unsigned value. |
tk_takateku | 0:33feccbba3ff | 124 | */ |
tk_takateku | 0:33feccbba3ff | 125 | inline static uint16_t bin_to_uint16( const void *s ) |
tk_takateku | 0:33feccbba3ff | 126 | { |
tk_takateku | 0:33feccbba3ff | 127 | uint8_t *s1 = (uint8_t *)s; |
tk_takateku | 0:33feccbba3ff | 128 | uint16_t ret; |
tk_takateku | 0:33feccbba3ff | 129 | |
tk_takateku | 0:33feccbba3ff | 130 | ret = *s1++; |
tk_takateku | 0:33feccbba3ff | 131 | ret = (ret << 8) + *s1; |
tk_takateku | 0:33feccbba3ff | 132 | return ret; |
tk_takateku | 0:33feccbba3ff | 133 | } |
tk_takateku | 0:33feccbba3ff | 134 | |
tk_takateku | 0:33feccbba3ff | 135 | |
tk_takateku | 0:33feccbba3ff | 136 | #ifdef __cplusplus |
tk_takateku | 0:33feccbba3ff | 137 | } |
tk_takateku | 0:33feccbba3ff | 138 | #endif |
tk_takateku | 0:33feccbba3ff | 139 | #endif |
tk_takateku | 0:33feccbba3ff | 140 |