trossin 0 Posted June 20, 2014 Report Share Posted June 20, 2014 Bug description: In the code below, the "ratio = (x==0) ? 0xffff : BigY/BigX;" returns the result of division the previous time this function was called when fixed_x is set to zero (which makes x 0). I attached a simple project which demonstrates the failure. I am able to work around this bug with an extra if statement "if(fixed_x==0) ratio = 0xffff;". Also, I still get the failure if I swap x for fixed_x in the original case. The code produced fails in the simulator as well as on Silicon (18F2620). It also fails with large and small memory models. In the simple example, the main function makes two calls to FixedAtan2 with different values but the second call gets the result of the first call which is -49.7 degrees instead of -90.0 degrees. int FixedAtan2(int fixed_y,int fixed_x) // Value returned is in 9.7 fixed point format. { unsigned int x,y; unsigned int Above,Below,Frac; unsigned int ratio; int angle; unsigned char NegX,NegY; unsigned char TableIndex,Half; unsigned long BigY,BigX; if(fixed_x<0){ NegX=1; x = -fixed_x; } else{ NegX=0; x = fixed_x; } if(fixed_y<0){ NegY=1; y = -fixed_y; } else{ NegY=0; y = fixed_y; } BigX = x; BigY = (unsigned long)y<<8; ratio = (x==0) ? 0xffff : BigY/BigX; // Work around for complier bug //if(fixed_x==0) ratio = 0xffff; Steps to reproduce:Build the attached projects and run to the while(1) in main. You will see AngleAboutX and AngleAboutY be the same values. If you single step into the second call, you can see the ratio equation produce the wrong answer. Expected behaviour: AngleAboutY should return 0xd300 which is -90.0 in 9.7 fixed point format. Is the problem 100% reproduceable: Yes. If fails every time. IDE version: 7.22 Compiler: Compiler BoostC Compiler version: 7.22 Target device: PIC18F2620 OS: Windows 7 and Windows 8.1 CBWiiNunchuckFail.zip Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.