2017-09-14 4 views
0

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); 
    } 
} 

答えて

0

MicroPythonがC関数を呼び出すためには、インタプリタに登録する必要があります。私はここで古風な例を持っています:https://github.com/dhylands/micropython/commit/b801dbd39eb323494f946c13362f4957f5d7281bこれはc_sampleというモジュールを作成します。あなたはよmpconfigport.hファイルに変更を見れば、それはMICROPY_PORT_BUILTIN_MODULES に& mp_module_c_sampleを追加する場所

これは輸入c_sampleが動作することを可能にするものです。

ファイルシステムがなければ、pythonソースファイルとフリーズファイルとして含まれるプリコンパイル済みバイトコード(.mpy)ファイルを使用することもできます。これらは使用できます。ティーンセイポートにはファイルシステムがなく、このテクニックを使用します。

関連する問題