This is a port of the mruby/c tutorial Chapter 03 to the mbed environment.

Dependencies:   mbed

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.

Committer:
tk_takateku
Date:
Wed Feb 15 01:03:35 2017 +0000
Revision:
0:33feccbba3ff
Commit before publishing

Who changed what in which revision?

UserRevisionLine numberNew 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