Hi,Krish
  Thank you so much for answering my questions detailedly!
  I‘ve got it.Thus next time I'll check the <****.h> file to find out the specific register name of machine in SDCC.
  Now I really want to know what SDCC compile flow is.How a c code become to be a assembly code,even the machine code?
  What is the differences between SDCC and GCC?
2011/3/23 Krishnendu Chatterjee <krishnendu.chatterjee@gmail.com>
Hi Donald,
I am trying to re-clarify the concept of __sfr and __sbit.

The statement '__sfr __at 0x9A MY_SFR' means that a new SFR is
declared at 0x9A which is identified by the name MY_SFR in this
program.

However, this does not mean that MY_SFR.0 or MY_SFR_0 can be used to
access the 'bit 0' of MY_SFR. To access that you need __sbit provided
that location is bit-addressable. 0x9A is not a bit-addressable. So
you cannot access the individual bits of this SFR.

To define a bit-addressable register, the address must end with 0 or
8. Thus I can define a bit addressable register at 0xC0. But still
then I have to define each bit of that SFR explicitly. Look at the
following code:

__sfr __at 0xC0 MY_BITADDRESSABLE_SFR;
__sbit __at 0xC0 MY_BITADDRESSABLE_SFR_0;
__sbit __at 0xC1 MY_BITADDRESSABLE_SFR_1;
__sbit __at 0xC2 MY_BITADDRESSABLE_SFR_2;
__sbit __at 0xC3 MY_BITADDRESSABLE_SFR_3;
__sbit __at 0xC4 MY_BITADDRESSABLE_SFR_4;
__sbit __at 0xC5 MY_BITADDRESSABLE_SFR_5;
__sbit __at 0xC6 MY_BITADDRESSABLE_SFR_6;
__sbit __at 0xC7 MY_BITADDRESSABLE_SFR_7;

Sometime the individual bits are given special name. Then the above
code changes to:
__sfr __at 0xC0 MY_BITADDRESSABLE_SFR
__sbit __at 0xC0 SPECIAL_0
__sbit __at 0xC1 SPECIAL_1
__sbit __at 0xC2 SPECIAL_2
__sbit __at 0xC3 SPECIAL_3
__sbit __at 0xC4 SPECIAL_4
__sbit __at 0xC5 SPECIAL_5
__sbit __at 0xC6 SPECIAL_6
__sbit __at 0xC7 SPECIAL_7

If you include <8051.h>, it already defines most of the SFR and SBIT
of 8051 architecture. So that you don't have to re-write them.

As far as PSW_1 is concerned, it has a special name called 'F1'. How
do I know this? Well:

1) Search PSW in 8051.h. The statement looks like '__sfr __at (0xD0)
PSW' which means it is at a location 0xD0.
2) Search of '__sbit __at (0xD0)' and find the following lines:
__sbit __at (0xD0) P
__sbit __at (0xD1) F1
__sbit __at (0xD2) OV
__sbit __at (0xD3) RS0
__sbit __at (0xD4) RS1
__sbit __at (0xD5) F0
__sbit __at (0xD6) AC
__sbit __at (0xD7) CY
So now I know PSW_0 is called P, PSW_1 is called F1, PSW_2 is called
OV and so on. So to set the 5-th bit of PSW, use RS1 = 1. not PSW_4 =
1.


The sfr and sbit keywords are SDCC specific. So it is a good practice
to add '__' (underscore underscore) prefix with them, just like other
SDCC keywords, e.g. __bit, __data, __idata, __code, __xdata,
__critical, __reentrant etc. Omitting this, new versions of sdcc
generate deprecation warnings.

Cheers.
Krish



On Wed, Mar 23, 2011 at 8:04 AM, duck donal <tangtao87657560@gmail.com> wrote:
> Hi roelof,
>    Thanks for your help!
>    I run what you modify code in my pc,It can be compiled successfully!
>    However I have some questions to this code.
>    1.What you use library files(p89lpc938.h) seems not the standard 51
> library files.Does that mean I can subsitute this library for standard
> 51 library?
>
>    2.You have no statements about P1_0/P1_7,Does that mean,the codes which
> have been compiled with SDCC don't need the statements of sfr or sbit?
>    3.I've tried another simple code(newpp.c) as what you told me,but the
> sdcc give me such a error:newpp.c:error 20:Undefined identifier 'PSW_1'
>       the code as follow:
>       #include <AT89X51.H>
>        sfr f_wren=0xf1;
>        sfr f_pp=0xf2;
>        sfr f_wr_adrH=0xf3;
>        sfr f_wr_adrM=0xf4;
>        sfr f_wr_adrL=0xf5;
>        sfr f_wr_dataH=0xf6;
>        sfr f_wr_dataM1=0xf7;
>        sfr f_wr_dataM2=0xf8;
>        sfr f_wr_dataL=0xf9;
>        sfr f_rw=0xfa;
>        sfr f_work=0xfb;
>        main()
>        {
>
>        f_wren=0x06;
>        f_pp=0x02;
>        f_wr_adrH=0x00;
>        f_wr_adrM=0x02;
>        f_wr_adrL=0x00;
>        f_wr_dataH=0x12;
>        f_wr_dataM1=0x34;
>        f_wr_dataM2=0x56;
>        f_wr_dataL=0x78;
>        f_rw=0x01;
>        f_work=0x01;
>        while(PSW_1==0)
>           f_work=0x00;
>        }o
>       I use PSW.1 instead of PSW_1,the SDCC give me a syntax error: token ->
> '.1';column 11
>       So,what should be done on this code?
>       4.I'm interesting in the SDCC compile internal,but manual is not very
> detailed to the introduction of the internal
>          so,could u give me some material,such as SDCC compile flow,Whether
> the SDCC have intermediate language,what is the difference between SDCC with
> GCC
>
>      Thanks!
>       Donald
> 2011/3/22 roelof 't Hooft <roelofh@itholland.nl>
>>
>> On Tue, 2011-03-22 at 10:02 +0800, duck donal wrote:
>> > Hi All,
>> > I'm a newbie for sdcc.
>> > A few days ago, I was in use of SDCC, ran into a problem.
>>
>> > So,what is the solutions?To modify the program?How to do it?
>> > Or modify the sdcc?
>>
>> Hi Donald,
>>
>> Here is your example code back, I modified it a bit to
>> have it succesfully compile with sdcc.
>> As opposed to arm-elf-gcc sdcc does not need or use the
>> return at the end of a program, embedded programs usually
>> never return and stay in a while(1) loop forever :-)
>>
>> #include <p89lpc938.h>
>>
>> void main(void)
>> {
>>        unsigned char j;
>>        unsigned int i;
>>
>>        while(1)
>>        {
>>                P1_7 = 1;
>>                while(P1_7 == 0)
>>                {
>>                        for(i = 1; i <= 500; i++)
>>                        {
>>                                P1_0 = !P1_0;
>>                                for(j = 0; j <= 50; j++)
>>                                {
>>                                }
>>                        }
>>                        for(i = 1; i <= 250; i++)
>>                        {
>>                                P1_0 = !P1_0;
>>                                for(j = 0; j <= 100; j++)
>>                                {
>>                                }
>>                        }
>>                }
>>        }
>> }
>>
>> roelofh@baywatch:~/tangtao$ sdcc tang.c
>> roelofh@baywatch:~/tangtao$ ll
>> total 196
>> -rw-r--r-- 1 roelofh domainusers 13302 2011-03-22 10:48 tang.asm
>> -rw-r--r-- 1 roelofh domainusers   333 2011-03-22 10:48 tang.c
>> -rw-r--r-- 1 roelofh domainusers   620 2011-03-22 10:48 tang.ihx
>> -rw-r--r-- 1 roelofh domainusers   215 2011-03-22 10:48 tang.lnk
>> -rw-r--r-- 1 roelofh domainusers 35446 2011-03-22 10:48 tang.lst
>> -rw-r--r-- 1 roelofh domainusers 34876 2011-03-22 10:48 tang.map
>> -rw-r--r-- 1 roelofh domainusers  1129 2011-03-22 10:48 tang.mem
>> -rw-r--r-- 1 roelofh domainusers  6201 2011-03-22 10:48 tang.rel
>> -rw-r--r-- 1 roelofh domainusers 35446 2011-03-22 10:48 tang.rst
>> -rw-r--r-- 1 roelofh domainusers 47706 2011-03-22 10:48 tang.sym
>> roelofh@baywatch:~/tangtao$ sdcc -v
>> SDCC : mcs51 3.0.1 #6066 (23 Nov 2010) (Linux)
>>
>> You will find the header files in /usr/local/share/sdcc/include/mcs51/
>> Please have a look at them and include the one you need for your
>> processor. I have included a random one for example.
>>
>> roelof
>>
>>
>>
>>
>> ------------------------------------------------------------------------------
>> Enable your software for Intel(R) Active Management Technology to meet the
>> growing manageability and security demands of your customers. Businesses
>> are taking advantage of Intel(R) vPro (TM) technology - will your software
>> be a part of the solution? Download the Intel(R) Manageability Checker
>> today! http://p.sf.net/sfu/intel-dev2devmar
>> _______________________________________________
>> Sdcc-user mailing list
>> Sdcc-user@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/sdcc-user
>
>
> ------------------------------------------------------------------------------
> Enable your software for Intel(R) Active Management Technology to meet the
> growing manageability and security demands of your customers. Businesses
> are taking advantage of Intel(R) vPro (TM) technology - will your software
> be a part of the solution? Download the Intel(R) Manageability Checker
> today! http://p.sf.net/sfu/intel-dev2devmar
> _______________________________________________
> Sdcc-user mailing list
> Sdcc-user@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sdcc-user
>
>

------------------------------------------------------------------------------
Enable your software for Intel(R) Active Management Technology to meet the
growing manageability and security demands of your customers. Businesses
are taking advantage of Intel(R) vPro (TM) technology - will your software
be a part of the solution? Download the Intel(R) Manageability Checker
today! http://p.sf.net/sfu/intel-dev2devmar
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user