为STM32移植Berry脚本语言

更新时间:2023-05-17 12:18:35 阅读: 评论:0

为STM32移植Berry脚本语⾔
是我为单⽚机设计的⼀款脚本语⾔,该语⾔具有资源占⽤⼩、平台⽆关、执⾏速度快和易于掌握等优点。在单⽚机上使⽤脚本语⾔可以提⾼单⽚机的⼆次开发能⼒以及调试效率,同时也是⼀种⽐较新颖的玩法。本教程将简要介绍在 STM32F103RBT6 单⽚机上移植 Berry 脚本语⾔的⽅法。教程的末尾给出了移植完成的⽰例⼯程,读者可以根据本教程的内容和⽰例⼯程完成⾃⼰的移植⼯作。
我使⽤ ST 推出的 CubeMX 软件进⾏单⽚机固件库的配置,选择⽤ CubeMX ⽣成 HAL 库⼯程⽽不⽤标准库是考虑到以下因素:
不必编写底层外设的驱动代码,减少⼯作量
⽅便后续⽀持更多的 STM32 型号
⽅便⽣成各种开发环境的⼯程
这只是⼀个简单的例⼦,只需要使⽤ CubeMX 建⽴⼀个基础的⼯程并进⾏少量的配置。开始本教程之前,读者需要先安装 CubeMX 软件和STM32CubeF1 ⽀持包,然后我们就可以开始建⽴⼯程了。
基础配置
打开 CubeMX 后,点击菜单栏中的New -> NewProjext来启动⼯程配置向导。按下图进⾏配置:
建⽴⼯程后将进⼊类似下图的界⾯(这是最终配置好的⼯程)
打开 Project Manager选项卡,我们进⾏以下配置:
这个界⾯⽤于进⾏⼯程的配置,除了⼯程名和路径等基本信息,我们需要注意 Toolchain/IDE 和 Linker Settings 中堆栈⼤⼩的设置。这⾥我选择了⽐较常⽤的 MDK-ARM V5 作为⽬标 IDE。对于堆栈⼤⼩,建议最⼩堆容量(Minimum Heap Size)不低于 4KB(0x1000),⽽最⼩栈容量不低于 2KB(0x800)。
读者可根据实际情况进⾏时钟配置,即使不进⾏任何配置也可以正常使⽤(将使⽤内部的 HSI 时钟源,且主频只有 8MHz)。
最后我们需要配置⼀个串⼝以⽅便运⾏脚本的交互模式。串⼝外设在 Pinout & Configuration 选项卡下的 Connectivity ⽬录中,我需要使⽤USART1 进⾏通信,这⾥就只对它进⾏配置:
到此,基本的配置⼯作就完成了,点击 GENERATE CODE 按钮就可以⽣成 Keil MDK 的⼯程,接下来的移植⼯作将在 MDK ⼯程中进⾏。塘下论坛
移植 Berry
准备⽂件
⽬前项⽬的⽬录结构如下所⽰:
⾸先到 GitHub 中下载的源代码并进⾏编译(这需要电脑上安装 GCC ⼯具链并执⾏make prebuild命令,如果没有的话读者可以直接使⽤⽂末我已经移植好的⼯程),该过程是为了⽣成需要⾃动⽣成的代码。完成之后我们需要进⾏以下操作:
1. 将整个berry⽂件夹移动到stm32f103rb_berry⽂件夹下,该⽂件夹中包含了 Berry 解释器的核⼼代码
2. 将berry/generate⽂件夹移动到stm32f103rb_berry⽂件夹下,这是在使⽤make prebuild命令时由berry/tools/map_build/⼯
具⾃动⽣成的代码,⽂末的参考⼯程也给出了这些代码
3. 将berry/default⽂件夹中的源⽂件和头⽂件分别移动到Src⽂件夹和Inc⽂件夹下,该⽂件夹包含了⼀个 Berry 交互式解释器的默认实
现,后⾯我们将通过调⽤它的主函数来运⾏该解释器
Berry 解释器需要从⼀种输⼊设备中读取字符流输⼊,在 PC 上可以使⽤ C 标准库中的fgets()函数或者 GNU/Readline 库中的readline()函数。本教程中使⽤ STM32 的 USART1 进⾏字符流传输,因此要实现基于串⼝的readline()函数。参考⼯程中的stm32f103rb_berry/Src/readline.c和stm32f103rb_berry/Inc/readline.h⽂件即⽤于实现该功能。从readline.h中我们可以看到⼀些公共的函数:
// 向输⼊队列中放⼊⼀个字符
// 该函数在串⼝接收中断服务函数中调⽤,实参为串⼝收到的字符
int queue_putchar(int ch);
// 从输⼊设备(串⼝)中读取⼀个字符串
// 参数 prompt 为导⾔字符串,导⾔会在开始接收字符流之前输出
// 返回值为接收到的⼀⾏字符串,如果没有接收到 '\r' 或 '\n' 则该函数会⼀直等待
const char* readline(const char *prompt);
// 从输⼊设备中(串⼝)读取⼀个字符,如果没有接收到字符则该函数会⼀直等待
int readchar(void);
现在我们将得到以下⽂件结构:
打开MDK-ARM⽬录下的 Keil ⼯程进⾏下⼀部的移植。在 Project 窗⼝下⼯程的根⽬录的右键菜单中打开 Manage Project Items 对话框,新建⼀个名为 berry 的 Group,然后将stm32f103rb_berry/berry/src中的所有源⽂件加⼊该分组。同时将刚才新加⼊stm32f103rb_berry/Src⽂件夹中的源⽂件加⼊ Application/Ur 分组。
动画的英文MDK ⼯程配置
到此为⽌,源⽂件的配置就完成了。我们还要到⼯程的 Options 中将../berry/src路径加⼊到 Include Paths 并勾选 C99 Mode:
注意,除⾮需要调试代码,建议将优化选项(Optimize)开到 O2 或更⾼以减少代码体积并提⾼运⾏速度。
源码修改
Applicatio/Ur下的berry.c包含了⼀个 Berry 的交互式解释器的⼊⼝,不过其主函数名确是main,这⾥需要将其改掉以避免和 STM32 ⼯程的main函数冲突:
百川东到海下一句int berry_main(int argc, char *argv[])
{
// ...
}面对作文
将 REPL 的字符串输⼊函数修改为readline:
// ...户海印
袁良善
#include "readline.h"
// ...
static int analysis_args(bvm *vm)
{
// ...
矿泉水瓶手工制作大全if (args & arg_i) { /* enter the REPL mode */
return be_repl(vm, readline);
成年人的英文
}
return 0;
}
在main.c中修改main()函数以启动解释器:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
berry_main(0, NULL); /* ADD: start berry interpreter */
while (1);
}
串⼝通信⽀持
为了让readline()函数能接收到字符,我们需要对串⼝中断服务函数进⾏修改,该函数在stm32f1xx_it.c⽂件中,以下是修改后的中断服务函数:// ...
#include "readline.h"
// ...
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if ((USART1->SR & USART_SR_RXNE) != RESET) {
USART1->SR &= ~USART_SR_RXNE;
queue_putchar(USART1->DR);
return;
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);

本文发布于:2023-05-17 12:18:35,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/908067.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:需要   函数   配置
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图