MicroPython Githubでシステムファイルのないpythonファイルをロードしてコンパイルします。私が使用しているMicroPython
私はMicroPython上で非常に簡単なコードを実行したいと思います。私はPythonからC関数を呼び出すことができ、その逆も自分のコードで呼び出すことができます。ただし、Windows(Visual Studio IDE)でのみ動作します。
ここで、Crossworks IDEを使用してこのコードをCortext M4チップにロードします。 Visual Studioのコードをコピーしてクロスワークに貼り付けようとしたときに、依存関係を特定してヘッダファイルを生成する作業が必要でした。
これはprintfのような基本機能でのみ動作しますが、私の関数呼び出しは無視されます。その理由は、私のPythonファイルを検索しようとしましたが、見つけられませんでした。ここで
は、私はPythonのコードをロードしてコンパイルする必要がコードです:
void compile_pyfile(const char* fileName) {
//load and compile python src file
mp_lexer_t *lex = mp_lexer_new_from_file(fileName);
mp_parse_tree_t pt = mp_parse(lex, MP_PARSE_FILE_INPUT);
mp_obj_t module_fun = mp_compile(&pt, lex->source_name, MP_EMIT_OPT_NONE, false);
mp_call_function_0(module_fun);
}
そして、ここではそのPythonのコンパイルの出力を呼び出す関数です:
mp_obj_t call_py_func3(mp_obj_t* arr) {
const char* fileName = "Hello.py";
const char* funcName = "ret = test_array_C(*args)";
nlr_buf_t nlr;
if (nlr_push(&nlr) == 0) {
qstr inArrName = qstr_from_str("args");
mp_store_global(inArrName, *arr);
compile_pyfile(fileName);
exec_cmd(funcName);
nlr_pop();
return 0;
} else {
// uncaught exception
return (mp_obj_t)nlr.ret_val;
}
}
私はしないでくださいシステムファイルなしで動作させるためには、ここで何が行われる必要があるのかが分かります。以下は、Githubのmicropython-masterで提供されている同様のコードです。これはファイルではなく文字列内にあります。
void do_str(const char *src, mp_parse_input_kind_t input_kind) {
nlr_buf_t nlr;
if (nlr_push(&nlr) == 0) {
mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, src, strlen(src), 0);
qstr source_name = lex->source_name;
mp_parse_tree_t parse_tree = mp_parse(lex, input_kind);
mp_obj_t module_fun = mp_compile(&parse_tree, source_name, MP_EMIT_OPT_NONE, true);
mp_call_function_0(module_fun);
nlr_pop();
} else {
// uncaught exception
mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val);
}
}