打印
[应用相关]

STM32F103X8运行脚本系统

[复制链接]
1855|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vsfopen|  楼主 | 2018-7-17 00:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 vsfopen 于 2018-7-17 10:46 编辑

https://bbs.21ic.com/icview-2530324-1-1.html

MCU中集成USB设备端协议栈,实现CDC串口输出系统日志,实现U盘,并且实现FAT32文件系统。
内置python实现的IDE,可以实现脚本编译、运行停止控制。并且上电自动运行脚本。
脚本支持面向对象,使用引用计数的方式。支持部分dart语法。
脚本虚拟机核心可以做到5K以下,算上一些基本扩展,最小运行环境也不到10K,最小脚本占用内存几百字节(实测环境使用1K)。
脚本编译器占用15K不到,编译器占用内存最小4K,编译完成后释放。

测试脚本:24个LED,由48个IO口空,IO引脚参数放在数组中。实现24位计数器,每500ms增加1。
const LED_NUM = 24;
const LED_ON = 1, LED_OFF = 0;

// 2-dimension char ledarr[LED_NUM][4] for 24 LEDs
var ledarr = array_create(2, 1, LED_NUM, 4);
ledarr.set(0, 0, 5, 0, 5, 1);     // ledarr[0 ]: PF0  - PF1
ledarr.set(1, 0, 5, 2, 5, 3);     // ledarr[1 ]: PF2  - PF3
ledarr.set(2, 0, 5, 4, 5, 5);     // ledarr[2 ]: PF4  - PF5
ledarr.set(3, 0, 5, 12, 5, 13);   // ledarr[3 ]: PF12 - PF13
ledarr.set(4, 0, 5, 14, 5, 15);   // ledarr[4 ]: PF14 - PF15
ledarr.set(5, 0, 6, 0, 6, 1);     // ledarr[5 ]: PG0  - PG1
ledarr.set(6, 0, 6, 2, 6, 3);     // ledarr[6 ]: PG2  - PG3
ledarr.set(7, 0, 6, 4, 6, 5);     // ledarr[7 ]: PG4  - PG5
ledarr.set(8, 0, 3, 11, 3, 12);   // ledarr[8 ]: PD11 - PD12
ledarr.set(9, 0, 3, 13, 4, 3);    // ledarr[9 ]: PD13 - PE3
ledarr.set(10, 0, 4, 4, 4, 5);    // ledarr[10]: PE4  - PE5
ledarr.set(11, 0, 4, 6, 4, 2);    // ledarr[11]: PE6  - PE2
ledarr.set(12, 0, 6, 13, 6, 14);  // ledarr[12]: PG13 - PG14
ledarr.set(13, 0, 3, 14, 3, 15);  // ledarr[13]: PD14 - PD15
ledarr.set(14, 0, 3, 0, 3, 1);    // ledarr[14]: PD0  - PD1
ledarr.set(15, 0, 4, 7, 4, 8);    // ledarr[15]: PE7  - PE8
ledarr.set(16, 0, 4, 9, 4, 10);   // ledarr[16]: PE9  - PE10
ledarr.set(17, 0, 4, 11, 4, 12);  // ledarr[17]: PE11 - PE12
ledarr.set(18, 0, 4, 13, 4, 14);  // ledarr[18]: PE13 - PE14
ledarr.set(19, 0, 4, 15, 3, 8);   // ledarr[19]: PE15 - PD8
ledarr.set(20, 0, 3, 9, 3, 10);   // ledarr[20]: PD9  - PD10
ledarr.set(21, 0, 3, 5, 3, 3);    // ledarr[21]: PD5  - PD3
ledarr.set(22, 0, 4, 1, 4, 0);    // ledarr[22]: PE1  - PE0
ledarr.set(23, 0, 3, 4, 3, 6);    // ledarr[23]: PD4  - PD6

set_led(index, value)
{
  var port, pin;
  if (value == LED_ON)
  {
    port = array_get(ledarr, index, 0);
    pin = array_get(ledarr, index, 1);
    gpio_create(port, pin).config(GPIO_OUTPP).set();
    port = array_get(ledarr, index, 2);
    pin = array_get(ledarr, index, 3);
    gpio_create(port, pin).config(GPIO_OUTPP).clear();
  }
  else
  {
    port = array_get(ledarr, index, 0);
    pin = array_get(ledarr, index, 1);
    gpio_create(port, pin).config(GPIO_INPUT);
    port = array_get(ledarr, index, 2);
    pin = array_get(ledarr, index, 3);
    gpio_create(port, pin).config(GPIO_INPUT);
  }
}

set_ledarr(cnt)
{
  var index = 0;
  while (index < LED_NUM)
  {
    if (cnt & (1 << index))
    {
      set_led(index, LED_ON);
    }
    else
    {
      set_led(index, LED_OFF);
    }
    index = index + 1;
  }
}

var cnt = 0;
while (1)
{
  set_ledarr(cnt);
  timer_delayms(500);
  cnt = cnt + 1;
}


测试图片:

沙发
guanjiaer| | 2018-7-17 08:40 | 只看该作者
老哥啊 你发错版块了吧

使用特权

评论回复
板凳
vsfopen|  楼主 | 2018-7-17 10:47 | 只看该作者
guanjiaer 发表于 2018-7-17 08:40
老哥啊 你发错版块了吧

没发错,标题打错了

使用特权

评论回复
地板
guanjiaer| | 2018-7-17 13:52 | 只看该作者
哦哦哦 这样啊

使用特权

评论回复
5
keaibukelian| | 2018-7-17 14:07 | 只看该作者
所谓的运行脚本 什么叫脚本呢?

使用特权

评论回复
6
vsfopen|  楼主 | 2018-7-17 16:13 | 只看该作者
keaibukelian 发表于 2018-7-17 14:07
所谓的运行脚本 什么叫脚本呢?

应该就是不直接编译为硬件直接可以运行的机器码,而是通过解释执行或者编译为中间代码然后由虚拟机执行的系统。

使用特权

评论回复
7
keaibukelian| | 2018-7-17 16:14 | 只看该作者
我还是不能理解这个东西

使用特权

评论回复
8
labasi| | 2018-7-17 16:18 | 只看该作者
脚本是批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本程序是确定的一系列控制计算机进行运算操作动作的组合,在其中可以实现一定的逻辑分支等

使用特权

评论回复
9
vsfopen|  楼主 | 2018-7-19 10:26 | 只看该作者
脚本系统的一个例子,虽然不是在STM32F103上运行的:
https://bbs.21ic.com/icview-2483528-1-1.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

325

帖子

8

粉丝