目前市面上有很多嵌入式平台使用MicroPython进行脚本开发,很是方便。实际上还有一门优秀的脚本语言,LUA也适合移植到嵌入式平台中使用。鉴于MicroPython的内容网上已经够多了,所以这里不再移植MicroPython,而是LUA。
参考http://www.lua.org/
从http://www.lua.org/ftp/下载最新版本
解压到我们自己的工程,并添加所有c文件(除了luac.c
)到工程中。
交互操作使用串口,我们使用PA9和PA10对应USART1,接到了板载STLINK的虚拟串口,这样只要接一个USB即可供电,仿真,又可以串口通讯。
串口的操作参见https://bbs.eeworld.com.cn/thread-1228718-1-1.html
https://bbs.eeworld.com.cn/thread-1228720-1-1.html
打印输出时增加回显
int fputc(int c, FILE *stream)
{
/* Your implementation of fputc(). */
uint8_t ch=0;
if((uint8_t)ch == (uint8_t)'\n')
{
ch = '\r';
uart_write(&ch,1);
}
ch = (uint8_t)c;
uart_write(&ch,1);
if((uint8_t)ch == (uint8_t)'\r')
{
ch = '\n';
uart_write(&ch,1);
}
return c;
}
不用fgets所以fgetc不用,而是使用xprintf的xgets
Lua.c时一个交互式的解释器,我们可以直接使用
#include "xprintf.h"
436行 fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */改为
xgets(b,LUA_MAXINPUT) != NULL)
因为fgets有点问题,所以使用xprintf的xgets。参见https://bbs.eeworld.com.cn/thread-1228721-1-1.html
int main (int argc, char **argv) {改为
int lua_main (int argc, char **argv) {
在我们的main中调用lua_main即可
实现三个接口函数
volatile uint32_t s_ms_u32 = 0;
time_t time(time_t * t)
{
if(t != 0)
{
*t = s_ms_u32/1000;
}
return s_ms_u32/1000;
}
int system(const char s)
{
return 0;
}
void exit(int p)
{
}
其中s_ms_u32在systick中断中递增
void SysTick_Handler(void)
{
static volatile uint32_t num = 0;
s_ms_u32++;
if(num++ >= 1000)
{
LL_GPIO_TogglePin(GPIOB, 1u<<7);
LL_GPIO_TogglePin(GPIOG, 1u<<2);
LL_GPIO_TogglePin(GPIOC, 1u<<7);
num=0;
}
HAL_IncTick();
}
修改堆栈加大一点
Main中调用 lua_main(3,cmd);即可
编译下载运行
先来个HelloWorld
打印时间
打印日期
其他操作可以参考lua的相关文档。
LUA是MicroPython外一个优秀的脚本语言,可以移植到MCU等资源较小的嵌入式平台。代码用ANSI-C写成,移植很简单,只需要实现几个接口即可。后面我们就可以发挥脚本语言的优势,移植外设部分,就可以实现lua操作硬件了。
引用: lugl4313820 发表于 2022-12-17 23:22 lua,移植,是要指定芯片吗?
lua资源需求很小,ANSI-C编写,可移植性很好,只要资源够可以移植到任何MCU上使用。
使用lua.c解释器只需要实现基本的标准输入输出接口即可。
引用: qinyunti 发表于 2022-12-17 23:43 lua资源需求很小,ANSI-C编写,可移植性很好,只要资源够可以移植到任何MCU上使用。 使用lua.c解释器 ...
感谢大佬 分享,我也试着学学,记得我入门那时就用过esp8266的lua。但是那时没有学好。
这个挺好玩的,在ESP8266的那个nodemcu上见过。这个和microPython比起来哪个更好用呢?