Hello, I have a project (C166/HUGE memory model), where some local variables seems to lose their values. Everything worked fine, until I added some more code to a specific function (and one more local variable):
unsigned char Ptmp=0,FSzu=0,IsCancelled=1,errors=0, FSDin,f3=0,f4=0,Abort=0,ii,done=0;
NAME CLASS SPACE TYPE OFFSET SIZE ---------------------------------------------------- Ptmp . . . . --reg-- uchar ----- 1 FSzu . . . . auto uchar 2H 1 IsCancelled. auto uchar 0H 1 errors . . . auto uchar 6H 1 FSDin. . . . auto uchar 8H 1 f3 . . . . . auto uchar AH 1 f4 . . . . . auto uchar CH 1 Abort. . . . auto uchar EH 1 ii . . . . . --reg-- uchar ----- 1 done . . . . auto uchar 2H 1
NAME CLASS SPACE TYPE OFFSET SIZE ---------------------------------------------------- Ptmp . . . . auto uchar 0H 1 FSzu . . . . auto uchar 2H 1 IsCancelled. --reg-- uchar ----- 1 errors . . . auto uchar 6H 1 FSDin. . . . auto uchar 8H 1 f3 . . . . . auto uchar AH 1 f4 . . . . . auto uchar CH 1 Abort. . . . auto uchar EH 1 ii . . . . . --reg-- uchar ----- 1
How can I prevent "auto" variables? The handbook talks a lot about how they are handled and placed, but as far as I see there is no way to directly place a variable in a specific place. Coming from C51, there was always an easy way to declare a variable as
unsigned char xdata varname;
The static keyword is designed for that. By default, local variables have the auto storage class pecifier. You can find details in K&R, for example.
Hello! what would be a reason against making "everything static" with the compiler option? Functions wouldn't be reentrant anymore, but if you don't have any functions that have to be, is there any reason why not to do this? ISRs should also run if they're static, since a new interrupt during the execution of the previous one would just wait until the previous one is handled. Thanks for any advice! Holger
"what would be a reason against making "everything static" with the compiler option?" That'd mean you'd need to allocate RAM for every single local variable. "Conventional" 'C' compilers allocate local variables on the Stack, so you only need enough RAM for the maximum number of local variables in use simultaneously C51 uses a data overlaying technique to achieve a similar end. I dunno how C166 does it.