读书人

Tornado2.2.1开发环境中生成bootrom时

发布时间: 2012-09-22 21:54:54 作者: rapoo

Tornado2.2.1开发环境中生成bootrom时出现的问题
struct IoInput /*解析、保存每次通道配置关系中输入通道信息*/
{
int a1;
int size_input[0];
};

struct IoOutput /*解析、保存每次通道配置关系中输出通道信息*/
{
int b1;
int size_output[0];
};

struct mystruct
{
char output[40];
char input[40];
int IoIndex;
int AdIndex;
int Io_Delaytime;
int chan;
int An_Delaytime;
struct IoInput *Ioinput;
struct IoOutput *Iooutput;
}mystruct1[2];


STATUS IOReadAll(int num , char *pbuf)
{
FILE *fp;

int i = 0; /*记录配置关系数*/
int j = 0; /* 记录每一次配置的具体信息行数*/

int m = 0;
int n = 0;
int k = 0;

int a = 0; /*记录输出通道整型数组的下标*/
int b = 0; /*记录输出通道整型数组的下标*/
int c = 0;

int i1;
int i2;
int j1;
int j2;


float *pdata;
char *tokenPtr_input;
char *tokenPtr_output;

UINT32 IniState = 0;
UINT32 Rdback1 = 0;
UINT32 Rdback2 = 0;
UINT32 NewState = 0;
UINT32 Out = 0;
UINT32 In = 0;

UINT32 Input_a = 0;
UINT32 Input_b = 0;
UINT32 Input_c = 0;
UINT32 Input_d = 0;

char ch[40]; /* 保存每一行配置信息*/
memset( ch, 0, sizeof(ch) ); /* Initial the array */

/* struct mystruct mystruct1[2];*/
/*struct IoInput *Ioinput;
struct IoOutput *Iooutput;*/

if((fp=fopen("f:\\Pei_Zhi.txt","r")) == NULL)
{
printf("File cannot be opened\n");
return ERROR;
}

while(fgets(ch,40,fp)) /* read the string from the file*/
{
j += 1;
i = (j - 1)/8;
if( 1 == (j%8))
{
continue; /*跳过每次配置的标记行*/
}
else
{
switch(j%8)
{
case 2:
mystruct1[i].IoIndex = atoi(ch); /* 保存配置信息板号 */
continue;
case 3:
strcpy(mystruct1[i].output,ch);
continue;
case 4:
mystruct1[i].Io_Delaytime = atoi(ch);
continue;
case 5:
strcpy(mystruct1[i].input,ch);
continue;
case 6:
mystruct1[i].An_Delaytime = atoi(ch);
continue;
case 7:
mystruct1[i].AdIndex = atoi(ch);
continue;
case 0:
mystruct1[i].chan = atoi(ch);
continue;
}
}
}

fclose(fp);

for( i1 = 0; i1 < 2; i1++)
{
for( j1 = 0; j1 < 40; j1++)
{
if((mystruct1[i1].output[j1] != '\0') && ( mystruct1[i1].output[j1] == ':'))
{
m++;
}
}

for( j2 = 0; j2 < 40 ; j2++)
{
if((mystruct1[i1].input[j2] != '\0') && ( mystruct1[i1].input[j2] == ':'))
{
n++;


}
}
mystruct1[i1].Ioinput = (IoInput *)malloc(sizeof(IoInput)+ m * sizeof(int));

/*mystruct1[i1].Ioinput = (IoInput*)tmp_input; */ /*强转指针类型*/

/*char *tokenPtr_input; */ /*给结构体中的结构体指针赋值*/
tokenPtr_input = strtok(mystruct1[i1].input,":;"); /*将配置关系的输入通道的映射关系解析出来,保存起来*/
/*int a = 0;*/
while(tokenPtr_input != NULL)
{
mystruct1[i1].Ioinput->size_input[a] = atoi(tokenPtr_input);
/*printf("mystruct1[i].Ioinput->size_input[b] = %d\n",mystruct1[i].Ioinput->size_input[a]);*/
tokenPtr_input = strtok(NULL,":;");
a++;
}

/*char *tmp_output;*/
mystruct1[i1].Iooutput = (IoOutput *) malloc (sizeof(IoOutput) + n * sizeof(int)); /*别忘了释放操作*/

/* mystruct1[i1].Iooutput = (IoOutput*) tmp_output; */ /*强制类型转换*/

/* char *tokenPtr_output; */ /*给结构体中的结构体指针赋值*/
tokenPtr_output = strtok(mystruct1[i1].output,":;"); /*将配置关系的输入通道的映射关系解析出来,保存起来*/
/* int b = 0;*/
while(tokenPtr_output != NULL)
{
mystruct1[i1].Iooutput->size_output[b] = atoi(tokenPtr_output);
/*printf("mystruct1[i].Iooutput->size_output[b] = %d\n",mystruct1[i].Iooutput->size_output[b]);*/
tokenPtr_output = strtok(NULL,":;");
b++;
}
}/* 完成输入通道、输出通道配置关系的解析、保存*/

Rdback1 = *(UINT32 *)(IO_MEM_BAR2[num-1] + Output_16a_st); /*前十六个输出通道状态*/
Rdback2 = *(UINT32 *)(IO_MEM_BAR2[num-1] + Output_16b_st); /*后16个输出通道状态*/

NewState = (Rdback2 << 16) + Rdback1; /* 将32个输出通道状态组合起来*/

for ( i2 = 0; i2 < 2; i2++)
{
if( num == mystruct1[i2].IoIndex) /*解析板号是否有配对的信息*/
{
for( k = 0; k < (2 * n); k++)
{
if( (k % 2) == 1) /* 每到两个数组元素,做一次输出通道配置信息组装操作*/
{
if( 0 == mystruct1[i2].Iooutput->size_output[k] ) /*碰到0,则用与操作*/
{
Out = (UINT32)(mystruct1[i2].Iooutput->size_output[k] << mystruct1[i2].Iooutput->size_output[k-1]);
IniState &= Out;
}
else if( 1 == mystruct1[i2].Iooutput->size_output[k]) /*碰到1,则用或操作*/
{
Out = (UINT32)(mystruct1[i2].Iooutput->size_output[k] << mystruct1[i2].Iooutput->size_output[k-1]);
IniState |= Out;
}
}
else
{
continue;
}
}/*完成输出通道配置信息的组装*/


if( IniState == NewState ) /*进一步判断输出通道配置信息是否匹配*/
{
/*在此地方加入输入通道和输出通道之间的延时*/
Input_a = *(UINT32 *)(IO_MEM_BAR2[num-1] + Input_16a); /*读取输入通道的状态值*/
Input_b = *(UINT32 *)(IO_MEM_BAR2[num-1] + Input_16b); /*此处num此时为同一块板卡的,也可以指定成*/
Input_c = *(UINT32 *)(IO_MEM_BAR2[num-1] + Input_16c);
Input_d = *(UINT32 *)(IO_MEM_BAR2[num-1] + Input_16d);


for( c = 0 ; c < (2 * m); c++ ) /*用户所需的输入通道信息的组装*/
{

if((mystruct1[i2].Ioinput->size_input[c] >= 0) && (mystruct1[i2].Ioinput->size_input[c] <= 15)) /**/


{
if( (( c % 2) == 1)) /*输入通道信息每两个,组装一次*/
{
if( 0 == mystruct1[i2].Ioinput->size_input[c]) /*用户想要指定输入通道为0*/
{
In = (UINT32)(mystruct1[i2].Ioinput->size_input[c] << mystruct1[i2].Ioinput->size_input[c-1]);
Input_a &= In;
}
else if( 1 == mystruct1[i2].Ioinput->size_input[c]) /*用户想要指定输入通道为1*/
{
In = (UINT32)(mystruct1[i2].Ioinput->size_input[c] << mystruct1[i2].Ioinput->size_input[c-1]);
Input_a |= In;
}
}
}
else if( (mystruct1[i2].Ioinput->size_input[c] >= 16) && (mystruct1[i2].Ioinput->size_input[c] <= 31))
{
if( (( c % 2) == 1))
{
if( 0 == mystruct1[i2].Ioinput->size_input[c])
{
In = (UINT32)(mystruct1[i2].Ioinput->size_input[c] << mystruct1[i2].Ioinput->size_input[c-1]);
Input_b &= In;
}
else if( 1 == mystruct1[i2].Ioinput->size_input[c] )
{
In = (UINT32)(mystruct1[i2].Ioinput->size_input[c] << mystruct1[i2].Ioinput->size_input[c-1]);
Input_b |= In;
}
}
}
else if( (mystruct1[i2].Ioinput->size_input[c] >= 32) && (mystruct1[i2].Ioinput->size_input[c] <= 47))
{
if( (( c % 2) == 1))
{
if( 0 == mystruct1[i2].Ioinput->size_input[c])
{
In = (UINT32)(mystruct1[i2].Ioinput->size_input[c] << mystruct1[i2].Ioinput->size_input[c-1]);
Input_c &= In;
}
else if( 1 == mystruct1[i2].Ioinput->size_input[c])
{
In = (UINT32)(mystruct1[i2].Ioinput->size_input[c] << mystruct1[i2].Ioinput->size_input[c-1]);
Input_c |= In;
}
}
}
else if( (mystruct1[i2].Ioinput->size_input[c] >= 48) && (mystruct1[i2].Ioinput->size_input[c] <= 63))
{
if( (( c % 2) == 1))
{
if( 0 == mystruct1[i2].Ioinput->size_input[c])
{
In = (UINT32)(mystruct1[i2].Ioinput->size_input[c] << mystruct1[i2].Ioinput->size_input[c-1]);
Input_d &= In;
}
else if( 1 == mystruct1[i2].Ioinput->size_input[c])
{
In = (UINT32)(mystruct1[i2].Ioinput->size_input[c] << mystruct1[i2].Ioinput->size_input[c-1]);
Input_d |= In;
}
}
}
}/*完成用户所需输入通道信息的组装*/


if( mystruct1[i2].AdIndex != 0 ) /*如果AD板号不为零,则需要AD操作配合*/
{
if( mystruct1[i2].An_Delaytime != 0 )
{
taskDelay(mystruct1[i2].An_Delaytime); /*AD通道模拟延时配合 注意函数参数为系统时钟的整数倍,通过sysclkRateGet()获取*/
}

ADReadData(mystruct1[i2].AdIndex, mystruct1[i2].chan , pdata); /*指定AD板卡的指定采集通道配合执行*/
}

free(tokenPtr_output); /*释放动态分配的内存*/
free(tokenPtr_input);

return OK;
}/*结束输出通道状态信息比对*/
else
{
continue;
}
}/*结束IO板号的比较*/
else
{
continue;
}

} /*结束最外层的FOR循环*/

return ERROR;
}


将开头的三个结构体放在.c文件的开头处,在函数IOReadAll()中,用到了IoInput、IoOutput结构体,但是Tornado2.2开发环境中,编译生成bootrom时,提示IoInput、IoOutput没有声明,真是非常蛋疼。在用Tornado2.2开发环境中,编译的时候,变量定义的位置很让人烦,一般按道理不该出错的,它总是提示没有定义之类的问题,不像VC6.0那样方便。不知道大家有没有碰到过类似问题,其中出现的问题,还请大牛们给予解答!谢谢




[解决办法]
typedef struct IoInput /*解析、保存每次通道配置关系中输入通道信息*/
{
int a1;
int size_input[0];
};

typedef struct IoOutput /*解析、保存每次通道配置关系中输出通道信息*/
{
int b1;
int size_output[0];
};

读书人网 >VxWorks

热点推荐