本帖最后由 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;
}
相关截图:
实验效果:
|