打印

SD卡+振南的znFAT 脚本解释执行(单片机批处理,另类编程方式)

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

振南的znFAT www.znmcu.cn www.znmcu.cn/bbs
技术交流QQ群:145948643

此实验用于实现一个简单的脚本解释器,即逐行读取SD卡中的脚本文件中的命令及其参数,经过分析后转为相应的硬件动作。
脚本(script)是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。说到脚本大家可
能会觉得比较遥远而高深,但如何说到DOS的批处理大家就会觉得比较熟悉了。DOS中的bat文件可以一次性逐行编写很多条
DOS指令,甚至可以有较为复杂的循环结构。它最大的好处就是灵活,而且无需编译,直接解释执行。
此实现中振南自定义了一个简单的脚本格式以及三个指令(SET CLR DELAY),由它们构成了脚本文件,放置于SD卡中。由
znFAT读取此文件,逐行取出各条指令,经过解释程序的分析,最终产生相应的硬件动作(AVR单片机PORTF端口各引脚电平变
化)。
将脚本思想应用于单片机与嵌入式平台上,主要目的是为了实现对硬件可随时配置的、在现场摆脱编译器与烧录器的灵活控制。
比如在工业现场需要临时产生一个特定的时序,而又没有开发与烧录环境,则可以通过直接撰写脚本来实现。
在线视频:


源代码下载:
script.rar (366.61 KB)
实验中使用的脚本示例文件:
script.rar (215 Bytes)

主要核心代码:
znFAT_Device_Init(); //存储设备初始化

znFAT_Init(); //文件系统初始化

znFAT_Open_File(&fileinfo,"/script.txt",0,1); //打开文件

do
{
datlen=znFAT_ReadData(&fileinfo,fileinfo.File_CurOffset,100,file_buf+temp);

i=0;index=0;
if((file_buf+temp)[0]==0x0a) {i++;index++;}

while(i<(datlen+temp))
{
len++;
if(file_buf[i]==0x0d)
{
file_buf[i]=0;
UART_Send_Str(file_buf+index);UART_Send_Enter();
CMD_Execute(file_buf+index);
i++;
index=i+1;
len=0;
}

i++;
}

temp=len;

if(temp!=0) //处理最后可能产生的不完整命令串
{
memcpy(file_buf,file_buf+index,temp); //将其拷贝到前面,与后面读到的数据拼接
}
}while(datlen==100); //如果脚本文件已经读完


znFAT_Close_File(&fileinfo);
int CMD_Execute(unsigned char *pbuf) //命令解释
{
int i=0,len=0;

while(pbuf[i]) //命令子串化
{
if(pbuf[i]==' ' || pbuf[i]==0X0D) pbuf[i]=0;
i++;
}

len=strlen(pbuf)+1;

if(!strcmp(pbuf,"SET")) //如果是SET指令
{
PORTF|=(0X01<<(pbuf[len]-0x30));
}

if(!strcmp(pbuf,"CLR")) //如果是CLR指令
{
PORTF&=~(0X01<<(pbuf[len]-0x30));
}

if(!strcmp(pbuf,"DELAY")) //如果是DELAY指令
{
delay(atoi(pbuf+len));
}

return 0;
}


相关截图:


实验效果:


评分
参与人数 1威望 +6 收起 理由
dong_abc + 6 非常好,力挺创新之作!

相关帖子

沙发
cjseng| | 2013-12-24 10:56 | 只看该作者
这个看起来很不错,如果用来做一个完整的项目不知是否可行?另外,这种方法与标准做法哪个开发起来快一些?

使用特权

评论回复
板凳
znmcu|  楼主 | 2013-12-24 10:57 | 只看该作者
接下来,为这个解释器添加更多的命令与循环结构。
使用脚本同样可以写出一些驱动程序来。而且由于文件操作的灵活性,这些驱动可以实现类似动态加载。

使用特权

评论回复
地板
znmcu|  楼主 | 2013-12-24 11:08 | 只看该作者
当然是标准方式更快。解释执行从来都是比较低效的,无法与编译执行比。
但是对于系统的灵活配置来说,脚本是一个很有意义的方法。

使用特权

评论回复
5
znmcu|  楼主 | 2013-12-24 18:25 | 只看该作者
我时间用脚本写个1602驱动

使用特权

评论回复
6
dong_abc| | 2013-12-24 18:43 | 只看该作者
脚本用在单片机里了,看起来很不错。

使用特权

评论回复
7
dirtwillfly| | 2013-12-24 20:27 | 只看该作者
自己设计的脚本和解释器?

使用特权

评论回复
8
znmcu|  楼主 | 2013-12-25 04:55 | 只看该作者

使用特权

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

本版积分规则

个人签名:振南的znFAT -- 单片机上上的FAT32文件系统 www.znmcu.cn

4474

主题

5195

帖子

33

粉丝