could someone please help me modify the below c program to work for AT91RM9200(ARM7TDMI)using keil simulation. the program is for finding dct coefficients for input pixel values #include<stdio.h> #include<conio.h> #include<math.h> #define N 8 void main() { int i,j,k,l; float f[10][10],fdct[10][10],a[10][10]; //input pixel values and output DCT coefficients clrscr(); /*printf("\n Enter the input pixel values:\n"); for(i=0;i<N;i=i+1) { for(j=0;j<N;j=j+1) { scanf("%f\n ",&f[i][j]); //Reading input pixel values given by user } } */ a[0][0]=23; a[0][1]=12; a[0][2]=14; a[0][3]=15; a[0][4]=30; a[0][5]=34; a[0][6]=10; a[0][7]=30;
a[1][0]=60; a[1][1]=70; a[1][2]=50; a[1][3]=70; a[1][4]=85; a[1][5]=90; a[1][6]=50; a[1][7]=94;
a[2][0]=54; a[2][1]=84; a[2][2]=30; a[2][3]=44; a[2][4]=50; a[2][5]=76; a[2][6]=80; a[2][7]=34;
a[3][0]=20; a[3][1]=22; a[3][2]=20; a[3][3]=33; a[3][4]=20; a[3][5]=93; a[3][6]=40; a[3][7]=58;
a[4][0]=43; a[4][1]=20; a[4][2]=10; a[4][3]=10; a[4][4]=40; a[4][5]=50; a[4][6]=60; a[4][7]=70;
a[5][0]=66; a[5][2]=60; a[5][3]=67; a[5][4]=60; a[5][5]=62; a[5][6]=70; a[5][7]=81;
a[6][0]=39; a[6][1]=35; a[6][2]=30; a[6][3]=38; a[6][4]=0; a[6][5]=34; a[6][6]=40; a[6][7]=42;
a[7][0]=60; a[7][1]=74 ; a[7][2]=70; a[7][3]=40; a[7][4]=35; a[7][5]=50; a[7][6]=40; a[7][7]=63;
a[8][0]=30; a[8][1]=40; a[8][2]=50; a[8][3]=42; a[8][4]=30; a[8][5]=21; a[8][6]=120; a[8][7]=230; for(i=0;i<N;i=i+1) { for(j=0;j<N;j=j+1) { f[i][j]=a[i][j]; } } for(i=0;i<N;i=i+1) { for(j=0;j<N;j=j+1) { printf("%f ",f[i][j]); } printf("\n"); } for(i=0;i<N;i=i+1) { for(j=0;j<N;j=j+1) { fdct[i][j]=0; for(k=0;k<N;k=k+1) { for(l=0;l<N;l=l+1) { if(i==0&&j==0) fdct[i][j]= fdct[i][j]+(1/4)*(1/2)*f[k][l]*cos((2*k+1)*i*3.14/16)*cos((2*l+1)*j*3.14/16); /*printf("%f ",fdct[i][j]); printf("%f ",(1/4)*(1/2)*f[k][l]); printf("%f ",f[k][l]); printf("%f ",cos((2*k+1)*i*3.14/16));*/ if(i==0&&j!=0) fdct[i][j]= fdct[i][j]+(1/sqrt(2))*(1/4)*f[k][l]*cos((2*k+1)*i*3.14/16)*cos((2*l+1)*j*3.14/16); if(i!=0&&j==0) fdct[i][j]= fdct[i][j]+(1/4)*(1/sqrt(2))*f[k][l]*cos((2*k+1)*i*3.14/16)*cos((2*l+1)*j*3.14/16); if(i!=0&&j!=0) fdct[i][j]= fdct[i][j]+(1/4)*f[k][l]*cos((2*k+1)*i*3.14/16)*cos((2*l+1)*j*3.14/16); } } } }
printf("\n"); printf("\n"); for(i=0;i<N;i=i+1) { for(j=0;j<N;j=j+1) { printf("%f ",fdct[i][j]); } printf("\n"); }
getch(); }
Notice that the first loops seems to have been indented with spaces.
Anyway: Your algorithm would probably work without any change at all.
But your processor may not have floating point support, and emulation of floating point will make it slow.
And the ARM compiler will not have the TurboC-specific include file <conio.h>.
If y ou are going to run the code in an embedded environment, you must decide where to get input data. You would normally not have any keyboard for manually entering it. And you must figure out what to do with the result. It isn't likely that you have a CRT for presenting the answers.
So, start by telling why you need to move this code from a PC? Then describe the data source (since an embedded system does not compute _one_ result but is used to continuously supervise/monitor something. Then describe what the results of the computation should be used for - either to control something by the ARM, or if they should be sent to another unit somewhere.
Another thing: Since embedded systems don't do one thing, and then ends, you should normally repeatedly run the code you have in your main - there is no operating system to return to after you return from main().
I'm working on 2D DCT for JPEG encoder. I tried compiling and running the above program in keil uVision(ARM Development Tools), it was showing an error- "code size limit exceeding 32k,running in evaluation mode"... -can i use the arrays as it is in the program or should i set registers of the corresponding ARM processor?
-I'm trying to simulate the output in the keil software itself and check for the output dct coefficients and the estimated time, is it possible?
-I'm trying to input the pixel values manually(pixel values were found out using matlab,directly read from the image), is there an option in keil also for taking the pixel values directly from the image or culd u suggest me any other possibility?
If I remember correctly, the Keil tools will count both code and data when deciding the max size possible for the evaluation version. But you can change arrays to pointers and then assign values to these pointers when the program starts.
But I didn't see any large arrays in your code. Just three arrays of 400 bytes each. It is probably the need of floating point emulation that makes you fail the limit of the evaluation version.
The ARM processor AT91RM9200 is a 32 bit processor. It is compatible for a floating point operation. Could u suggest any other processor which is better suited for the program