STM32F407でのLuaによるシリアル通信を利用した機能ホットアップデート
目次- STM32F407でのLuaによるシリアル通信を利用した機能ホットアップデート
- 1.Luaリソースの準備
- 2.全体のアプローチ
- 3.Luaの移植
- ステップ1
- ステップ2
- ステップ3
- ステップ4
- ステップ5
- ステップ6
- 4.Luaの基本的な使用法
- ステップ1 基本的なLua関数の作成
- ステップ2 Lua関数の登録
- ステップ3 Lua文の理解
- ステップ4 Luaインタプリタの作成
- ステップ5 Luaの起動
- ステップ6 シリアル通信文の規則
- ステップ7 まとめ
1.Luaリソースの準備
Lua
2.全体のアプローチ
Keilプロジェクトの作成--->Luaの移植--->対応機能の追加
3.Luaの移植
ステップ1
通常通り解圧してください このファイルのみが使用されます
ステップ2
このフォルダ内を検索し、これら2つのファイルを削除してください(これらのファイルはSTM32では使用しません)
残りのファイルはBSP追加の手順に従って追加してください
ステップ3
プロジェクトを開き、追加が完了したらこのようになっているはずです。異なる場合は、こちらに従って調整してください
ステップ4
Stack_Sizeを変更します。このファイルを見つけてください
Stack_Sizeは必ず変更してください。Heap_Sizeは状況に応じて変更してください
ステップ5
Luaに必要な関数を作成
//適当なファイルに追加してください(Lua関数を格納する専用のCファイルを作成することをお勧めします)
time_t time(time_t * time){
return 0;
}
void exit(int status){
}
int system(const char * string){
return 0;
}
ステップ6
コンパイルして、エラーがなければOKです!
4.Luaの基本的な使用法
ステップ1 基本的なLua関数の作成
int LED_Control(lua_State *L)
{
uint8_t mode = lua_tointeger(L,1); // 渡された関数のパラメータを読み取り、数字は渡されたすべてのデータの何番目か
if(mode){
switch (mode)
{
case 1:{LED0_TOGGLE();}break; //LED0_TOGGLE()は事前に作成したC言語の関数です
case 2:{LED1_TOGGLE();};break;
case 3:{LED0_TOGGLE();};break;
};
}
return 1; //戻り値の数です、パラメータではありません
}
ステップ2 Lua関数の登録
登録されたLua関数のみがLuaインタプリタによって認識されます
const struct luaL_Reg mylib[] ={
{"LED_Control",LED_Control},//文字列は自由に定義できます。私は同じ名前にすることが習慣です()は不要です
{"delay_ms",delay_ms},
{"read_ADC",read_ADC},
{NULL,NULL}
};
ステップ3 Lua文について
まず、Lua文法ルールに適合した文字列を作成する必要があります LED_Control(1)はステップ1を参照してください
char lua_script[] = {
"print(\"Lua起動\")\nLED_Control(1)\ndelay_ms(1000)\n",
};
ステップ4 Luaインタプリタの作成
特記すべき点はありません。これが最もシンプルな例です。その他、Luaライブラリの起動などもあります。興味と必要があれば、各自で調べてみてください
lua_State *LUA_ENV;
int LUA_Init(){
LUA_ENV = luaL_newstate(); // Luaコンパイラの作成
luaopen_base(LUA_ENV); // 基本関数の登録
luaL_setfuncs(LUA_ENV, mylib, 0);
return 0;
};
ステップ5 Luaの起動
私は直接メインループに書きました。良いアイデアをお持ちの方がいれば教えてくださいXD;
while(1)
{
usart_command_Receive();//私が作成したシリアルコマンド受信
if(command_ready == 1)
{
int result = luaL_dostring(LUA_ENV,lua_script); // スクリプト文の実行
if(result == 1)
{
printf("Luaコード実行エラー!\r\n");
printf("エラー: %s\n", lua_tostring(LUA_ENV, -1));//エラーがあれば、Luaインタプリタがエラーをスタックにプッシュするので、直接読み取ることができます
command_ready = 0;
}
//
//command_ready = 0;
}
else
{LED0_TOGGLE();
delay_ms(3000);}
}
ステップ6 シリアル通信文の規則
シリアル通信文はLua文法に従って直接送信できますが、注意点として、ご自身のシリアルプロトコルとシリアルアシスタントの違いがあります。多くのサンプルでは\r\nをシリアル受信の終了として使用しています。シリアルアシスタントで改行を送信する場合は、必ず16進数に変換し、0D 0Aまたは単独の0Aであるか確認してください。可能であれば、独自のPC側アプリケーションを作成することをお勧めします。 プログラム更新後、再起動するとデータが失われる問題については、flashを使用できます(文字列はそれほど大きくありません)
ステップ7 まとめ
Luaの移植はそれほど困難ではありません個人的には、Luaを組み込み環境に移植することで、機能のホットアップデートがより容易になりますが、前提としてBSP部分を適切にカプセル化する必要があります。このようなシリアル通信(またはその他の通信方法)を通じたプログラム更新方法は、かなり興味深いものです(づ ̄3 ̄)づ╭❤~