这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 如此问题,大家可否见过????

共8条 1/1 1 跳转至

如此问题,大家可否见过????

菜鸟
2006-10-16 19:22:19     打赏

先说环境: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
}




关键词: 如此     问题     大家     可否     见过     cmdline     mu    

菜鸟
2006-10-17 05:18:00     打赏
2楼
检查一下你的STACK的设置。另外,确定在那里出了问题,然后找原因。不可能无缘无故就变了的。

菜鸟
2006-10-18 21:29:00     打赏
3楼
只要是有读相同文件名的 ,它传值就不对,只传nfr这三个字符,后面的字符就不传,郁闷了很久,还没解决

菜鸟
2006-10-18 21:32:00     打赏
4楼
小弟不才,再问一句,STACK要怎么设置的??

菜鸟
2006-10-19 00:50:00     打赏
5楼

首先问你:ParseCmd("nfr music_a c200000");这个作为参数的指针在什么地方。

你在下面的代码中把字符串"nfr music_a c200000"变成了"nfr"。

else
{ /* state == STATE_WORD */
if(*c == ' ')
{
*c = '\0';
state = STATE_WHITESPACE;
}
}


菜鸟
2006-10-19 01:55:00     打赏
6楼

多谢楼上的朋友回答.

不过:

至于ParseCmd("nfr music_a c200000");这个作为参数的指针在什么地方。我也说不清,我只是将"nfr music_a c200000"这个字符串传给 形参cmdline ,

至于

else
{ /* state == STATE_WORD */
if(*c == ' ')
{
*c = '\0';
state = STATE_WHITESPACE;
}
}

它是得到了"nfr"(只是c="nfr"),但这并没有改变cmdline的值(cmdline="nfr music_a c200000")


菜鸟
2006-10-19 16:36:00     打赏
7楼

霍霍,吓我一跳!

ParseCmd("nfr music_a c200000");中,传给函数的参数是一个指针,这个指针的值就是字符串"nfr music_a c200000"的存储地址,它应该位于代码段。由于44b0通常把代码段拷贝到SDRAM中运行,所以代码段也是可以被修改的。

“它是得到了"nfr"(只是c="nfr"),但这并没有改变cmdline的值(cmdline="nfr music_a c200000")”,这个理解完全错误。C语言没有字符串这样一种数据类型。去找找C指针的资料好好看看再写这个程序。

char cmdline[] = "aaa";
char *c;
c = cmdline;
*c = 'b';
// *cmdline == 'a'? NO! *cmdline == 'b'


菜鸟
2006-10-20 00:30:00     打赏
8楼

楼上所言极是,是我误解,字符串"nfr music_a c200000"确实变成了"nfr"。

但对于我的问题,我还是想不通,前两次while循环是对的, 但第三次循环就不对了呢??


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]