Hello everyone,
So, I am working with an 8051W core processor (with OTP, once again, that's a whole other discussion) and I'm pretty maxed out on code space and looking to trim it down a bit. I need to check the functionality of some of my interrupts so I've had to create code that looks like this:
void main (void) { DiagMode = 0; /* Loop for standard/hardware diagnostics mode */ if ((DiagMode == 0) || (DiagMode == 2)) { while (1) { // Insert code here }; /* Loop forever */ } /* Loop for simulation/software diagnostic mode */ else if (DiagMode == 1) { while(1) { decimator2_ISR(); // Insert code here }; /* Loop forever */ } }
So if I wanted to use the code in simulation mode, I set DiagMode = 1. When I go to burn the chip, I set it equal to 0 (or 2 if I'm doing some hardware diagnostics, I have various case statements throughout the code that run only if DiagMode = 1 or 2).
Currently, if I want to cut down the code I have, I can comment out any unnecessary code portions (anything with DiagMode = 1, etc). I was wondering if there was a way to set my code to build the code differently if it is being used in simulation mode and when I compile it to hex (or set DiagMode to 0), the portions in code with DiagMode set to 1 are not built into the hex code, saving space.
I apologize if what I'm asking for is confusing. Realistically, it probably isn't possible but I figure if anyone would know how to do something along these lines (or has a better alternative), this would be the place to go.
Let me know when you get the chance. Thanks!
Note that #if BUILD1 tests if the preprocessor symbol BUILD1 is nonzero. #if defined(BUILD1) (or the older #ifdef BUILD1) just tests if it is defined.
#define BUILD1 // just defines this symbol #define BUILD1 1 // also gives it a value
if you give the define a value, you can also do
#define BUILD_TYPE 2 #if BUILD_TYPE==0 ... #elif BUILD_TYPE==1 ... #elif BUILD_TYPE==2 ... #else #error "Unsupported build type." #endif
Well, found the issue with the errors with
#define DiagMode 0
in my VARS.H file. Turns out, I just need to comment out:
unsigned char idata DiagMode = 0; extern unsigned char idata DiagMode;
Now I don't have to change anything (which is convenient). Thanks!
Well remember that #define does symbol replacement.
So your
unsigned char idata DiagMode = 0;
will look like
unsigned char idata 0 = 0;
and the compiler is not impressed by that.