Moving to PSoC 5 from PSoC 3

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Anonymous
Not applicable

Hello,

   

Very recently I ported and existing application from the PSoC 3 to the 5.  I must say it was amazingly easy to do.  Creator even properly assigned all the pins!  I have not had the chance to actually test the code as the PSoC 5 development board has not arrived.

   

However I do have one question.  The Keil compiler had no hard burn with the following code:

   

void set_params(float wpm,uint8 paddle,uint8 mode,uint8 spacing,float weight, uint8 lag,uint8 memory,

   

uint8 l_sound,uint8 l_cw_mode,uint8 l_iambic_mode,float l_iambic_tuning,uint8 l_semi_breakin,uint8 l_tx_hold,uint8 l_semi_control)

   

{

   

uint8 error;

   

//uint8 is_written = 1;

   

uint8 iambic_section;

   

CySetTemp();

   

iambic_section = CyEnterCriticalSection();

   

// This writes variable data to EEPROM

   

error = EEPROM_ByteWrite(FIRMWARE_VERSION_MINOR,1u,EE_FIRMWARE_VERSION);

   

error = EEPROM_ByteWrite(paddle,1u,EE_PADDLE_REGISTER);

   

error = EEPROM_ByteWrite(mode,1u,EE_MODE_REGISTER);

   

error = EEPROM_ByteWrite(spacing,1u,EE_SPACING_REGISTER);

   

error = EEPROM_ByteWrite(lag,1u,EE_LAG_REGISTER);

   

error = EEPROM_ByteWrite(memory,1u,EE_MEMORY_REGISTER);

   

error = EEPROM_ByteWrite(l_sound,1u,EE_EXTERNAL_SOUND_REGISTER);

   

error = EEPROM_ByteWrite(l_cw_mode,1u,EE_CW_MODE_REGISTER);

   

error = EEPROM_ByteWrite(l_iambic_mode,1u,EE_IAMBIC_MODE_REGISTER);

   

error = EEPROM_ByteWrite(l_semi_breakin,1u,EE_SEMI_BREAKIN);

   

error = EEPROM_ByteWrite(l_semi_control,1u,EE_SEMI_CONTROL);

   

error = EEPROM_ByteWrite(l_tx_hold,1u,EE_TX_HOLD);

   

error = EEPROM_ByteWrite(((uint8) (weight * 100)),1u,EE_WEIGHT);

   

error = EEPROM_ByteWrite(((uint8)(wpm)),1u,EE_WPM);

   

error = EEPROM_ByteWrite(((uint8) (l_iambic_tuning / RATIO_FACTOR)),1u,EE_IAMBIC_TUNING);

   

CyExitCriticalSection(iambic_section);

   

error = 0;

   

}

   

 

   

The GCC compiler produces a warning that "error" has not been used:  "variable 'error' set but not used [-Wunused-but-set-variable]".  I'm confused as it does appear that error is used in the procedure.  What am I missing.

   

Regards,

   

Ron

0 Likes
6 Replies
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

You assign a value to the variable error and in the next line you overwrite ist value without "using" the old one. This is what GCC sees and warns you for.

   

You may suppress that warning by adding -Wunused-but-set-variable to the compiler flags in the build settings dialog.

   

"The"  difference between PSoC3 and 5 is the CPU core and the lack of a real stack in the 8051

   

 

   

Bob

0 Likes
Anonymous
Not applicable

Hi Bob,

   

Its been a while.  I appreciate the help.  Sorry, but I don't quite follow what you are saying.  Can you provide a code snippet that would not produce the warning?  I have this same warning in three other places in my code.

   

Regards,

   

Ron

0 Likes
Anonymous
Not applicable

Hi Bob,

   

OK, I get it.  Added this to the code as a test.

   

test = error;

   

Now the warning does not report for "error" but does report for test since it has been "set" but not "used.  Got it.  I will add -Wunused-but-set-variable to the build.  Honestly, I have never seen that warning before, with any of my Linux based code. 

   

Regards,

   

Ron

0 Likes
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

Use

   

error |= expression

   

except for the first assignment. Has two advantages:

   
        
  • No warning
  •     
  • A collected error-value that might be tested and reacted on at the end of the function.
  •    
   

 

   

Bob

0 Likes
HeLi_263931
Level 8
Level 8
100 solutions authored 50 solutions authored 25 solutions authored

The compiler is correct in warning you. All of the write calls assign the return value to 'error', but there is never a check what this return value actually is. Thats what compiler tells you - the variable is not used for anything meaningful.

   

Either you can skip the assignment (and remove the 'error' variable alltogether) or you do an actual check (e.g. by doing an error+=WRITE() call, and the check at the end if error is still 0).

0 Likes
Anonymous
Not applicable

Hi,

   

Thanks for the help on this issue.  I have found this in the Cypress generated code:

   

/* To remove the compiler warning if errorCode not used. */

   

errorCode = errorCode;

   

I find that somewhat amusing for some reason 🙂

   

Regards,

   

Ron

0 Likes