From: SourceForge.net <no...@so...> - 2005-11-30 10:33:52
|
Bugs item #1369874, was opened at 2005-11-30 10:26 Message generated for change (Comment added) made by bernhardheld You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1369874&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. >Category: C-Front End Group: None Status: Open Resolution: None Priority: 5 Submitted By: Weston T. Schmidt (schmidtw) >Assigned to: Bernhard Held (bernhardheld) >Summary: replacement by volatile variable Initial Comment: I am running CVS code from 11/29/2005. 8051 series chip make -f Makefile-sdcc clean make -f Makefile-sdcc Basically the problem I am having is the desired value of mmc_Nac = 50000, but if I have the gcse optimization enabled, then I get mmc_Nac = 0 The section of code in question is: --- start --- /* Now calculate Nac */ mmc_Nac = mmc_taac_map[((0x78 & mmc_TAAC) >> 3)]; //printf( "Must be here... %ld\n", g_tmp ); for( g_i = (mmc_TAAC & 0x07); g_i < 7; g_i++ ) { mmc_Nac /= 10; } //printf( "Must be here... %ld\n", mmc_Nac ); //mmc_junk( mmc_Nac ); mmc_Nac += (FOSC / mmc_speed) * 100UL * ((ui32) mmc_NSAC); --- end --- If gcse optimization is enabled, then I must either comment out the call to mmc_junk( mmc_Nac ) or the printf() line above it, otherwise I get the incorrect value of 0 for mmc_Nac. I have been trying to debug this as best I can, but I'm not sure what I'm looking at. Below is some sample output. Thanks, Wes <wes...@al...> --- Correct --- Hello, world mmc_Nac: 50000 mmc_Nac: 50000 mmc_Nac_SD_max: 333333 mmc_Nac: 50000 mmc_TAAC: 54 mmc_NSAC: 0 mmc_speed_const: 1 mmc_speed: 10000000 mmc_address: 131071 --- Error --- Hello, world mmc_Nac: 0 mmc_Nac: 0 mmc_Nac_SD_max: 333333 mmc_Nac: 0 mmc_TAAC: 54 mmc_NSAC: 0 mmc_speed_const: 1 mmc_speed: 10000000 mmc_address: 131071 ---------------------------------------------------------------------- >Comment By: Bernhard Held (bernhardheld) Date: 2005-11-30 11:33 Message: Logged In: YES user_id=203539 The read from mmc_TAAC is replaced by the cheaper read of the volatile(!) MMCMD. This is not an obvious bug, but it's a bug. Workaround: define mmc_TAAC as volatile. Stripped down source: volatile char vc; xdata char xc; char c; void foo (void) { long r, s; xc = vc; /* eat all registers */ for (r = 0; r < 100; ++r) for (s = 0; s < 100; ++s) ; /* BUG: xc will be replaced by cheaper, volatile vc! */ c = xc; } ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1369874&group_id=599 |
From: SourceForge.net <no...@so...> - 2005-12-01 05:51:46
|
Bugs item #1369874, was opened at 2005-11-30 01:26 Message generated for change (Comment added) made by schmidtw You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1369874&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: C-Front End Group: None Status: Open Resolution: None Priority: 5 Submitted By: Weston T. Schmidt (schmidtw) Assigned to: Bernhard Held (bernhardheld) Summary: replacement by volatile variable Initial Comment: I am running CVS code from 11/29/2005. 8051 series chip make -f Makefile-sdcc clean make -f Makefile-sdcc Basically the problem I am having is the desired value of mmc_Nac = 50000, but if I have the gcse optimization enabled, then I get mmc_Nac = 0 The section of code in question is: --- start --- /* Now calculate Nac */ mmc_Nac = mmc_taac_map[((0x78 & mmc_TAAC) >> 3)]; //printf( "Must be here... %ld\n", g_tmp ); for( g_i = (mmc_TAAC & 0x07); g_i < 7; g_i++ ) { mmc_Nac /= 10; } //printf( "Must be here... %ld\n", mmc_Nac ); //mmc_junk( mmc_Nac ); mmc_Nac += (FOSC / mmc_speed) * 100UL * ((ui32) mmc_NSAC); --- end --- If gcse optimization is enabled, then I must either comment out the call to mmc_junk( mmc_Nac ) or the printf() line above it, otherwise I get the incorrect value of 0 for mmc_Nac. I have been trying to debug this as best I can, but I'm not sure what I'm looking at. Below is some sample output. Thanks, Wes <wes...@al...> --- Correct --- Hello, world mmc_Nac: 50000 mmc_Nac: 50000 mmc_Nac_SD_max: 333333 mmc_Nac: 50000 mmc_TAAC: 54 mmc_NSAC: 0 mmc_speed_const: 1 mmc_speed: 10000000 mmc_address: 131071 --- Error --- Hello, world mmc_Nac: 0 mmc_Nac: 0 mmc_Nac_SD_max: 333333 mmc_Nac: 0 mmc_TAAC: 54 mmc_NSAC: 0 mmc_speed_const: 1 mmc_speed: 10000000 mmc_address: 131071 ---------------------------------------------------------------------- >Comment By: Weston T. Schmidt (schmidtw) Date: 2005-11-30 21:51 Message: Logged In: YES user_id=767003 Bernhard, I tried your suggestion & that didn't work, but I tried making both mmc_TAAC & mmc_NSAC volatile & that worked. However, I'm not sure those are the values that should really be defined as volatile. I tried casting MMCMD as volatile in the #define at the top of the page & that solved the problem without the need of making mmc_TAAC & mmc_NSAC volatile. I am not sure that this is a compiler bug, instead I think it was user error. I will let you decide that & close the bug. Thank you very much for your quick turnaround, and good help. Thanks, Wes ---------------------------------------------------------------------- Comment By: Bernhard Held (bernhardheld) Date: 2005-11-30 02:33 Message: Logged In: YES user_id=203539 The read from mmc_TAAC is replaced by the cheaper read of the volatile(!) MMCMD. This is not an obvious bug, but it's a bug. Workaround: define mmc_TAAC as volatile. Stripped down source: volatile char vc; xdata char xc; char c; void foo (void) { long r, s; xc = vc; /* eat all registers */ for (r = 0; r < 100; ++r) for (s = 0; s < 100; ++s) ; /* BUG: xc will be replaced by cheaper, volatile vc! */ c = xc; } ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1369874&group_id=599 |
From: SourceForge.net <no...@so...> - 2005-12-01 08:16:09
|
Bugs item #1369874, was opened at 2005-11-30 10:26 Message generated for change (Comment added) made by bernhardheld You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1369874&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: C-Front End Group: None Status: Open Resolution: None Priority: 5 Submitted By: Weston T. Schmidt (schmidtw) Assigned to: Bernhard Held (bernhardheld) Summary: replacement by volatile variable Initial Comment: I am running CVS code from 11/29/2005. 8051 series chip make -f Makefile-sdcc clean make -f Makefile-sdcc Basically the problem I am having is the desired value of mmc_Nac = 50000, but if I have the gcse optimization enabled, then I get mmc_Nac = 0 The section of code in question is: --- start --- /* Now calculate Nac */ mmc_Nac = mmc_taac_map[((0x78 & mmc_TAAC) >> 3)]; //printf( "Must be here... %ld\n", g_tmp ); for( g_i = (mmc_TAAC & 0x07); g_i < 7; g_i++ ) { mmc_Nac /= 10; } //printf( "Must be here... %ld\n", mmc_Nac ); //mmc_junk( mmc_Nac ); mmc_Nac += (FOSC / mmc_speed) * 100UL * ((ui32) mmc_NSAC); --- end --- If gcse optimization is enabled, then I must either comment out the call to mmc_junk( mmc_Nac ) or the printf() line above it, otherwise I get the incorrect value of 0 for mmc_Nac. I have been trying to debug this as best I can, but I'm not sure what I'm looking at. Below is some sample output. Thanks, Wes <wes...@al...> --- Correct --- Hello, world mmc_Nac: 50000 mmc_Nac: 50000 mmc_Nac_SD_max: 333333 mmc_Nac: 50000 mmc_TAAC: 54 mmc_NSAC: 0 mmc_speed_const: 1 mmc_speed: 10000000 mmc_address: 131071 --- Error --- Hello, world mmc_Nac: 0 mmc_Nac: 0 mmc_Nac_SD_max: 333333 mmc_Nac: 0 mmc_TAAC: 54 mmc_NSAC: 0 mmc_speed_const: 1 mmc_speed: 10000000 mmc_address: 131071 ---------------------------------------------------------------------- >Comment By: Bernhard Held (bernhardheld) Date: 2005-12-01 09:16 Message: Logged In: YES user_id=203539 > I tried casting MMCMD as volatile in the #define at the > top of the page & that solved the problem without the > need of making mmc_TAAC & mmc_NSAC volatile. Strange. MMCMD is a sfr, and therefore it's already volatile. Are you sure, this is the only change needed to fix your problem? Could you please post the exact #define? ---------------------------------------------------------------------- Comment By: Weston T. Schmidt (schmidtw) Date: 2005-12-01 06:51 Message: Logged In: YES user_id=767003 Bernhard, I tried your suggestion & that didn't work, but I tried making both mmc_TAAC & mmc_NSAC volatile & that worked. However, I'm not sure those are the values that should really be defined as volatile. I tried casting MMCMD as volatile in the #define at the top of the page & that solved the problem without the need of making mmc_TAAC & mmc_NSAC volatile. I am not sure that this is a compiler bug, instead I think it was user error. I will let you decide that & close the bug. Thank you very much for your quick turnaround, and good help. Thanks, Wes ---------------------------------------------------------------------- Comment By: Bernhard Held (bernhardheld) Date: 2005-11-30 11:33 Message: Logged In: YES user_id=203539 The read from mmc_TAAC is replaced by the cheaper read of the volatile(!) MMCMD. This is not an obvious bug, but it's a bug. Workaround: define mmc_TAAC as volatile. Stripped down source: volatile char vc; xdata char xc; char c; void foo (void) { long r, s; xc = vc; /* eat all registers */ for (r = 0; r < 100; ++r) for (s = 0; s < 100; ++s) ; /* BUG: xc will be replaced by cheaper, volatile vc! */ c = xc; } ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1369874&group_id=599 |
From: SourceForge.net <no...@so...> - 2005-12-01 08:46:28
|
Bugs item #1369874, was opened at 2005-11-30 01:26 Message generated for change (Comment added) made by schmidtw You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1369874&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: C-Front End Group: None Status: Open Resolution: None Priority: 5 Submitted By: Weston T. Schmidt (schmidtw) Assigned to: Bernhard Held (bernhardheld) Summary: replacement by volatile variable Initial Comment: I am running CVS code from 11/29/2005. 8051 series chip make -f Makefile-sdcc clean make -f Makefile-sdcc Basically the problem I am having is the desired value of mmc_Nac = 50000, but if I have the gcse optimization enabled, then I get mmc_Nac = 0 The section of code in question is: --- start --- /* Now calculate Nac */ mmc_Nac = mmc_taac_map[((0x78 & mmc_TAAC) >> 3)]; //printf( "Must be here... %ld\n", g_tmp ); for( g_i = (mmc_TAAC & 0x07); g_i < 7; g_i++ ) { mmc_Nac /= 10; } //printf( "Must be here... %ld\n", mmc_Nac ); //mmc_junk( mmc_Nac ); mmc_Nac += (FOSC / mmc_speed) * 100UL * ((ui32) mmc_NSAC); --- end --- If gcse optimization is enabled, then I must either comment out the call to mmc_junk( mmc_Nac ) or the printf() line above it, otherwise I get the incorrect value of 0 for mmc_Nac. I have been trying to debug this as best I can, but I'm not sure what I'm looking at. Below is some sample output. Thanks, Wes <wes...@al...> --- Correct --- Hello, world mmc_Nac: 50000 mmc_Nac: 50000 mmc_Nac_SD_max: 333333 mmc_Nac: 50000 mmc_TAAC: 54 mmc_NSAC: 0 mmc_speed_const: 1 mmc_speed: 10000000 mmc_address: 131071 --- Error --- Hello, world mmc_Nac: 0 mmc_Nac: 0 mmc_Nac_SD_max: 333333 mmc_Nac: 0 mmc_TAAC: 54 mmc_NSAC: 0 mmc_speed_const: 1 mmc_speed: 10000000 mmc_address: 131071 ---------------------------------------------------------------------- >Comment By: Weston T. Schmidt (schmidtw) Date: 2005-12-01 00:46 Message: Logged In: YES user_id=767003 I just tried this again to make sure that the From value failed and the To value succeeded from the attached error.tar.gz From: #define mmc_response_read() MMCMD To: #define mmc_response_read() (volatile) MMCMD ---------------------------------------------------------------------- Comment By: Bernhard Held (bernhardheld) Date: 2005-12-01 00:16 Message: Logged In: YES user_id=203539 > I tried casting MMCMD as volatile in the #define at the > top of the page & that solved the problem without the > need of making mmc_TAAC & mmc_NSAC volatile. Strange. MMCMD is a sfr, and therefore it's already volatile. Are you sure, this is the only change needed to fix your problem? Could you please post the exact #define? ---------------------------------------------------------------------- Comment By: Weston T. Schmidt (schmidtw) Date: 2005-11-30 21:51 Message: Logged In: YES user_id=767003 Bernhard, I tried your suggestion & that didn't work, but I tried making both mmc_TAAC & mmc_NSAC volatile & that worked. However, I'm not sure those are the values that should really be defined as volatile. I tried casting MMCMD as volatile in the #define at the top of the page & that solved the problem without the need of making mmc_TAAC & mmc_NSAC volatile. I am not sure that this is a compiler bug, instead I think it was user error. I will let you decide that & close the bug. Thank you very much for your quick turnaround, and good help. Thanks, Wes ---------------------------------------------------------------------- Comment By: Bernhard Held (bernhardheld) Date: 2005-11-30 02:33 Message: Logged In: YES user_id=203539 The read from mmc_TAAC is replaced by the cheaper read of the volatile(!) MMCMD. This is not an obvious bug, but it's a bug. Workaround: define mmc_TAAC as volatile. Stripped down source: volatile char vc; xdata char xc; char c; void foo (void) { long r, s; xc = vc; /* eat all registers */ for (r = 0; r < 100; ++r) for (s = 0; s < 100; ++s) ; /* BUG: xc will be replaced by cheaper, volatile vc! */ c = xc; } ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1369874&group_id=599 |
From: SourceForge.net <no...@so...> - 2005-12-01 09:09:29
|
Bugs item #1369874, was opened at 2005-11-30 10:26 Message generated for change (Comment added) made by bernhardheld You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1369874&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: C-Front End Group: None Status: Open Resolution: None Priority: 5 Submitted By: Weston T. Schmidt (schmidtw) Assigned to: Bernhard Held (bernhardheld) Summary: replacement by volatile variable Initial Comment: I am running CVS code from 11/29/2005. 8051 series chip make -f Makefile-sdcc clean make -f Makefile-sdcc Basically the problem I am having is the desired value of mmc_Nac = 50000, but if I have the gcse optimization enabled, then I get mmc_Nac = 0 The section of code in question is: --- start --- /* Now calculate Nac */ mmc_Nac = mmc_taac_map[((0x78 & mmc_TAAC) >> 3)]; //printf( "Must be here... %ld\n", g_tmp ); for( g_i = (mmc_TAAC & 0x07); g_i < 7; g_i++ ) { mmc_Nac /= 10; } //printf( "Must be here... %ld\n", mmc_Nac ); //mmc_junk( mmc_Nac ); mmc_Nac += (FOSC / mmc_speed) * 100UL * ((ui32) mmc_NSAC); --- end --- If gcse optimization is enabled, then I must either comment out the call to mmc_junk( mmc_Nac ) or the printf() line above it, otherwise I get the incorrect value of 0 for mmc_Nac. I have been trying to debug this as best I can, but I'm not sure what I'm looking at. Below is some sample output. Thanks, Wes <wes...@al...> --- Correct --- Hello, world mmc_Nac: 50000 mmc_Nac: 50000 mmc_Nac_SD_max: 333333 mmc_Nac: 50000 mmc_TAAC: 54 mmc_NSAC: 0 mmc_speed_const: 1 mmc_speed: 10000000 mmc_address: 131071 --- Error --- Hello, world mmc_Nac: 0 mmc_Nac: 0 mmc_Nac_SD_max: 333333 mmc_Nac: 0 mmc_TAAC: 54 mmc_NSAC: 0 mmc_speed_const: 1 mmc_speed: 10000000 mmc_address: 131071 ---------------------------------------------------------------------- >Comment By: Bernhard Held (bernhardheld) Date: 2005-12-01 10:09 Message: Logged In: YES user_id=203539 Ok, now I understand what's happening. > #define mmc_response_read() (volatile) MMCMD is equivalent to: #define mmc_response_read() (volatile int) MMCMD You casted MMCMD from (sfr-volatile-unsigned-char) to (volatile-int). Therefore the optimizer skips the buggy replacement. Your "fix" is somewhat expensive: it comes with a cast operation and requires an additional register. Anyway: thanks for the additional information! ---------------------------------------------------------------------- Comment By: Weston T. Schmidt (schmidtw) Date: 2005-12-01 09:46 Message: Logged In: YES user_id=767003 I just tried this again to make sure that the From value failed and the To value succeeded from the attached error.tar.gz From: #define mmc_response_read() MMCMD To: #define mmc_response_read() (volatile) MMCMD ---------------------------------------------------------------------- Comment By: Bernhard Held (bernhardheld) Date: 2005-12-01 09:16 Message: Logged In: YES user_id=203539 > I tried casting MMCMD as volatile in the #define at the > top of the page & that solved the problem without the > need of making mmc_TAAC & mmc_NSAC volatile. Strange. MMCMD is a sfr, and therefore it's already volatile. Are you sure, this is the only change needed to fix your problem? Could you please post the exact #define? ---------------------------------------------------------------------- Comment By: Weston T. Schmidt (schmidtw) Date: 2005-12-01 06:51 Message: Logged In: YES user_id=767003 Bernhard, I tried your suggestion & that didn't work, but I tried making both mmc_TAAC & mmc_NSAC volatile & that worked. However, I'm not sure those are the values that should really be defined as volatile. I tried casting MMCMD as volatile in the #define at the top of the page & that solved the problem without the need of making mmc_TAAC & mmc_NSAC volatile. I am not sure that this is a compiler bug, instead I think it was user error. I will let you decide that & close the bug. Thank you very much for your quick turnaround, and good help. Thanks, Wes ---------------------------------------------------------------------- Comment By: Bernhard Held (bernhardheld) Date: 2005-11-30 11:33 Message: Logged In: YES user_id=203539 The read from mmc_TAAC is replaced by the cheaper read of the volatile(!) MMCMD. This is not an obvious bug, but it's a bug. Workaround: define mmc_TAAC as volatile. Stripped down source: volatile char vc; xdata char xc; char c; void foo (void) { long r, s; xc = vc; /* eat all registers */ for (r = 0; r < 100; ++r) for (s = 0; s < 100; ++s) ; /* BUG: xc will be replaced by cheaper, volatile vc! */ c = xc; } ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1369874&group_id=599 |
From: SourceForge.net <no...@so...> - 2005-12-11 21:36:37
|
Bugs item #1369874, was opened at 2005-11-30 10:26 Message generated for change (Comment added) made by bernhardheld You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1369874&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: C-Front End >Group: fixed >Status: Closed >Resolution: Fixed Priority: 5 Submitted By: Weston T. Schmidt (schmidtw) Assigned to: Bernhard Held (bernhardheld) Summary: replacement by volatile variable Initial Comment: I am running CVS code from 11/29/2005. 8051 series chip make -f Makefile-sdcc clean make -f Makefile-sdcc Basically the problem I am having is the desired value of mmc_Nac = 50000, but if I have the gcse optimization enabled, then I get mmc_Nac = 0 The section of code in question is: --- start --- /* Now calculate Nac */ mmc_Nac = mmc_taac_map[((0x78 & mmc_TAAC) >> 3)]; //printf( "Must be here... %ld\n", g_tmp ); for( g_i = (mmc_TAAC & 0x07); g_i < 7; g_i++ ) { mmc_Nac /= 10; } //printf( "Must be here... %ld\n", mmc_Nac ); //mmc_junk( mmc_Nac ); mmc_Nac += (FOSC / mmc_speed) * 100UL * ((ui32) mmc_NSAC); --- end --- If gcse optimization is enabled, then I must either comment out the call to mmc_junk( mmc_Nac ) or the printf() line above it, otherwise I get the incorrect value of 0 for mmc_Nac. I have been trying to debug this as best I can, but I'm not sure what I'm looking at. Below is some sample output. Thanks, Wes <wes...@al...> --- Correct --- Hello, world mmc_Nac: 50000 mmc_Nac: 50000 mmc_Nac_SD_max: 333333 mmc_Nac: 50000 mmc_TAAC: 54 mmc_NSAC: 0 mmc_speed_const: 1 mmc_speed: 10000000 mmc_address: 131071 --- Error --- Hello, world mmc_Nac: 0 mmc_Nac: 0 mmc_Nac_SD_max: 333333 mmc_Nac: 0 mmc_TAAC: 54 mmc_NSAC: 0 mmc_speed_const: 1 mmc_speed: 10000000 mmc_address: 131071 ---------------------------------------------------------------------- >Comment By: Bernhard Held (bernhardheld) Date: 2005-12-11 22:36 Message: Logged In: YES user_id=203539 Fixed in SDCCicode.c 1.232, build 1186 ---------------------------------------------------------------------- Comment By: Bernhard Held (bernhardheld) Date: 2005-12-01 10:09 Message: Logged In: YES user_id=203539 Ok, now I understand what's happening. > #define mmc_response_read() (volatile) MMCMD is equivalent to: #define mmc_response_read() (volatile int) MMCMD You casted MMCMD from (sfr-volatile-unsigned-char) to (volatile-int). Therefore the optimizer skips the buggy replacement. Your "fix" is somewhat expensive: it comes with a cast operation and requires an additional register. Anyway: thanks for the additional information! ---------------------------------------------------------------------- Comment By: Weston T. Schmidt (schmidtw) Date: 2005-12-01 09:46 Message: Logged In: YES user_id=767003 I just tried this again to make sure that the From value failed and the To value succeeded from the attached error.tar.gz From: #define mmc_response_read() MMCMD To: #define mmc_response_read() (volatile) MMCMD ---------------------------------------------------------------------- Comment By: Bernhard Held (bernhardheld) Date: 2005-12-01 09:16 Message: Logged In: YES user_id=203539 > I tried casting MMCMD as volatile in the #define at the > top of the page & that solved the problem without the > need of making mmc_TAAC & mmc_NSAC volatile. Strange. MMCMD is a sfr, and therefore it's already volatile. Are you sure, this is the only change needed to fix your problem? Could you please post the exact #define? ---------------------------------------------------------------------- Comment By: Weston T. Schmidt (schmidtw) Date: 2005-12-01 06:51 Message: Logged In: YES user_id=767003 Bernhard, I tried your suggestion & that didn't work, but I tried making both mmc_TAAC & mmc_NSAC volatile & that worked. However, I'm not sure those are the values that should really be defined as volatile. I tried casting MMCMD as volatile in the #define at the top of the page & that solved the problem without the need of making mmc_TAAC & mmc_NSAC volatile. I am not sure that this is a compiler bug, instead I think it was user error. I will let you decide that & close the bug. Thank you very much for your quick turnaround, and good help. Thanks, Wes ---------------------------------------------------------------------- Comment By: Bernhard Held (bernhardheld) Date: 2005-11-30 11:33 Message: Logged In: YES user_id=203539 The read from mmc_TAAC is replaced by the cheaper read of the volatile(!) MMCMD. This is not an obvious bug, but it's a bug. Workaround: define mmc_TAAC as volatile. Stripped down source: volatile char vc; xdata char xc; char c; void foo (void) { long r, s; xc = vc; /* eat all registers */ for (r = 0; r < 100; ++r) for (s = 0; s < 100; ++s) ; /* BUG: xc will be replaced by cheaper, volatile vc! */ c = xc; } ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1369874&group_id=599 |