先说环境:XP SP2系统,ADS1.2开发环境,ARM7 s3c44b0 芯片 ,k9f2808u0c NAND FLASH,
本来是想调语音程序的(语音芯片UDA1431TS),调试中遇到一个不可思议的问题(困惑好几天了):
用JTAG调试时发现(其实在超级终端中也可看到Uart_Printf("\ncmdline======%s\n",cmdline);),
前两次while循环 ,int ParseCmd(char *cmdline)函数中的cmdline的字符串能正确传值,
分别是cmdline="nfr music_a c200000"和cmdline="nfr music_b c200000",第三次
while循环时cmdline的值成了"nfr",以后循环cmdline都为"nfr"。
如果把music_b改为music_a后,第二次while循环时就出现了cmdline="nfr"的情况,看样子跟文件名相同有关,但不知为何,难道同一个文件就不能两次读去??
不可思议,不知道各位达人可有碰到,请出手解决一下
注:这个工程本身是个BIOS程序.
music_num=1;初始化music_num为1
while(1)
{
{switch(music_num)
{ case 1:
music_num++;
ParseCmd("nfr music_a c200000"); //从NAND FLASH中读取music_a文件到0xc200000地址中
//musicstart=1;
//playmusic1341(); //播放音乐程序,BDMA方式
//_free_((unsigned char *)0xc200000);
break;
case 2:
music_num=1;
ParseCmd("nfr music_b c200000"); //从NAND FLASH中读取music_b文件到0xc200000地址中
//musicstart=1;
//playmusic1341(); //播放音乐程序,BDMA方式
//_free_((unsigned char *)0xc200000);
break;
}
}
}
int ParseCmd(char *cmdline)
{
int argc, num_commands;
char *argv[MAX_ARGS];
Uart_Printf("\ncmdline======%s\n",cmdline);
ParseArgs(cmdline, &argc, argv);
/* only whitespace */
if(argc == 0)
return 0;
num_commands = GetCmdMatche(argv[0]);
if(num_commands<0)
{
return -1;
}
//num_commands=25;
if(CMD_INNER[num_commands].proc!=NULL)
{
CMD_INNER[num_commands].proc(argc, argv);
}
return 0;
}
void ParseArgs(char *cmdline, int *argc, char **argv)
{
#define STATE_WHITESPACE 0
#define STATE_WORD 1
char *c;
int state = STATE_WHITESPACE;
int i;
*argc = 0;
if(Strlen((char *)cmdline) == 0)
return;
/* convert all tabs into single spaces */
c = (char *)cmdline;
while(*c != '\0')
{
if(*c == '\t')
*c = ' ';
c++;
}
c =(char *)cmdline;
i = 0;
/* now find all words on the command line */
while(*c != '\0')
{
if(state == STATE_WHITESPACE)
{
if(*c != ' ')
{
argv[i] = c; //将argv[i]指向c
i++;
state = STATE_WORD;
}
}
else
{ /* state == STATE_WORD */
if(*c == ' ')
{
*c = '\0';
state = STATE_WHITESPACE;
}
}
c++;
}
*argc = i;
#undef STATE_WHITESPACE
#undef STATE_WORD
}