qinyunti 发表于 2022-12-17 00:04

【ST NUCLEO-U575ZI-Q 测评 】LUA移植

<div class='showpostmsg'><h1>f3a07fa02c80f25fccdaf908d3bce13d<br />
</h1>

<h1><b>前言</b></h1>

<p >目前市面上有很多嵌入式平台使用MicroPython进行脚本开发,很是方便。实际上还有一门优秀的脚本语言,LUA也适合移植到嵌入式平台中使用。鉴于MicroPython的内容网上已经够多了,所以这里不再移植MicroPython,而是LUA。</p>

<p >参考http://www.lua.org/</p>

<h1 ><b>过程</b></h1>

<h2 ><b>准备</b></h2>

<p >从http://www.lua.org/ftp/下载最新版本</p>

<p > &nbsp;</p>

<p >解压到我们自己的工程,并添加所有c文件(除了luac.c</p>

<p >)到工程中。</p>

<p > &nbsp;</p>

<p >&nbsp;</p>

<p >&nbsp;</p>

<h2 ><b>串口</b></h2>

<p >交互操作使用串口,我们使用PA9和PA10对应USART1,接到了板载STLINK的虚拟串口,这样只要接一个USB即可供电,仿真,又可以串口通讯。</p>

<p >串口的操作参见https://bbs.eeworld.com.cn/thread-1228718-1-1.html</p>

<p ><a href="https://bbs.eeworld.com.cn/thread-1228720-1-1.html"><u>https://bbs.eeworld.com.cn/thread-1228720-1-1.html</u></a></p>

<p >&nbsp;</p>

<p >打印输出时增加回显</p>

<p >&nbsp;</p>

<div class="parsedown-markdown">
<p>int fputc(int c, FILE *stream)</p>

<p >{</p>

<p >/* Your implementation of fputc(). */</p>

<p >uint8_t ch=0;</p>

<p >if((uint8_t)ch == (uint8_t)&#39;\n&#39;)</p>

<p >{</p>

<p >ch = &#39;\r&#39;;</p>

<p >uart_write(&amp;ch,1);</p>

<p >}</p>

<p >ch = (uint8_t)c;</p>

<p >uart_write(&amp;ch,1);</p>

<p >if((uint8_t)ch == (uint8_t)&#39;\r&#39;)</p>

<p >{</p>

<p >ch = &#39;\n&#39;;</p>

<p >uart_write(&amp;ch,1);</p>

<p >}</p>

<p >return c;</p>

<p >}</p>

<p >&nbsp;</p>
</div>

<p >&nbsp;</p>

<p >不用fgets所以fgetc不用,而是使用xprintf的xgets</p>

<h2 ><b>移植修改</b></h2>

<p >Lua.c时一个交互式的解释器,我们可以直接使用</p>

<p >#include &quot;xprintf.h&quot;</p>

<p >436行 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fgets(b, LUA_MAXINPUT, stdin) != NULL) &nbsp;/* get line */改为</p>

<p >xgets(b,LUA_MAXINPUT) != NULL)</p>

<p >因为fgets有点问题,所以使用xprintf的xgets。参见https://bbs.eeworld.com.cn/thread-1228721-1-1.html</p>

<p >&nbsp;</p>

<p >int main (int argc, char **argv) {改为</p>

<p >int lua_main (int argc, char **argv) {</p>

<p >&nbsp;</p>

<p >在我们的main中调用lua_main即可</p>

<p >&nbsp;</p>

<p >实现三个接口函数</p>

<p >&nbsp;</p>

<div class="parsedown-markdown">
<p>volatile uint32_t s_ms_u32 = 0;</p>

<p >time_t time(time_t * t)</p>

<p >{</p>

<p >if(t != 0)</p>

<p >{</p>

<p >*t = s_ms_u32/1000;</p>

<p >}</p>

<p >return s_ms_u32/1000;</p>

<p >}</p>

<p >&nbsp;</p>

<p >int system(const char s)</p>

<p >{</p>

<p >return 0;</p>

<p >}</p>

<p >&nbsp;</p>

<p >void exit(int p)</p>

<p >{</p>

<p >&nbsp;</p>

<p >}</p>
</div>

<p >&nbsp;</p>

<p >&nbsp;</p>

<p >其中s_ms_u32在systick中断中递增</p>

<p >&nbsp;</p>

<div class="parsedown-markdown">
<p>void SysTick_Handler(void)</p>

<p >{</p>

<p >static volatile uint32_t num = 0;</p>

<p >s_ms_u32++;</p>

<p >if(num++ &gt;= 1000)</p>

<p >{</p>

<p >LL_GPIO_TogglePin(GPIOB, 1u&lt;&lt;7);</p>

<p >LL_GPIO_TogglePin(GPIOG, 1u&lt;&lt;2);</p>

<p >LL_GPIO_TogglePin(GPIOC, 1u&lt;&lt;7);</p>

<p >num=0;</p>

<p >}</p>

<p >HAL_IncTick();</p>

<p >}</p>
</div>

<p >&nbsp;</p>

<p >&nbsp;</p>

<p >修改堆栈加大一点</p>

<p > &nbsp;</p>

<p >&nbsp;</p>

<p >Main中调用 lua_main(3,cmd);即可</p>

<p >&nbsp;</p>

<p >&nbsp;</p>

<p >&nbsp;</p>

<h1 ><b>测试</b></h1>

<p >编译下载运行</p>

<p >先来个HelloWorld</p>

<p > &nbsp;</p>

<p >&nbsp;</p>

<p >打印时间</p>

<p > &nbsp;</p>

<p >&nbsp;</p>

<p >打印日期</p>

<p > &nbsp;</p>

<p >&nbsp;</p>

<p >其他操作可以参考lua的相关文档。</p>

<h1 ><b>总结</b></h1>

<p >LUA是MicroPython外一个优秀的脚本语言,可以移植到MCU等资源较小的嵌入式平台。代码用ANSI-C写成,移植很简单,只需要实现几个接口即可。后面我们就可以发挥脚本语言的优势,移植外设部分,就可以实现lua操作硬件了。</p>

<p >&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2022-12-17 20:37

<p>看来LUA确实适合移植到嵌入式平台中</p>

lugl4313820 发表于 2022-12-17 23:22

lua,移植,是要指定芯片吗?

qinyunti 发表于 2022-12-17 23:43

lugl4313820 发表于 2022-12-17 23:22
lua,移植,是要指定芯片吗?

<p>lua资源需求很小,ANSI-C编写,可移植性很好,只要资源够可以移植到任何MCU上使用。</p>

<p>使用lua.c解释器只需要实现基本的标准输入输出接口即可。</p>

lugl4313820 发表于 2022-12-18 10:24

qinyunti 发表于 2022-12-17 23:43
lua资源需求很小,ANSI-C编写,可移植性很好,只要资源够可以移植到任何MCU上使用。

使用lua.c解释器 ...

<p>感谢大佬 分享,我也试着学学,记得我入门那时就用过esp8266的lua。但是那时没有学好。</p>

freebsder 发表于 2022-12-27 14:15

<p>xprintf,学习了!</p>

manhuami2007 发表于 2023-1-8 21:46

<p>这个挺好玩的,在ESP8266的那个nodemcu上见过。这个和microPython比起来哪个更好用呢?</p>

okhxyyo 发表于 2023-1-12 09:44

<p>测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html</p>
页: [1]
查看完整版本: 【ST NUCLEO-U575ZI-Q 测评 】LUA移植