Added demo script.

This commit is contained in:
imi415 2022-01-19 17:28:48 +08:00
parent 6019146984
commit d22600328a
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
8 changed files with 113 additions and 51 deletions

View File

@ -28,6 +28,10 @@
#include "mruby.h"
#include "mruby/compile.h"
#include "mruby/dump.h"
#include "mruby/string.h"
#include "mruby/variable.h"
#include "mruby/presym.h"
/* USER CODE END Includes */
@ -354,12 +358,6 @@ static void report_card_info(void) {
);
}
static void report_heap(void) {
struct mallinfo mi = mallinfo();
printf("\r\nHeap usage: %d bytes.\r\n", mi.uordblks);
}
/**
* @brief Load a script called boot.rb from SD card
* It's caller free.
@ -383,7 +381,7 @@ static char *load_boot_script(void) {
}
UINT boot_file_size = f_size(&boot_file);
ret = malloc(boot_file_size + 1);
ret = pvPortMalloc(boot_file_size + 1);
if(ret == NULL) {
printf("Failed to allocate memory for script.\r\n");
goto out_close;
@ -392,7 +390,7 @@ static char *load_boot_script(void) {
UINT read_size;
if(f_read(&boot_file, ret, boot_file_size, &read_size) != FR_OK) {
printf("Failed to read script.\r\n");
free(ret);
vPortFree(ret);
ret = NULL;
} else {
ret[read_size] = '\0';
@ -421,11 +419,10 @@ void RunMRBTask(void *argument)
{
/* USER CODE BEGIN 5 */
report_heap();
mrb_state *mrb = mrb_open();
if(mrb == NULL) {
printf("Failed to open mruby core.\r\n");
goto dead_loop;
}
mrbc_context *cxt = mrbc_context_new(mrb);
@ -440,18 +437,27 @@ void RunMRBTask(void *argument)
struct mrb_parser_state *parser_state = mrb_parse_string(mrb, boot_script, cxt);
if(parser_state == NULL) {
printf("Failed to parse main script.\r\n");
vPortFree(boot_script);
mrb_parser_free(parser_state);
} else {
free(boot_script);
vPortFree(boot_script);
mrb_load_exec(mrb, parser_state, cxt);
if(mrb->exc) {
printf("Exception occured, script not finished.\r\n");
}
}
}
printf("Boot script exited, cleaning up.\r\n");
cleanup_mrb:
mrb_close(mrb);
report_heap();
dead_loop:
/* Infinite loop */
for(;;)
{

28
example/boot.rb Normal file
View File

@ -0,0 +1,28 @@
i = 0
puts "mRuby v#{RUBY_VERSION} on STM32!\r\n"
2.times do
puts "Hello world #{i}\r\n"
i += 1
puts "MRB Heap usage: #{OSUtil.heap_usage.to_s}\r\n"
OSUtil.sleep_ms(500)
end
begin
puts "#{Gpio}\r\n"
pin = Gpio::Pin.new({:port => 0, :pin => 16}, {:mode => 0, :pull => 0})
puts "#{pin}\r\n"
puts "#{Gpio::Port::A}\r\n"
rescue Exception => e
puts "Exception: #{e.inspect}\r\n"
end
puts "MRB Heap usage: #{OSUtil.heap_usage.to_s}\r\n"
puts "Main script ended.\r\n"

View File

@ -1,14 +0,0 @@
cmake_minimum_required(VERSION 3.10)
project(linenoise)
set(LINENOISE_SOURCES
"linenoise/linenoise.c"
)
set(LINENOISE_INCLUDES
"linenoise"
)
add_library(${PROJECT_NAME} ${LINENOISE_SOURCES})
target_include_directories(${PROJECT_NAME} PUBLIC ${LINENOISE_INCLUDES})

View File

@ -29,7 +29,7 @@ set_target_properties(mruby PROPERTIES IMPORTED_LOCATION
)
set_target_properties(mruby PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${CMAKE_CURRENT_SOURCE_DIR}/mruby/include"
"${CMAKE_CURRENT_SOURCE_DIR}/mruby/include;${CMAKE_CURRENT_SOURCE_DIR}/mruby/build/STM32H750/include"
)
set_directory_properties(PROPERTIES ADDITIONAL_CLEAN_FILES

View File

@ -47,6 +47,7 @@ MRuby::CrossBuild.new("STM32H750") do |conf|
#gems from core
conf.gem :core => "mruby-compiler"
conf.gem :core => "mruby-enum-ext"
conf.gem :core => "mruby-hash-ext"
conf.gem :core => "mruby-math"
conf.gem :core => "mruby-numeric-ext"
conf.gem :core => "mruby-print"

View File

@ -0,0 +1,24 @@
module Gpio
module Port
A = 0
B = 1
C = 2
D = 3
E = 4
F = 5
G = 6
H = 7
end
module Mode
INPUT = 0
OUTPUT_PP = 1
OUTPUT_OD = 2
end
module Pull
NONE = 0
UP = 1
DOWN = 2
end
end

View File

@ -1,41 +1,49 @@
#include <mruby.h>
#include <mruby/string.h>
#include <mruby/variable.h>
#include <mruby/class.h>
#include "stm32h7xx_hal.h"
static mrb_value stm32_gpio_init_c_method(mrb_state *mrb, mrb_value self) {
}
static mrb_value stm32_gpio_deinit_c_method(mrb_state *mrb, mrb_value self) {
printf("Init called.\r\n");
return mrb_nil_value();
}
static mrb_value stm32_gpio_read_c_method(mrb_state *mrb, mrb_value self) {
printf("Read called.\r\n");
return mrb_nil_value();
}
static mrb_value stm32_gpio_write_c_method(mrb_state *mrb, mrb_value self) {
printf("Write called.\r\n");
return mrb_nil_value();
}
static mrb_value stm32_gpio_toggle_c_method(mrb_state *mrb, mrb_value self) {
printf("Toggle called.\r\n");
return mrb_nil_value();
}
void mrb_stm32_gpio_gem_init(mrb_state *mrb) {
struct RClass *stm32_gpio_cextension = mrb_define_class(mrb, "stm32_gpio", mrb->object_class);
/* _init(port, pin, mode) */
mrb_define_method(mrb, stm32_gpio_cextension, "_init", stm32_gpio_init_c_method, MRB_ARGS_REQ(3));
/* _deinit(port, pin) */
mrb_define_method(mrb, stm32_gpio_cextension, "_deinit", stm32_gpio_deinit_c_method, MRB_ARGS_REQ(2));
/* _read(port, pin) */
mrb_define_method(mrb, stm32_gpio_cextension, "_read", stm32_gpio_read_c_method, MRB_ARGS_REQ(2));
/* _write(port, pin, value) */
mrb_define_method(mrb, stm32_gpio_cextension, "_write", stm32_gpio_write_c_method, MRB_ARGS_REQ(3));
/* _toggle(port, pin) */
mrb_define_method(mrb, stm32_gpio_cextension, "_toggle", stm32_gpio_toggle_c_method, MRB_ARGS_REQ(2));
struct RClass *stm32_gpio_module = mrb_define_module(mrb, "Gpio");
struct RClass *stm32_pin_class = mrb_define_class_under(mrb, stm32_gpio_module, "Pin", mrb->object_class);
MRB_SET_INSTANCE_TT(stm32_pin_class, MRB_TT_DATA);
/* initialize(port, pin, mode) */
mrb_define_method(mrb, stm32_pin_class, "initialize", stm32_gpio_init_c_method, MRB_ARGS_ARG(1, 1));
/* _read(port, pin) */
mrb_define_method(mrb, stm32_pin_class, "read", stm32_gpio_read_c_method, MRB_ARGS_NONE());
/* _write(port, pin, value) */
mrb_define_method(mrb, stm32_pin_class, "write", stm32_gpio_write_c_method, MRB_ARGS_NONE());
/* _toggle(port, pin) */
mrb_define_method(mrb, stm32_pin_class, "toggle", stm32_gpio_toggle_c_method, MRB_ARGS_NONE());
}
void mrb_stm32_gpio_gem_final(mrb_state *mrb) {

View File

@ -1,16 +1,15 @@
#include <malloc.h>
#include <mruby.h>
#include <mruby/string.h>
#include "cmsis_os.h"
static mrb_value stm32_osutil_sleep_ms_c_method(mrb_state* mrb, mrb_value self) {
mrb_value* argv;
static mrb_value stm32_osutil_sleep_ms_c_method(mrb_state *mrb, mrb_value self) {
mrb_value *argv;
mrb_int argc;
mrb_get_args(mrb, "*", &argv, &argc);
int iargc = (int)argc;
if (iargc == 0 || iargc >= 2) {
if (argc != 1) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
}
@ -20,13 +19,23 @@ static mrb_value stm32_osutil_sleep_ms_c_method(mrb_state* mrb, mrb_value self)
mrb_raise(mrb, E_ARGUMENT_ERROR, "sleep duration must be positive integer");
}
return self;
return mrb_nil_value();
}
void mrb_stm32_osutil_gem_init(mrb_state* mrb) {
struct RClass* class_cextension = mrb_define_module(mrb, "OSUtil");
static mrb_value stm32_osutil_heap_usage_c_method(mrb_state *mrb, mrb_value self) {
struct mallinfo mi = mallinfo();
return mrb_int_value(mrb, mi.uordblks);
}
void mrb_stm32_osutil_gem_init(mrb_state *mrb) {
struct RClass *class_cextension = mrb_define_module(mrb, "OSUtil");
/* OSUtil.sleep_ms(msec) => nil */
mrb_define_class_method(mrb, class_cextension, "sleep_ms", stm32_osutil_sleep_ms_c_method, MRB_ARGS_REQ(1));
/* OSUtil.heap_usage() => usage in bytes */
mrb_define_class_method(mrb, class_cextension, "heap_usage", stm32_osutil_heap_usage_c_method, MRB_ARGS_NONE());
}
void mrb_stm32_osutil_gem_final(mrb_state* mrb) { /* finalizer */
void mrb_stm32_osutil_gem_final(mrb_state *mrb) {
/* Finalizer */
/* No resources needs cleanup. */
}