We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Could someone please help me in clarifying that weird execution sequence of the following function:
int S2Pressed (void) { static int S2KeyCount = 0, S2KeyPressed = 0; 01 if (S2KeyPressed) { 02 if (((GPIOA->IDR & S2) == 0 )) { // Check if S2 is pressed 03 if (S2KeyCount < UNBOUNCE_CNT) S2KeyCount++; 04 else { 05 S2KeyPressed = 1; 06 S2KeyCount = 0; 07 return (1); 08 } 09 } 10 } 11 else { 12 if (!((GPIOA->IDR & S2) == 0 )) { // Check if S2 is not pressed 13 if (S2KeyCount < UNBOUNCE_CNT) S2KeyCount++; 14 else { 15 S2KeyPressed = 0; 16 S2KeyCount = 0; 17 } 18 } 19 } 20 return (0); } <pre/> When I simulate the code, it enters the function on line 01 then jump to line 03, then jump back to line 02, then again to line 03, then back to line 02, and then directly jumps to line 12 then 20 and exit that function. It looks like it doesn't matter what is inside the if/else statement because it always does the same with the exact sequence (01, 03, 02, 03, 02, 12), No matter whether I replace the code of the outer if<i/> from line 02 to 09 with the one of the else<i/> part (from line 12 to 18). Now the weird thing is that I have copied that function from the ~Keil\Boards\MCBSTM32\GPIO\GPIO.uvprog When I simulate the latter program it runs just fine without any problems! Can anyone give me any hint one how to move to solve this issue! Any help would be appreciated
Thank you Andy for your reply!
I got your point, but I think I should read more about how HLL simulation is done, so I can understand how to debug a code like this one.
The Keil simulator does not simulate the HLL - it just simulates the execution of the machine (Lowest-level) instructions.
That's why stepping in the debugger (whether in simulation or connected to a real target) often doesn't tie-up with the HLL source lines.