X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=doc%2Fsdccman.lyx;h=2972e85fc97895efe16a89afbc8ec9eefb710431;hb=90d3640cdd575040ccb9bcf1e73f031027dc7f60;hp=c4ce3eba5665fbec3744787ae389bbd7b950254f;hpb=ee76e2f5985c5917392f3f6ea121db57a9e314ce;p=fw%2Fsdcc diff --git a/doc/sdccman.lyx b/doc/sdccman.lyx index c4ce3eba..2972e85f 100644 --- a/doc/sdccman.lyx +++ b/doc/sdccman.lyx @@ -7,7 +7,7 @@ pdftitle={SDCC Compiler User Guide}, pdfauthor={SDCC development team}, pdfsubject={installation, user manual}, - pdfkeywords={68hc08 8032 8051 ansi c compiler assembler CPU DS390 embedded development free Floating Point Arithmetic Freescale GPL HC08 inline Intel ISO/IEC 9899:1990 Linux MAC OS X manual Maxim mcs51 Microchip microcontroller open source PIC Unix Windows Z80 Zilog}, + pdfkeywords={68hc08 8032 8051 ansi c compiler assembler CPU DS390 embedded development free Floating Point Arithmetic Freescale GPL HC08 inline Intel ISO/IEC 9899:1990 Linux MAC OS X manual Maxim mcs51 Microchip microcontroller open source PIC Unix Windows Z80 Zilog}, pdfpagemode=UseOutlines, colorlinks=true, linkcolor=blue] {hyperref} @@ -45,7 +45,13 @@ \papersides 1 \paperpagestyle fancy -\layout Comment +\layout Standard + + +\begin_inset Note +collapsed true + +\layout Standard Please note: double dashed longoptions (e.g. --version) are written this way: - @@ -59,22 +65,25 @@ status Collapsed \end_inset - -\layout Comment +\layout Standard Two resp. three consecutive dashes simply result in a long resp. extra long dash. -\layout Comment +\layout Standard Architecture specific stuff (like memory models, code examples) should maybe later go -\layout Comment +\layout Standard into seperate sections/chapters/appendices (it is hard to document PIC or Z80 in -\layout Comment +\layout Standard a 8051 centered document) - for now simply add. +\end_inset + + \layout Title SDCC Compiler User Guide @@ -82,16 +91,25 @@ SDCC Compiler User Guide \size normal -SDCC 2.6.2 +SDCC 2.6.4 \size footnotesize \newline $Date$ \newline $Revision$ -\layout Comment +\layout Standard + + +\begin_inset Note +collapsed true + +\layout Standard The above strings enclosed in $ are automatically updated by Subversion +\end_inset + + \layout Standard @@ -1059,6 +1077,20 @@ status Collapsed \end_inset -datadir see table below +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-datarootdir see table below \newline \layout List @@ -1351,7 +1383,7 @@ These defaults are: \align center \begin_inset Tabular - + @@ -1462,7 +1494,7 @@ BINDIR \emph on -$EXECPREFIX +$EXEC_PREFIX \emph default /bin \end_inset @@ -1474,7 +1506,7 @@ $EXECPREFIX \emph on -$EXECPREFIX +$EXEC_PREFIX \emph default \backslash @@ -1499,6 +1531,38 @@ DATADIR \layout Standard +\emph on +$DATAROOTDIR +\end_inset + + +\begin_inset Text + +\layout Standard + + +\emph on +$DATAROOTDIR +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\emph on +DATAROOTDIR +\end_inset + + +\begin_inset Text + +\layout Standard + + \emph on $PREFIX \emph default @@ -1534,7 +1598,7 @@ DOCDIR \emph on -$DATADIR +$DATAROOTDIR \emph default /sdcc/doc \end_inset @@ -1546,7 +1610,7 @@ $DATADIR \emph on -$DATADIR +$DATAROOTDIR \emph default \backslash @@ -1784,7 +1848,7 @@ status Collapsed / \end_inset --datadir= +-datarootdir= \begin_inset Quotes srd \end_inset @@ -1901,7 +1965,7 @@ status Collapsed / \end_inset --datadir= +-datarootdir= \begin_inset Quotes srd \end_inset @@ -1917,7 +1981,9 @@ docdir= \begin_inset Quotes srd \end_inset -/sdcc/doc + +\backslash +${datarootdir}/doc \begin_inset Quotes srd \end_inset @@ -2058,7 +2124,7 @@ status Collapsed / \end_inset --datadir= +-datarootdir= \begin_inset Quotes srd \end_inset @@ -2074,7 +2140,9 @@ docdir= \begin_inset Quotes srd \end_inset -/sdcc/doc + +\backslash +${datarootdir}/doc \begin_inset Quotes srd \end_inset @@ -2164,7 +2232,7 @@ status Collapsed However if options are changed, it can be necessary to delete the config.cache file. \layout Section - +\added_space_bottom medskip Install paths \begin_inset LatexCommand \label{sub:Install-paths} @@ -2177,7 +2245,7 @@ Install paths \layout Standard -\added_space_top medskip \align center +\align center \begin_inset Tabular @@ -3267,10 +3335,19 @@ lib/ \newline -\layout Comment +\layout Standard + + +\begin_inset Note +collapsed true + +\layout Standard Don't delete any of the stray spaces in the table above without checking the HTML output (last line)! +\end_inset + + \layout Standard \SpecialChar ~ @@ -5846,11 +5923,20 @@ Processor Selection Options \end_inset . -\layout Comment +\layout Standard + + +\begin_inset Note +collapsed true + +\layout Standard I think it is fair to direct users there for now. Open source is also about avoiding unnecessary work . But I didn't find the 'official' link. +\end_inset + + \layout List \labelwidthstring 00.00.0000 @@ -5870,9 +5956,18 @@ I think it is fair to direct users there for now. -bit processors (p16f84 and variants. In development, not complete). -\layout Comment +\layout Standard + + +\begin_inset Note +collapsed true + +\layout Standard p16f627 p16f628 p16f84 p16f873 p16f877? +\end_inset + + \layout List \labelwidthstring 00.00.0000 @@ -6122,6 +6217,33 @@ file"'. Like `-dD' except that the macro arguments and contents are omitted. Only `#define name' is included in the output. \layout List +\labelwidthstring 00.00.0000 + + +\series bold +-pedantic-parse-number +\begin_inset LatexCommand \index{-pedantic-parse-number} + +\end_inset + + +\size large +\bar under + +\series default +\size default +\bar default +Pedentic parse numbers so that situations like 0xfe-LO_B(3) are parsed properly + and the macro LO_B(3) gets expanded. + See also #pragma pedantic_parse_number in section +\begin_inset LatexCommand \ref{sec:Pragmas} + +\end_inset + + +\emph on +Note: this functionality is not in conformance with standard! +\layout List \added_space_bottom bigskip \labelwidthstring 00.00.0000 @@ -6164,7 +6286,7 @@ gcc \end_inset ), if you need more dedicated options please refer to the GCC\SpecialChar ~ -3.3.6\SpecialChar ~ +4.1.1\SpecialChar ~ CPP\SpecialChar ~ Manual at @@ -8178,6 +8300,46 @@ status Collapsed \labelwidthstring 00.00.0000 +\series bold +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-funsigned-char +\begin_inset LatexCommand \index{-\/-funsigned-char} + +\end_inset + + +\series default + The default signedness for every type is +\family typewriter + signed +\family default +. + In some embedded environments the default signedness of +\family typewriter + char +\family default + is +\family typewriter + unsigned +\family default +. + To set the signess for characters to unsigned, use the option --funsigned-char. + If this option is set and no signedness keyword (unsigned/signed) is given, + a char will be signed. + All other types are unaffected. +\layout List +\labelwidthstring 00.00.0000 + + \series bold - \begin_inset ERT @@ -8696,6 +8858,29 @@ status Collapsed Can be used for instance when using bank switching to put the const data in a bank. \layout List +\labelwidthstring 00.00.0000 + + +\series bold +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-fdollars-in-identifiers +\begin_inset LatexCommand \index{-\/-fdollars-in-identifiers} + +\end_inset + + +\series default + Permit '$' as an identifier character +\layout List \added_space_bottom bigskip \labelwidthstring 00.00.0000 @@ -12927,232 +13112,95 @@ Startup Code MCS51/DS390 Startup Code \layout Standard -The compiler inserts a call to the C routine -\emph on -_sdcc_external_startup() -\begin_inset LatexCommand \index{\_sdcc\_external\_startup()} +The compiler triggers the linker to link certain initialization modules + from the runtime library +\begin_inset LatexCommand \index{Runtime library} \end_inset + called crt. + Only the necessary ones are linked, for instance crtxstack.asm (GSINIT1, + GSINIT5) is not linked unless the --xstack option is used. + These modules are highly entangled by the use of special segments/areas, + but a common layout is shown below: +\layout Verse + +\family typewriter \series bold -\emph default - -\series default -at the start of the CODE area. - This routine is in the runtime library -\begin_inset LatexCommand \index{Runtime library} +\size footnotesize +(main.asm) +\layout Verse -\end_inset -. - By default this routine returns 0, if this routine returns a non-zero value, - the static & global variable initialization will be skipped and the function - main will be invoked. - Otherwise static & global variables will be initialized before the function - main is invoked. - You could add a -\emph on -_sdcc_external_startup() -\emph default - routine to your program to override the default if you need to setup hardware - or perform some other critical operation prior to static & global variable - initialization -\begin_inset LatexCommand \index{Variable initialization} +\family typewriter +\size footnotesize +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +.area HOME (CODE) +\newline +__interrupt_vect: +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +ljmp __sdcc_gsinit_startup +\layout Verse -\end_inset -. - On some mcs51 variants xdata -\begin_inset LatexCommand \index{xdata (mcs51, ds390 storage class)} +\family typewriter +\series bold +\size footnotesize +(crtstart.asm) +\layout Verse -\end_inset - memory has to be explicitly enabled before it can be accessed or if the - watchdog -\begin_inset LatexCommand \index{watchdog} +\family typewriter +\size footnotesize +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +.area GSINIT0 (CODE) +\newline +__sdcc_gsinit_startup:: +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov sp,#__start__stack - 1 +\layout Verse -\end_inset - needs to be disabled, this is the place to do it. - The startup code clears all internal data memory, 256 bytes by default, - but from 0 to n-1 if -\emph on -- -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --iram-size -\begin_inset LatexCommand \index{-\/-iram-size } - -\end_inset - -n -\emph default - is used. - (recommended for Chipcon CC1010). -\layout Standard -\added_space_bottom bigskip -See also the compiler options -\emph on -- -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --no-xinit -\emph default -- -\emph on -opt -\emph default - -\begin_inset LatexCommand \index{-\/-no-xinit-opt} - -\end_inset - -, -\emph on -- -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --main-return -\emph default - -\begin_inset LatexCommand \index{-\/-main-return} - -\end_inset - - and section -\begin_inset LatexCommand \ref{sub:MCS51-variants} - -\end_inset - - about MCS51-variants. -\layout Subsection - -HC08 Startup Code -\layout Standard -\added_space_bottom bigskip -The HC08 -\begin_inset LatexCommand \index{HC08} - -\end_inset - - startup code follows the same scheme as the MCS51 startup code. -\layout Subsection - -Z80 Startup Code -\layout Standard -\added_space_bottom bigskip -On the Z80 -\begin_inset LatexCommand \index{Z80} - -\end_inset - - the startup code is inserted by linking with crt0.o which is generated from - sdcc/device/lib/z80/crt0.s. - If you need a different startup code you can use the compiler option -\emph on -- +\family typewriter \series bold -\emph default - -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - - -\series default -\emph on --no-std-crt0 -\emph default - -\begin_inset LatexCommand \index{-\/-no-std-crt0} - -\end_inset - - and provide your own crt0.o. - -\layout Section - -Inline Assembler Code -\begin_inset LatexCommand \index{Assembler routines} - -\end_inset - - -\layout Subsection - -A Step by Step Introduction -\begin_inset LatexCommand \label{sub:A-Step-by Assembler Introduction} - -\end_inset - - -\layout Standard - -Starting from a small snippet of c-code this example shows for the MCS51 - how to use inline assembly, access variables, a function parameter and - an array in xdata memory. - The example uses an MCS51 here but is easily adapted for other architectures. - This is a buffer routine which should be optimized: +\size footnotesize +(crtxstack.asm) \layout Verse \family typewriter \size footnotesize -unsigned char __far -\begin_inset LatexCommand \index{far (storage class)} - -\end_inset - - -\begin_inset LatexCommand \index{\_\_far (storage class)} - -\end_inset - - __at -\begin_inset LatexCommand \index{at} - -\end_inset - - -\begin_inset LatexCommand \index{\_\_at} - -\end_inset - -(0x7f00) buf[0x100]; -\begin_inset LatexCommand \index{Aligned array} - -\end_inset - - -\newline -unsigned char head, tail;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -13161,6 +13209,13 @@ unsigned char head, tail;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +.area GSINIT1 (CODE) +\newline +__sdcc_init_xstack:: +\newline +; Need to initialize in GSINIT1 in case the user's __sdcc_external_startup + uses the xstack. +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -13169,12 +13224,7 @@ unsigned char head, tail;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -/* if interrupts -\begin_inset LatexCommand \index{interrupt} - -\end_inset - - are involved see +mov __XPAGE,#(__start__xstack >> 8) \newline \SpecialChar ~ \SpecialChar ~ @@ -13184,6 +13234,19 @@ unsigned char head, tail;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +mov _spx,#__start__xstack +\layout Verse + + +\family typewriter +\series bold +\size footnotesize +(crtstart.asm) +\layout Verse + + +\family typewriter +\size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -13192,6 +13255,8 @@ unsigned char head, tail;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +.area GSINIT2 (CODE) +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -13200,6 +13265,8 @@ unsigned char head, tail;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +lcall __sdcc_external_startup +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -13208,6 +13275,8 @@ unsigned char head, tail;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +mov a,dpl +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -13216,61 +13285,31 @@ unsigned char head, tail;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +jz __sdcc_init_data +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -section -\begin_inset LatexCommand \ref{sub:Common-interrupt-pitfall-volatile} - -\end_inset - - about -\series bold - volatile -\series default - */ -\newline - -\newline -void to_buffer( unsigned char c ) -\newline -{ -\newline -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -if( head != (unsigned char)(tail-1) )\SpecialChar ~ -/* cast -\series bold -needed -\series default - to avoid promotion -\begin_inset LatexCommand \index{promotion to signed int} - -\end_inset - - -\begin_inset LatexCommand \index{type promotion} - -\end_inset - - to integer */ -\begin_inset Marginal -collapsed true - -\layout Standard +ljmp __sdcc_program_startup +\newline +__sdcc_init_data: +\layout Verse +\family typewriter \series bold -\SpecialChar ~ -! -\end_inset +\size footnotesize +(crtxinit.asm) +\layout Verse -\newline +\family typewriter +\size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -13279,7 +13318,11 @@ collapsed true \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -buf[ head++ ] = c;\SpecialChar ~ +.area GSINIT3 (CODE) +\newline +__mcs51_genXINIT:: +\newline +\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -13287,6 +13330,8 @@ buf[ head++ ] = c;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +mov r1,#l_XINIT +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -13295,249 +13340,120 @@ buf[ head++ ] = c;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -/* access to a 256 byte aligned array */ -\newline -} -\layout Standard - -If the code snippet (assume it is saved in buffer.c) is compiled with SDCC - then a corresponding buffer.asm file is generated. - We define a new function -\family typewriter -to_buffer_asm() -\family default - in file buffer.c in which we cut and paste the generated code, removing - unwanted comments and some ':'. - Then add -\begin_inset Quotes sld -\end_inset - -_asm -\begin_inset Quotes srd -\end_inset - - and -\begin_inset Quotes sld -\end_inset - -_endasm; -\begin_inset Quotes srd -\end_inset - - to the beginning and the end of the function body: -\layout Verse - - -\family typewriter -\size footnotesize -/* With a cut and paste from the .asm file, we have something to start with. +mov a,r1 \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -The function is not yet OK! (registers aren't saved) */ -\newline -void to_buffer_asm( unsigned char c ) -\newline -{ -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_asm -\begin_inset LatexCommand \index{\_asm} - -\end_inset - - -\begin_inset LatexCommand \index{\_\_asm} - -\end_inset - - +\SpecialChar ~ +orl a,#(l_XINIT >> 8) \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ \SpecialChar ~ -r2,dpl -\newline -;buffer.c if( head != (unsigned char)(tail-1) ) \SpecialChar ~ -/* cast -\series bold -needed -\series default - to avoid promotion -\begin_inset LatexCommand \index{promotion to signed int} - -\end_inset - - -\begin_inset LatexCommand \index{type promotion} - -\end_inset - - to integer */ -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +jz 00003$ +\newline \SpecialChar ~ -mov\SpecialChar ~ \SpecialChar ~ -a,_tail -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -dec\SpecialChar ~ \SpecialChar ~ -a +\SpecialChar ~ +mov r2,#((l_XINIT+255) >> 8) \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ \SpecialChar ~ -r3,a +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov dptr,#s_XINIT \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ \SpecialChar ~ -a,_head +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov r0,#s_XISEG \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -cjne a,ar3,00106$ -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -ret +mov __XPAGE,#(s_XISEG >> 8) \newline -00106$: -\newline -;buffer.c buf[ head++ ] = c; /* access to a 256 byte aligned array */ -\begin_inset LatexCommand \index{Aligned array} - -\end_inset - - +00001$:\SpecialChar ~ +clr a \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ -\SpecialChar ~ -r3,_head -\newline -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -inc\SpecialChar ~ \SpecialChar ~ -_head +movc a,@a+dptr \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ \SpecialChar ~ -dpl,r3 -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +movx @r0,a +\newline +\SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ \SpecialChar ~ -dph,#(_buf >> 8) -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ \SpecialChar ~ -a,r2 +inc dptr \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -movx @dptr,a -\newline -00103$: -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -ret +inc r0 \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_endasm -\begin_inset LatexCommand \index{\_endasm} - -\end_inset - - -\begin_inset LatexCommand \index{\_\_endasm} - -\end_inset - -; -\newline -} -\layout Standard - -The new file buffer.c should compile with only one warning about the unreferenced - function argument 'c'. - Now we hand-optimize the assembly code and insert an #define USE_ASSEMBLY - (1) and finally have: -\layout Verse - - -\family typewriter -\size footnotesize -unsigned char __far __at(0x7f00) buf[0x100]; -\newline -unsigned char head, tail; -\newline -#define USE_ASSEMBLY (1) -\newline - -\newline -#if !USE_ASSEMBLY -\newline - -\newline -void to_buffer( unsigned char c ) -\newline -{ -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -if( head != (unsigned char)(tail-1) ) +cjne r0,#0,00002$ \newline \SpecialChar ~ \SpecialChar ~ @@ -13547,41 +13463,20 @@ if( head != (unsigned char)(tail-1) ) \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -buf[ head++ ] = c; -\newline -} -\newline - -\newline -#else -\newline - +inc __XPAGE \newline -void to_buffer( unsigned char c ) -\newline -{ +00002$:\SpecialChar ~ +djnz r1,00001$ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -c; // to avoid warning: unreferenced function argument -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_asm -\begin_inset LatexCommand \index{\_asm} - -\end_inset - - -\begin_inset LatexCommand \index{\_\_asm} - -\end_inset - - +djnz r2,00001$ \newline \SpecialChar ~ \SpecialChar ~ @@ -13591,9 +13486,21 @@ _asm \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -; save used registers here. - +mov __XPAGE,#0xFF \newline +00003$: +\layout Verse + + +\family typewriter +\series bold +\size footnotesize +(crtclear.asm) +\layout Verse + + +\family typewriter +\size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -13602,10 +13509,9 @@ _asm \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -; If we were still using r2,r3 we would have to push them here. - +.area GSINIT4 (CODE) \newline -; if( head != (unsigned char)(tail-1) ) +__mcs51_genRAMCLEAR:: \newline \SpecialChar ~ \SpecialChar ~ @@ -13615,8 +13521,7 @@ _asm \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ - a,_tail +clr a \newline \SpecialChar ~ \SpecialChar ~ @@ -13626,8 +13531,10 @@ mov\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -dec\SpecialChar ~ - a +mov r0,#(l_IRAM-1) +\newline +00004$:\SpecialChar ~ +mov @r0,a \newline \SpecialChar ~ \SpecialChar ~ @@ -13637,9 +13544,21 @@ dec\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -xrl\SpecialChar ~ - a,_head +djnz r0,00004$ \newline +; _mcs51_genRAMCLEAR() end +\layout Verse + + +\family typewriter +\series bold +\size footnotesize +(crtxclear.asm) +\layout Verse + + +\family typewriter +\size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -13648,7 +13567,9 @@ xrl\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -; we could do an ANL a,#0x0f here to use a smaller buffer (see below) +.area GSINIT4 (CODE) +\newline +__mcs51_genXRAMCLEAR:: \newline \SpecialChar ~ \SpecialChar ~ @@ -13658,9 +13579,7 @@ xrl\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -jz\SpecialChar ~ -\SpecialChar ~ - t_b_end$ +mov r0,#l_PSEG \newline \SpecialChar ~ \SpecialChar ~ @@ -13670,9 +13589,7 @@ jz\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -; -\newline -; buf[ head++ ] = c; +mov a,r0 \newline \SpecialChar ~ \SpecialChar ~ @@ -13682,29 +13599,27 @@ jz\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ - a,dpl \SpecialChar ~ +jz 00006$ +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -; dpl holds lower byte of function argument -\newline \SpecialChar ~ \SpecialChar ~ +mov r1,#s_PSEG +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ - dpl,_head \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -; buf is 0x100 byte aligned so head can be used directly +mov __XPAGE,#(s_PSEG >> 8) \newline \SpecialChar ~ \SpecialChar ~ @@ -13714,8 +13629,10 @@ mov\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ - dph,#(_buf>>8) +clr a +\newline +00005$:\SpecialChar ~ +movx @r1,a \newline \SpecialChar ~ \SpecialChar ~ @@ -13725,7 +13642,7 @@ mov\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -movx @dptr,a +inc r1 \newline \SpecialChar ~ \SpecialChar ~ @@ -13735,8 +13652,9 @@ movx @dptr,a \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -inc \SpecialChar ~ -_head +djnz r0,00005$ +\newline +00006$: \newline \SpecialChar ~ \SpecialChar ~ @@ -13746,9 +13664,7 @@ _head \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -; we could do an ANL _head,#0x0f here to use a smaller buffer (see above) -\newline -t_b_end$: +mov r0,#l_XSEG \newline \SpecialChar ~ \SpecialChar ~ @@ -13758,239 +13674,37 @@ t_b_end$: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -; restore used registers here +mov a,r0 \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_endasm -\begin_inset LatexCommand \index{\_endasm} - -\end_inset - - -\begin_inset LatexCommand \index{\_\_endasm} - -\end_inset - -; -\newline -} -\newline -#endif -\layout Standard - -The inline assembler code can contain any valid code understood by the assembler -, this includes any assembler directives and comment lines. - The assembler does not like some characters like ':' or ''' in comments. - You'll find an 100+ pages assembler manual in sdcc/as/doc/asxhtm.html -\begin_inset LatexCommand \index{asXXXX (as-gbz80, as-hc08, asx8051, as-z80)} - -\end_inset - - -\begin_inset LatexCommand \index{Assembler documentation} - -\end_inset - - or online at -\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/as/doc/asxhtm.html} - -\end_inset - \SpecialChar ~ -. -\layout Standard - -The compiler does not do any validation of the code within the -\family typewriter -_asm -\begin_inset LatexCommand \index{\_asm} - -\end_inset - - -\begin_inset LatexCommand \index{\_\_asm} - -\end_inset - - ... - _endasm -\size footnotesize - -\begin_inset LatexCommand \index{\_endasm} - -\end_inset - - -\begin_inset LatexCommand \index{\_\_endasm} - -\end_inset - - -\size default -; -\family default - keyword pair. - Specifically it will not know which registers are used and thus register - pushing/popping -\begin_inset LatexCommand \index{push/pop} - -\end_inset - - has to be done manually. - -\layout Standard - -It is recommended that each assembly instruction (including labels) be placed - in a separate line (as the example shows). - When the - -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - -- -\emph on -peep-asm -\begin_inset LatexCommand \index{-\/-peep-asm} - -\end_inset - - -\emph default - command line option is used, the inline assembler code will be passed through - the peephole optimizer -\begin_inset LatexCommand \index{Peephole optimizer} - -\end_inset - -. - There are only a few (if any) cases where this option makes sense, it might - cause some unexpected changes in the inline assembler code. - Please go through the peephole optimizer rules defined in file -\emph on -SDCCpeeph.def -\emph default - before using this option. -\layout Subsection - -Naked Functions -\begin_inset LatexCommand \label{sub:Naked-Functions} - -\end_inset - - -\begin_inset LatexCommand \index{Naked functions} - -\end_inset - - -\layout Standard - -A special keyword may be associated with a function declaring it as -\emph on -_naked -\begin_inset LatexCommand \index{\_naked} - -\end_inset - - -\begin_inset LatexCommand \index{\_\_naked} - -\end_inset - -. - -\emph default -The -\emph on -_naked -\emph default - function modifier attribute prevents the compiler from generating prologue -\begin_inset LatexCommand \index{function prologue} - -\end_inset - - and epilogue -\begin_inset LatexCommand \index{function epilogue} - -\end_inset - - code for that function. - This means that the user is entirely responsible for such things as saving - any registers that may need to be preserved, selecting the proper register - bank, generating the -\emph on -return -\emph default - instruction at the end, etc. - Practically, this means that the contents of the function must be written - in inline assembler. - This is particularly useful for interrupt functions, which can have a large - (and often unnecessary) prologue/epilogue. - For example, compare the code generated by these two functions: -\layout Verse - - -\family typewriter -volatile -\begin_inset LatexCommand \index{volatile} - -\end_inset - - data unsigned char counter; -\newline - -\newline -void simpleInterrupt(void) __interrupt -\begin_inset LatexCommand \index{interrupt} - -\end_inset - - -\begin_inset LatexCommand \index{\_\_interrupt} - -\end_inset - - (1) -\newline -{ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +orl a,#(l_XSEG >> 8) \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -counter++; -\newline -} -\newline - -\newline -void nakedInterrupt(void) __interrupt (2) __naked -\newline -{ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +jz 00008$ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_asm -\begin_inset LatexCommand \index{\_asm} - -\end_inset - - -\begin_inset LatexCommand \index{\_\_asm} - -\end_inset - - +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov r1,#((l_XSEG + 255) >> 8) \newline \SpecialChar ~ \SpecialChar ~ @@ -13998,12 +13712,22 @@ _asm \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -inc\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +mov dptr,#s_XSEG +\newline \SpecialChar ~ \SpecialChar ~ -_counter ; does not change flags, no need to save psw +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +clr a +\newline +00007$:\SpecialChar ~ +movx @dptr,a \newline \SpecialChar ~ \SpecialChar ~ @@ -14011,211 +13735,169 @@ _counter ; does not change flags, no need to save psw \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -reti\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +inc dptr +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -; MUST explicitly include ret or reti in _naked function. +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +djnz r0,00007$ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_endasm -\begin_inset LatexCommand \index{\_endasm} - -\end_inset - - -\begin_inset LatexCommand \index{\_\_endasm} - -\end_inset - -; +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +djnz r1,00007$ \newline -} -\layout Standard - -For an 8051 target, the generated simpleInterrupt looks like: +00008$: \layout Verse \family typewriter -Note, this is an -\emph on -outdated -\emph default - example, recent versions of SDCC generate -\newline -the -\emph on -same -\emph default - code for simpleInterrupt() and nakedInterrupt()! -\newline +\series bold +\size footnotesize +(crtxstack.asm) +\layout Verse -\newline -_simpleInterrupt: -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -push\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -acc -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -push\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ + +\family typewriter +\size footnotesize \SpecialChar ~ -b -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -push\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -dpl +.area GSINIT5 (CODE) \newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -push\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -dph +; Need to initialize in GSINIT5 because __mcs51_genXINIT modifies __XPAGE \newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -push\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -psw +; and __mcs51_genRAMCLEAR modifies _spx. \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -psw,#0x00 +mov __XPAGE,#(__start__xstack >> 8) \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -inc\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_counter -\newline +mov _spx,#__start__xstack +\layout Verse + + +\family typewriter +\series bold +\size footnotesize +(application modules) +\layout Verse + + +\family typewriter +\size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -pop\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -psw -\newline +.area GSINIT (CODE) +\layout Verse + + +\family typewriter +\series bold +\size footnotesize +(main.asm) +\layout Verse + + +\family typewriter +\size footnotesize \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -pop\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -dph +.area GSFINAL (CODE) \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -pop\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -dpl +ljmp __sdcc_program_startup +\newline +;-------------------------------------------------------- +\newline +; Home +\newline +;-------------------------------------------------------- \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -pop\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -b +.area HOME (CODE) \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -pop\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -acc +.area CSEG (CODE) \newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -reti -\layout Standard - -whereas nakedInterrupt looks like: -\layout Verse - - -\family typewriter -_nakedInterrupt: +__sdcc_program_startup: \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -inc\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -_counter ; does not change flags, no need to save psw -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ -reti\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +lcall _main +\newline +; return from main will lock up +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -14224,2015 +13906,2242 @@ reti\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -; MUST explicitly include ret or reti in _naked function +sjmp . \layout Standard -The related directive #pragma exclude -\begin_inset LatexCommand \index{\#pragma exclude} +One of these modules (crtstart.asm) contains a call to the C routine +\emph on +_sdcc_external_startup() +\begin_inset LatexCommand \index{\_sdcc\_external\_startup()} \end_inset - allows a more fine grained control over pushing & popping -\begin_inset LatexCommand \index{push/pop} + +\series bold +\emph default + +\series default +at the start of the CODE area. + This routine is also in the runtime library +\begin_inset LatexCommand \index{Runtime library} \end_inset - the registers. -\layout Standard + and returns 0 by default. + If this routine returns a non-zero value, the static & global variable + initialization will be skipped and the function main will be invoked. + Otherwise static & global variables will be initialized before the function + main is invoked. + You could add an +\emph on +_sdcc_external_startup() +\emph default + routine to your program to override the default if you need to setup hardware + or perform some other critical operation prior to static & global variable + initialization +\begin_inset LatexCommand \index{Variable initialization} -While there is nothing preventing you from writing C code inside a -\family typewriter -_naked -\family default - function, there are many ways to shoot yourself in the foot doing this, - and it is recommended that you stick to inline assembler. -\layout Subsection +\end_inset -Use of Labels within Inline Assembler -\layout Standard +. + On some mcs51 variants xdata +\begin_inset LatexCommand \index{xdata (mcs51, ds390 storage class)} -SDCC allows the use of in-line assembler with a few restrictions regarding - labels. - In older versions of the compiler all labels defined within inline assembler - code +\end_inset + + memory has to be explicitly enabled before it can be accessed or if the + watchdog +\begin_inset LatexCommand \index{watchdog} + +\end_inset + + needs to be disabled, this is the place to do it. + The startup code clears all internal data memory, 256 bytes by default, + but from 0 to n-1 if \emph on -had to be +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-iram-size +\begin_inset LatexCommand \index{-\/-iram-size } + +\end_inset + +n \emph default - of the form + is used. + (recommended for Chipcon CC1010). +\layout Standard +\added_space_bottom bigskip +See also the compiler options \emph on -nnnnn$ +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-no-xinit \emph default - where nnnn is a number less than 100 (which implies a limit of utmost 100 - inline assembler labels +- \emph on -per function +opt \emph default -\noun on -) -\noun default -. - -\layout Verse - -\family typewriter -_asm -\begin_inset LatexCommand \index{\_asm} +\begin_inset LatexCommand \index{-\/-no-xinit-opt} \end_inset +, +\emph on +- +\begin_inset ERT +status Collapsed -\begin_inset LatexCommand \index{\_\_asm} +\layout Standard +\backslash +/ \end_inset +-main-return +\emph default + +\begin_inset LatexCommand \index{-\/-main-return} + +\end_inset + + and section +\begin_inset LatexCommand \ref{sub:MCS51-variants} + +\end_inset + + about MCS51-variants. +\layout Subsection + +HC08 Startup Code +\layout Standard +\added_space_bottom bigskip +The HC08 +\begin_inset LatexCommand \index{HC08} + +\end_inset + + startup code follows the same scheme as the MCS51 startup code. +\layout Subsection + +Z80 Startup Code +\layout Standard +\added_space_bottom bigskip +On the Z80 +\begin_inset LatexCommand \index{Z80} + +\end_inset + + the startup code is inserted by linking with crt0.o which is generated from + sdcc/device/lib/z80/crt0.s. + If you need a different startup code you can use the compiler option +\emph on +- +\series bold +\emph default + +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + + +\series default +\emph on +-no-std-crt0 +\emph default + +\begin_inset LatexCommand \index{-\/-no-std-crt0} + +\end_inset + + and provide your own crt0.o. +\layout Section + +Inline Assembler Code +\begin_inset LatexCommand \index{Assembler routines} + +\end_inset + + +\layout Subsection + +A Step by Step Introduction +\begin_inset LatexCommand \label{sub:A-Step-by Assembler Introduction} + +\end_inset + + +\layout Standard + +Starting from a small snippet of c-code this example shows for the MCS51 + how to use inline assembly, access variables, a function parameter and + an array in xdata memory. + The example uses an MCS51 here but is easily adapted for other architectures. + This is a buffer routine which should be optimized: +\layout Verse + + +\family typewriter +\size footnotesize +unsigned char __far +\begin_inset LatexCommand \index{far (storage class)} + +\end_inset + + +\begin_inset LatexCommand \index{\_\_far (storage class)} + +\end_inset + + __at +\begin_inset LatexCommand \index{at} + +\end_inset + + +\begin_inset LatexCommand \index{\_\_at} + +\end_inset + +(0x7f00) buf[0x100]; +\begin_inset LatexCommand \index{Aligned array} + +\end_inset + + \newline +unsigned char head, tail;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -b,#10 -\newline -00001$: -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -djnz\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -b,00001$ -\newline -_endasm -\begin_inset LatexCommand \index{\_endasm} - -\end_inset - - -\begin_inset LatexCommand \index{\_\_endasm} - -\end_inset - - ; -\layout Standard - -Inline assembler code cannot reference any C-Labels, however it can reference - labels -\begin_inset LatexCommand \index{Labels} +\SpecialChar ~ +/* if interrupts +\begin_inset LatexCommand \index{interrupt} \end_inset - defined by the inline assembler, e.g.: -\layout Verse - - -\family typewriter -foo() { + are involved see \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -/* some c code */ -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_asm -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -; some assembler code -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -ljmp $0003 -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_endasm; -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -/* some more c code */ -\newline -clabel:\SpecialChar ~ \SpecialChar ~ -/* inline assembler cannot reference this label */ -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_asm -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -$0003: ;label (can be referenced by inline assembler only) -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_endasm -\begin_inset LatexCommand \index{\_endasm} +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +section +\begin_inset LatexCommand \ref{sub:Common-interrupt-pitfall-volatile} \end_inset + about +\series bold + volatile +\series default + */ +\newline -\begin_inset LatexCommand \index{\_\_endasm} - -\end_inset - - ; +\newline +void to_buffer( unsigned char c ) +\newline +{ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -/* some more c code */ -\newline -} -\layout Standard - -In other words inline assembly code can access labels defined in inline - assembly within the scope of the function. - The same goes the other way, i.e. - labels defines in inline assembly can not be accessed by C statements. -\layout Section - -Interfacing with Assembler Code -\begin_inset LatexCommand \index{Assembler routines} +if( head != (unsigned char)(tail-1) )\SpecialChar ~ +/* cast +\series bold +needed +\series default + to avoid promotion +\begin_inset LatexCommand \index{promotion to signed int} \end_inset -\layout Subsection - -Global Registers used for Parameter Passing -\begin_inset LatexCommand \index{Parameter passing} +\begin_inset LatexCommand \index{type promotion} \end_inset + to integer */ +\begin_inset Marginal +collapsed true \layout Standard -The compiler always uses the global registers -\emph on -DPL, DPH -\begin_inset LatexCommand \index{DPTR, DPH, DPL} - -\end_inset - - -\begin_inset LatexCommand \index{DPTR} - -\end_inset - -, B -\begin_inset LatexCommand \index{B (mcs51, ds390 register)} - -\end_inset - - -\emph default -and -\emph on - ACC -\begin_inset LatexCommand \index{ACC (mcs51, ds390 register)} +\series bold +\SpecialChar ~ +! \end_inset -\emph default - to pass the first parameter to a routine. - The second parameter onwards is either allocated on the stack (for reentrant - routines or if - -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --stack-auto is used) or in data / xdata memory (depending on the memory - model). - -\layout Subsection - -Assembler Routine (non-reentrant) +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +buf[ head++ ] = c;\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* access to a 256 byte aligned array */ +\newline +} \layout Standard -In the following example -\begin_inset LatexCommand \index{reentrant} - +If the code snippet (assume it is saved in buffer.c) is compiled with SDCC + then a corresponding buffer.asm file is generated. + We define a new function +\family typewriter +to_buffer_asm() +\family default + in file buffer.c in which we cut and paste the generated code, removing + unwanted comments and some ':'. + Then add +\begin_inset Quotes sld \end_inset - -\begin_inset LatexCommand \index{Assembler routines (non-reentrant)} - +_asm +\begin_inset Quotes srd \end_inset - the function c_func calls an assembler routine asm_func, which takes two - parameters -\begin_inset LatexCommand \index{function parameter} + and +\begin_inset Quotes sld +\end_inset +_endasm; +\begin_inset Quotes srd \end_inset -. + to the beginning and the end of the function body: \layout Verse \family typewriter -extern int asm_func(unsigned char, unsigned char); +\size footnotesize +/* With a cut and paste from the .asm file, we have something to start with. \newline - +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +The function is not yet OK! (registers aren't saved) */ \newline -int c_func (unsigned char i, unsigned char j) +void to_buffer_asm( unsigned char c ) \newline -{ +{ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -return asm_func(i,j); -\newline -} -\newline +_asm +\begin_inset LatexCommand \index{\_asm} + +\end_inset + + +\begin_inset LatexCommand \index{\_\_asm} + +\end_inset + -\newline -int main() -\newline -{ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -return c_func(10,9); +mov\SpecialChar ~ +\SpecialChar ~ +r2,dpl \newline -} -\layout Standard +;buffer.c if( head != (unsigned char)(tail-1) ) \SpecialChar ~ +/* cast +\series bold +needed +\series default + to avoid promotion +\begin_inset LatexCommand \index{promotion to signed int} -The corresponding assembler function is: -\layout Verse +\end_inset -\family typewriter -.globl _asm_func_PARM_2 +\begin_inset LatexCommand \index{type promotion} + +\end_inset + + to integer */ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +mov\SpecialChar ~ \SpecialChar ~ +a,_tail +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -.globl _asm_func -\newline -\SpecialChar ~ \SpecialChar ~ +dec\SpecialChar ~ \SpecialChar ~ +a +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +mov\SpecialChar ~ \SpecialChar ~ -.area OSEG -\newline -_asm_func_PARM_2: +r3,a \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +mov\SpecialChar ~ +\SpecialChar ~ +a,_head +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -.ds 1 +cjne a,ar3,00106$ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +ret +\newline +00106$: +\newline +;buffer.c buf[ head++ ] = c; /* access to a 256 byte aligned array */ +\begin_inset LatexCommand \index{Aligned array} + +\end_inset + + +\newline +\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +mov\SpecialChar ~ \SpecialChar ~ -.area CSEG -\newline -_asm_func: +r3,_head \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +inc\SpecialChar ~ \SpecialChar ~ +_head +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ +mov\SpecialChar ~ \SpecialChar ~ -a,dpl +dpl,r3 \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +mov\SpecialChar ~ \SpecialChar ~ +dph,#(_buf >> 8) +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -add\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ +mov\SpecialChar ~ \SpecialChar ~ -a,_asm_func_PARM_2 +a,r2 \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +movx @dptr,a +\newline +00103$: +\newline +\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +ret +\newline \SpecialChar ~ -mov\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -dpl,a +_endasm +\begin_inset LatexCommand \index{\_endasm} + +\end_inset + + +\begin_inset LatexCommand \index{\_\_endasm} + +\end_inset + +; +\newline +} +\layout Standard + +The new file buffer.c should compile with only one warning about the unreferenced + function argument 'c'. + Now we hand-optimize the assembly code and insert an #define USE_ASSEMBLY + (1) and finally have: +\layout Verse + + +\family typewriter +\size footnotesize +unsigned char __far __at(0x7f00) buf[0x100]; +\newline +unsigned char head, tail; +\newline +#define USE_ASSEMBLY (1) +\newline + +\newline +#if !USE_ASSEMBLY +\newline + +\newline +void to_buffer( unsigned char c ) +\newline +{ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +if( head != (unsigned char)(tail-1) ) +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -dph -\begin_inset LatexCommand \index{DPTR, DPH, DPL} +\SpecialChar ~ +buf[ head++ ] = c; +\newline +} +\newline -\end_inset +\newline +#else +\newline -,#0x00 +\newline +void to_buffer( unsigned char c ) +\newline +{ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +c; // to avoid warning: unreferenced function argument +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -ret -\layout Standard +_asm +\begin_inset LatexCommand \index{\_asm} -Note here that the return values -\begin_inset LatexCommand \index{return value} +\end_inset + + +\begin_inset LatexCommand \index{\_\_asm} \end_inset - are placed in 'dpl' - One byte return value, 'dpl' LSB & 'dph' MSB for - two byte values. - 'dpl', 'dph' and 'b' for three byte values (generic pointers) and 'dpl','dph',' -b' & 'acc' for four byte values. -\layout Standard -The parameter naming convention is __PARM_, where n is - the parameter number starting from 1, and counting from the left. - The first parameter is passed in -\begin_inset Quotes eld -\end_inset - -dpl -\begin_inset Quotes erd -\end_inset - - for a one byte parameter, -\begin_inset Quotes eld -\end_inset - -dptr -\begin_inset Quotes erd -\end_inset - - for two bytes, -\begin_inset Quotes eld -\end_inset - -b,dptr -\begin_inset Quotes erd -\end_inset - - for three bytes and -\begin_inset Quotes eld -\end_inset - -acc,b,dptr -\begin_inset Quotes erd -\end_inset - - for a four bytes parameter. - The variable name for the second parameter will be __PARM_2. -\newline - -\newline -Assemble the assembler routine with the following command: -\newline - -\newline - -\family sans -\series bold -asx8051 -losg asmfunc.asm -\newline - -\newline - -\family default -\series default -Then compile and link the assembler routine to the C source file with the - following command: -\newline - -\newline - -\family sans -\series bold -sdcc cfunc.c asmfunc.rel -\layout Subsection - -Assembler Routine (reentrant) -\layout Standard - -In this case -\begin_inset LatexCommand \index{reentrant} - -\end_inset - - -\begin_inset LatexCommand \index{Assembler routines (reentrant)} - -\end_inset - - the second parameter -\begin_inset LatexCommand \index{function parameter} - -\end_inset - - onwards will be passed on the stack, the parameters are pushed from right - to left i.e. - after the call the leftmost parameter will be on the top of the stack. - Here is an example: -\layout Verse - - -\family typewriter -extern int asm_func(unsigned char, unsigned char); \newline - +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; save used registers here. + \newline -int c_func (unsigned char i, unsigned char j) reentrant +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; If we were still using r2,r3 we would have to push them here. + \newline -{ +; if( head != (unsigned char)(tail-1) ) \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -return asm_func(i,j); -\newline -} +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov\SpecialChar ~ + a,_tail \newline - +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +dec\SpecialChar ~ + a \newline -int main() +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +xrl\SpecialChar ~ + a,_head \newline -{ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; we could do an ANL a,#0x0f here to use a smaller buffer (see below) \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -return c_func(10,9); +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +jz\SpecialChar ~ +\SpecialChar ~ + t_b_end$ \newline -} -\layout Standard - -The corresponding assembler routine is: -\layout Verse - - -\family typewriter -.globl _asm_func +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; \newline -_asm_func: +; buf[ head++ ] = c; \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -push _bp -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov _bp,sp -\newline +mov\SpecialChar ~ + a,dpl \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov r2,dpl +\SpecialChar ~ +\SpecialChar ~ +; dpl holds lower byte of function argument \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov a,_bp -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -add a,#0xfd +mov\SpecialChar ~ + dpl,_head \SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; buf is 0x100 byte aligned so head can be used directly \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov r0,a -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -add a,#0xfc ;? +mov\SpecialChar ~ + dph,#(_buf>>8) \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov r1,a -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov a,@r0 +movx @dptr,a \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -add a,r2 ;? -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov dpl,a +inc \SpecialChar ~ +_head \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov dph,#0x00 -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov sp,_bp +; we could do an ANL _head,#0x0f here to use a smaller buffer (see above) +\newline +t_b_end$: \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -pop _bp +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; restore used registers here \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -ret -\layout Standard -\added_space_bottom bigskip -The compiling and linking procedure remains the same, however note the extra - entry & exit linkage required for the assembler code, _bp is the stack - frame pointer and is used to compute the offset into the stack for parameters - and local variables. -\layout Section - -int (16 bit) -\begin_inset LatexCommand \index{int (16 bit)} +_endasm +\begin_inset LatexCommand \index{\_endasm} \end_inset - and long (32 bit) -\begin_inset LatexCommand \index{long (32 bit)} + +\begin_inset LatexCommand \index{\_\_endasm} \end_inset - Support -\layout Standard - -For signed & unsigned int (16 bit) and long (32 bit) variables, division, - multiplication and modulus operations are implemented by support routines. - These support routines are all developed in ANSI-C to facilitate porting - to other MCUs, although some model specific assembler optimizations are - used. - The following files contain the described routines, all of them can be - found in /share/sdcc/lib. -\newline - -\layout Standard -\align center - -\begin_inset Tabular - - - - - - -\begin_inset Text - +; +\newline +} +\newline +#endif \layout Standard +The inline assembler code can contain any valid code understood by the assembler +, this includes any assembler directives and comment lines. + The assembler does not like some characters like ':' or ''' in comments. + You'll find an 100+ pages assembler manual in sdcc/as/doc/asxhtm.html +\begin_inset LatexCommand \index{asXXXX (as-gbz80, as-hc08, asx8051, as-z80)} -\series bold -Function \end_inset - - -\begin_inset Text -\layout Standard +\begin_inset LatexCommand \index{Assembler documentation} -\series bold -Description \end_inset - - - - -\begin_inset Text -\layout Standard + or online at +\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/as/doc/asxhtm.html} -_mulint.c \end_inset - - -\begin_inset Text +\SpecialChar ~ +. \layout Standard -16 bit multiplication -\end_inset - - - - -\begin_inset Text - -\layout Standard +The compiler does not do any validation of the code within the +\family typewriter +_asm +\begin_inset LatexCommand \index{\_asm} -_divsint.c \end_inset - - -\begin_inset Text -\layout Standard - signed 16 bit division (calls _divuint) +\begin_inset LatexCommand \index{\_\_asm} + \end_inset - - - - -\begin_inset Text -\layout Standard + ... + _endasm +\size footnotesize + +\begin_inset LatexCommand \index{\_endasm} -_divuint.c \end_inset - - -\begin_inset Text -\layout Standard - unsigned 16 bit division +\begin_inset LatexCommand \index{\_\_endasm} + \end_inset - - - - -\begin_inset Text -\layout Standard -_modsint.c +\size default +; +\family default + keyword pair. + Specifically it will not know which registers are used and thus register + pushing/popping +\begin_inset LatexCommand \index{push/pop} + \end_inset - - -\begin_inset Text + has to be done manually. + \layout Standard -signed 16 bit modulus (calls _moduint) -\end_inset - - - - -\begin_inset Text +It is recommended that each assembly instruction (including labels) be placed + in a separate line (as the example shows). + When the - +\begin_inset ERT +status Collapsed \layout Standard -_moduint.c +\backslash +/ \end_inset - - -\begin_inset Text -\layout Standard +- +\emph on +peep-asm +\begin_inset LatexCommand \index{-\/-peep-asm} -unsigned 16 bit modulus \end_inset - - - - -\begin_inset Text -\layout Standard -_mullong.c +\emph default + command line option is used, the inline assembler code will be passed through + the peephole optimizer +\begin_inset LatexCommand \index{Peephole optimizer} + \end_inset - - -\begin_inset Text -\layout Standard +. + There are only a few (if any) cases where this option makes sense, it might + cause some unexpected changes in the inline assembler code. + Please go through the peephole optimizer rules defined in file +\emph on +SDCCpeeph.def +\emph default + before using this option. +\layout Subsection + +Naked Functions +\begin_inset LatexCommand \label{sub:Naked-Functions} -32 bit multiplication \end_inset - - - - -\begin_inset Text -\layout Standard -_divslong.c +\begin_inset LatexCommand \index{Naked functions} + \end_inset - - -\begin_inset Text + \layout Standard - signed 32 division (calls _divulong) +A special keyword may be associated with a function declaring it as +\emph on +_naked +\begin_inset LatexCommand \index{\_naked} + \end_inset - - - - -\begin_inset Text -\layout Standard -_divulong.c +\begin_inset LatexCommand \index{\_\_naked} + \end_inset - - -\begin_inset Text -\layout Standard +. + +\emph default +The +\emph on +_naked +\emph default + function modifier attribute prevents the compiler from generating prologue +\begin_inset LatexCommand \index{function prologue} -unsigned 32 division \end_inset - - - - -\begin_inset Text -\layout Standard + and epilogue +\begin_inset LatexCommand \index{function epilogue} -_modslong.c \end_inset - - -\begin_inset Text -\layout Standard + code for that function. + This means that the user is entirely responsible for such things as saving + any registers that may need to be preserved, selecting the proper register + bank, generating the +\emph on +return +\emph default + instruction at the end, etc. + Practically, this means that the contents of the function must be written + in inline assembler. + This is particularly useful for interrupt functions, which can have a large + (and often unnecessary) prologue/epilogue. + For example, compare the code generated by these two functions: +\layout Verse - signed 32 bit modulus (calls _modulong) -\end_inset - - - - -\begin_inset Text -\layout Standard +\family typewriter +volatile +\begin_inset LatexCommand \index{volatile} -_modulong.c \end_inset - - -\begin_inset Text -\layout Standard + data unsigned char counter; +\newline -unsigned 32 bit modulus -\end_inset - - - +\newline +void simpleInterrupt(void) __interrupt +\begin_inset LatexCommand \index{interrupt} \end_inset -\newline - -\layout Standard - -Since they are compiled as -\emph on -non-reentrant -\emph default - -\begin_inset LatexCommand \index{reentrant} - -\end_inset - -, interrupt -\begin_inset LatexCommand \index{interrupt} - -\end_inset - - service routines should not do any of the above operations. - If this is unavoidable then the above routines will need to be compiled - with the -\emph on -- -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --stack-auto -\begin_inset LatexCommand \index{-\/-stack-auto} - -\end_inset - - -\emph default - option, after which the source program will have to be compiled with -\emph on -- -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --int-long-reent -\begin_inset LatexCommand \index{-\/-int-long-reent} - -\end_inset - - -\emph default - option. - Notice that you don't have to call these routines directly. - The compiler will use them automatically every time an integer operation - is required. -\layout Section - -Floating Point Support -\begin_inset LatexCommand \index{Floating point support} +\begin_inset LatexCommand \index{\_\_interrupt} \end_inset - -\layout Standard - -SDCC supports IEEE (single precision 4 bytes) floating point numbers. - The floating point support routines are derived from gcc's floatlib.c and - consist of the following routines: + (1) +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +counter++; +\newline +} \newline -\layout Standard -\align center - -\size footnotesize - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\layout Standard - - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -Function -\end_inset - - -\begin_inset Text - -\layout Standard +\newline +void nakedInterrupt(void) __interrupt (2) __naked +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +_asm +\begin_inset LatexCommand \index{\_asm} -Description \end_inset - - - - -\begin_inset Text -\layout Standard +\begin_inset LatexCommand \index{\_\_asm} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_fsadd.c \end_inset - - -\begin_inset Text -\layout Standard +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +inc\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +_counter ; does not change flags, no need to save psw +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +reti\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; MUST explicitly include ret or reti in _naked function. +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +_endasm +\begin_inset LatexCommand \index{\_endasm} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -add floating point numbers \end_inset - - - - -\begin_inset Text -\layout Standard +\begin_inset LatexCommand \index{\_\_endasm} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_fssub.c \end_inset - - -\begin_inset Text +; +\newline +} \layout Standard - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -subtract floating point numbers -\end_inset - - - - -\begin_inset Text - -\layout Standard +For an 8051 target, the generated simpleInterrupt looks like: +\layout Verse -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_fsdiv.c -\end_inset - - -\begin_inset Text - -\layout Standard - - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -divide floating point numbers -\end_inset - - - - -\begin_inset Text +\family typewriter +Note, this is an +\emph on +outdated +\emph default + example, recent versions of SDCC generate +\newline +the +\emph on +same +\emph default + code for simpleInterrupt() and nakedInterrupt()! +\newline +\newline +_simpleInterrupt: +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +push\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +acc +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +push\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +b +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +push\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +dpl +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +push\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +dph +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +push\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +psw +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +psw,#0x00 +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +inc\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +_counter +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +pop\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +psw +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +pop\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +dph +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +pop\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +dpl +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +pop\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +b +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +pop\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +acc +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +reti \layout Standard +whereas nakedInterrupt looks like: +\layout Verse -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_fsmul.c -\end_inset - - -\begin_inset Text +\family typewriter +_nakedInterrupt: +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +inc\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +_counter ; does not change flags, no need to save psw +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +reti\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; MUST explicitly include ret or reti in _naked function \layout Standard +The related directive #pragma exclude +\begin_inset LatexCommand \index{\#pragma exclude} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -multiply floating point numbers \end_inset - - - - -\begin_inset Text - -\layout Standard + allows a more fine grained control over pushing & popping +\begin_inset LatexCommand \index{push/pop} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_fs2uchar.c \end_inset - - -\begin_inset Text + the registers. \layout Standard +While there is nothing preventing you from writing C code inside a +\family typewriter +_naked +\family default + function, there are many ways to shoot yourself in the foot doing this, + and it is recommended that you stick to inline assembler. +\layout Subsection -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -convert floating point to unsigned char -\end_inset - - - - -\begin_inset Text - +Use of Labels within Inline Assembler \layout Standard +SDCC allows the use of in-line assembler with a few restrictions regarding + labels. + In older versions of the compiler all labels defined within inline assembler + code +\emph on +had to be +\emph default + of the form +\emph on +nnnnn$ +\emph default + where nnnn is a number less than 100 (which implies a limit of utmost 100 + inline assembler labels +\emph on +per function +\emph default +\noun on +) +\noun default +. + +\layout Verse -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_fs2char.c -\end_inset - - -\begin_inset Text - -\layout Standard +\family typewriter +_asm +\begin_inset LatexCommand \index{\_asm} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -convert floating point to signed char \end_inset - - - - -\begin_inset Text -\layout Standard +\begin_inset LatexCommand \index{\_\_asm} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_fs2uint.c \end_inset - - -\begin_inset Text - -\layout Standard + +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +b,#10 +\newline +00001$: +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +djnz\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +b,00001$ +\newline +_endasm +\begin_inset LatexCommand \index{\_endasm} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -convert floating point to unsigned int \end_inset - - - - -\begin_inset Text -\layout Standard +\begin_inset LatexCommand \index{\_\_endasm} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_fs2int.c \end_inset - - -\begin_inset Text + ; \layout Standard +Inline assembler code cannot reference any C-Labels, however it can reference + labels +\begin_inset LatexCommand \index{Labels} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -convert floating point to signed int \end_inset - - - - -\begin_inset Text -\layout Standard + defined by the inline assembler, e.g.: +\layout Verse -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_fs2ulong. -\family default -\series default -\shape default -\size default -\emph default -\bar default -\noun default -\color default -c +\family typewriter +foo() { +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* some c code */ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +_asm +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; some assembler code +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +ljmp $0003 +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +_endasm; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* some more c code */ +\newline +clabel:\SpecialChar ~ +\SpecialChar ~ +/* inline assembler cannot reference this label */ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +_asm +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +$0003: ;label (can be referenced by inline assembler only) +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +_endasm +\begin_inset LatexCommand \index{\_endasm} + \end_inset - - -\begin_inset Text -\layout Standard +\begin_inset LatexCommand \index{\_\_endasm} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -convert floating point to unsigned long \end_inset - - - - -\begin_inset Text + ; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* some more c code */ +\newline +} \layout Standard +In other words inline assembly code can access labels defined in inline + assembly within the scope of the function. + The same goes the other way, i.e. + labels defines in inline assembly can not be accessed by C statements. +\layout Section -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_fs2long.c -\end_inset - - -\begin_inset Text - -\layout Standard - +Interfacing with Assembler Code +\begin_inset LatexCommand \index{Assembler routines} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -convert floating point to signed long \end_inset - - - - -\begin_inset Text - -\layout Standard - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_uchar2fs.c -\end_inset - - -\begin_inset Text -\layout Standard +\layout Subsection +Global Registers used for Parameter Passing +\begin_inset LatexCommand \index{Parameter passing} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -convert unsigned char to floating point \end_inset - - - - -\begin_inset Text - -\layout Standard - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_char2fs.c -\end_inset - - -\begin_inset Text \layout Standard +The compiler always uses the global registers +\emph on +DPL, DPH +\begin_inset LatexCommand \index{DPTR, DPH, DPL} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -convert char to floating point number \end_inset - - - - -\begin_inset Text -\layout Standard +\begin_inset LatexCommand \index{DPTR} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_uint2fs.c \end_inset - - -\begin_inset Text - -\layout Standard +, B +\begin_inset LatexCommand \index{B (mcs51, ds390 register)} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -convert unsigned int to floating point \end_inset - - - - -\begin_inset Text - -\layout Standard + +\emph default +and +\emph on + ACC +\begin_inset LatexCommand \index{ACC (mcs51, ds390 register)} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_int2fs.c \end_inset - - -\begin_inset Text - -\layout Standard -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -convert int to floating point numbers -\end_inset - - - - -\begin_inset Text +\emph default + to pass the first parameter to a routine. + The second parameter onwards is either allocated on the stack (for reentrant + routines or if - +\begin_inset ERT +status Collapsed \layout Standard - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_ulong2fs.c +\backslash +/ \end_inset - - -\begin_inset Text +-stack-auto is used) or in data / xdata memory (depending on the memory + model). + +\layout Subsection + +Assembler Routine (non-reentrant) \layout Standard +In the following example +\begin_inset LatexCommand \index{reentrant} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -convert unsigned long to floating point number \end_inset - - - - -\begin_inset Text -\layout Standard +\begin_inset LatexCommand \index{Assembler routines (non-reentrant)} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -_long2fs.c \end_inset - - -\begin_inset Text - -\layout Standard + the function c_func calls an assembler routine asm_func, which takes two + parameters +\begin_inset LatexCommand \index{function parameter} -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -convert long to floating point number \end_inset - - - -\end_inset +. +\layout Verse +\family typewriter +extern int asm_func(unsigned char, unsigned char); \newline -\layout Standard -\added_space_bottom bigskip -These support routines are developed in ANSI-C so there is room for space - and speed improvement -\begin_inset Foot -collapsed false +\newline +int c_func (unsigned char i, unsigned char j) +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +return asm_func(i,j); +\newline +} +\newline +\newline +int main() +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +return c_func(10,9); +\newline +} \layout Standard -These floating point routines ( -\emph on -not -\emph default - sinf(), cosf(), ...) for the mcs51 are implemented in assembler. - -\end_inset +The corresponding assembler function is: +\layout Verse -. - Note if all these routines are used simultaneously the data space might - overflow. - For serious floating point usage the large model might be needed. - Also notice that you don't have to call this routines directly. - The compiler will use them automatically every time a floating point operation - is required. -\layout Section -Library Routines -\begin_inset LatexCommand \index{Libraries} +\family typewriter +.globl _asm_func_PARM_2 +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +.globl _asm_func +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +.area OSEG +\newline +_asm_func_PARM_2: +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +.ds 1 +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +.area CSEG +\newline +_asm_func: +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +a,dpl +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +add\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +a,_asm_func_PARM_2 +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +dpl,a +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +dph +\begin_inset LatexCommand \index{DPTR, DPH, DPL} \end_inset - +,#0x00 +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +ret \layout Standard +Note here that the return values +\begin_inset LatexCommand \index{return value} -\emph on - -\layout Subsection - -Compiler support routines (_gptrget, _mulint etc.) -\layout Subsection - -Stdclib functions (puts, printf, strcat etc.) -\layout Subsubsection +\end_inset - + are placed in 'dpl' - One byte return value, 'dpl' LSB & 'dph' MSB for + two byte values. + 'dpl', 'dph' and 'b' for three byte values (generic pointers) and 'dpl','dph',' +b' & 'acc' for four byte values. \layout Standard +The parameter naming convention is __PARM_, where n is + the parameter number starting from 1, and counting from the left. + The first parameter is passed in +\begin_inset Quotes eld +\end_inset + +dpl +\begin_inset Quotes erd +\end_inset -\begin_inset LatexCommand \index{} + for a one byte parameter, +\begin_inset Quotes eld +\end_inset +dptr +\begin_inset Quotes erd \end_inset -As usual on embedded systems you have to provide your own -\family typewriter -getchar() -\begin_inset LatexCommand \index{getchar()} + for two bytes, +\begin_inset Quotes eld +\end_inset +b,dptr +\begin_inset Quotes erd \end_inset - -\family default -and -\family typewriter -putchar() -\begin_inset LatexCommand \index{putchar()} + for three bytes and +\begin_inset Quotes eld +\end_inset +acc,b,dptr +\begin_inset Quotes erd \end_inset + for a four bytes parameter. + The variable name for the second parameter will be __PARM_2. +\newline -\family default - routines. - SDCC does not know whether the system connects to a serial line with or - without handshake, LCD, keyboard or other device. - And whether a -\family typewriter -lf -\family default - to -\family typewriter -crlf -\family default - conversion within -\family typewriter -putchar() -\family default - is intended. - You'll find examples for serial routines f.e. - in sdcc/device/lib. -\layout Standard +\newline +Assemble the assembler routine with the following command: +\newline -The default -\family typewriter - printf() -\begin_inset LatexCommand \index{printf()} +\newline -\end_inset +\family sans +\series bold +asx8051 -losg asmfunc.asm +\newline +\newline \family default -implementation in -\family typewriter - printf_large.c -\family default - does not support float (except on ds390). - To enable this recompile it with the option -\emph on -- -\begin_inset ERT -status Collapsed +\series default +Then compile and link the assembler routine to the C source file with the + following command: +\newline -\layout Standard +\newline -\backslash -/ -\end_inset +\family sans +\series bold +sdcc cfunc.c asmfunc.rel +\layout Subsection -DUSE_FLOATS=1 -\begin_inset LatexCommand \index{USE\_FLOATS} +Assembler Routine (reentrant) +\layout Standard -\end_inset +In this case +\begin_inset LatexCommand \index{reentrant} +\end_inset -\emph default - on the command line. - Use -\emph on - - -\begin_inset ERT -status Collapsed -\layout Standard +\begin_inset LatexCommand \index{Assembler routines (reentrant)} -\backslash -/ \end_inset --model-large -\begin_inset LatexCommand \index{-\/-model-large} + the second parameter +\begin_inset LatexCommand \index{function parameter} \end_inset + onwards will be passed on the stack, the parameters are pushed from right + to left i.e. + after the call the leftmost parameter will be on the top of the stack. + Here is an example: +\layout Verse -\emph default - for the mcs51 port, since this uses a lot of memory. -\layout Standard -If you're short on memory you might want to use \family typewriter -printf_small() -\begin_inset LatexCommand \index{printf\_small()} - -\end_inset - +extern int asm_func(unsigned char, unsigned char); +\newline -\family default - -\emph on -instead -\emph default - of -\family typewriter - printf(). +\newline +int c_func (unsigned char i, unsigned char j) reentrant +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +return asm_func(i,j); +\newline +} +\newline -\family default - For the mcs51 there additionally are assembly versions -\family typewriter -printf_tiny() -\begin_inset LatexCommand \index{printf\_tiny() (mcs51)} +\newline +int main() +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +return c_func(10,9); +\newline +} +\layout Standard -\end_inset +The corresponding assembler routine is: +\layout Verse -\family default - (subset of printf using less than 270 bytes) and \family typewriter -printf_fast() -\begin_inset LatexCommand \index{printf\_fast() (mcs51)} +.globl _asm_func +\newline +_asm_func: +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +push _bp +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov _bp,sp +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov r2,dpl +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov a,_bp +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +add a,#0xfd +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov r0,a +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +add a,#0xfc ;? +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov r1,a +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov a,@r0 +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +add a,r2 ;? +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov dpl,a +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov dph,#0x00 +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov sp,_bp +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +pop _bp +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +ret +\layout Standard +\added_space_bottom bigskip +The compiling and linking procedure remains the same, however note the extra + entry & exit linkage required for the assembler code, _bp is the stack + frame pointer and is used to compute the offset into the stack for parameters + and local variables. +\layout Section + +int (16 bit) +\begin_inset LatexCommand \index{int (16 bit)} \end_inset - -\family default -and -\family typewriter - printf_fast_f() -\begin_inset LatexCommand \index{printf\_fast\_f() (mcs51)} + and long (32 bit) +\begin_inset LatexCommand \index{long (32 bit)} \end_inset + Support +\layout Standard -\family default - (floating-point aware version of printf_fast) which should fit the requirements - of many embedded systems (printf_fast() can be customized by unsetting - #defines to -\emph on -not -\emph default - support long variables and field widths). -\layout Subsubsection - - -\begin_inset LatexCommand \index{malloc.h} +For signed & unsigned int (16 bit) and long (32 bit) variables, division, + multiplication and modulus operations are implemented by support routines. + These support routines are all developed in ANSI-C to facilitate porting + to other MCUs, although some model specific assembler optimizations are + used. + The following files contain the described routines, all of them can be + found in /share/sdcc/lib. +\newline -\end_inset +\layout Standard +\align center +\begin_inset Tabular + + + + + + +\begin_inset Text \layout Standard -As of SDCC 2.6.2 you no longer need to call an initialization routine before - using dynamic memory allocation -\begin_inset LatexCommand \index{dynamic memory allocation (malloc)} +\series bold +Function \end_inset + + +\begin_inset Text + +\layout Standard - and a default heap -\begin_inset LatexCommand \index{heap (malloc)} +\series bold +Description \end_inset + + + + +\begin_inset Text - space of 1024 bytes is provided for malloc to allocate memory from. - -\family default -If you need a different heap size you need to recompile _heap.c with the - required size defined in HEAP_SIZE. It is recommended to make a copy of this - file into your project directory and compile it there with: -\layout Verse +\layout Standard +_mulint.c +\end_inset + + +\begin_inset Text -\family typewriter -sdcc -c _heap.c -D HEAD_SIZE=2048 -\newline -\family default -And then link it with: -\layout Verse +\layout Standard -\family typewriter -sdcc main.rel _heap.rel -\newline +16 bit multiplication +\end_inset + + + + +\begin_inset Text -\layout Subsection +\layout Standard -Math functions (sinf, powf, sqrtf etc.) -\layout Subsubsection +_divsint.c +\end_inset + + +\begin_inset Text - \layout Standard -See definitions in file . -\layout Subsection + signed 16 bit division (calls _divuint) +\end_inset + + + + +\begin_inset Text -Other libraries \layout Standard -Libraries -\begin_inset LatexCommand \index{Libraries} - +_divuint.c \end_inset + + +\begin_inset Text - included in SDCC should have a license at least as liberal as the GNU Lesser - General Public License -\begin_inset LatexCommand \index{GNU Lesser General Public License, LGPL} +\layout Standard + unsigned 16 bit division \end_inset + + + + +\begin_inset Text - -\emph on -LGPL -\emph default -. -\layout Comment +\layout Standard -license statements for the libraries are missing. - sdcc/device/lib/ser_ir.c -\layout Comment +_modsint.c +\end_inset + + +\begin_inset Text -or _decdptr f.e. - come with a GPL (as opposed to LGPL) License - this will not be liberal - enough for many embedded programmers. \layout Standard -If you have ported some library or want to share experience about some code - which f.e. - falls into any of these categories Busses (I -\begin_inset Formula $^{\textrm{2}}$ +signed 16 bit modulus (calls _moduint) \end_inset + + + + +\begin_inset Text -C, CAN, Ethernet, Profibus, Modbus, USB, SPI, JTAG ...), Media (IDE, Memory - cards, eeprom, flash...), En-/Decryption, Remote debugging, Realtime kernel, - Keyboard, LCD, RTC, FPGA, PID then the sdcc-user mailing list -\begin_inset LatexCommand \url{http://sourceforge.net/mail/?group_id=599} +\layout Standard +_moduint.c \end_inset + + +\begin_inset Text -\SpecialChar ~ -would certainly like to hear about it. \layout Standard -\added_space_bottom bigskip -Programmers coding for embedded systems are not especially famous for being - enthusiastic, so don't expect a big hurray but as the mailing list is searchabl -e these references are very valuable. - Let's help to create a climate where information is shared. -\layout Section -Memory Models -\layout Subsection +unsigned 16 bit modulus +\end_inset + + + + +\begin_inset Text -MCS51 Memory Models -\begin_inset LatexCommand \index{Memory model} +\layout Standard +_mullong.c \end_inset + + +\begin_inset Text +\layout Standard -\begin_inset LatexCommand \index{MCS51 memory model} +32 bit multiplication +\end_inset + + + + +\begin_inset Text + +\layout Standard +_divslong.c \end_inset + + +\begin_inset Text +\layout Standard -\layout Subsubsection + signed 32 division (calls _divulong) +\end_inset + + + + +\begin_inset Text -Small, Medium and Large \layout Standard -SDCC allows three memory models for MCS51 code, -\shape slanted -small, medium -\shape default - and -\shape slanted -large -\shape default -. - Modules compiled with different memory models should -\emph on -never -\emph default - be combined together or the results would be unpredictable. - The library routines supplied with the compiler are compiled as small, - medium and large. - The compiled library modules are contained in separate directories as small, - medium and large so that you can link to the appropriate set. +_divulong.c +\end_inset + + +\begin_inset Text + \layout Standard -When the medium or large model is used all variables declared without a - storage class will be allocated into the external ram, this includes all - parameters and local variables (for non-reentrant -\begin_inset LatexCommand \index{reentrant} +unsigned 32 division +\end_inset + + + + +\begin_inset Text + +\layout Standard +_modslong.c \end_inset + + +\begin_inset Text - functions). - When the small model is used variables without storage class are allocated - in the internal ram. \layout Standard -Judicious usage of the processor specific storage classes -\begin_inset LatexCommand \index{Storage class} + signed 32 bit modulus (calls _modulong) +\end_inset + + + + +\begin_inset Text +\layout Standard + +_modulong.c \end_inset + + +\begin_inset Text - and the 'reentrant' function type will yield much more efficient code, - than using the large model. - Several optimizations are disabled when the program is compiled using the - large model, it is therefore recommended that the small model be used unless - absolutely required. -\layout Subsubsection +\layout Standard -External Stack -\begin_inset LatexCommand \label{sub:External-Stack} +unsigned 32 bit modulus +\end_inset + + + \end_inset -\begin_inset LatexCommand \index{stack} +\newline -\end_inset +\layout Standard +Since they are compiled as +\emph on +non-reentrant +\emph default -\begin_inset LatexCommand \index{External stack (mcs51)} +\begin_inset LatexCommand \index{reentrant} \end_inset +, interrupt +\begin_inset LatexCommand \index{interrupt} -\layout Standard +\end_inset -The external stack (- + service routines should not do any of the above operations. + If this is unavoidable then the above routines will need to be compiled + with the +\emph on +- \begin_inset ERT status Collapsed @@ -16242,20 +16151,16 @@ status Collapsed / \end_inset --xstack option -\begin_inset LatexCommand \index{-\/-xstack} +-stack-auto +\begin_inset LatexCommand \index{-\/-stack-auto} \end_inset -) is located in pdata -\begin_inset LatexCommand \index{pdata (mcs51, ds390 storage class)} - -\end_inset - memory (usually at the start of the external ram segment) and uses all - unused space in pdata (max. - 256 bytes). - When - +\emph default + option, after which the source program will have to be compiled with +\emph on +- \begin_inset ERT status Collapsed @@ -16265,581 +16170,820 @@ status Collapsed / \end_inset --xstack option is used to compile the program, the parameters and local - variables -\begin_inset LatexCommand \index{local variables} +-int-long-reent +\begin_inset LatexCommand \index{-\/-int-long-reent} \end_inset - of all reentrant functions are allocated in this area. - This option is provided for programs with large stack space requirements. - When used with the - -\begin_inset ERT -status Collapsed - -\layout Standard -\backslash -/ -\end_inset +\emph default + option. + Notice that you don't have to call these routines directly. + The compiler will use them automatically every time an integer operation + is required. +\layout Section --stack-auto -\begin_inset LatexCommand \index{-\/-stack-auto} +Floating Point Support +\begin_inset LatexCommand \index{Floating point support} \end_inset - option, all parameters and local variables are allocated on the external - stack (note: support libraries will need to be recompiled with the same - options. - There is a predefined target in the library makefile). + \layout Standard -The compiler outputs the higher order address byte of the external ram segment - into port P2 -\begin_inset LatexCommand \index{P2 (mcs51 sfr)} +SDCC supports IEEE (single precision 4 bytes) floating point numbers. + The floating point support routines are derived from gcc's floatlib.c and + consist of the following routines: +\newline -\end_inset +\layout Standard +\align center - (see also section -\begin_inset LatexCommand \ref{sub:MCS51-variants} +\size footnotesize -\end_inset +\begin_inset Tabular + + + + + + +\begin_inset Text -), therefore when using the External Stack option, this port -\emph on -may not -\emph default - be used by the application program. -\layout Subsection +\layout Standard -DS390 Memory Model -\begin_inset LatexCommand \index{Memory model} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +Function \end_inset + + +\begin_inset Text +\layout Standard -\begin_inset LatexCommand \index{DS390 memory model} - +Description \end_inset - + + + + +\begin_inset Text \layout Standard -The only model supported is Flat 24 -\begin_inset LatexCommand \index{Flat 24 (DS390 memory model)} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fsadd.c \end_inset + + +\begin_inset Text -. - This generates code for the 24 bit contiguous addressing mode of the Dallas - DS80C390 part. - In this mode, up to four meg of external RAM or code space can be directly - addressed. - See the data sheets at www.dalsemi.com for further information on this part. -\newline - -\newline -Note that the compiler does not generate any code to place the processor - into 24 bitmode (although -\emph on -tinibios -\emph default - in the ds390 libraries will do that for you). - If you don't use -\emph on -tinibios -\emph default +\layout Standard -\begin_inset LatexCommand \index{Tinibios (DS390)} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +add floating point numbers \end_inset - -, the boot loader or similar code must ensure that the processor is in 24 - bit contiguous addressing mode before calling the SDCC startup code. -\newline - -\newline -Like the -\emph on -- -\begin_inset ERT -status Collapsed + + + + +\begin_inset Text \layout Standard -\backslash -/ + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fssub.c \end_inset + + +\begin_inset Text --model-large -\emph default - option, variables will by default be placed into the XDATA segment. - -\newline +\layout Standard -\newline -Segments may be placed anywhere in the 4 meg address space using the usual - - -\begin_inset ERT -status Collapsed + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +subtract floating point numbers +\end_inset + + + + +\begin_inset Text \layout Standard -\backslash -/ + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fsdiv.c \end_inset + + +\begin_inset Text --*-loc options. - Note that if any segments are located above 64K, the -r flag must be passed - to the linker to generate the proper segment relocations, and the Intel - HEX output format must be used. - The -r flag can be passed to the linker by using the option -\emph on --Wl-r -\emph default - on the SDCC command line. - However, currently the linker can not handle code segments > 64k. -\layout Section +\layout Standard -Pragmas -\begin_inset LatexCommand \label{sec:Pragmas} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +divide floating point numbers \end_inset + + + + +\begin_inset Text +\layout Standard -\begin_inset LatexCommand \index{Pragmas} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fsmul.c \end_inset - + + +\begin_inset Text \layout Standard -SDCC supports the following #pragma directives: -\layout Itemize +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +multiply floating point numbers +\end_inset + + + + +\begin_inset Text -\series bold -save -\series default +\layout Standard -\begin_inset LatexCommand \index{\#pragma save} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fs2uchar.c \end_inset + + +\begin_inset Text - - this will save most current options to the save/restore stack. - See #pragma\SpecialChar ~ -restore. -\layout Itemize - - -\series bold -restore -\series default +\layout Standard -\begin_inset LatexCommand \index{\#pragma restore} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert floating point to unsigned char \end_inset + + + + +\begin_inset Text - - will restore saved options from the last save. - saves & restores can be nested. - SDCC uses a save/restore stack: save pushes current options to the stack, - restore pulls current options from the stack. - See #pragma\SpecialChar ~ -save. -\newline +\layout Standard -\layout Itemize +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fs2char.c +\end_inset + + +\begin_inset Text -\series bold -callee_saves -\series default +\layout Standard -\begin_inset LatexCommand \index{\#pragma callee\_saves} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert floating point to signed char \end_inset + + + + +\begin_inset Text +\layout Standard -\begin_inset LatexCommand \index{function prologue} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fs2uint.c \end_inset + + +\begin_inset Text - function1[,function2[,function3...]] - The compiler by default uses a caller - saves convention for register saving across function calls, however this - can cause unnecessary register pushing & popping -\begin_inset LatexCommand \index{push/pop} +\layout Standard -\end_inset - when calling small functions from larger functions. - This option can be used to switch off the register saving convention for - the function names specified. - The compiler will not save registers when calling these functions, extra - code need to be manually inserted at the entry & exit for these functions - to save & restore the registers used by these functions, this can SUBSTANTIALLY - reduce code & improve run time performance of the generated code. - In the future the compiler (with inter procedural analysis) may be able - to determine the appropriate scheme to use for each function call. - If - -\begin_inset ERT -status Collapsed +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert floating point to unsigned int +\end_inset + + + + +\begin_inset Text \layout Standard -\backslash -/ -\end_inset - --callee-saves command line option is used, the function names specified - in #pragma\SpecialChar ~ -callee_saves -\begin_inset LatexCommand \index{\#pragma callee\_saves} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fs2int.c \end_inset + + +\begin_inset Text - is appended to the list of functions specified in the command line. -\layout Itemize - - -\series bold -exclude -\series default +\layout Standard -\begin_inset LatexCommand \index{\#pragma exclude} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert floating point to signed int \end_inset + + + + +\begin_inset Text - none | {acc[,b[,dpl[,dph]]] - The exclude pragma disables the generation - of pairs of push/pop -\begin_inset LatexCommand \index{push/pop} +\layout Standard -\end_inset - instructions in -\emph on -I +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fs2ulong. +\family default +\series default +\shape default +\size default \emph default -nterrupt -\begin_inset LatexCommand \index{interrupt} - +\bar default +\noun default +c \end_inset + + +\begin_inset Text - -\emph on -S -\emph default -ervice -\emph on -R -\emph default -outines. - The directive should be placed immediately before the ISR function definition - and it affects ALL ISR functions following it. - To enable the normal register saving for ISR functions use #pragma\SpecialChar ~ -exclude\SpecialChar ~ -none -\begin_inset LatexCommand \index{\#pragma exclude} - -\end_inset +\layout Standard -. - See also the related keyword _naked -\begin_inset LatexCommand \index{\_naked} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert floating point to unsigned long \end_inset + + + + +\begin_inset Text +\layout Standard -\begin_inset LatexCommand \index{\_\_naked} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fs2long.c \end_inset + + +\begin_inset Text -. -\layout Itemize - - -\series bold -less_pedantic -\series default +\layout Standard -\begin_inset LatexCommand \index{\#pragma less\_pedantic} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert floating point to signed long \end_inset + + + + +\begin_inset Text - - the compiler will not warn you anymore for obvious mistakes, you'r on - your own now ;-( -\layout Itemize - +\layout Standard -\series bold -disable_warning -\series default - -\begin_inset LatexCommand \index{\#pragma disable\_warning} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_uchar2fs.c \end_inset + + +\begin_inset Text - - the compiler will not warn you anymore about warning number . -\layout Itemize - - -\series bold -nogcse -\series default +\layout Standard -\begin_inset LatexCommand \index{\#pragma nogcse} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert unsigned char to floating point \end_inset + + + + +\begin_inset Text - - will stop global common subexpression elimination. -\layout Itemize - - -\series bold -noinduction -\series default +\layout Standard -\begin_inset LatexCommand \index{\#pragma noinduction} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_char2fs.c \end_inset + + +\begin_inset Text - - will stop loop induction optimizations. -\layout Itemize - - -\series bold -noinvariant -\series default +\layout Standard -\begin_inset LatexCommand \index{\#pragma noinvariant} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert char to floating point number \end_inset + + + + +\begin_inset Text - - will not do loop invariant optimizations. - For more details see Loop Invariants in section -\begin_inset LatexCommand \ref{sub:Loop-Optimizations} - -\end_inset +\layout Standard -. -\layout Itemize +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_uint2fs.c +\end_inset + + +\begin_inset Text -\series bold -noiv -\series default +\layout Standard -\begin_inset LatexCommand \index{\#pragma noiv} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert unsigned int to floating point \end_inset + + + + +\begin_inset Text - - Do not generate interrupt -\begin_inset LatexCommand \index{interrupt} - -\end_inset +\layout Standard - vector table -\begin_inset LatexCommand \index{interrupt vector table} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_int2fs.c \end_inset + + +\begin_inset Text - entries for all ISR functions defined after the pragma. - This is useful in cases where the interrupt vector table must be defined - manually, or when there is a secondary, manually defined interrupt vector - table (e.g. - for the autovector feature of the Cypress EZ-USB FX2). - More elegantly this can be achieved by obmitting the optional interrupt - number after the interrupt keyword, see section -\begin_inset LatexCommand \ref{sub:Interrupt-Service-Routines} - -\end_inset +\layout Standard -\SpecialChar ~ -about interrupts. -\layout Itemize +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert int to floating point numbers +\end_inset + + + + +\begin_inset Text -\series bold -nojtbound -\series default +\layout Standard -\begin_inset LatexCommand \index{\#pragma nojtbound} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_ulong2fs.c \end_inset + + +\begin_inset Text - - will not generate code for boundary value checking, when switch statements - are turned into jump-tables (dangerous). - For more details see section -\begin_inset LatexCommand \ref{sub:'switch'-Statements} +\layout Standard -\end_inset -. -\layout Itemize +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert unsigned long to floating point number +\end_inset + + + + +\begin_inset Text +\layout Standard -\series bold -noloopreverse -\series default - -\begin_inset LatexCommand \index{\#pragma noloopreverse} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_long2fs.c \end_inset + + +\begin_inset Text - - Will not do loop reversal optimization -\layout Itemize - - -\series bold -nooverlay -\series default +\layout Standard -\begin_inset LatexCommand \index{\#pragma nooverlay} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert long to floating point number \end_inset + + + - - the compiler will not overlay the parameters and local variables of a - function. -\layout Itemize - - -\series bold -stackauto -\series default +\end_inset -\begin_inset LatexCommand \index{\#pragma stackauto} -\end_inset +\newline -- See option - -\begin_inset ERT -status Collapsed +\layout Standard +\added_space_bottom bigskip +These support routines are developed in ANSI-C so there is room for space + and speed improvement +\begin_inset Foot +collapsed false \layout Standard -\backslash -/ +These floating point routines ( +\emph on +not +\emph default + sinf(), cosf(), ...) for the mcs51 are implemented in assembler. + \end_inset --stack-auto -\begin_inset LatexCommand \index{-\/-stack-auto} - -\end_inset +. + Note if all these routines are used simultaneously the data space might + overflow. + For serious floating point usage the large model might be needed. + Also notice that you don't have to call this routines directly. + The compiler will use them automatically every time a floating point operation + is required. +\layout Section - and section -\begin_inset LatexCommand \ref{sec:Parameters-and-Local-Variables} +Library Routines +\begin_inset LatexCommand \index{Libraries} \end_inset - Parameters and Local Variables. -\layout Itemize +\layout Standard -\series bold -opt_code_speed -\series default - -\begin_inset LatexCommand \index{\#pragma opt\_code\_speed} - -\end_inset -- The compiler will optimize code generation towards fast code, possibly - at the expense of code size. - Currently this has little effect. -\layout Itemize +\emph on + +\layout Subsection +Compiler support routines (_gptrget, _mulint etc.) +\layout Subsection -\series bold -opt_code_size -\series default - -\begin_inset LatexCommand \index{\#pragma opt\_code\_size} +Stdclib functions (puts, printf, strcat etc.) +\layout Subsubsection -\end_inset + +\layout Paragraph -- The compiler will optimize code generation towards compact code, possibly - at the expense of code speed. - Currently this has little effect. -\layout Itemize +getchar(), putchar() +\layout Standard -\series bold -opt_code_balanced -\series default - -\begin_inset LatexCommand \index{\#pragma opt\_code\_balanced} +\begin_inset LatexCommand \index{} \end_inset -- The compiler will attempt to generate code that is both compact and fast, - as long as meeting one goal is not a detriment to the other (this is the - default). - -\layout Itemize - - -\series bold -std_sdcc89 -\series default - -\begin_inset LatexCommand \index{\#pragma std\_sdcc89} +As usual on embedded systems you have to provide your own +\family typewriter +getchar() +\begin_inset LatexCommand \index{getchar()} \end_inset -- Generally follow the C89 standard, but allow SDCC features that conflict - with the standard (default). -\layout Itemize - - -\series bold -std_c89 -\series default -\begin_inset LatexCommand \index{\#pragma std\_c89} +\family default +and +\family typewriter +putchar() +\begin_inset LatexCommand \index{putchar()} \end_inset -- Follow the C89 standard and disable SDCC features that conflict with the - standard. -\layout Itemize - -\series bold -std_sdcc99 -\series default - -\begin_inset LatexCommand \index{\#pragma std\_sdcc99} +\family default + routines. + SDCC does not know whether the system connects to a serial line with or + without handshake, LCD, keyboard or other device. + And whether a +\family typewriter +lf +\family default + to +\family typewriter +crlf +\family default + conversion within +\family typewriter +putchar() +\family default + is intended. + You'll find examples for serial routines f.e. + in sdcc/device/lib. + For the mcs51 this minimalistic polling +\family typewriter +putchar() +\family default + routine might be a start: +\layout Verse -\end_inset -- Generally follow the C99 standard, but allow SDCC features that conflict - with the standard (incomplete support). -\layout Itemize +\family typewriter +void putchar (char c) { +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +while (!TI)\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + /* assumes UART is initialized */ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +TI = 0; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +SBUF = c; +\newline +} +\layout Paragraph +printf() +\layout Standard -\series bold -std_c99 -\series default - -\begin_inset LatexCommand \index{\#pragma std\_c99} +The default +\family typewriter + printf() +\begin_inset LatexCommand \index{printf()} \end_inset -- Follow the C99 standard and disable SDCC features that conflict with the - standard (incomplete support). -\layout Itemize - - -\series bold -codeseg -\series default - -\begin_inset LatexCommand \index{\#pragma codeseg} - -\end_inset -- Use this name (max. - 8 characters) for the code segment. - See option - +\family default + implementation in +\family typewriter + printf_large.c +\family default + does not support float (except on ds390). + To enable this recompile it with the option +\emph on +- \begin_inset ERT status Collapsed @@ -16849,21 +16993,17 @@ status Collapsed / \end_inset --codeseg. -\layout Itemize +DUSE_FLOATS=1 +\begin_inset LatexCommand \index{USE\_FLOATS} +\end_inset -\series bold -constseg -\series default - -\begin_inset LatexCommand \index{\#pragma constseg} - -\end_inset -- Use this name (max. - 8 characters) for the const segment. - See option - +\emph default + on the command line. + Use +\emph on + - \begin_inset ERT status Collapsed @@ -16873,234 +17013,148 @@ status Collapsed / \end_inset --constseg. -\layout Standard - -The preprocessor SDCPP -\begin_inset LatexCommand \index{sdcpp (preprocessor)} - -\end_inset - - supports the following #pragma directives: -\layout Itemize - - -\series bold -preproc_asm -\series default - -\begin_inset LatexCommand \index{\#pragma preproc\_asm} +-model-large +\begin_inset LatexCommand \index{-\/-model-large} \end_inset - (+ | -) - switch _asm _endasm block preprocessing on / off. - Default is on. - You use this prama to define multilines of assembly code. - This will prevent the preprocessor from changing the formating required - by assembly code. - Below is an example on how to use this pragma. -\layout Verse +\emph default + for the mcs51 port, since this uses a lot of memory. +\layout Standard +If you're short on code memory you might want to use \family typewriter -#pragma preproc_asm - -\begin_inset LatexCommand \index{\#pragma preproc\_asm} +printf_small() +\begin_inset LatexCommand \index{printf\_small()} \end_inset -\newline -#define MYDELAY _asm -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -nop ;my assembly comment... -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -nop -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -nop -\newline -_endasm -\newline -#pragma preproc_asm + -\newline - -\newline -void foo (void) -\newline -{ -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - ... - -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - MYDELAY; -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - ... +\family default -\newline -} -\newline - -\layout Standard - -The pragma's are intended to be used to turn-on or off certain optimizations - which might cause the compiler to generate extra stack / data space to - store compiler generated temporary variables. - This usually happens in large functions. - Pragma directives should be used as shown in the following example, they - are used to control options & optimizations for a given function; pragmas - should be placed before and/or after a function, placing pragma's inside - a function body could have unpredictable results. -\layout Verse - +\emph on +instead +\emph default + of +\family typewriter + printf(). +\family default + For the mcs51 there additionally are assembly versions \family typewriter -#pragma save -\begin_inset LatexCommand \index{\#pragma save} +printf_tiny() +\begin_inset LatexCommand \index{printf\_tiny() (mcs51)} \end_inset - \SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -/* save the current settings */ -\newline -#pragma nogcse -\begin_inset LatexCommand \index{\#pragma nogcse} - -\end_inset - \SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -/* turnoff global subexpression elimination */ -\newline -#pragma noinduction -\begin_inset LatexCommand \index{\#pragma noinduction} +\family default + (subset of printf using less than 270 bytes) and +\family typewriter +printf_fast() +\begin_inset LatexCommand \index{printf\_fast() (mcs51)} \end_inset - /* turn off induction optimizations */ -\newline -int foo () -\newline -{ -\newline -\SpecialChar ~ - \SpecialChar ~ - ... - -\newline -\SpecialChar ~ - \SpecialChar ~ - /* large code */ -\newline -\SpecialChar ~ - \SpecialChar ~ - ... -\newline -} -\newline -#pragma restore -\begin_inset LatexCommand \index{\#pragma restore} +\family default +and +\family typewriter + printf_fast_f() +\begin_inset LatexCommand \index{printf\_fast\_f() (mcs51)} \end_inset - /* turn the optimizations back on */ -\layout Standard -The compiler will generate a warning message when extra space is allocated. - It is strongly recommended that the save and restore pragma's be used when - changing options for a function. +\family default + (floating-point aware version of printf_fast) which should fit the requirements + of many embedded systems (printf_fast() can be customized by unsetting + #defines to +\emph on +not +\emph default + support long variables and field widths). + Be sure to use only one of these printf options within a project. \newline -\newline +\layout Standard -\newline +Feature matrix of different +\emph on +printf +\emph default + options on mcs51. +\layout Standard -\layout Section -Defines Created by the Compiler +\begin_inset Tabular + + + + + + + + + + + +\begin_inset Text + \layout Standard -The compiler creates the following #defines -\begin_inset LatexCommand \index{\#defines} +\series bold +\size large +mcs51 \end_inset + + +\begin_inset Text +\layout Standard -\begin_inset LatexCommand \index{Defines created by the compiler} +printf +\begin_inset LatexCommand \index{printf} \end_inset -: -\newline - -\layout Standard - -\begin_inset Tabular - - - - - +\end_inset + \begin_inset Text \layout Standard - -\series bold -#define +printf +\size scriptsize +USE_FLOATS=1 \end_inset - + \begin_inset Text \layout Standard - -\series bold -Description +printf_small \end_inset - - \begin_inset Text \layout Standard -SDCC -\begin_inset LatexCommand \index{SDCC} - +printf_fast \end_inset + + +\begin_inset Text - +\layout Standard + +printf_fast_f \end_inset @@ -17108,72 +17162,67 @@ SDCC \layout Standard -Always defined. - Since version 2.5.6 the version number as an int (ex. - 256) +printf_tiny \end_inset - + \begin_inset Text \layout Standard -SDCC_mcs51 -\begin_inset LatexCommand \index{SDCC\_mcs51} - +filename \end_inset + + +\begin_inset Text - or SDCC_ds390 -\begin_inset LatexCommand \index{SDCC\_ds390} +\layout Standard -\end_inset - - or SDCC_z80 -\begin_inset LatexCommand \index{SDCC\_z80} -\end_inset - -, etc. +\size scriptsize +printf_large.c \end_inset - + \begin_inset Text \layout Standard -depending on the model used (e.g.: -mds390) + +\size scriptsize +printf_large.c \end_inset - - \begin_inset Text \layout Standard -__mcs51 -\begin_inset LatexCommand \index{\_\_mcs51} +\size scriptsize +printfl.c \end_inset + + +\begin_inset Text -, __ds390 -\begin_inset LatexCommand \index{\_\_ds390} - -\end_inset +\layout Standard -, __hc08 -\begin_inset LatexCommand \index{\_\_hc08} +\size scriptsize +printf_fast.c \end_inset + + +\begin_inset Text -, __z80 -\begin_inset LatexCommand \index{\_\_z80} +\layout Standard -\end_inset -, etc +\size scriptsize +printf_fast_f.c \end_inset @@ -17181,134 +17230,123 @@ __mcs51 \layout Standard -depending on the model used (e.g. - -mz80) + +\size scriptsize +printf_tiny.c \end_inset - + \begin_inset Text \layout Standard -SDCC_STACK_AUTO -\begin_inset LatexCommand \index{SDCC\_STACK\_AUTO} +\begin_inset Quotes sld +\end_inset + +Hello World +\begin_inset Quotes srd \end_inset + size +\layout Standard +small / large \end_inset - + \begin_inset Text \layout Standard -when -\emph on -- -\begin_inset ERT -status Collapsed +1.7k / 2.4k +\end_inset + + +\begin_inset Text \layout Standard -\backslash -/ -\end_inset - --stack-auto -\emph default - option is used +4.3k / 5.6k \end_inset - - \begin_inset Text \layout Standard -SDCC_MODEL_SMALL -\begin_inset LatexCommand \index{SDCC\_MODEL\_SMALL} - +1.2k / 1.8k \end_inset + + +\begin_inset Text +\layout Standard +1.3k / 1.3k \end_inset - + \begin_inset Text \layout Standard -when -\emph on -- -\begin_inset ERT -status Collapsed +1.9k / 1.9k +\end_inset + + +\begin_inset Text \layout Standard -\backslash -/ -\end_inset - --model-small -\emph default - is used +0.44k / 0.44k \end_inset - + \begin_inset Text \layout Standard -SDCC_MODEL_MEDIUM -\begin_inset LatexCommand \index{SDCC\_MODEL\_MEDIUM} - -\end_inset - +code size +\layout Standard +small / large \end_inset - + \begin_inset Text \layout Standard -when -\emph on -- -\begin_inset ERT -status Collapsed +1.4k / 2.0k +\end_inset + + +\begin_inset Text \layout Standard -\backslash -/ -\end_inset - --model-medium -\emph default - is used +2.8k / 3.7k \end_inset - - \begin_inset Text \layout Standard -SDCC_MODEL_LARGE -\begin_inset LatexCommand \index{SDCC\_MODEL\_LARGE} - +0.45k / 0.47k (+ _ltoa) \end_inset + + +\begin_inset Text +\layout Standard +1.2k / 1.2k \end_inset @@ -17316,21 +17354,15 @@ SDCC_MODEL_LARGE \layout Standard -when -\emph on -- -\begin_inset ERT -status Collapsed +1.6k / 1.6k +\end_inset + + +\begin_inset Text \layout Standard -\backslash -/ -\end_inset - --model-large -\emph default - is used +0.26k / 0.26k \end_inset @@ -17340,76 +17372,125 @@ status Collapsed \layout Standard -SDCC_USE_XSTACK -\begin_inset LatexCommand \index{SDCC\_USE\_XSTACK} - -\end_inset - - +formats \end_inset - + \begin_inset Text \layout Standard -when +cdi \emph on -- -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --xstack +o \emph default - option is used +psux \end_inset - - \begin_inset Text \layout Standard -SDCC_STACK_TENBIT -\begin_inset LatexCommand \index{SDCC\_STACK\_TENBIT} - -\end_inset - +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +cd +\family default +\series default +\shape default +\size default +\emph default +\bar default +\noun default +f +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +i +\family default +\series default +\shape default +\size default +\emph on +\bar default +\noun default +o +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +psux \end_inset - + \begin_inset Text \layout Standard -when +c +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +d +\family default +\series default +\shape default +\size default \emph on --mds390 +\bar default +\noun default +o +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +s +\family default +\series default +\shape default +\size default \emph default - is used +\bar default +\noun default +x \end_inset - - \begin_inset Text \layout Standard -SDCC_MODEL_FLAT24 -\begin_inset LatexCommand \index{SDCC\_MODEL\_FLAT24} - +cdsux \end_inset + + +\begin_inset Text +\layout Standard +cdfsux \end_inset @@ -17417,654 +17498,425 @@ SDCC_MODEL_FLAT24 \layout Standard -when -\emph on --mds390 -\emph default - is used +cdsux \end_inset - + + +\begin_inset Text -\end_inset +\layout Standard +long (32 bit) support +\end_inset + + +\begin_inset Text -\layout Chapter +\layout Standard -Notes on supported Processors -\layout Section +x +\end_inset + + +\begin_inset Text -MCS51 variants -\begin_inset LatexCommand \label{sub:MCS51-variants} +\layout Standard +x \end_inset + + +\begin_inset Text +\layout Standard -\begin_inset LatexCommand \index{MCS51 variants} - +x \end_inset - + + +\begin_inset Text \layout Standard -MCS51 processors are available from many vendors and come in many different - flavours. - While they might differ considerably in respect to Special Function Registers - the core MCS51 is usually not modified or is kept compatible. - -\layout Subsection +x +\end_inset + + +\begin_inset Text -pdata access by SFR \layout Standard -With the upcome of devices with internal xdata and flash memory devices - using port P2 -\begin_inset LatexCommand \index{P2 (mcs51 sfr)} +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +x \end_inset + + +\begin_inset Text - as dedicated I/O port is becoming more popular. - Switching the high byte for pdata -\begin_inset LatexCommand \index{pdata (mcs51, ds390 storage class)} +\layout Standard +- \end_inset + + + + +\begin_inset Text - access which was formerly done by port P2 is then achieved by a Special - Function Register -\begin_inset LatexCommand \index{sfr} +\layout Standard +byte arguments on stack \end_inset + + +\begin_inset Text -. - In well-established MCS51 tradition the address of this -\emph on -sfr -\emph default - is where the chip designers decided to put it. - Needless to say that they didn't agree on a common name either. - So that the startup code can correctly initialize xdata variables, you - should define an sfr with the name _XPAGE -\family typewriter - -\begin_inset LatexCommand \index{\_XPAGE (mcs51)} +\layout Standard +b \end_inset + + +\begin_inset Text - -\family default - at the appropriate location if the default, port P2, is not used for this. - Some examples are: -\layout Verse - - -\family typewriter -__sfr __at (0x92) _XPAGE; /* Cypress EZ-USB family */ -\layout Verse - - -\family typewriter -__sfr __at (0xaf) _XPAGE; /* some Silicon Labs (Cygnal) chips */ -\layout Verse - - -\family typewriter -__sfr __at (0xaa) _XPAGE; /* some Silicon Labs (Cygnal) chips */ \layout Standard -For more exotic implementations further customizations may be needed. - See section -\begin_inset LatexCommand \ref{sub:Startup-Code} - +b \end_inset + + +\begin_inset Text - for other possibilities. -\layout Subsection - -Other Features available by SFR \layout Standard -\added_space_bottom bigskip -Some MCS51 variants offer features like Double DPTR -\begin_inset LatexCommand \index{DPTR} +- \end_inset + + +\begin_inset Text -, multiple DPTR, decrementing DPTR, 16x16 Multiply. - These are currently not used for the MCS51 port. - If you absolutely need them you can fall back to inline assembly or submit - a patch to SDCC. -\layout Section - -DS400 port \layout Standard -\added_space_bottom bigskip -The DS80C400 -\begin_inset LatexCommand \index{DS80C400} +- \end_inset + + +\begin_inset Text +\layout Standard -\begin_inset LatexCommand \index{DS400} - +- \end_inset + + +\begin_inset Text - microcontroller has a rich set of peripherals. - In its built-in ROM library it includes functions to access some of the - features, among them is a TCP stack with IP4 and IP6 support. - Library headers (currently in beta status) and other files are provided - at -\size footnotesize - -\begin_inset LatexCommand \url{ftp://ftp.dalsemi.com/pub/tini/ds80c400/c_libraries/sdcc/index.html} +\layout Standard +- \end_inset + + + + +\begin_inset Text -. - -\layout Section - -The Z80 and gbz80 port \layout Standard -SDCC can target both the Zilog Z80 -\begin_inset LatexCommand \index{Z80} +float format +\begin_inset LatexCommand \index{Floating point support} \end_inset - and the Nintendo Gameboy's Z80-like gbz80 -\begin_inset LatexCommand \index{gbz80 (GameBoy Z80)} \end_inset + + +\begin_inset Text -. - The Z80 port is passed through the same -\emph on -regressions tests -\begin_inset LatexCommand \index{Regression test} +\layout Standard +- \end_inset + + +\begin_inset Text +\layout Standard -\emph default - (see section -\begin_inset LatexCommand \ref{sec:Quality-control} - +%f \end_inset + + +\begin_inset Text -) as the MCS51 and DS390 ports, so floating point support, support for long - variables and bitfield support is fine. - See mailing lists and forums about interrupt routines. \layout Standard -\added_space_bottom bigskip -As always, the code is the authoritative reference - see z80/ralloc.c and - z80/gen.c. - The stack -\begin_inset LatexCommand \index{Z80!stack} +- \end_inset + + +\begin_inset Text - frame is similar to that generated by the IAR Z80 compiler. - IX is used as the base pointer, HL and IY are used as a temporary registers, - and BC and DE are available for holding variables. - Return values -\begin_inset LatexCommand \index{Z80!return value} +\layout Standard +- \end_inset + + +\begin_inset Text - for the Z80 port are stored in L (one byte), HL (two bytes), or DEHL (four - bytes). - The gbz80 port use the same set of registers for the return values, but - in a different order of significance: E (one byte), DE (two bytes), or - HLDE (four bytes). -\layout Section +\layout Standard + +%f +\begin_inset Foot +collapsed true -The HC08 port \layout Standard -The port to the Freescale/Motorola HC08 -\begin_inset LatexCommand \index{HC08} +Range limited to +/- 4294967040, precision limited to 8 digits past decimal +\end_inset + \end_inset + + +\begin_inset Text - family has been added in October 2003, and is still undergoing some basic - development. - The code generator is complete, but the register allocation is still quite - unoptimized. - Some of the SDCC's standard C library functions have embedded non-HC08 - inline assembly and so are not yet usable. \layout Standard -\added_space_bottom bigskip -The HC08 port passes the regression test suite (see section -\begin_inset LatexCommand \ref{sec:Quality-control} +- \end_inset + + + + +\begin_inset Text -). -\layout Section -\pagebreak_top -The PIC14 port \layout Standard -The 14bit PIC -\begin_inset LatexCommand \index{PIC14} - +float formats %e %g \end_inset + + +\begin_inset Text - port still requires a major effort from the development community. - However it can work for simple code. - It passes its (smaller set of) regression tests -\begin_inset LatexCommand \index{Regression test (PIC14)} +\layout Standard +- \end_inset + + +\begin_inset Text - in the directory -\shape italic -sdcc/src/regression -\shape default -. -\layout Subsection - -C code and 14bit PIC code page -\begin_inset LatexCommand \index{code page (pic14)} +\layout Standard +- \end_inset + + +\begin_inset Text - and RAM banks -\begin_inset LatexCommand \index{RAM bank (pic14)} +\layout Standard +- \end_inset - + + +\begin_inset Text \layout Standard -The linker organizes allocation for the code page and RAM banks. - It does not have intimate knowledge of the code flow. - It will put all the code section of a single asm file into a single code - page. - In order to make use of multiple code pages, separate asm files must be - used. - The compiler treats all functions of a single C file as being in the same - code page unless it is non static. - The compiler treats all local variables of a single C file as being in - the same RAM bank unless it is an extern. -\newline - -\newline -To get the best follow these guide lines: -\layout Enumerate - -make local functions static, as non static functions require code page selection - overhead. -\layout Enumerate - -Make local variables static as extern variables require RAM bank selection - overhead. -\layout Enumerate - -For devices that have multiple code pages it is more efficient to use the - same number of files as pages, i.e. - for the 16F877 use 4 separate files and i.e. - for the 16F874 use 2 separate files. - This way the linker can put the code for each file into different code - pages and the compiler can allocate reusable variables more efficiently - and there's less page selection overhead. - And as for any 8 bit micro (especially for PIC 14 as they have a very simple - instruction set) use 'unsigned char' whereever possible instead of 'int'. -\layout Subsection +- +\end_inset + + +\begin_inset Text -Creating a device include file \layout Standard -For generating a device include file -\begin_inset LatexCommand \index{PIC14!Header files} - +- \end_inset + + +\begin_inset Text - use the support perl script inc2h.pl kept in directory support/script. -\layout Subsection - -Interrupt code \layout Standard -For the interrupt function, use the keyword 'interrupt' -\begin_inset LatexCommand \index{PIC14!interrupt} - +- \end_inset + + + + +\begin_inset Text - with level number of 0 (PIC14 only has 1 interrupt so this number is only - there to avoid a syntax error - it ought to be fixed). - E.g.: -\layout Verse - - -\family typewriter -void Intr(void) interrupt 0 -\newline -{ -\newline -\SpecialChar ~ -\SpecialChar ~ -T0IF = 0; /* Clear timer interrupt */ -\newline -} -\layout Subsection - -Linking and assembling \layout Standard -For assembling you can use either GPUTILS' -\begin_inset LatexCommand \index{gputils (pic tools)} - +field width \end_inset + + +\begin_inset Text - gpasm.exe or MPLAB's mpasmwin.exe. - GPUTILS is available from -\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils} +\layout Standard +x \end_inset + + +\begin_inset Text -. - For linking you can use either GPUTIL's gplink or MPLAB's mplink.exe. - If you use MPLAB and an interrupt function then the linker script file - vectors section will need to be enlarged to link with mplink. -\newline +\layout Standard -\newline -Here is a -\family typewriter -Makefile -\family default - using GPUTILS: -\layout Verse +x +\end_inset + + +\begin_inset Text +\layout Standard -\family typewriter -.c.o: -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -sdcc -S -V -mpic14 -p16F877 $< -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -gpasm -c $*.asm -\newline +- +\end_inset + + +\begin_inset Text -\newline -$(PRJ).hex: $(OBJS) -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -gplink -m -s $(PRJ).lkr -o $(PRJ).hex $(OBJS) libsdcc.lib \layout Standard -Here is a -\family typewriter -Makefile -\family default - using MPLAB: -\layout Verse +x +\end_inset + + +\begin_inset Text +\layout Standard -\family typewriter -.c.o: -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -sdcc -S -V -mpic14 -p16F877 $< -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -mpasmwin /q /o $*.asm -\newline +x +\end_inset + + +\begin_inset Text -\newline -$(PRJ).hex: $(OBJS) -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -mplink /v $(PRJ).lkr /m $(PRJ).map /o $(PRJ).hex $(OBJS) libsdcc.lib \layout Standard -Please note that indentations within a -\family typewriter - Makefile -\family default - have to be done with a tabulator character. -\layout Subsection +- +\end_inset + + + + +\begin_inset Text -Command-line options \layout Standard -Besides the switches common to all SDCC backends, the PIC14 port accepts - the following options (for an updated list see sdcc - -\begin_inset ERT -status Collapsed +string speed +\begin_inset Foot +collapsed true \layout Standard +Execution time of printf("%s%c%s%c%c%c", "Hello", ' ', "World", '!', ' \backslash -/ +r', ' +\backslash +n'); standard 8051 @ 22.1184 MHz, empty putchar() \end_inset --help): -\layout List -\labelwidthstring 00.00.0000 +, +\layout Standard -- -\begin_inset ERT -status Collapsed +small / large +\end_inset + + +\begin_inset Text \layout Standard -\backslash -/ +1.52 / 2.59 ms \end_inset - --debug-extra -\begin_inset LatexCommand \index{PIC14!Options!-\/-debug-extra} - -\end_inset - - emit debug info in assembly output -\layout List -\labelwidthstring 00.00.0000 - -- -\begin_inset ERT -status Collapsed + + +\begin_inset Text \layout Standard -\backslash -/ -\end_inset - --no-pcode-opt -\begin_inset LatexCommand \index{PIC14!Options!-\/-no-pcode-opt} - +1.53 / 2.62 ms \end_inset + + +\begin_inset Text - disable (slightly faulty) optimization on pCode -\layout Subsection - -The library -\layout Subsubsection - -error: missing definition for symbol -\begin_inset Quotes sld -\end_inset +\layout Standard -__gptrget1 -\begin_inset Quotes srd +0.92 / 0.93 ms \end_inset - + + +\begin_inset Text \layout Standard -The PIC14 port uses library routines to provide more complex operations - like multiplication, division/modulus and (generic) pointer dereferencing. - In order to add these routines to your project, you must link with PIC14's - -\family typewriter -libsdcc.lib -\family default -. - For single source file projects this is done automatically, more complex - projects must add -\family typewriter -libsdcc.lib -\family default - to the linker's arguments. - Make sure you also add an include path for the library (using the -I switch - to the linker)! -\layout Subsubsection - -Processor mismatch in file -\begin_inset Quotes sld -\end_inset - -XXX -\begin_inset Quotes srd +0.45 / 0.45 ms \end_inset + + +\begin_inset Text -. \layout Standard -This warning can usually be ignored due to the very good compatibility amongst - 14 bit PIC -\begin_inset LatexCommand \index{PIC14} - +0.46 / 0.46 ms \end_inset + + +\begin_inset Text - devices. \layout Standard -You might also consider recompiling the library for your specific device - by changing the ARCH=p16f877 (default target) entry in -\family typewriter -device/lib/pic/Makefile.in -\family default - and -\family typewriter -device/lib/pic/Makefile -\family default - to reflect your device. - This might even improve performance for smaller devices as unneccesary - BANKSELs migth be removed. -\layout Subsection - -Known bugs -\layout Subsubsection +0.45 / 0.45 ms +\end_inset + + + + +\begin_inset Text -initialized data \layout Standard -Currently, data can only be initialized if it resides in the source file - together with -\emph on -main() -\emph default -. - Data in other source files will silently -\series bold -not -\series default - be initialized. -\family typewriter -\size footnotesize - -\begin_inset Marginal +int speed +\begin_inset Foot collapsed true \layout Standard - -\series bold -\SpecialChar ~ -! -\end_inset - - -\layout Section -\pagebreak_top -The PIC16 -\begin_inset LatexCommand \index{PIC16} - +Execution time of printf("%d", -12345); standard 8051 @ 22.1184 MHz, empty + putchar() \end_inset - port +, \layout Standard -The PIC16 -\begin_inset LatexCommand \index{PIC16} - -\end_inset - - port is the portion of SDCC that is responsible to produce code for the - Microchip -\begin_inset LatexCommand \index{Microchip} - +small / large \end_inset - -(TM) microcontrollers with 16 bit core. - Currently this family of microcontrollers contains the PIC18Fxxx and PIC18Fxxxx. - Currently supported devices are: -\layout Standard -\align center - -\begin_inset Tabular - - - - - - - - - + \begin_inset Text \layout Standard -18F242 +3.01 / 3.61 ms \end_inset @@ -18072,7 +17924,7 @@ The PIC16 \layout Standard -18F248 +3.01 / 3.61 ms \end_inset @@ -18080,23 +17932,23 @@ The PIC16 \layout Standard -18F252 +3.51 / 18.13 ms \end_inset - + \begin_inset Text \layout Standard -18F258 +0.22 / 0.22 ms \end_inset - + \begin_inset Text \layout Standard -18F442 +0.23 / 0.23 ms \end_inset @@ -18104,67 +17956,63 @@ The PIC16 \layout Standard -18F448 -\end_inset - - - - -\begin_inset Text +0.25 / 0.25 ms +\begin_inset Foot +collapsed true \layout Standard -18F452 +printf_tiny integer speed is data dependent, worst case is 0.33 ms \end_inset - - -\begin_inset Text -\layout Standard -18F458 \end_inset + + \begin_inset Text \layout Standard -18F1220 +long speed +\begin_inset Foot +collapsed true + +\layout Standard + +Execution time of printf("%ld", -123456789); standard 8051 @ 22.1184 MHz, + empty putchar() \end_inset - - -\begin_inset Text +, \layout Standard -18F2220 +small / large \end_inset - + \begin_inset Text \layout Standard -18F2550 +5.37 / 6.31 ms \end_inset - + \begin_inset Text \layout Standard -18F4331 +5.37 / 6.31 ms \end_inset - - \begin_inset Text \layout Standard -18F4455 +8.71 / 40.65 ms \end_inset @@ -18172,7 +18020,7 @@ The PIC16 \layout Standard -18F6520 +0.40 / 0.40 ms \end_inset @@ -18180,7 +18028,7 @@ The PIC16 \layout Standard -18F6620 +0.40 / 0.40 ms \end_inset @@ -18188,33 +18036,38 @@ The PIC16 \layout Standard -18F6680 +- \end_inset - + + + \begin_inset Text \layout Standard -18F6720 +float speed +\begin_inset Foot +collapsed true + +\layout Standard + +Execution time of printf("%.3f", -12345.678); standard 8051 @ 22.1184 MHz, + empty putchar() \end_inset - - -\begin_inset Text +, \layout Standard -18F8520 +small / large \end_inset - - \begin_inset Text \layout Standard -18F8620 +- \end_inset @@ -18222,7 +18075,7 @@ The PIC16 \layout Standard -18F8680 +7.49 / 22.47 ms \end_inset @@ -18230,21 +18083,23 @@ The PIC16 \layout Standard -18F8720 +- \end_inset - + \begin_inset Text \layout Standard +- \end_inset - + \begin_inset Text \layout Standard +1.04 / 1.04 ms \end_inset @@ -18252,6 +18107,7 @@ The PIC16 \layout Standard +- \end_inset @@ -18260,202 +18116,200 @@ The PIC16 \end_inset -\layout Subsection +\layout Subsubsection -Global Options -\layout Standard + +\begin_inset LatexCommand \index{malloc.h} -PIC16 port supports the standard command line arguments as supposed, with - the exception of certain cases that will be mentioned in the following - list: -\layout List -\labelwidthstring 00.00.0000 +\end_inset -- -\begin_inset ERT -status Collapsed \layout Standard -\backslash -/ -\end_inset - --callee-saves -\begin_inset LatexCommand \index{PIC16!Options!-\/-callee-saves} +As of SDCC 2.6.2 you no longer need to call an initialization routine before + using dynamic memory allocation +\begin_inset LatexCommand \index{dynamic memory allocation (malloc)} \end_inset - See - -\begin_inset ERT -status Collapsed + and a default heap +\begin_inset LatexCommand \index{heap (malloc)} + +\end_inset + + space of 1024 bytes is provided for malloc to allocate memory from. + If you need a different heap size you need to recompile _heap.c with the + required size defined in HEAP_SIZE. + It is recommended to make a copy of this file into your project directory + and compile it there with: +\layout Verse + +\family typewriter +sdcc -c _heap.c -D HEAD_SIZE=2048 \layout Standard -\backslash -/ -\end_inset +And then link it with: +\layout Verse --all-callee-saves -\layout List -\labelwidthstring 00.00.0000 -- -\begin_inset ERT -status Collapsed +\family typewriter +sdcc main.rel _heap.rel +\layout Subsection + +Math functions (sinf, powf, sqrtf etc.) +\layout Subsubsection + \layout Standard -\backslash -/ +See definitions in file . +\layout Subsection + +Other libraries +\layout Standard + +Libraries +\begin_inset LatexCommand \index{Libraries} + \end_inset --all-callee-saves -\begin_inset LatexCommand \index{PIC16!Options!-\/-all-callee-saves} + included in SDCC should have a license at least as liberal as the GNU Lesser + General Public License +\begin_inset LatexCommand \index{GNU Lesser General Public License, LGPL} \end_inset - All function arguments are passed on stack by default. \emph on -There is no need to specify this in the command line. -\layout List -\labelwidthstring 00.00.0000 +LGPL +\emph default +. +\layout Standard -- -\begin_inset ERT -status Collapsed -\layout Standard +\begin_inset Note +collapsed true -\backslash -/ -\end_inset +\layout Standard --fommit-frame-pointer -\begin_inset LatexCommand \index{PIC16!Options!-\/-fommit-frame-pointer} +license statements for the libraries are missing. + sdcc/device/lib/ser_ir.c +\layout Standard +or _decdptr f.e. + come with a GPL (as opposed to LGPL) License - this will not be liberal + enough for many embedded programmers. \end_inset - Frame pointer will be omitted when the function uses no local variables. -\layout Subsection -Port Specific Options -\begin_inset LatexCommand \index{Options PIC16} +\layout Standard +If you have ported some library or want to share experience about some code + which f.e. + falls into any of these categories Busses (I +\begin_inset Formula $^{\textrm{2}}$ \end_inset +C, CAN, Ethernet, Profibus, Modbus, USB, SPI, JTAG ...), Media (IDE, Memory + cards, eeprom, flash...), En-/Decryption, Remote debugging, Realtime kernel, + Keyboard, LCD, RTC, FPGA, PID then the sdcc-user mailing list +\begin_inset LatexCommand \url{http://sourceforge.net/mail/?group_id=599} + +\end_inset +\SpecialChar ~ +would certainly like to hear about it. \layout Standard +\added_space_bottom bigskip +Programmers coding for embedded systems are not especially famous for being + enthusiastic, so don't expect a big hurray but as the mailing list is searchabl +e these references are very valuable. + Let's help to create a climate where information is shared. +\layout Section -The port specific options appear after the global options in the sdcc --help - output. -\layout Subsubsection +Memory Models +\layout Subsection -General Options -\layout Standard +MCS51 Memory Models +\begin_inset LatexCommand \index{Memory model} -General options enable certain port features and optimizations. -\layout List -\labelwidthstring 00.00.0000 +\end_inset -- -\begin_inset ERT -status Collapsed -\layout Standard +\begin_inset LatexCommand \index{MCS51 memory model} -\backslash -/ \end_inset --stack-model=[model] Used in conjuction with the command above. - Defines the stack model to be used, valid stack models are : -\begin_deeper -\layout List -\labelwidthstring 00.00.0000 - -\emph on -small -\emph default - Selects small stack model. - 8 bit stack and frame pointers. - Supports 256 bytes stack size. -\layout List -\labelwidthstring 00.00.0000 +\layout Subsubsection +Small, Medium and Large +\layout Standard -\emph on +SDCC allows three memory models for MCS51 code, +\shape slanted +small, medium +\shape default + and +\shape slanted large +\shape default +. + Modules compiled with different memory models should +\emph on +never \emph default - Selects large stack model. - 16 bit stack and frame pointers. - Supports 65536 bytes stack size. -\end_deeper -\layout List -\labelwidthstring 00.00.0000 + be combined together or the results would be unpredictable. + The library routines supplied with the compiler are compiled as small, + medium and large. + The compiled library modules are contained in separate directories as small, + medium and large so that you can link to the appropriate set. +\layout Standard -- -\begin_inset ERT -status Collapsed +When the medium or large model is used all variables declared without a + storage class will be allocated into the external ram, this includes all + parameters and local variables (for non-reentrant +\begin_inset LatexCommand \index{reentrant} + +\end_inset + functions). + When the small model is used variables without storage class are allocated + in the internal ram. \layout Standard -\backslash -/ -\end_inset +Judicious usage of the processor specific storage classes +\begin_inset LatexCommand \index{Storage class} --preplace-udata-with=[kword] Replaces the default udata keyword for allocating - unitialized data variables with [kword]. - Valid keywords are: "udata_acs", "udata_shr", "udata_ovr". -\layout List -\labelwidthstring 00.00.0000 +\end_inset -- -\begin_inset ERT -status Collapsed + and the 'reentrant' function type will yield much more efficient code, + than using the large model. + Several optimizations are disabled when the program is compiled using the + large model, it is therefore recommended that the small model be used unless + absolutely required. +\layout Subsubsection -\layout Standard +External Stack +\begin_inset LatexCommand \label{sub:External-Stack} -\backslash -/ \end_inset --ivt-loc positions the Interrupt Vector Table at location . - Useful for bootloaders. -\layout List -\labelwidthstring 00.00.0000 - -- -\begin_inset ERT -status Collapsed -\layout Standard +\begin_inset LatexCommand \index{stack} -\backslash -/ \end_inset --asm= sets the full path and name of an external assembler to call. -\layout List -\labelwidthstring 00.00.0000 - -- -\begin_inset ERT -status Collapsed -\layout Standard +\begin_inset LatexCommand \index{External stack (mcs51)} -\backslash -/ \end_inset --link= sets the full path and name of an external linker to call. -\layout List -\labelwidthstring 00.00.0000 -- +\layout Standard + +The external stack (- \begin_inset ERT status Collapsed @@ -18465,20 +18319,20 @@ status Collapsed / \end_inset --mplab-comp MPLAB -\begin_inset LatexCommand \index{PIC16!MPLAB} +-xstack option +\begin_inset LatexCommand \index{-\/-xstack} \end_inset - compatibility option. - Currently only suppresses special gpasm directives. -\layout Subsubsection +) is located in pdata +\begin_inset LatexCommand \index{pdata (mcs51, ds390 storage class)} -Optimization Options -\layout List -\labelwidthstring 00.00.0000 +\end_inset -- + memory (usually at the start of the external ram segment) and uses all + unused space in pdata (max. + 256 bytes). + When - \begin_inset ERT status Collapsed @@ -18488,11 +18342,15 @@ status Collapsed / \end_inset --optimize-goto Try to use (conditional) BRA instead of GOTO -\layout List -\labelwidthstring 00.00.0000 +-xstack option is used to compile the program, the parameters and local + variables +\begin_inset LatexCommand \index{local variables} -- +\end_inset + + of all reentrant functions are allocated in this area. + This option is provided for programs with large stack space requirements. + When used with the - \begin_inset ERT status Collapsed @@ -18502,79 +18360,84 @@ status Collapsed / \end_inset --optimize-cmp Try to optimize some compares. -\layout List -\labelwidthstring 00.00.0000 +-stack-auto +\begin_inset LatexCommand \index{-\/-stack-auto} -- -\begin_inset ERT -status Collapsed +\end_inset + option, all parameters and local variables are allocated on the external + stack (note: support libraries will need to be recompiled with the same + options. + There is a predefined target in the library makefile). \layout Standard -\backslash -/ +The compiler outputs the higher order address byte of the external ram segment + into port P2 +\begin_inset LatexCommand \index{P2 (mcs51 sfr)} + \end_inset --optimize-df Analyze the dataflow of the generated code and improve it. -\layout List -\labelwidthstring 00.00.0000 + (see also section +\begin_inset LatexCommand \ref{sub:MCS51-variants} -- -\begin_inset ERT -status Collapsed +\end_inset -\layout Standard +), therefore when using the External Stack option, this port +\emph on +may not +\emph default + be used by the application program. +\layout Subsection + +DS390 Memory Model +\begin_inset LatexCommand \index{Memory model} -\backslash -/ \end_inset --obanksel=nn Set optimization level for inserting BANKSELs. -\newline -\begin_deeper -\layout List -\labelwidthstring 00.00.0000 +\begin_inset LatexCommand \index{DS390 memory model} -0 no optimization -\layout List -\labelwidthstring 00.00.0000 +\end_inset -1 checks previous used register and if it is the same then does not emit - BANKSEL, accounts only for labels. -\layout List -\labelwidthstring 00.00.0000 -2 tries to check the location of (even different) symbols and removes BANKSELs - if they are in the same bank. - -\newline +\layout Standard -\emph on -Important: There might be problems if the linker script has data sections - across bank borders! -\end_deeper -\layout Subsubsection +The only model supported is Flat 24 +\begin_inset LatexCommand \index{Flat 24 (DS390 memory model)} -Linking Options -\layout List -\labelwidthstring 00.00.0000 +\end_inset -- -\begin_inset ERT -status Collapsed +. + This generates code for the 24 bit contiguous addressing mode of the Dallas + DS80C390 part. + In this mode, up to four meg of external RAM or code space can be directly + addressed. + See the data sheets at www.dalsemi.com for further information on this part. +\newline -\layout Standard +\newline +Note that the compiler does not generate any code to place the processor + into 24 bitmode (although +\emph on +tinibios +\emph default + in the ds390 libraries will do that for you). + If you don't use +\emph on +tinibios +\emph default + +\begin_inset LatexCommand \index{Tinibios (DS390)} -\backslash -/ \end_inset --nodefaultlibs do not link default libraries when linking -\layout List -\labelwidthstring 00.00.0000 +, the boot loader or similar code must ensure that the processor is in 24 + bit contiguous addressing mode before calling the SDCC startup code. +\newline +\newline +Like the +\emph on - \begin_inset ERT status Collapsed @@ -18585,11 +18448,15 @@ status Collapsed / \end_inset --no-crt Don't link the default run-time modules -\layout List -\labelwidthstring 00.00.0000 +-model-large +\emph default + option, variables will by default be placed into the XDATA segment. + +\newline -- +\newline +Segments may be placed anywhere in the 4 meg address space using the usual + - \begin_inset ERT status Collapsed @@ -18599,91 +18466,98 @@ status Collapsed / \end_inset --use-crt= Use a custom run-time module instead of the defaults. -\layout Subsubsection +-*-loc options. + Note that if any segments are located above 64K, the -r flag must be passed + to the linker to generate the proper segment relocations, and the Intel + HEX output format must be used. + The -r flag can be passed to the linker by using the option +\emph on +-Wl-r +\emph default + on the SDCC command line. + However, currently the linker can not handle code segments > 64k. +\layout Section -Debugging Options -\layout Standard +Pragmas +\begin_inset LatexCommand \label{sec:Pragmas} -Debugging options enable extra debugging information in the output files. -\layout List -\labelwidthstring 00.00.0000 +\end_inset -- -\begin_inset ERT -status Collapsed -\layout Standard +\begin_inset LatexCommand \index{Pragmas} -\backslash -/ \end_inset --debug-xtra Similar to - -\begin_inset ERT -status Collapsed \layout Standard -\backslash -/ -\end_inset +SDCC supports the following #pragma directives: +\layout Itemize --debug -\begin_inset LatexCommand \index{-\/-debug} + +\series bold +save +\series default + +\begin_inset LatexCommand \index{\#pragma save} \end_inset -, but dumps more information. -\layout List -\labelwidthstring 00.00.0000 + - this will save most current options to the save/restore stack. + See #pragma\SpecialChar ~ +restore. +\layout Itemize -- -\begin_inset ERT -status Collapsed -\layout Standard +\series bold +restore +\series default + +\begin_inset LatexCommand \index{\#pragma restore} -\backslash -/ \end_inset --debug-ralloc Force register allocator to dump .d file with debugging - information. - is the name of the file compiled. -\layout List -\labelwidthstring 00.00.0000 + - will restore saved options from the last save. + saves & restores can be nested. + SDCC uses a save/restore stack: save pushes current options to the stack, + restore pulls current options from the stack. + See #pragma\SpecialChar ~ +save. +\newline -- -\begin_inset ERT -status Collapsed +\layout Itemize -\layout Standard -\backslash -/ -\end_inset +\series bold +callee_saves +\series default --pcode-verbose Enable pcode debugging information in translation. -\layout List -\labelwidthstring 00.00.0000 +\begin_inset LatexCommand \index{\#pragma callee\_saves} -- -\begin_inset ERT -status Collapsed +\end_inset -\layout Standard -\backslash -/ +\begin_inset LatexCommand \index{function prologue} + \end_inset --denable-peeps Force the usage of peepholes. - Use with care. -\layout List -\labelwidthstring 00.00.0000 + function1[,function2[,function3...]] - The compiler by default uses a caller + saves convention for register saving across function calls, however this + can cause unnecessary register pushing & popping +\begin_inset LatexCommand \index{push/pop} -- +\end_inset + + when calling small functions from larger functions. + This option can be used to switch off the register saving convention for + the function names specified. + The compiler will not save registers when calling these functions, extra + code need to be manually inserted at the entry & exit for these functions + to save & restore the registers used by these functions, this can SUBSTANTIALLY + reduce code & improve run time performance of the generated code. + In the future the compiler (with inter procedural analysis) may be able + to determine the appropriate scheme to use for each function call. + If - \begin_inset ERT status Collapsed @@ -18693,668 +18567,718 @@ status Collapsed / \end_inset --gstack Trace push/pops for stack pointer overflow -\layout List -\labelwidthstring 00.00.0000 - -- -\begin_inset ERT -status Collapsed - -\layout Standard +-callee-saves command line option is used, the function names specified + in #pragma\SpecialChar ~ +callee_saves +\begin_inset LatexCommand \index{\#pragma callee\_saves} -\backslash -/ \end_inset --call-tree dump call tree in .calltree file -\layout Subsection + is appended to the list of functions specified in the command line. +\layout Itemize -Enviromental Variables -\layout Standard -There is a number of enviromental variables that can be used when running - SDCC to enable certain optimizations or force a specific program behaviour. - these variables are primarily for debugging purposes so they can be enabled/dis -abled at will. -\layout Standard +\series bold +exclude +\series default -Currently there is only two such variables available: -\layout List -\labelwidthstring 00.00.0000 +\begin_inset LatexCommand \index{\#pragma exclude} -OPTIMIZE_BITFIELD_POINTER_GET when this variable exists reading of structure - bitfields is optimized by directly loading FSR0 with the address of the - bitfield structure. - Normally SDCC will cast the bitfield structure to a bitfield pointer and - then load FSR0. - This step saves data ram and code space for functions that perform heavy - use of bitfields. - (ie. - 80 bytes of code space are saved when compiling malloc.c with this option). - -\layout List -\labelwidthstring 00.00.0000 +\end_inset -NO_REG_OPT do not perform pCode registers optimization. - This should be used for debugging purposes. - In some where bugs in the pcode optimizer are found, users can benefit - from temporarily disabling the optimizer until the bug is fixed. -\layout Subsection + none | {acc[,b[,dpl[,dph]]] - The exclude pragma disables the generation + of pairs of push/pop +\begin_inset LatexCommand \index{push/pop} -Preprocessor Macros -\layout Standard +\end_inset -PIC16 -\begin_inset LatexCommand \index{PIC16} + instructions in +\emph on +I +\emph default +nterrupt +\begin_inset LatexCommand \index{interrupt} \end_inset - port defines the following preprocessor macros while translating a source. -\layout Standard -\align center + +\emph on +S +\emph default +ervice +\emph on +R +\emph default +outines. + The directive should be placed immediately before the ISR function definition + and it affects ALL ISR functions following it. + To enable the normal register saving for ISR functions use #pragma\SpecialChar ~ +exclude\SpecialChar ~ +none +\begin_inset LatexCommand \index{\#pragma exclude} -\begin_inset Tabular - - - - - - -\begin_inset Text +\end_inset -\layout Standard +. + See also the related keyword _naked +\begin_inset LatexCommand \index{\_naked} -Macro \end_inset - - -\begin_inset Text -\layout Standard -Description +\begin_inset LatexCommand \index{\_\_naked} + \end_inset - - - - -\begin_inset Text -\layout Standard +. +\layout Itemize -SDCC_pic16 -\end_inset - - -\begin_inset Text -\layout Standard +\series bold +less_pedantic +\series default + +\begin_inset LatexCommand \index{\#pragma less\_pedantic} -Port identification \end_inset - - - - -\begin_inset Text -\layout Standard + - the compiler will not warn you anymore for obvious mistakes, you'r on + your own now ;-( +\layout Itemize -_ -\begin_inset ERT -status Collapsed -\layout Standard +\series bold +disable_warning +\series default + +\begin_inset LatexCommand \index{\#pragma disable\_warning} -\backslash -/ \end_inset -_pic16 -\end_inset - - -\begin_inset Text + - the compiler will not warn you anymore about warning number . +\layout Itemize -\layout Standard -Port identification (same as above) -\end_inset - - - - -\begin_inset Text +\series bold +nogcse +\series default -\layout Standard +\begin_inset LatexCommand \index{\#pragma nogcse} -pic18fxxxx \end_inset - - -\begin_inset Text - -\layout Standard -MCU Identification. - -\emph on -xxxx -\emph default - is the microcontrol identification number, i.e. - 452, 6620, etc -\end_inset - - - - -\begin_inset Text + - will stop global common subexpression elimination. +\layout Itemize -\layout Standard -_ -\begin_inset ERT -status Collapsed +\series bold +noinduction +\series default -\layout Standard +\begin_inset LatexCommand \index{\#pragma noinduction} -\backslash -/ \end_inset -_18Fxxxx -\end_inset - - -\begin_inset Text + - will stop loop induction optimizations. +\layout Itemize -\layout Standard -MCU Identification (same as above) -\end_inset - - - - -\begin_inset Text +\series bold +noinvariant +\series default -\layout Standard +\begin_inset LatexCommand \index{\#pragma noinvariant} -STACK_MODEL_nnn \end_inset - - -\begin_inset Text -\layout Standard + - will not do loop invariant optimizations. + For more details see Loop Invariants in section +\begin_inset LatexCommand \ref{sub:Loop-Optimizations} -nnn = SMALL or LARGE respectively according to the stack model used \end_inset - - - -\end_inset +. +\layout Itemize -\layout Standard +\series bold +noiv +\series default -In addition the following macros are defined when calling assembler: -\layout Standard -\align center +\begin_inset LatexCommand \index{\#pragma noiv} -\begin_inset Tabular - - - - - - -\begin_inset Text +\end_inset -\layout Standard + - Do not generate interrupt +\begin_inset LatexCommand \index{interrupt} -Macro \end_inset - - -\begin_inset Text -\layout Standard + vector table +\begin_inset LatexCommand \index{interrupt vector table} -Description \end_inset - - - - -\begin_inset Text -\layout Standard + entries for all ISR functions defined after the pragma. + This is useful in cases where the interrupt vector table must be defined + manually, or when there is a secondary, manually defined interrupt vector + table (e.g. + for the autovector feature of the Cypress EZ-USB FX2). + More elegantly this can be achieved by obmitting the optional interrupt + number after the interrupt keyword, see section +\begin_inset LatexCommand \ref{sub:Interrupt-Service-Routines} -__18Fxxxx \end_inset - - -\begin_inset Text - -\layout Standard -MCU Identification. - -\emph on -xxxx -\emph default - is the microcontrol identification number, i.e. - 452, 6620, etc -\end_inset - - - - -\begin_inset Text +\SpecialChar ~ +about interrupts. +\layout Itemize -\layout Standard -SDCC_MODEL_nnn -\end_inset - - -\begin_inset Text +\series bold +nojtbound +\series default -\layout Standard +\begin_inset LatexCommand \index{\#pragma nojtbound} -nnn = SMALL or LARGE respectively according to the memory model used for - SDCC \end_inset - - - - -\begin_inset Text -\layout Standard + - will not generate code for boundary value checking, when switch statements + are turned into jump-tables (dangerous). + For more details see section +\begin_inset LatexCommand \ref{sub:'switch'-Statements} -STACK_MODEL_nnn \end_inset - - -\begin_inset Text -\layout Standard +. +\layout Itemize -nnn = SMALL or LARGE respectively according to the stack model used -\end_inset - - - + +\series bold +noloopreverse +\series default + +\begin_inset LatexCommand \index{\#pragma noloopreverse} \end_inset + - Will not do loop reversal optimization +\layout Itemize -\layout Subsection -Directories -\layout Standard +\series bold +nooverlay +\series default -PIC16 -\begin_inset LatexCommand \index{PIC16} +\begin_inset LatexCommand \index{\#pragma nooverlay} \end_inset - port uses the following directories for searching header files and libraries. -\layout Standard -\align center - -\begin_inset Tabular - - - - - - - - -\begin_inset Text + - the compiler will not overlay the parameters and local variables of a + function. +\layout Itemize -\layout Standard -Directory -\end_inset - - -\begin_inset Text +\series bold +stackauto +\series default -\layout Standard +\begin_inset LatexCommand \index{\#pragma stackauto} -Description \end_inset - - -\begin_inset Text + +- See option - +\begin_inset ERT +status Collapsed \layout Standard -Target +\backslash +/ \end_inset - - -\begin_inset Text -\layout Standard +-stack-auto +\begin_inset LatexCommand \index{-\/-stack-auto} -Command prefix \end_inset - - - - -\begin_inset Text -\layout Standard + and section +\begin_inset LatexCommand \ref{sec:Parameters-and-Local-Variables} -PREFIX/sdcc/include/pic16 \end_inset - - -\begin_inset Text -\layout Standard + Parameters and Local Variables. +\layout Itemize -PIC16 specific headers -\end_inset - - -\begin_inset Text -\layout Standard +\series bold +opt_code_speed +\series default + +\begin_inset LatexCommand \index{\#pragma opt\_code\_speed} -Compiler \end_inset - - -\begin_inset Text -\layout Standard +- The compiler will optimize code generation towards fast code, possibly + at the expense of code size. + Currently this has little effect. +\layout Itemize --I -\end_inset - - - - -\begin_inset Text -\layout Standard +\series bold +opt_code_size +\series default + +\begin_inset LatexCommand \index{\#pragma opt\_code\_size} -PREFIX/sdcc/lib/pic16 \end_inset - - -\begin_inset Text -\layout Standard +- The compiler will optimize code generation towards compact code, possibly + at the expense of code speed. + Currently this has little effect. +\layout Itemize -PIC16 specific libraries -\end_inset - - -\begin_inset Text -\layout Standard +\series bold +opt_code_balanced +\series default + +\begin_inset LatexCommand \index{\#pragma opt\_code\_balanced} -Linker \end_inset - - -\begin_inset Text -\layout Standard +- The compiler will attempt to generate code that is both compact and fast, + as long as meeting one goal is not a detriment to the other (this is the + default). + +\layout Itemize --L -\end_inset - - - + +\series bold +std_sdcc89 +\series default + +\begin_inset LatexCommand \index{\#pragma std\_sdcc89} \end_inset +- Generally follow the C89 standard, but allow SDCC features that conflict + with the standard (default). +\layout Itemize -\layout Subsection -Pragmas -\begin_inset LatexCommand \label{sub:PIC16_Pragmas} +\series bold +std_c89 +\series default + +\begin_inset LatexCommand \index{\#pragma std\_c89} \end_inset +- Follow the C89 standard and disable SDCC features that conflict with the + standard. +\layout Itemize -\layout Standard -PIC16 -\begin_inset LatexCommand \index{PIC16} +\series bold +std_sdcc99 +\series default + +\begin_inset LatexCommand \index{\#pragma std\_sdcc99} \end_inset - port currently supports the following pragmas: -\layout List -\labelwidthstring 00.00.0000 - -stack -\begin_inset LatexCommand \index{PIC16!Pragmas!\#pragma stack} +- Generally follow the C99 standard, but allow SDCC features that conflict + with the standard (incomplete support). +\layout Itemize -\end_inset - pragma stack -\begin_inset LatexCommand \index{PIC16!stack} +\series bold +std_c99 +\series default + +\begin_inset LatexCommand \index{\#pragma std\_c99} \end_inset - forces the code generator to initialize the stack & frame pointers at a - specific address. - This is an adhoc solution for cases where no STACK directive is available - in the linker script or gplink is not instructed to create a stack section. -\newline -The stack pragma should be used only once in a project. - Multiple pragmas may result in indeterminate behaviour of the program. -\begin_inset Foot -collapsed false +- Follow the C99 standard and disable SDCC features that conflict with the + standard (incomplete support). +\layout Itemize -\layout Standard -The old format (ie. - #pragma stack 0x5ff) is deprecated and will cause the stack pointer to - cross page boundaries (or even exceed the available data RAM) and crash - the program. - Make sure that stack does not cross page boundaries when using the SMALL - stack model. -\end_inset +\series bold +codeseg +\series default + +\begin_inset LatexCommand \index{\#pragma codeseg} +\end_inset -\newline -The format is as follows: -\layout LyX-Code +- Use this name (max. + 8 characters) for the code segment. + See option - +\begin_inset ERT +status Collapsed -#pragma stack bottom_address [stack_size] \layout Standard +\backslash +/ +\end_inset -\emph on -bottom_address -\emph default - is the lower bound of the stack section. - The stack pointer initially will point at address (bottom_address+stack_size-1). -\layout LyX-Code - -Example: -\layout LyX-Code +-codeseg. +\layout Itemize -\layout LyX-Code -/* initializes stack of 100 bytes at RAM address 0x200 */ -\layout LyX-Code +\series bold +constseg +\series default + +\begin_inset LatexCommand \index{\#pragma constseg} -#pragma stack 0x200 100 -\layout Standard +\end_inset -If the stack_size field is omitted then a stack is created with the default - size of 64. - This size might be enough for most programs, but its not enough for operations - with deep function nesting or excessive stack usage. -\layout List -\labelwidthstring 00.00.0000 +- Use this name (max. + 8 characters) for the const segment. + See option - +\begin_inset ERT +status Collapsed -code -\begin_inset LatexCommand \index{PIC16!Pragmas!\#pragma code} +\layout Standard +\backslash +/ \end_inset - place a function symbol at static FLASH address -\layout LyX-Code +-constseg. +\layout Standard -Example: -\layout LyX-Code +The preprocessor SDCPP +\begin_inset LatexCommand \index{sdcpp (preprocessor)} -\layout LyX-Code +\end_inset -/* place function test_func at 0x4000 */ -\layout LyX-Code + supports the following #pragma directives: +\layout Itemize -#pragma code test_func 0x4000 -\layout LyX-Code -\layout List -\labelwidthstring 00.00.0000 +\series bold +pedantic_parse_number +\series default -library instructs the linker to use a library module. -\newline -Usage: -\layout LyX-Code +\begin_inset LatexCommand \index{\#pragma pedantic\_parse\_number} -#pragma library module_name -\layout Standard +\end_inset + (+ | -) - Pedantic parse numbers so that situations like 0xfe-LO_B(3) are + parsed properly and the macro LO_B(3) gets expanded. + Default is off. + Below is an example on how to use this pragma. \emph on -module_name -\emph default - can be any library or object file (including its path). - Note that there are four reserved keywords which have special meaning. - These are: -\layout Standard -\align center + Note: this functionality is not in conformance with standard! +\layout Verse -\begin_inset Tabular - - - - - - - -\begin_inset Text -\layout Standard +\family typewriter +#pragma pedantic_parse_number + +\begin_inset LatexCommand \index{\#pragma pedantic\_parse\_number} -Keyword \end_inset - - -\begin_inset Text -\layout Standard -Description -\end_inset - - -\begin_inset Text +\newline -\layout Standard +\newline +#define LO_B(x) ((x) & 0xff) +\newline -Module to link -\end_inset - - - - -\begin_inset Text +\newline +unsigned char foo(void) +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +unsigned char c=0xfe-LO_B(3); +\newline -\layout Standard +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +return c; +\newline +} +\newline + +\layout Itemize \series bold -ignore -\end_inset - - -\begin_inset Text +preproc_asm +\series default -\layout Standard +\begin_inset LatexCommand \index{\#pragma preproc\_asm} -ignore all library pragmas \end_inset - - -\begin_inset Text -\layout Standard + (+ | -) - switch _asm _endasm block preprocessing on / off. + Default is on. + You use this prama to define multilines of assembly code. + This will prevent the preprocessor from changing the formating required + by assembly code. + Below is an example on how to use this pragma. +\layout Verse -\emph on -(none) +\family typewriter +#pragma preproc_asm - +\begin_inset LatexCommand \index{\#pragma preproc\_asm} + \end_inset - - - - -\begin_inset Text -\layout Standard +\newline +#define MYDELAY _asm +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +nop ;my assembly comment... +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +nop +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +nop +\newline +_endasm +\newline +#pragma preproc_asm + +\newline -\series bold -c -\end_inset - - -\begin_inset Text +\newline +void foo (void) +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + ... + +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + MYDELAY; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + ... + +\newline +} +\newline -\layout Standard +\layout Itemize -link the C library -\end_inset - - -\begin_inset Text -\layout Standard +\series bold +sdcc_hash +\series default +\begin_inset LatexCommand \index{\#pragma sdcc\_hash} -\emph on -libc18f -\emph default -.lib \end_inset - - - - -\begin_inset Text -\layout Standard + (+ | -) - Allow "naked" hash in macro definition, for example: +\newline +\family typewriter +#define DIR_LO(x) #(x & 0xff) +\family default + +\newline +Default is off. + Below is an example on how to use this pragma. +\layout Verse + + +\family typewriter +#pragma preproc_asm + +\newline +#pragma sdcc_hash + +\begin_inset LatexCommand \index{\#pragma sdcc\_hash} -\series bold -math \end_inset - + + +\newline + +\newline +#define ROMCALL(x) +\backslash + +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov R6_B3, #(x & 0xff) +\backslash + +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov R7_B3, #((x >> 8) & 0xff) +\backslash + +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +lcall __romcall +\newline + +\newline +... +\newline +_asm +\newline +ROMCALL(72) +\newline +_endasm; +\newline +... +\newline + +\layout Standard + +The pragma's are intended to be used to turn-on or off certain optimizations + which might cause the compiler to generate extra stack / data space to + store compiler generated temporary variables. + This usually happens in large functions. + Pragma directives should be used as shown in the following example, they + are used to control options & optimizations for a given function; pragmas + should be placed before and/or after a function, placing pragma's inside + a function body could have unpredictable results. +\layout Verse + + +\family typewriter +#pragma save +\begin_inset LatexCommand \index{\#pragma save} + +\end_inset + + \SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* save the current settings */ +\newline +#pragma nogcse +\begin_inset LatexCommand \index{\#pragma nogcse} + +\end_inset + + \SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* turnoff global subexpression elimination */ +\newline +#pragma noinduction +\begin_inset LatexCommand \index{\#pragma noinduction} + +\end_inset + + /* turn off induction optimizations */ +\newline +int foo () +\newline +{ +\newline +\SpecialChar ~ + \SpecialChar ~ + ... + +\newline +\SpecialChar ~ + \SpecialChar ~ + /* large code */ +\newline +\SpecialChar ~ + \SpecialChar ~ + ... + +\newline +} +\newline +#pragma restore +\begin_inset LatexCommand \index{\#pragma restore} + +\end_inset + + /* turn the optimizations back on */ +\layout Standard + +The compiler will generate a warning message when extra space is allocated. + It is strongly recommended that the save and restore pragma's be used when + changing options for a function. +\newline + +\newline + +\newline + +\layout Section + +Defines Created by the Compiler +\layout Standard + +The compiler creates the following #defines +\begin_inset LatexCommand \index{\#defines} + +\end_inset + + +\begin_inset LatexCommand \index{Defines created by the compiler} + +\end_inset + +: +\newline + +\layout Standard + + +\begin_inset Tabular + + + + + \begin_inset Text \layout Standard -link the Math libarary + +\series bold +#define \end_inset @@ -19363,10 +19287,8 @@ link the Math libarary \layout Standard -\emph on -libm18f -\emph default -.lib +\series bold +Description \end_inset @@ -19376,17 +19298,12 @@ libm18f \layout Standard +SDCC +\begin_inset LatexCommand \index{SDCC} -\series bold -io \end_inset - - -\begin_inset Text -\layout Standard - -link the I/O library + \end_inset @@ -19394,31 +19311,34 @@ link the I/O library \layout Standard - -\emph on -libio18f* -\emph default -.lib +Always defined. + Since version 2.5.6 the version number as an int (ex. + 256) \end_inset - + \begin_inset Text \layout Standard +SDCC_mcs51 +\begin_inset LatexCommand \index{SDCC\_mcs51} + +\end_inset + + or SDCC_ds390 +\begin_inset LatexCommand \index{SDCC\_ds390} -\series bold -debug \end_inset - - -\begin_inset Text -\layout Standard + or SDCC_z80 +\begin_inset LatexCommand \index{SDCC\_z80} -link the debug library +\end_inset + +, etc. \end_inset @@ -19426,303 +19346,246 @@ link the debug library \layout Standard - -\emph on -libdebug -\emph default -.lib +depending on the model used (e.g.: -mds390) \end_inset - + + +\begin_inset Text -\end_inset +\layout Standard +__mcs51 +\begin_inset LatexCommand \index{\_\_mcs51} -\newline -* is the device number, i.e. - 452 for PIC18F452 MCU. -\layout Standard +\end_inset -This feature allows for linking with specific libraries withoug having to - explicit name them in the command line. - Note that the -\noun on -ignore -\noun default - keyword will reject all modules specified by the library pragma. -\layout List -\labelwidthstring 00.00.0000 +, __ds390 +\begin_inset LatexCommand \index{\_\_ds390} -udata pragma udata instructs the compiler to emit code so that linker will - place a variable at a specific memory bank -\layout LyX-Code +\end_inset -Example: -\layout LyX-Code +, __hc08 +\begin_inset LatexCommand \index{\_\_hc08} -\layout LyX-Code +\end_inset -/* places variable foo at bank2 */ -\layout LyX-Code +, __z80 +\begin_inset LatexCommand \index{\_\_z80} -#pragma udata bank2 foo -\layout LyX-Code +\end_inset -char foo; -\layout Standard +, etc +\end_inset + + +\begin_inset Text -In order for this pragma to work extra SECTION directives should be added - in the .lkr script. - In the following example a sample .lkr file is shown: -\layout LyX-Code +\layout Standard -\layout LyX-Code +depending on the model used (e.g. + -mz80) +\end_inset + + + + +\begin_inset Text -// Sample linker script for the PIC18F452 processor -\layout LyX-Code +\layout Standard -LIBPATH . -\layout LyX-Code +SDCC_STACK_AUTO +\begin_inset LatexCommand \index{SDCC\_STACK\_AUTO} -CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED -\layout LyX-Code +\end_inset -CODEPAGE NAME=page START=0x2A END=0x7FFF -\layout LyX-Code -CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED -\layout LyX-Code +\end_inset + + +\begin_inset Text -CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED -\layout LyX-Code +\layout Standard -CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED -\layout LyX-Code +when +\emph on +- +\begin_inset ERT +status Collapsed -CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED -\layout LyX-Code +\layout Standard -ACCESSBANK NAME=accessram START=0x0 END=0x7F -\layout LyX-Code +\backslash +/ +\end_inset -\layout LyX-Code +-stack-auto +\emph default + option is used +\end_inset + + + + +\begin_inset Text -DATABANK NAME=gpr0 START=0x80 END=0xFF -\layout LyX-Code +\layout Standard -DATABANK NAME=gpr1 START=0x100 END=0x1FF -\layout LyX-Code +SDCC_MODEL_SMALL +\begin_inset LatexCommand \index{SDCC\_MODEL\_SMALL} -DATABANK NAME=gpr2 START=0x200 END=0x2FF -\layout LyX-Code +\end_inset -DATABANK NAME=gpr3 START=0x300 END=0x3FF -\layout LyX-Code -DATABANK NAME=gpr4 START=0x400 END=0x4FF -\layout LyX-Code +\end_inset + + +\begin_inset Text -DATABANK NAME=gpr5 START=0x500 END=0x5FF -\layout LyX-Code +\layout Standard -ACCESSBANK NAME=accesssfr START=0xF80 END=0xFFF PROTECTED -\layout LyX-Code +when +\emph on +- +\begin_inset ERT +status Collapsed -\layout LyX-Code +\layout Standard -SECTION NAME=CONFIG ROM=config -\layout LyX-Code +\backslash +/ +\end_inset -\layout LyX-Code +-model-small +\emph default + is used +\end_inset + + + + +\begin_inset Text -SECTION NAME=bank0 RAM=gpr0 # these SECTION directives -\layout LyX-Code +\layout Standard -SECTION NAME=bank1 RAM=gpr1 # should be added to link -\layout LyX-Code +SDCC_MODEL_MEDIUM +\begin_inset LatexCommand \index{SDCC\_MODEL\_MEDIUM} -SECTION NAME=bank2 RAM=gpr2 # section name 'bank?' with -\layout LyX-Code +\end_inset -SECTION NAME=bank3 RAM=gpr3 # a specific DATABANK name -\layout LyX-Code -SECTION NAME=bank4 RAM=gpr4 -\layout LyX-Code +\end_inset + + +\begin_inset Text -SECTION NAME=bank5 RAM=gpr5 \layout Standard -The linker will recognise the section name set in the pragma statement and - will position the variable at the memory bank set with the RAM field at - the SECTION line in the linker script file. -\layout Subsection +when +\emph on +- +\begin_inset ERT +status Collapsed -Header Files -\begin_inset LatexCommand \label{sub:PIC16_Header-Files} +\layout Standard +\backslash +/ \end_inset +-model-medium +\emph default + is used +\end_inset + + + + +\begin_inset Text \layout Standard -There is one main header file -\begin_inset LatexCommand \index{PIC16!Header files} +SDCC_MODEL_LARGE +\begin_inset LatexCommand \index{SDCC\_MODEL\_LARGE} \end_inset - that can be included to the source files using the pic16 -\begin_inset LatexCommand \index{PIC16} \end_inset + + +\begin_inset Text - port. - That file is the -\series bold -pic18fregs.h -\series default -. - This header file contains the definitions for the processor special registers, - so it is necessary if the source accesses them. - It can be included by adding the following line in the beginning of the - file: -\layout LyX-Code - -#include \layout Standard -The specific microcontroller is selected within the pic18fregs.h automatically, - so the same source can be used with a variety of devices. -\layout Subsection +when +\emph on +- +\begin_inset ERT +status Collapsed -Libraries \layout Standard -The libraries -\begin_inset LatexCommand \index{PIC16!Libraries} - +\backslash +/ \end_inset - that PIC16 -\begin_inset LatexCommand \index{PIC16} - +-model-large +\emph default + is used \end_inset + + + + +\begin_inset Text - port depends on are the microcontroller device libraries which contain - the symbol definitions for the microcontroller special function registers. - These libraries have the format pic18fxxxx.lib, where -\emph on -xxxx -\emph default - is the microcontroller identification number. - The specific library is selected automatically by the compiler at link - stage according to the selected device. \layout Standard -Libraries are created with gplib which is part of the gputils package -\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils} +SDCC_USE_XSTACK +\begin_inset LatexCommand \index{SDCC\_USE\_XSTACK} \end_inset -. -\layout Subsubsection* -Building the libraries -\layout Standard +\end_inset + + +\begin_inset Text -Before using SDCC/pic16 there are some libraries that need to be compiled. - This process is not done automatically by SDCC since not all users use - SDCC for pic16 projects. - So each user should compile the libraries separately. \layout Standard -The steps to compile the pic16 libraries under Linux are: -\layout LyX-Code +when +\emph on +- +\begin_inset ERT +status Collapsed -cd device/lib/pic16 -\layout LyX-Code +\layout Standard -./configure -\layout LyX-Code +\backslash +/ +\end_inset -make -\layout LyX-Code +-xstack +\emph default + option is used +\end_inset + + + + +\begin_inset Text -cd .. -\layout LyX-Code +\layout Standard -make model-pic16 -\layout LyX-Code - -su -c 'make install' # install the libraries, you need the root password -\layout Standard - -If you need to install the headers too, do: -\layout LyX-Code - -cd device/include -\layout LyX-Code - -su -c 'make install' # install the headers, you need the root password -\layout Standard - -There exist a special target to build the I/O libraries. - This target is not automatically build because it will build the I/O library - for -\emph on -every -\emph default - supported device. - This way building will take quite a lot of time. - Users are advised to edit the -\series bold -device/lib/pic16/pics.build -\series default - file and then execute: -\layout LyX-Code - -make lib-io -\layout Subsection - -Memory Models -\layout Standard - -The following memory models are supported by the PIC16 port: -\layout Itemize - -small model -\layout Itemize - -large model -\layout Standard - -Memory model affects the default size of pointers within the source. - The sizes are shown in the next table: -\layout Standard -\align center - -\begin_inset Tabular - - - - - - - -\begin_inset Text - -\layout Standard +SDCC_STACK_TENBIT +\begin_inset LatexCommand \index{SDCC\_STACK\_TENBIT} -Pointer sizes according to memory model \end_inset - - -\begin_inset Text - -\layout Standard -small model + \end_inset @@ -19730,7 +19593,11 @@ small model \layout Standard -large model +when +\emph on +-mds390 +\emph default + is used \end_inset @@ -19740,15 +19607,12 @@ large model \layout Standard -code pointers +SDCC_MODEL_FLAT24 +\begin_inset LatexCommand \index{SDCC\_MODEL\_FLAT24} + \end_inset - - -\begin_inset Text -\layout Standard -16-bits \end_inset @@ -19756,501 +19620,712 @@ code pointers \layout Standard -24-bits +when +\emph on +-mds390 +\emph default + is used \end_inset - - -\begin_inset Text - -\layout Standard + -data pointers \end_inset - - -\begin_inset Text -\layout Standard -16-bits -\end_inset - - -\begin_inset Text +\layout Chapter -\layout Standard +Notes on supported Processors +\layout Section + +MCS51 variants +\begin_inset LatexCommand \label{sub:MCS51-variants} -16-bits \end_inset - - - + + +\begin_inset LatexCommand \index{MCS51 variants} \end_inset \layout Standard -It is advisable that all sources within a project are compiled with the - same memory model. - If one wants to override the default memory model, this can be done by - declaring a pointer as -\series bold -far -\series default - or -\series bold -near -\series default -. - Far selects large memory model's pointers, while near selects small memory - model's pointers. +MCS51 processors are available from many vendors and come in many different + flavours. + While they might differ considerably in respect to Special Function Registers + the core MCS51 is usually not modified or is kept compatible. + +\layout Subsection + +pdata access by SFR \layout Standard -The standard device libraries (see -\begin_inset LatexCommand \ref{sub:PIC16_Header-Files} +With the upcome of devices with internal xdata and flash memory devices + using port P2 +\begin_inset LatexCommand \index{P2 (mcs51 sfr)} \end_inset -) contain no reference to pointers, so they can be used with both memory - models. -\layout Subsection + as dedicated I/O port is becoming more popular. + Switching the high byte for pdata +\begin_inset LatexCommand \index{pdata (mcs51, ds390 storage class)} -Stack -\layout Standard +\end_inset -The stack -\begin_inset LatexCommand \index{PIC16!stack} + access which was formerly done by port P2 is then achieved by a Special + Function Register +\begin_inset LatexCommand \index{sfr} \end_inset - implementation for the PIC16 port uses two indirect registers, FSR1 and - FSR2. -\layout List -\labelwidthstring 00.00.0000 +. + In well-established MCS51 tradition the address of this +\emph on +sfr +\emph default + is where the chip designers decided to put it. + Needless to say that they didn't agree on a common name either. + So that the startup code can correctly initialize xdata variables, you + should define an sfr with the name _XPAGE +\family typewriter -FSR1 is assigned as stack pointer -\layout List -\labelwidthstring 00.00.0000 +\begin_inset LatexCommand \index{\_XPAGE (mcs51)} -FSR2 is assigned as frame pointer -\layout Standard +\end_inset -The following stack models are supported by the PIC16 port -\layout Itemize +\family default + at the appropriate location if the default, port P2, is not used for this. + Some examples are: +\layout Verse -\noun on -small -\noun default - model -\layout Itemize +\family typewriter +__sfr __at (0x85) _XPAGE; /* Ramtron VRS51 family a.k.a. + MPAGE */ +\layout Verse -\noun on -large -\noun default - model -\layout Standard +\family typewriter +__sfr __at (0x92) _XPAGE; /* Cypress EZ-USB family, Texas Instruments (Chipcon) + a.k.a. + MPAGE */ +\layout Verse -\noun on -Small -\noun default - model means that only the FSRxL byte is used to access stack and frame, - while -\emph on -\noun on -large -\emph default -\noun default - uses both FSRxL and FSRxH registers. - The following table shows the stack/frame pointers sizes according to stack - model and the maximum space they can address: -\layout Standard -\align center -\begin_inset Tabular - - - - - - - -\begin_inset Text +\family typewriter +__sfr __at (0x91) _XPAGE; /* Infineon (Siemens) C500 family a.k.a. + XPAGE */ +\layout Verse -\layout Standard -Stack & Frame pointer sizes according to stack model -\end_inset - - -\begin_inset Text +\family typewriter +__sfr __at (0xaf) _XPAGE; /* some Silicon Labs (Cygnal) chips a.k.a. + EMI0CN */ +\layout Verse + +\family typewriter +__sfr __at (0xaa) _XPAGE; /* some Silicon Labs (Cygnal) chips a.k.a. + EMI0CN */ \layout Standard -small +For more exotic implementations further customizations may be needed. + See section +\begin_inset LatexCommand \ref{sub:Startup-Code} + \end_inset - - -\begin_inset Text + for other possibilities. +\layout Subsection + +Other Features available by SFR \layout Standard +\added_space_bottom bigskip +Some MCS51 variants offer features like Double DPTR +\begin_inset LatexCommand \index{DPTR} -large \end_inset - - - - -\begin_inset Text +, multiple DPTR, decrementing DPTR, 16x16 Multiply. + These are currently not used for the MCS51 port. + If you absolutely need them you can fall back to inline assembly or submit + a patch to SDCC. +\layout Section + +DS400 port \layout Standard +\added_space_bottom bigskip +The DS80C400 +\begin_inset LatexCommand \index{DS80C400} -Stack pointer FSR1 \end_inset - - -\begin_inset Text -\layout Standard -8-bits +\begin_inset LatexCommand \index{DS400} + \end_inset - - -\begin_inset Text -\layout Standard + microcontroller has a rich set of peripherals. + In its built-in ROM library it includes functions to access some of the + features, among them is a TCP stack with IP4 and IP6 support. + Library headers (currently in beta status) and other files are provided + at +\size footnotesize + +\begin_inset LatexCommand \url{ftp://ftp.dalsemi.com/pub/tini/ds80c400/c_libraries/sdcc/index.html} -16-bits \end_inset - - - - -\begin_inset Text +. + +\layout Section + +The Z80 and gbz80 port \layout Standard -Frame pointer FSR2 +SDCC can target both the Zilog Z80 +\begin_inset LatexCommand \index{Z80} + \end_inset - - -\begin_inset Text -\layout Standard + and the Nintendo Gameboy's Z80-like gbz80 +\begin_inset LatexCommand \index{gbz80 (GameBoy Z80)} -8-bits \end_inset - - -\begin_inset Text -\layout Standard +. + The Z80 port is passed through the same +\emph on +regressions tests +\begin_inset LatexCommand \index{Regression test} -16-bits \end_inset - - - -\end_inset +\emph default + (see section +\begin_inset LatexCommand \ref{sec:Quality-control} + +\end_inset +) as the MCS51 and DS390 ports, so floating point support, support for long + variables and bitfield support is fine. + See mailing lists and forums about interrupt routines. \layout Standard +\added_space_bottom bigskip +As always, the code is the authoritative reference - see z80/ralloc.c and + z80/gen.c. + The stack +\begin_inset LatexCommand \index{Z80!stack} +\end_inset -\noun on -Large -\noun default -stack model is currently not working properly throughout the code generator. - So its use is not advised. - Also there are some other points that need special care: -\newline + frame is similar to that generated by the IAR Z80 compiler. + IX is used as the base pointer, HL and IY are used as a temporary registers, + and BC and DE are available for holding variables. + Return values +\begin_inset LatexCommand \index{Z80!return value} -\layout Enumerate +\end_inset -Do not create stack sections with size more than one physical bank (that - is 256 bytes) -\layout Enumerate + for the Z80 port are stored in L (one byte), HL (two bytes), or DEHL (four + bytes). + The gbz80 port use the same set of registers for the return values, but + in a different order of significance: E (one byte), DE (two bytes), or + HLDE (four bytes). +\layout Section -Stack sections should no cross physical bank limits (i.e. - #pragma stack 0x50 0x100) +The HC08 port \layout Standard -These limitations are caused by the fact that only FSRxL is modified when - using SMALL stack model, so no more than 256 bytes of stack can be used. - This problem will disappear after LARGE model is fully implemented. -\layout Subsection +The port to the Freescale/Motorola HC08 +\begin_inset LatexCommand \index{HC08} -Functions -\layout Standard +\end_inset -In addition to the standard SDCC function keywords, PIC16 -\begin_inset LatexCommand \index{PIC16} + family has been added in October 2003, and is still undergoing some basic + development. + The code generator is complete, but the register allocation is still quite + unoptimized. + Some of the SDCC's standard C library functions have embedded non-HC08 + inline assembly and so are not yet usable. +\layout Standard +\added_space_bottom bigskip \pagebreak_bottom +The HC08 port passes the regression test suite (see section +\begin_inset LatexCommand \ref{sec:Quality-control} \end_inset - port makes available two more: -\layout List -\labelwidthstring 00.00.0000 - -wparam -\begin_inset LatexCommand \index{PIC16!wparam} +). +\layout Section -\end_inset +The PIC14 port +\layout Standard - Use the WREG to pass one byte of the first function argument. - This improves speed but you may not use this for functions with arguments - that are called via function pointers, otherwise the first byte of the - first parameter will get lost. - Usage: -\layout LyX-Code +The 14bit PIC +\begin_inset LatexCommand \index{PIC14} -void func_wparam(int a) wparam -\layout LyX-Code +\end_inset -{ -\layout LyX-Code + port still requires a major effort from the development community. + However it can work for simple code. + It passes its (smaller set of) regression tests +\begin_inset LatexCommand \index{Regression test (PIC14)} - /* WREG hold the lower part of a */ -\layout LyX-Code +\end_inset - /* the high part of a is stored in FSR2+2 (or +3 for large stack model) - */ -\layout LyX-Code + in the directory +\shape italic +sdcc/src/regression +\shape default +. +\layout Subsection -... -\layout LyX-Code +C code and 14bit PIC code page +\begin_inset LatexCommand \index{code page (pic14)} -} -\layout List -\labelwidthstring 00.00.0000 +\end_inset -shadowregs -\begin_inset LatexCommand \index{PIC16!shadowregs} + and RAM banks +\begin_inset LatexCommand \index{RAM bank (pic14)} \end_inset - When entering/exiting an ISR, it is possible to take advantage of the PIC18F - hardware shadow registers which hold the values of WREG, STATUS and BSR - registers. - This can be done by adding the keyword -\emph on -shadowregs -\emph default - before the -\emph on -interrupt -\emph default - keyword in the function's header. -\layout LyX-Code -void isr_shadow(void) shadowregs interrupt 1 -\layout LyX-Code +\layout Standard -{ -\layout LyX-Code +The linker organizes allocation for the code page and RAM banks. + It does not have intimate knowledge of the code flow. + It will put all the code section of a single asm file into a single code + page. + In order to make use of multiple code pages, separate asm files must be + used. + The compiler treats all functions of a single C file as being in the same + code page unless it is non static. +\newline -... -\layout LyX-Code +\newline +To get the best follow these guide lines: +\layout Enumerate -} -\layout Standard +Make local functions static, as non static functions require code page selection + overhead. +\layout Enumerate +For devices that have multiple code pages it is more efficient to use the + same number of files as pages, i.e. + for the 16F877 use 4 separate files and i.e. + for the 16F874 use 2 separate files. + This way the linker can put the code for each file into different code + pages and there's less page selection overhead. +\layout Enumerate -\emph on -shadowregs -\emph default - instructs the code generator not to store/restore WREG, STATUS, BSR when - entering/exiting the ISR. +And as for any 8 bit micro (especially for PIC 14 as they have a very simple + instruction set), use 'unsigned char' whereever possible instead of 'int'. \layout Subsection -Function return values +Creating a device include file \layout Standard -Return values from functions are placed to the appropriate registers following - a modified Microchip policy optimized for SDCC. - The following table shows these registers: -\layout Standard -\align center +For generating a device include file +\begin_inset LatexCommand \index{PIC14!Header files} -\begin_inset Tabular - - - - - - -\begin_inset Text +\end_inset + + use the support perl script inc2h.pl kept in directory support/script. +\layout Subsection +Interrupt code \layout Standard -size +For the interrupt function, use the keyword '__interrupt' +\begin_inset LatexCommand \index{PIC14!interrupt} + \end_inset - - -\begin_inset Text -\layout Standard + with level number of 0 (PIC14 only has 1 interrupt so this number is only + there to avoid a syntax error - it ought to be fixed). + E.g.: +\layout Verse -destination register -\end_inset - - - - -\begin_inset Text +\family typewriter +void Intr(void) __interrupt 0 +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +T0IF = 0; /* Clear timer interrupt */ +\newline +} +\layout Subsection + +Linking and assembling \layout Standard -8 bits +For assembling you can use either GPUTILS' +\begin_inset LatexCommand \index{gputils (pic tools)} + \end_inset - - -\begin_inset Text -\layout Standard + gpasm.exe or MPLAB's mpasmwin.exe. + GPUTILS is available from +\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils} -WREG \end_inset - - - - -\begin_inset Text -\layout Standard +. + For linking you can use either GPUTIL's gplink or MPLAB's mplink.exe. + If you use MPLAB and an interrupt function then the linker script file + vectors section will need to be enlarged to link with mplink. +\newline -16 bits -\end_inset - - -\begin_inset Text +\newline +Here is a +\family typewriter +Makefile +\family default + using GPUTILS: +\layout Verse + + +\family typewriter +.c.o: +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +sdcc -S -V -mpic14 -p16F877 $< +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +gpasm -c $*.asm +\newline +\newline +$(PRJ).hex: $(OBJS) +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +gplink -m -s $(PRJ).lkr -o $(PRJ).hex $(OBJS) libsdcc.lib \layout Standard -PRODL:WREG -\end_inset - - - - -\begin_inset Text +Here is a +\family typewriter +Makefile +\family default + using MPLAB: +\layout Verse + + +\family typewriter +.c.o: +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +sdcc -S -V -mpic14 -p16F877 $< +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mpasmwin /q /o $*.asm +\newline +\newline +$(PRJ).hex: $(OBJS) +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mplink /v $(PRJ).lkr /m $(PRJ).map /o $(PRJ).hex $(OBJS) libsdcc.lib \layout Standard -24 bits -\end_inset - - -\begin_inset Text +Please note that indentations within a +\family typewriter + Makefile +\family default + have to be done with a tabulator character. +\layout Subsection +Command-line options \layout Standard -PRODH:PRODL:WREG -\end_inset - - - - -\begin_inset Text +Besides the switches common to all SDCC backends, the PIC14 port accepts + the following options (for an updated list see sdcc - +\begin_inset ERT +status Collapsed \layout Standard -32 bits +\backslash +/ \end_inset - - -\begin_inset Text + +-help): +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed \layout Standard -FSR0L:PRODH:PRODL:WREG +\backslash +/ \end_inset - - - - -\begin_inset Text -\layout Standard +-debug-extra +\begin_inset LatexCommand \index{PIC14!Options!-\/-debug-extra} ->32 bits \end_inset - - -\begin_inset Text + + emit debug info in assembly output +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed \layout Standard -on stack, FSR0 points to the beginning +\backslash +/ \end_inset - - - + +-no-pcode-opt +\begin_inset LatexCommand \index{PIC14!Options!-\/-no-pcode-opt} \end_inset + disable (slightly faulty) optimization on pCode +\layout List +\labelwidthstring 00.00.0000 -\layout Subsection +- +\begin_inset ERT +status Collapsed -Interrupts \layout Standard -An interrupt -\begin_inset LatexCommand \index{PIC16!interrupt} - +\backslash +/ \end_inset - service routine (ISR) is declared using the -\emph on -interrupt -\emph default - keyword. -\layout LyX-Code +-stack-loc +\begin_inset LatexCommand \index{PIC14!Options!-\/-stack-loc} -void isr(void) interrupt -\emph on -n -\layout LyX-Code +\end_inset -{ -\layout LyX-Code + sets the lowest address of the argument passing stack (defaults to a suitably + large shared databank to reduce BANKSEL overhead) +\layout List +\labelwidthstring 00.00.0000 -... -\layout LyX-Code +- +\begin_inset ERT +status Collapsed -} \layout Standard +\backslash +/ +\end_inset -\emph on -n +-stack-size +\begin_inset LatexCommand \index{PIC14!Options!-\/-stack-size} + +\end_inset + + sets the size if the argument passing stack (default: 16, minimum: 4) +\layout Subsection + +The library +\layout Subsubsection + +error: missing definition for symbol +\begin_inset Quotes sld +\end_inset + +__gptrget1 +\begin_inset Quotes srd +\end_inset + + +\layout Standard + +The PIC14 port uses library routines to provide more complex operations + like multiplication, division/modulus and (generic) pointer dereferencing. + In order to add these routines to your project, you must link with PIC14's + +\family typewriter +libsdcc.lib +\family default +. + For single source file projects this is done automatically, more complex + projects must add +\family typewriter +libsdcc.lib +\family default + to the linker's arguments. + Make sure you also add an include path for the library (using the -I switch + to the linker)! +\layout Subsubsection + +Processor mismatch in file +\begin_inset Quotes sld +\end_inset + +XXX +\begin_inset Quotes srd +\end_inset + +. +\layout Standard + +This warning can usually be ignored due to the very good compatibility amongst + 14 bit PIC +\begin_inset LatexCommand \index{PIC14} + +\end_inset + + devices. +\layout Standard + +You might also consider recompiling the library for your specific device + by changing the ARCH=p16f877 (default target) entry in +\family typewriter +device/lib/pic/Makefile.in +\family default + and +\family typewriter +device/lib/pic/Makefile +\family default + to reflect your device. + This might even improve performance for smaller devices as unneccesary + BANKSELs migth be removed. +\layout Subsection + +Known bugs +\layout Subsubsection + +initialized data +\layout Standard +\pagebreak_bottom +Currently, data can only be initialized if it resides in the source file + together with +\emph on +main() \emph default - is the interrupt number, which for PIC18F devices can be: +. + Data in other source files will silently +\series bold +not +\series default + be initialized. +\family typewriter +\size footnotesize + +\begin_inset Marginal +collapsed true + +\layout Standard + + +\series bold +\SpecialChar ~ +! +\end_inset + + +\layout Section + +The PIC16 +\begin_inset LatexCommand \index{PIC16} + +\end_inset + + port +\layout Standard + +The PIC16 +\begin_inset LatexCommand \index{PIC16} + +\end_inset + + port is the portion of SDCC that is responsible to produce code for the + Microchip +\begin_inset LatexCommand \index{Microchip} + +\end_inset + +(TM) microcontrollers with 16 bit core. + Currently this family of microcontrollers contains the PIC18Fxxx and PIC18Fxxxx. + Currently supported devices are: \layout Standard \align center \begin_inset Tabular - + + + + - + \begin_inset Text \layout Standard +18F242 +\end_inset + + +\begin_inset Text + +\layout Standard -\emph on -n +18F248 \end_inset @@ -20258,7 +20333,7 @@ n \layout Standard -Interrupt Vector +18F252 \end_inset @@ -20266,7 +20341,23 @@ Interrupt Vector \layout Standard -Interrupt Vector Address +18F258 +\end_inset + + +\begin_inset Text + +\layout Standard + +18F442 +\end_inset + + +\begin_inset Text + +\layout Standard + +18F448 \end_inset @@ -20276,7 +20367,7 @@ Interrupt Vector Address \layout Standard -0 +18F452 \end_inset @@ -20284,7 +20375,15 @@ Interrupt Vector Address \layout Standard -RESET vector +18F458 +\end_inset + + +\begin_inset Text + +\layout Standard + +18F1220 \end_inset @@ -20292,7 +20391,23 @@ RESET vector \layout Standard -0x000000 +18F2220 +\end_inset + + +\begin_inset Text + +\layout Standard + +18F2550 +\end_inset + + +\begin_inset Text + +\layout Standard + +18F4331 \end_inset @@ -20302,16 +20417,15 @@ RESET vector \layout Standard +18F4455 +\end_inset + + +\begin_inset Text -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -1 +\layout Standard + +18F6520 \end_inset @@ -20319,16 +20433,15 @@ RESET vector \layout Standard +18F6620 +\end_inset + + +\begin_inset Text -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -HIGH priority interrupts +\layout Standard + +18F6680 \end_inset @@ -20336,7 +20449,15 @@ HIGH priority interrupts \layout Standard -0x000008 +18F6720 +\end_inset + + +\begin_inset Text + +\layout Standard + +18F8520 \end_inset @@ -20346,7 +20467,7 @@ HIGH priority interrupts \layout Standard -2 +18F8620 \end_inset @@ -20354,558 +20475,542 @@ HIGH priority interrupts \layout Standard -LOW priority interrupts +18F8680 \end_inset - + \begin_inset Text \layout Standard -0x000018 +18F8720 \end_inset - - + +\begin_inset Text -\end_inset +\layout Standard +\end_inset + + +\begin_inset Text \layout Standard -When generating assembly code for ISR the code generator places a -\noun on -goto -\noun default -instruction at the -\emph on -Interrupt Vector Address -\emph default - which points at the genetated ISR. - This single GOTO instruction is part of an automatically generated -\emph on -interrupt entry point -\emph default - function. - The actuall ISR code is placed as normally would in the code space. - Upon interrupt request, the GOTO instruction is executed which jumps to - the ISR code. - When declaring interrupt functions as _naked this GOTO instruction is -\series bold -not -\series default - generated. - The whole interrupt functions is therefore placed at the Interrupt Vector - Address of the specific interrupt. - This is not a problem for the LOW priority interrupts, but it is a problem - for the RESET and the HIGH priority interrupts because code may be written - at the next interrupt´s vector address and cause undeterminate program - behaviour if that interrupt is raised. -\begin_inset Foot -collapsed false +\end_inset + + +\begin_inset Text \layout Standard -This is not a problem when -\layout Enumerate - -this is a HIGH interrupt ISR and LOW interrupts are -\emph on -disabled -\emph default - or not used. -\layout Enumerate +\end_inset + + + -when the ISR is small enough not to reach the next interrupt´s vector address. \end_inset +\layout Subsection + +Global Options \layout Standard +PIC16 port supports the standard command line arguments as supposed, with + the exception of certain cases that will be mentioned in the following + list: +\layout List +\labelwidthstring 00.00.0000 -\emph on -n -\emph default - is possible to be omitted. - This way a function is generated similar to an ISR, but it is not assigned - to any interrupt. -\layout Standard +- +\begin_inset ERT +status Collapsed -When entering an interrupt, currently the PIC16 -\begin_inset LatexCommand \index{PIC16} +\layout Standard +\backslash +/ \end_inset - port automatically saves the following registers: -\layout Itemize +-callee-saves +\begin_inset LatexCommand \index{PIC16!Options!-\/-callee-saves} -WREG -\layout Itemize +\end_inset -STATUS -\layout Itemize + See - +\begin_inset ERT +status Collapsed -BSR -\layout Itemize +\layout Standard -PROD (PRODL and PRODH) -\layout Itemize +\backslash +/ +\end_inset -FSR0 (FSR0L and FSR0H) -\layout Standard +-all-callee-saves +\layout List +\labelwidthstring 00.00.0000 -These registers are restored upon return from the interrupt routine. -\begin_inset Foot -collapsed false +- +\begin_inset ERT +status Collapsed \layout Standard -NOTE that when the _naked attribute is specified for an interrupt routine, - then NO registers are stored or restored. +\backslash +/ \end_inset +-all-callee-saves +\begin_inset LatexCommand \index{PIC16!Options!-\/-all-callee-saves} -\layout Subsection - -Generic Pointers -\layout Standard +\end_inset -Generic pointers are implemented in PIC16 port as 3-byte (24-bit) types. - There are 3 types of generic pointers currently implemented data, code - and eeprom pointers. - They are differentiated by the value of the 7th and 6th bits of the upper - byte: -\layout Standard -\align center + All function arguments are passed on stack by default. + +\emph on +There is no need to specify this in the command line. +\layout List +\labelwidthstring 00.00.0000 -\begin_inset Tabular - - - - - - - - - -\begin_inset Text +- +\begin_inset ERT +status Collapsed \layout Standard -pointer type +\backslash +/ \end_inset - - -\begin_inset Text -\layout Standard +-fommit-frame-pointer +\begin_inset LatexCommand \index{PIC16!Options!-\/-fommit-frame-pointer} -7th bit \end_inset - - -\begin_inset Text - -\layout Standard -6th bit -\end_inset - - -\begin_inset Text + Frame pointer will be omitted when the function uses no local variables. +\layout Subsection -\layout Standard +Port Specific Options +\begin_inset LatexCommand \index{Options PIC16} -rest of the pointer \end_inset - - -\begin_inset Text + \layout Standard -description -\end_inset - - - - -\begin_inset Text +The port specific options appear after the global options in the sdcc --help + output. +\layout Subsubsection +General Options \layout Standard -data -\end_inset - - -\begin_inset Text +General options enable certain port features and optimizations. +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed \layout Standard -1 +\backslash +/ \end_inset - - -\begin_inset Text -\layout Standard +-pstack-model=[model] Used in conjuction with the command above. + Defines the stack model to be used, valid stack models are : +\begin_deeper +\layout List +\labelwidthstring 00.00.0000 -0 -\end_inset - - -\begin_inset Text -\layout Standard +\emph on +small +\emph default + Selects small stack model. + 8 bit stack and frame pointers. + Supports 256 bytes stack size. +\layout List +\labelwidthstring 00.00.0000 -\family typewriter -\shape slanted \emph on -uuuuuu uuuuxxxx xxxxxxxx -\end_inset - - -\begin_inset Text +large +\emph default + Selects large stack model. + 16 bit stack and frame pointers. + Supports 65536 bytes stack size. +\end_deeper +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed \layout Standard -a 12-bit data pointer in data RAM memory +\backslash +/ \end_inset - - - - -\begin_inset Text + +-preplace-udata-with=[kword] Replaces the default udata keyword for allocating + unitialized data variables with [kword]. + Valid keywords are: "udata_acs", "udata_shr", "udata_ovr". +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed \layout Standard -code +\backslash +/ \end_inset - - -\begin_inset Text -\layout Standard +-ivt-loc positions the Interrupt Vector Table at location . + Useful for bootloaders. +\layout List +\labelwidthstring 00.00.0000 -0 -\end_inset - - -\begin_inset Text +- +\begin_inset ERT +status Collapsed \layout Standard -0 +\backslash +/ \end_inset - - -\begin_inset Text - -\layout Standard +-asm= sets the full path and name of an external assembler to call. +\layout List +\labelwidthstring 00.00.0000 -\family typewriter -\shape slanted -\emph on -uxxxxx xxxxxxxx xxxxxxxx -\end_inset - - -\begin_inset Text +- +\begin_inset ERT +status Collapsed \layout Standard -a 21-bit code pointer in FLASH memory +\backslash +/ \end_inset - - - - -\begin_inset Text -\layout Standard +-link= sets the full path and name of an external linker to call. +\layout List +\labelwidthstring 00.00.0000 -eeprom -\end_inset - - -\begin_inset Text +- +\begin_inset ERT +status Collapsed \layout Standard -0 +\backslash +/ \end_inset - - -\begin_inset Text -\layout Standard +-mplab-comp MPLAB +\begin_inset LatexCommand \index{PIC16!MPLAB} -1 \end_inset - - -\begin_inset Text -\layout Standard + compatibility option. + Currently only suppresses special gpasm directives. +\layout Subsubsection +Optimization Options +\layout List +\labelwidthstring 00.00.0000 -\family typewriter -\shape slanted -\emph on -uuuuuu uuuuuuxx xxxxxxxx -\end_inset - - -\begin_inset Text +- +\begin_inset ERT +status Collapsed \layout Standard -a 10-bit eeprom pointer in EEPROM memory +\backslash +/ \end_inset - - - - -\begin_inset Text -\layout Standard +-optimize-goto Try to use (conditional) BRA instead of GOTO +\layout List +\labelwidthstring 00.00.0000 -(unimplemented) -\end_inset - - -\begin_inset Text +- +\begin_inset ERT +status Collapsed \layout Standard -1 +\backslash +/ \end_inset - - -\begin_inset Text -\layout Standard +-optimize-cmp Try to optimize some compares. +\layout List +\labelwidthstring 00.00.0000 -1 -\end_inset - - -\begin_inset Text +- +\begin_inset ERT +status Collapsed \layout Standard - -\family typewriter -\shape slanted -\emph on -xxxxxx xxxxxxxx xxxxxxxx +\backslash +/ \end_inset - - -\begin_inset Text + +-optimize-df Analyze the dataflow of the generated code and improve it. +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed \layout Standard -unimplemented pointer type +\backslash +/ \end_inset - - - -\end_inset +-obanksel=nn Set optimization level for inserting BANKSELs. +\newline +\begin_deeper +\layout List +\labelwidthstring 00.00.0000 -\layout Standard +0 no optimization +\layout List +\labelwidthstring 00.00.0000 -Generic pointer are read and written with a set of library functions which - read/write 1, 2, 3, 4 bytes. -\layout Subsection +1 checks previous used register and if it is the same then does not emit + BANKSEL, accounts only for labels. +\layout List +\labelwidthstring 00.00.0000 -PIC16 C Libraries +2 tries to check the location of (even different) symbols and removes BANKSELs + if they are in the same bank. + +\newline + +\emph on +Important: There might be problems if the linker script has data sections + across bank borders! +\end_deeper \layout Subsubsection -Standard I/O Streams -\layout Standard +Linking Options +\layout List +\labelwidthstring 00.00.0000 -In the -\emph on -stdio.h -\emph default - the type FILE is defined as: -\layout LyX-Code +- +\begin_inset ERT +status Collapsed -typedef char * FILE; \layout Standard -This type is the stream type implemented I/O in the PIC18F devices. - Also the standard input and output streams are declared in stdio.h: -\layout LyX-Code +\backslash +/ +\end_inset -extern FILE * stdin; -\layout LyX-Code +-nodefaultlibs do not link default libraries when linking +\layout List +\labelwidthstring 00.00.0000 -extern FILE * stdout; -\layout Standard +- +\begin_inset ERT +status Collapsed -The FILE type is actually a generic pointer which defines one more type - of generic pointers, the -\emph on -stream -\emph default -pointer. - This new type has the format: \layout Standard -\align center -\begin_inset Tabular - - - - - - - - - - - -\begin_inset Text +\backslash +/ +\end_inset -\layout Standard +-no-crt Don't link the default run-time modules +\layout List +\labelwidthstring 00.00.0000 -pointer type -\end_inset - - -\begin_inset Text +- +\begin_inset ERT +status Collapsed \layout Standard -<7:6> +\backslash +/ \end_inset - - -\begin_inset Text -\layout Standard - -<5> -\end_inset - - -\begin_inset Text +-use-crt= Use a custom run-time module instead of the defaults. +\layout Subsubsection +Debugging Options \layout Standard -<4> -\end_inset - - -\begin_inset Text +Debugging options enable extra debugging information in the output files. +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed \layout Standard -<3:0> +\backslash +/ \end_inset - - -\begin_inset Text + +-debug-xtra Similar to - +\begin_inset ERT +status Collapsed \layout Standard -rest of the pointer +\backslash +/ \end_inset - - -\begin_inset Text -\layout Standard +-debug +\begin_inset LatexCommand \index{-\/-debug} -descrption \end_inset - - - - -\begin_inset Text -\layout Standard +, but dumps more information. +\layout List +\labelwidthstring 00.00.0000 -stream -\end_inset - - -\begin_inset Text +- +\begin_inset ERT +status Collapsed \layout Standard -00 +\backslash +/ \end_inset - - -\begin_inset Text + +-debug-ralloc Force register allocator to dump .d file with debugging + information. + is the name of the file compiled. +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed \layout Standard -1 +\backslash +/ \end_inset - - -\begin_inset Text + +-pcode-verbose Enable pcode debugging information in translation. +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed \layout Standard -0 +\backslash +/ \end_inset - - -\begin_inset Text + +-denable-peeps Force the usage of peepholes. + Use with care. +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed \layout Standard -nnnn +\backslash +/ \end_inset - - -\begin_inset Text -\layout Standard +-gstack Trace push/pops for stack pointer overflow +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed +\layout Standard -\family typewriter -\shape slanted -\emph on -uuuuuuuu uuuuuuuu +\backslash +/ \end_inset - - -\begin_inset Text +-call-tree dump call tree in .calltree file +\layout Subsection + +Enviromental Variables \layout Standard -upper byte high nubble is 0x2n, the rest are zeroes -\end_inset - - - +There is a number of enviromental variables that can be used when running + SDCC to enable certain optimizations or force a specific program behaviour. + these variables are primarily for debugging purposes so they can be enabled/dis +abled at will. +\layout Standard -\end_inset +Currently there is only two such variables available: +\layout List +\labelwidthstring 00.00.0000 + +OPTIMIZE_BITFIELD_POINTER_GET when this variable exists reading of structure + bitfields is optimized by directly loading FSR0 with the address of the + bitfield structure. + Normally SDCC will cast the bitfield structure to a bitfield pointer and + then load FSR0. + This step saves data ram and code space for functions that perform heavy + use of bitfields. + (ie. + 80 bytes of code space are saved when compiling malloc.c with this option). + +\layout List +\labelwidthstring 00.00.0000 +NO_REG_OPT do not perform pCode registers optimization. + This should be used for debugging purposes. + In some where bugs in the pcode optimizer are found, users can benefit + from temporarily disabling the optimizer until the bug is fixed. +\layout Subsection +Preprocessor Macros \layout Standard -Currently implemented there are 3 types of streams defined: +PIC16 +\begin_inset LatexCommand \index{PIC16} + +\end_inset + + port defines the following preprocessor macros while translating a source. \layout Standard \align center \begin_inset Tabular - + - - @@ -20913,23 +21018,25 @@ Currently implemented there are 3 types of streams defined: \layout Standard -stream type +Macro \end_inset - + \begin_inset Text \layout Standard -value +Description \end_inset + + \begin_inset Text \layout Standard -module +SDCC_pic16 \end_inset @@ -20937,7 +21044,7 @@ module \layout Standard -description +Port identification \end_inset @@ -20947,25 +21054,17 @@ description \layout Standard -STREAM_USART -\end_inset - - -\begin_inset Text +_ +\begin_inset ERT +status Collapsed \layout Standard - -\family typewriter -0x200000UL +\backslash +/ \end_inset - - -\begin_inset Text - -\layout Standard -USART +_pic16 \end_inset @@ -20973,7 +21072,7 @@ USART \layout Standard -Writes/Reads characters via the USART peripheral +Port identification (same as above) \end_inset @@ -20983,61 +21082,59 @@ Writes/Reads characters via the USART peripheral \layout Standard -STREAM_MSSP +pic18fxxxx \end_inset - + \begin_inset Text \layout Standard - -\family typewriter -0x210000UL +MCU Identification. + +\emph on +xxxx +\emph default + is the microcontrol identification number, i.e. + 452, 6620, etc \end_inset + + \begin_inset Text \layout Standard -MSSP -\end_inset - - -\begin_inset Text +_ +\begin_inset ERT +status Collapsed \layout Standard -Writes/Reads characters via the MSSP peripheral +\backslash +/ \end_inset - - - - -\begin_inset Text - -\layout Standard -STREAM_USER +_18Fxxxx \end_inset - + \begin_inset Text \layout Standard - -\family typewriter -0x2f0000UL +MCU Identification (same as above) \end_inset + + \begin_inset Text \layout Standard -(none) +STACK_MODEL_nnn \end_inset @@ -21045,7 +21142,7 @@ STREAM_USER \layout Standard -Writes/Reads characters via used defined functions +nnn = SMALL or LARGE respectively according to the stack model used \end_inset @@ -21056,161 +21153,14 @@ Writes/Reads characters via used defined functions \layout Standard -The stream identifiers are declared as macros in the stdio.h header. -\layout Standard - -In the libc library there exist the functions that are used to write to - each of the above streams. - These are -\layout List -\labelwidthstring 00.00.0000 - -_ -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - -_stream_usart_putchar writes a character at the USART stream -\layout List -\labelwidthstring 00.00.0000 - -_ -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - -_stream_mssp_putchar writes a character at the MSSP stream -\layout List -\labelwidthstring 00.00.0000 - -putchar dummy function. - This writes a character to a user specified manner. -\layout Standard - -In order to increase performance -\emph on -putchar -\emph default -is declared in stdio.h as having its parameter in WREG (it has the wparam - keyword). - In stdio.h exists the macro PUTCHAR(arg) that defines the putchar function - in a user-friendly way. - -\emph on -arg -\emph default - is the name of the variable that holds the character to print. - An example follows: -\layout LyX-Code - -#include -\newline -#include -\newline - -\newline -PUTCHAR( c ) -\layout LyX-Code - -{ -\layout LyX-Code - - PORTA = c; /* dump character c to PORTA */ -\layout LyX-Code - -} -\newline - -\newline -void main(void) -\layout LyX-Code - -{ -\layout LyX-Code - - stdout = STREAM_USER; /* this is not necessary, since stdout points -\layout LyX-Code - - * by default to STREAM_USER */ -\layout LyX-Code - - printf (¨This is a printf test -\backslash -n¨); -\layout LyX-Code - -} -\layout LyX-Code - -\layout Subsubsection - -Printing functions -\layout Standard - -PIC16 contains an implementation of the printf-family of functions. - There exist the following functions: -\layout LyX-Code - -extern unsigned int sprintf(char *buf, char *fmt, ...); -\layout LyX-Code - -extern unsigned int vsprintf(char *buf, char *fmt, va_list ap); -\layout LyX-Code - -\layout LyX-Code - -extern unsigned int printf(char *fmt, ...); -\layout LyX-Code - -extern unsigned int vprintf(char *fmt, va_lista ap); -\layout LyX-Code - -\layout LyX-Code - -extern unsigned int fprintf(FILE *fp, char *fmt, ...); -\layout LyX-Code - -extern unsigned int vfprintf(FILE *fp, char *fmt, va_list ap); -\layout Standard - -For sprintf and vsprintf -\emph on -buf -\emph default -should normally be a data pointer where the resulting string will be placed. - No range checking is done so the user should allocate the necessery buffer. - For fprintf and vfprintf -\emph on -fp -\emph default - should be a stream pointer (i.e. - stdout, STREAM_MSSP, etc...). -\layout Subsubsection - -Signals -\layout Standard - -The PIC18F family of microcontrollers supports a number of interrupt sources. - A list of these interrupts is shown in the following table: +In addition the following macros are defined when calling assembler: \layout Standard \align center \begin_inset Tabular - + - - - + @@ -21218,7 +21168,7 @@ The PIC18F family of microcontrollers supports a number of interrupt sources. \layout Standard -signal name +Macro \end_inset @@ -21226,15 +21176,17 @@ signal name \layout Standard -description +Description \end_inset - + + + \begin_inset Text \layout Standard -signal name +__18Fxxxx \end_inset @@ -21242,7 +21194,13 @@ signal name \layout Standard -descritpion +MCU Identification. + +\emph on +xxxx +\emph default + is the microcontrol identification number, i.e. + 452, 6620, etc \end_inset @@ -21252,23 +21210,26 @@ descritpion \layout Standard -SIG_RB +SDCC_MODEL_nnn \end_inset - + \begin_inset Text \layout Standard -PORTB change interrupt +nnn = SMALL or LARGE respectively according to the memory model used for + SDCC \end_inset - + + + \begin_inset Text \layout Standard -SIG_EE +STACK_MODEL_nnn \end_inset @@ -21276,51 +21237,43 @@ SIG_EE \layout Standard -EEPROM/FLASH write complete interrupt +nnn = SMALL or LARGE respectively according to the stack model used \end_inset - - -\begin_inset Text - -\layout Standard + -SIG_INT0 \end_inset - - -\begin_inset Text -\layout Standard -INT0 external interrupt -\end_inset - - -\begin_inset Text +\layout Subsection +Directories \layout Standard -SIG_BCOL +PIC16 +\begin_inset LatexCommand \index{PIC16} + \end_inset - - -\begin_inset Text + port uses the following directories for searching header files and libraries. \layout Standard +\align center -Bus collision interrupt -\end_inset - - - +\begin_inset Tabular + + + + + + + \begin_inset Text \layout Standard -SIG_INT1 +Directory \end_inset @@ -21328,7 +21281,7 @@ SIG_INT1 \layout Standard -INT1 external interrupt +Description \end_inset @@ -21336,7 +21289,7 @@ INT1 external interrupt \layout Standard -SIG_LVD +Target \end_inset @@ -21344,7 +21297,7 @@ SIG_LVD \layout Standard -Low voltage detect interrupt +Command prefix \end_inset @@ -21354,7 +21307,7 @@ Low voltage detect interrupt \layout Standard -SIG_INT2 +PREFIX/sdcc/include/pic16 \end_inset @@ -21362,7 +21315,7 @@ SIG_INT2 \layout Standard -INT2 external interrupt +PIC16 specific headers \end_inset @@ -21370,7 +21323,7 @@ INT2 external interrupt \layout Standard -SIG_PSP +Compiler \end_inset @@ -21378,17 +21331,17 @@ SIG_PSP \layout Standard -Parallel slave port interrupt +-I \end_inset - + \begin_inset Text \layout Standard -SIG_CCP1 +PREFIX/sdcc/lib/pic16 \end_inset @@ -21396,7 +21349,7 @@ SIG_CCP1 \layout Standard -CCP1 module interrupt +PIC16 specific libraries \end_inset @@ -21404,7 +21357,7 @@ CCP1 module interrupt \layout Standard -SIG_AD +Linker \end_inset @@ -21412,33 +21365,159 @@ SIG_AD \layout Standard -AD convertion complete interrupt +-L \end_inset - - -\begin_inset Text + -\layout Standard +\end_inset + + +\layout Subsection + +Pragmas +\begin_inset LatexCommand \label{sub:PIC16_Pragmas} -SIG_CCP2 \end_inset - - + + +\layout Standard + +PIC16 +\begin_inset LatexCommand \index{PIC16} + +\end_inset + + port currently supports the following pragmas: +\layout List +\labelwidthstring 00.00.0000 + +stack +\begin_inset LatexCommand \index{PIC16!Pragmas!\#pragma stack} + +\end_inset + + pragma stack +\begin_inset LatexCommand \index{PIC16!stack} + +\end_inset + + forces the code generator to initialize the stack & frame pointers at a + specific address. + This is an adhoc solution for cases where no STACK directive is available + in the linker script or gplink is not instructed to create a stack section. +\newline +The stack pragma should be used only once in a project. + Multiple pragmas may result in indeterminate behaviour of the program. +\begin_inset Foot +collapsed false + +\layout Standard + +The old format (ie. + #pragma stack 0x5ff) is deprecated and will cause the stack pointer to + cross page boundaries (or even exceed the available data RAM) and crash + the program. + Make sure that stack does not cross page boundaries when using the SMALL + stack model. +\end_inset + + +\newline +The format is as follows: +\layout LyX-Code + +#pragma stack bottom_address [stack_size] +\layout Standard + + +\emph on +bottom_address +\emph default + is the lower bound of the stack section. + The stack pointer initially will point at address (bottom_address+stack_size-1). +\layout LyX-Code + +Example: +\layout LyX-Code + +\layout LyX-Code + +/* initializes stack of 100 bytes at RAM address 0x200 */ +\layout LyX-Code + +#pragma stack 0x200 100 +\layout Standard + +If the stack_size field is omitted then a stack is created with the default + size of 64. + This size might be enough for most programs, but its not enough for operations + with deep function nesting or excessive stack usage. +\layout List +\labelwidthstring 00.00.0000 + +code +\begin_inset LatexCommand \index{PIC16!Pragmas!\#pragma code} + +\end_inset + + place a function symbol at static FLASH address +\layout LyX-Code + +Example: +\layout LyX-Code + +\layout LyX-Code + +/* place function test_func at 0x4000 */ +\layout LyX-Code + +#pragma code test_func 0x4000 +\layout LyX-Code + +\layout List +\labelwidthstring 00.00.0000 + +library instructs the linker to use a library module. +\newline +Usage: +\layout LyX-Code + +#pragma library module_name +\layout Standard + + +\emph on +module_name +\emph default + can be any library or object file (including its path). + Note that there are four reserved keywords which have special meaning. + These are: +\layout Standard +\align center + +\begin_inset Tabular + + + + + + + \begin_inset Text \layout Standard -CCP2 module interrupt +Keyword \end_inset - + \begin_inset Text \layout Standard -SIG_RC +Description \end_inset @@ -21446,7 +21525,7 @@ SIG_RC \layout Standard -USART receive interrupt +Module to link \end_inset @@ -21456,23 +21535,17 @@ USART receive interrupt \layout Standard -SIG_TMR0 -\end_inset - - -\begin_inset Text - -\layout Standard -TMR0 overflow interrupt +\series bold +ignore \end_inset - + \begin_inset Text \layout Standard -SIG_TX +ignore all library pragmas \end_inset @@ -21480,7 +21553,9 @@ SIG_TX \layout Standard -USART transmit interrupt + +\emph on +(none) \end_inset @@ -21490,15 +21565,17 @@ USART transmit interrupt \layout Standard -SIG_TMR1 + +\series bold +c \end_inset - + \begin_inset Text \layout Standard -TMR1 overflow interrupt +link the C library \end_inset @@ -21506,25 +21583,31 @@ TMR1 overflow interrupt \layout Standard -SIG_MSSP + +\emph on +libc18f +\emph default +.lib \end_inset - + + + \begin_inset Text \layout Standard -SSP receive/transmit interrupt + +\series bold +math \end_inset - - \begin_inset Text \layout Standard -SIG_TMR2 +link the Math libarary \end_inset @@ -21532,46 +21615,63 @@ SIG_TMR2 \layout Standard -TMR2 matches PR2 interrupt + +\emph on +libm18f +\emph default +.lib \end_inset - + + + \begin_inset Text \layout Standard + +\series bold +io \end_inset - + \begin_inset Text \layout Standard +link the I/O library \end_inset - - - + \begin_inset Text \layout Standard -SIG_TMR3 + +\emph on +libio18f* +\emph default +.lib \end_inset - + + + \begin_inset Text \layout Standard -TMR3 overflow interrupt + +\series bold +debug \end_inset - + \begin_inset Text \layout Standard +link the debug library \end_inset @@ -21579,6 +21679,11 @@ TMR3 overflow interrupt \layout Standard + +\emph on +libdebug +\emph default +.lib \end_inset @@ -21587,1083 +21692,3255 @@ TMR3 overflow interrupt \end_inset +\newline +* is the device number, i.e. + 452 for PIC18F452 MCU. \layout Standard -The prototypes for these names are defined in the header file -\emph on -signal.h -\emph default - . -\layout Standard - -In order to simplify signal handling, a number of macros is provided: +This feature allows for linking with specific libraries withoug having to + explicit name them in the command line. + Note that the +\noun on +ignore +\noun default + keyword will reject all modules specified by the library pragma. \layout List \labelwidthstring 00.00.0000 -DEF_INTHIGH(name) begin the definition of the interrupt dispatch table for - high priority interrupts. - -\emph on -name -\emph default - is the function name to use. -\layout List -\labelwidthstring 00.00.0000 - -DEF_INTLOW(name) begin the definition of the interrupt dispatch table fo - low priority interrupt. - -\emph on -name -\emph default - is the function name to use. -\layout List -\labelwidthstring 00.00.0000 - -DEF_HANDLER(sig,handler) define a handler for signal -\emph on -sig. -\layout List -\labelwidthstring 00.00.0000 +udata pragma udata instructs the compiler to emit code so that linker will + place a variable at a specific memory bank +\layout LyX-Code -END_DEF end the declaration of the dispatch table. -\layout Standard +Example: +\layout LyX-Code -Additionally there are two more macros to simplify the declaration of the - signal handler: -\layout List -\labelwidthstring 00.00.0000 +\layout LyX-Code +/* places variable foo at bank2 */ +\layout LyX-Code -\series medium -SIGHANDLER(handler) -\series default -this declares the function prototype for the -\emph on -handler -\emph default - function. -\layout List -\labelwidthstring 00.00.0000 +#pragma udata bank2 foo +\layout LyX-Code -SIGHANDLERNAKED(handler) same as SIGHANDLER() but declares a naked function. +char foo; \layout Standard -An example of using the macros above is shown below: +In order for this pragma to work extra SECTION directives should be added + in the .lkr script. + In the following example a sample .lkr file is shown: \layout LyX-Code -#include \layout LyX-Code -#include -\newline - -\newline -DEF_INTHIGH(high_int) +// Sample linker script for the PIC18F452 processor \layout LyX-Code -DEF_HANDLER(SIG_TMR0, _tmr0_handler) +LIBPATH . \layout LyX-Code -DEF_HANDLER(SIG_BCOL, _bcol_handler) +CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED \layout LyX-Code -END_DEF -\newline +CODEPAGE NAME=page START=0x2A END=0x7FFF +\layout LyX-Code -\newline -SIGHANDLER(_tmr0_handler) +CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED \layout LyX-Code -{ +CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED \layout LyX-Code - /* action to be taken when timer 0 overflows */ +CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED \layout LyX-Code -} -\newline +CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED +\layout LyX-Code -\newline -SIGHANDLERNAKED(_bcol_handler) +ACCESSBANK NAME=accessram START=0x0 END=0x7F \layout LyX-Code -{ \layout LyX-Code - _asm +DATABANK NAME=gpr0 START=0x80 END=0xFF \layout LyX-Code - /* action to be taken when bus collision occurs */ +DATABANK NAME=gpr1 START=0x100 END=0x1FF \layout LyX-Code - retfie +DATABANK NAME=gpr2 START=0x200 END=0x2FF \layout LyX-Code - _endasm; +DATABANK NAME=gpr3 START=0x300 END=0x3FF \layout LyX-Code -} -\layout Standard +DATABANK NAME=gpr4 START=0x400 END=0x4FF +\layout LyX-Code +DATABANK NAME=gpr5 START=0x500 END=0x5FF +\layout LyX-Code -\series bold -NOTES: -\series default - Special care should be taken when using the above scheme: -\layout Itemize +ACCESSBANK NAME=accesssfr START=0xF80 END=0xFFF PROTECTED +\layout LyX-Code -do not place a colon (;) at the end of the DEF_* and END_DEF macros. -\layout Itemize +\layout LyX-Code -when declaring SIGHANDLERNAKED handler never forget to use -\emph on -retfie -\emph default - for proper returning. -\layout Subsection +SECTION NAME=CONFIG ROM=config +\layout LyX-Code -PIC16 Port -- Tips -\layout Standard +\layout LyX-Code -Here you can find some general tips for compiling programs with SDCC/pic16. -\layout Subsubsection +SECTION NAME=bank0 RAM=gpr0 # these SECTION directives +\layout LyX-Code -Stack size -\layout Standard +SECTION NAME=bank1 RAM=gpr1 # should be added to link +\layout LyX-Code -The default stack -\begin_inset LatexCommand \index{PIC16!stack} +SECTION NAME=bank2 RAM=gpr2 # section name 'bank?' with +\layout LyX-Code -\end_inset +SECTION NAME=bank3 RAM=gpr3 # a specific DATABANK name +\layout LyX-Code - size (that is 64 bytes) probably is enough for many programs. - One must take care that when there are many levels of function nesting, - or there is excessive usage of stack, its size should be extended. - An example of such a case is the printf/sprintf family of functions. - If you encounter problems like not being able to print integers, then you - need to set the stack size around the maximum (256 for small stack model). - The following diagram shows what happens when calling printf to print an - integer: +SECTION NAME=bank4 RAM=gpr4 \layout LyX-Code -printf () --> ltoa () --> ultoa () --> divschar () +SECTION NAME=bank5 RAM=gpr5 \layout Standard -It is should be understood that stack is easily consumed when calling complicate -d functions. - Using command line arguments like - -\begin_inset ERT -status Collapsed +The linker will recognise the section name set in the pragma statement and + will position the variable at the memory bank set with the RAM field at + the SECTION line in the linker script file. +\layout Subsection -\layout Standard +Header Files +\begin_inset LatexCommand \label{sub:PIC16_Header-Files} -\backslash -/ \end_inset --fommit-frame-pointer might reduce stack usage by not creating unnecessery - stack frames. - Other ways to reduce stack usage may exist. -\layout Subsection -Known bugs \layout Standard -The PIC16 Port currently does not pass SDCC's regression test -\begin_inset LatexCommand \index{Regression test (PIC16)} +There is one main header file +\begin_inset LatexCommand \index{PIC16!Header files} \end_inset - suite (see section -\begin_inset LatexCommand \ref{sec:Quality-control} + that can be included to the source files using the pic16 +\begin_inset LatexCommand \index{PIC16} \end_inset -) and thus the nightly regression tests for the PIC16 target are currently - disabled for all hosts except for -\emph on -Linux on Opteron. - -\emph default - This means you can see the result of the PIC16 regression tests f.e. - by checking the log files in -\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/regression_test_results/amd64-unknown-linux2.3/} + port. + That file is the +\series bold +pic18fregs.h +\series default +. + This header file contains the definitions for the processor special registers, + so it is necessary if the source accesses them. + It can be included by adding the following line in the beginning of the + file: +\layout LyX-Code -\end_inset +#include +\layout Standard - (pick the most up to date file there, scroll down, lend a hand). -\layout Chapter +The specific microcontroller is selected within the pic18fregs.h automatically, + so the same source can be used with a variety of devices. +\layout Subsection -Debugging +Libraries \layout Standard -There are several approaches to debugging your code. - This chapter is meant to show your options and to give detail on some of - them: -\newline - -\newline -When writing your code: -\layout Itemize +The libraries +\begin_inset LatexCommand \index{PIC16!Libraries} -write your code with debugging in mind (avoid duplicating code, put conceptually - similar variables into structs, use structured code, have strategic points - within your code where all variables are consistent, ...) -\layout Itemize +\end_inset -run a syntax-checking tool like splint -\begin_inset LatexCommand \index{splint (syntax checking tool)} + that PIC16 +\begin_inset LatexCommand \index{PIC16} \end_inset + port depends on are the microcontroller device libraries which contain + the symbol definitions for the microcontroller special function registers. + These libraries have the format pic18fxxxx.lib, where +\emph on +xxxx +\emph default + is the microcontroller identification number. + The specific library is selected automatically by the compiler at link + stage according to the selected device. +\layout Standard -\begin_inset LatexCommand \index{lint (syntax checking tool)} +Libraries are created with gplib which is part of the gputils package +\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils} \end_inset - (see - -\begin_inset ERT -status Collapsed +. +\layout Subsubsection* +Building the libraries \layout Standard -\backslash -/ -\end_inset +Before using SDCC/pic16 there are some libraries that need to be compiled. + This process is not done automatically by SDCC since not all users use + SDCC for pic16 projects. + So each user should compile the libraries separately. +\layout Standard --more-pedantic -\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT} +The steps to compile the pic16 libraries under Linux are: +\layout LyX-Code -\end_inset +cd device/lib/pic16 +\layout LyX-Code -) over the code. -\layout Itemize +./configure +\layout LyX-Code -for the high level code use a C-compiler (like f.e. - GCC) to compile run and debug the code on your host. - See (see - -\begin_inset ERT -status Collapsed +make +\layout LyX-Code + +cd .. +\layout LyX-Code + +make model-pic16 +\layout LyX-Code +su -c 'make install' # install the libraries, you need the root password \layout Standard -\backslash -/ -\end_inset +If you need to install the headers too, do: +\layout LyX-Code --more-pedantic -\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT} +cd device/include +\layout LyX-Code -\end_inset +su -c 'make install' # install the headers, you need the root password +\layout Standard - ) on howto handle syntax extensions like __xdata, __at(), ... - -\layout Itemize +There exist a special target to build the I/O libraries. + This target is not automatically build because it will build the I/O library + for +\emph on +every +\emph default + supported device. + This way building will take quite a lot of time. + Users are advised to edit the +\series bold +device/lib/pic16/pics.build +\series default + file and then execute: +\layout LyX-Code -use another C-compiler to compile code for your target. - Always an option but not recommended:) And not very likely to help you. - If you seriously consider walking this path you should at least occasionally - check portability of your code. - Most commercial compiler vendors will offer an evaluation version so you - can test compile your code or snippets of your code. +make lib-io +\layout Subsection + +Memory Models \layout Standard -Debugging on a simulator: +The following memory models are supported by the PIC16 port: \layout Itemize -there is a separate section about SDCDB (section -\begin_inset LatexCommand \ref{cha:Debugging-with-SDCDB} +small model +\layout Itemize -\end_inset +large model +\layout Standard -) below. -\layout Itemize +Memory model affects the default size of pointers within the source. + The sizes are shown in the next table: +\layout Standard +\align center -or (8051 specific) use a freeware/commercial simulator which interfaces - to the AOMF -\begin_inset LatexCommand \index{AOMF, AOMF51} +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\layout Standard +Pointer sizes according to memory model \end_inset + + +\begin_inset Text - file (see -\begin_inset LatexCommand \ref{OMF file} +\layout Standard +small model \end_inset + + +\begin_inset Text -) optionally generated by SDCC. \layout Standard -Debugging On-target: -\layout Itemize - -use a MCU port pin to serially output debug data to the RS232 port of your - host. - You'll probably want some level shifting device typically involving a MAX232 - or similar IC. - If the hardware serial port of the MCU is not available search for 'Software - UART' in your favourite search machine. -\layout Itemize +large model +\end_inset + + + + +\begin_inset Text -use an on-target monitor. - In this context a monitor is a small program which usually accepts commands - via a serial line and allows to set program counter, to single step through - a program and read/write memory locations. - For the 8051 good examples of monitors are paulmon and cmon51 (see section - -\begin_inset LatexCommand \ref{sec:Related-open-source-tools} +\layout Standard +code pointers \end_inset + + +\begin_inset Text -). -\layout Itemize +\layout Standard -toggle MCU port pins at strategic points within your code and use an oscilloscop -e. - A -\emph on -digital oscilloscope -\emph default +16-bits +\end_inset + + +\begin_inset Text -\begin_inset LatexCommand \index{Oscilloscope} +\layout Standard +24-bits \end_inset + + + + +\begin_inset Text - with deep trace memory is really helpful especially if you have to debug - a realtime application. - If you need to monitor more pins than your oscilloscope provides you can - sometimes get away with a small R-2R network. - On a single channel oscilloscope you could f.e. - monitor 2 push-pull driven pins by connecting one via a 10\SpecialChar ~ -k -\begin_inset Formula $\Omega$ -\end_inset +\layout Standard - resistor and the other one by a 5\SpecialChar ~ -k -\begin_inset Formula $\Omega$ +data pointers \end_inset + + +\begin_inset Text - resistor to the oscilloscope probe (check output drive capability of the - pins you want to monitor). - If you need to monitor many more pins a -\emph on -logic analyzer -\emph default - will be handy. -\layout Itemize +\layout Standard -use an ICE ( -\emph on -i -\emph default -n -\emph on -c -\emph default -ircuit -\emph on -e -\emph default -mulator -\begin_inset LatexCommand \index{ICE (in circuit emulator)} +16-bits +\end_inset + + +\begin_inset Text + +\layout Standard +16-bits \end_inset + + + -). - Usually very expensive. - And very nice to have too. - And usually locks you (for years...) to the devices the ICE can emulate. - -\layout Itemize +\end_inset -use a remote debugger. - In most 8-bit systems the symbol information is not available on the target, - and a complete debugger is too bulky for the target system. - Therefore usually a debugger on the host system connects to an on-target - debugging stub which accepts only primitive commands. - -\newline -Terms to enter into your favourite search engine could be 'remote debugging', - 'gdb stub' or 'inferior debugger'. - (is there one?) -\layout Itemize -use an on target hardware debugger. - Some of the more modern MCUs include hardware support for setting break - points and monitoring/changing variables by using dedicated hardware pins. - This facility doesn't require additional code to run on the target and - -\emph on -usually -\emph default - doesn't affect runtime behaviour until a breakpoint is hit. - For the mcs51 most hardware debuggers use the AOMF -\begin_inset LatexCommand \index{AOMF, AOMF51} +\layout Standard -\end_inset +It is advisable that all sources within a project are compiled with the + same memory model. + If one wants to override the default memory model, this can be done by + declaring a pointer as +\series bold +far +\series default + or +\series bold +near +\series default +. + Far selects large memory model's pointers, while near selects small memory + model's pointers. +\layout Standard - file (see -\begin_inset LatexCommand \ref{OMF file} +The standard device libraries (see +\begin_inset LatexCommand \ref{sub:PIC16_Header-Files} \end_inset -) as input file. - +) contain no reference to pointers, so they can be used with both memory + models. +\layout Subsection + +Stack \layout Standard -Last not least: -\layout Itemize +The stack +\begin_inset LatexCommand \index{PIC16!stack} -if you are not familiar with any of the following terms you're likely to - run into problems rather sooner than later: -\emph on -volatile -\emph default -, -\emph on -atomic -\emph default -, -\emph on -memory map -\emph default -, -\emph on -overlay -\emph default -. - As an embedded programmer you -\emph on -have -\emph default - to know them so why not look them up -\emph on -before -\emph default - you have problems?) -\layout Itemize +\end_inset -tell someone else about your problem (actually this is a surprisingly effective - means to hunt down the bug even if the listener is not familiar with your - environment). - As 'failure to communicate' is probably one of the job-induced deformations - of an embedded programmer this is highly encouraged. -\layout Section + implementation for the PIC16 port uses two indirect registers, FSR1 and + FSR2. +\layout List +\labelwidthstring 00.00.0000 -Debugging with SDCDB -\begin_inset LatexCommand \label{cha:Debugging-with-SDCDB} +FSR1 is assigned as stack pointer +\layout List +\labelwidthstring 00.00.0000 -\end_inset +FSR2 is assigned as frame pointer +\layout Standard +The following stack models are supported by the PIC16 port +\layout Itemize -\begin_inset LatexCommand \index{SDCDB (debugger)} -\end_inset +\noun on +small +\noun default + model +\layout Itemize - + +\noun on +large +\noun default + model \layout Standard -SDCC is distributed with a source level debugger -\begin_inset LatexCommand \index{Debugger} -\end_inset +\noun on +Small +\noun default + model means that only the FSRxL byte is used to access stack and frame, + while +\emph on +\noun on +large +\emph default +\noun default + uses both FSRxL and FSRxH registers. + The following table shows the stack/frame pointers sizes according to stack + model and the maximum space they can address: +\layout Standard +\align center -. - The debugger uses a command line interface, the command repertoire of the - debugger has been kept as close to gdb -\begin_inset LatexCommand \index{gdb} +\begin_inset Tabular + + + + + + + +\begin_inset Text -\end_inset +\layout Standard - (the GNU debugger) as possible. - The configuration and build process is part of the standard compiler installati -on, which also builds and installs the debugger in the target directory - specified during configuration. - The debugger allows you debug BOTH at the C source and at the ASM source - level. -\layout Subsection +Stack & Frame pointer sizes according to stack model +\end_inset + + +\begin_inset Text -Compiling for Debugging \layout Standard -The - -\begin_inset ERT -status Collapsed +small +\end_inset + + +\begin_inset Text \layout Standard -\backslash -/ +large \end_inset + + + + +\begin_inset Text --debug -\begin_inset LatexCommand \index{-\/-debug} +\layout Standard +Stack pointer FSR1 \end_inset + + +\begin_inset Text - option must be specified for all files for which debug information is to - be generated. - The compiler generates a .adb file for each of these files. - The linker creates the .cdb -\begin_inset LatexCommand \index{.cdb} +\layout Standard +8-bits \end_inset + + +\begin_inset Text - file from the .adb -\begin_inset LatexCommand \index{.adb} +\layout Standard +16-bits \end_inset + + + + +\begin_inset Text - files and the address information. - This .cdb is used by the debugger. -\layout Subsection - -How the Debugger Works \layout Standard -When the - -\begin_inset ERT -status Collapsed +Frame pointer FSR2 +\end_inset + + +\begin_inset Text \layout Standard -\backslash -/ +8-bits \end_inset + + +\begin_inset Text --debug option is specified the compiler generates extra symbol information - some of which are put into the assembler source and some are put into the - .adb file. - Then the linker creates the .cdb file from the individual .adb files with - the address information for the symbols. - The debugger reads the symbolic information generated by the compiler & - the address information generated by the linker. - It uses the SIMULATOR (Daniel's S51) to execute the program, the program - execution is controlled by the debugger. - When a command is issued for the debugger, it translates it into appropriate - commands for the simulator. - (Currently SDCDM only connects to the simulator but -\emph on -newcdb -\emph default - at -\begin_inset LatexCommand \url{http://ec2drv.sf.net/} +\layout Standard + +16-bits +\end_inset + + + \end_inset - is an effort to connect directly to the hardware.) -\layout Subsection -Starting the Debugger SDCDB \layout Standard -The debugger can be started using the following command line. - (Assume the file you are debugging has the file name foo). -\newline +\noun on +Large +\noun default +stack model is currently not working properly throughout the code generator. + So its use is not advised. + Also there are some other points that need special care: \newline -\family sans -\series bold -sdcdb foo -\newline +\layout Enumerate -\family default -\series default +Do not create stack sections with size more than one physical bank (that + is 256 bytes) +\layout Enumerate -\newline -The debugger will look for the following files. -\layout Itemize +Stack sections should no cross physical bank limits (i.e. + #pragma stack 0x50 0x100) +\layout Standard -foo.c - the source file. -\layout Itemize +These limitations are caused by the fact that only FSRxL is modified when + using SMALL stack model, so no more than 256 bytes of stack can be used. + This problem will disappear after LARGE model is fully implemented. +\layout Subsection -foo.cdb - the debugger symbol information file. -\layout Itemize +Functions +\layout Standard -foo.ihx - the Intel hex format -\begin_inset LatexCommand \index{Intel hex format} +In addition to the standard SDCC function keywords, PIC16 +\begin_inset LatexCommand \index{PIC16} \end_inset - object file. -\layout Subsection - -SDCDB Command Line Options -\layout Itemize - -- -\begin_inset ERT -status Collapsed + port makes available two more: +\layout List +\labelwidthstring 00.00.0000 -\layout Standard +wparam +\begin_inset LatexCommand \index{PIC16!wparam} -\backslash -/ \end_inset --directory= this option can used to specify the directory - search list. - The debugger will look into the directory list specified for source, cdb - & ihx files. - The items in the directory list must be separated by ':', e.g. - if the source files can be in the directories /home/src1 and /home/src2, - the - -\begin_inset ERT -status Collapsed - -\layout Standard + Use the WREG to pass one byte of the first function argument. + This improves speed but you may not use this for functions with arguments + that are called via function pointers, otherwise the first byte of the + first parameter will get lost. + Usage: +\layout LyX-Code -\backslash -/ -\end_inset +void func_wparam(int a) wparam +\layout LyX-Code --directory option should be - -\begin_inset ERT -status Collapsed +{ +\layout LyX-Code -\layout Standard + /* WREG hold the lower part of a */ +\layout LyX-Code -\backslash -/ -\end_inset + /* the high part of a is stored in FSR2+2 (or +3 for large stack model) + */ +\layout LyX-Code --directory=/home/src1:/home/src2. - Note there can be no spaces in the option. - -\layout Itemize +... +\layout LyX-Code --cd - change to the . -\layout Itemize +} +\layout List +\labelwidthstring 00.00.0000 --fullname - used by GUI front ends. -\layout Itemize +shadowregs +\begin_inset LatexCommand \index{PIC16!shadowregs} --cpu - this argument is passed to the simulator please see the - simulator docs for details. -\layout Itemize +\end_inset --X this options is passed to the simulator please see - the simulator docs for details. -\layout Itemize + When entering/exiting an ISR, it is possible to take advantage of the PIC18F + hardware shadow registers which hold the values of WREG, STATUS and BSR + registers. + This can be done by adding the keyword +\emph on +shadowregs +\emph default + before the +\emph on +interrupt +\emph default + keyword in the function's header. +\layout LyX-Code --s passed to simulator see the simulator docs for details. -\layout Itemize +void isr_shadow(void) shadowregs interrupt 1 +\layout LyX-Code --S passed to simulator see the simulator docs for details. -\layout Itemize +{ +\layout LyX-Code --k passed to simulator see the simulator docs for details. -\layout Subsection +... +\layout LyX-Code -SDCDB Debugger Commands +} \layout Standard -As mentioned earlier the command interface for the debugger has been deliberatel -y kept as close the GNU debugger gdb, as possible. - This will help the integration with existing graphical user interfaces - (like ddd, xxgdb or xemacs) existing for the GNU debugger. - If you use a graphical user interface for the debugger you can skip this - section. -\layout Subsubsection* -break [line | file:line | function | file:function] -\layout Standard +\emph on +shadowregs +\emph default + instructs the code generator not to store/restore WREG, STATUS, BSR when + entering/exiting the ISR. +\layout Subsection -Set breakpoint at specified line or function: -\newline +Function return values +\layout Standard -\newline +Return values from functions are placed to the appropriate registers following + a modified Microchip policy optimized for SDCC. + The following table shows these registers: +\layout Standard +\align center -\family sans -\series bold -sdcdb>break 100 -\newline -sdcdb>break foo.c:100 -\newline -sdcdb>break funcfoo -\newline -sdcdb>break foo.c:funcfoo -\layout Subsubsection* +\begin_inset Tabular + + + + + + +\begin_inset Text -clear [line | file:line | function | file:function ] \layout Standard -Clear breakpoint at specified line or function: -\newline +size +\end_inset + + +\begin_inset Text -\newline +\layout Standard -\family sans -\series bold -sdcdb>clear 100 -\newline -sdcdb>clear foo.c:100 -\newline -sdcdb>clear funcfoo -\newline -sdcdb>clear foo.c:funcfoo -\layout Subsubsection* +destination register +\end_inset + + + + +\begin_inset Text -continue \layout Standard -Continue program being debugged, after breakpoint. -\layout Subsubsection* +8 bits +\end_inset + + +\begin_inset Text -finish \layout Standard -Execute till the end of the current function. -\layout Subsubsection* +WREG +\end_inset + + + + +\begin_inset Text -delete [n] \layout Standard -Delete breakpoint number 'n'. - If used without any option clear ALL user defined break points. -\layout Subsubsection* - -info [break | stack | frame | registers ] -\layout Itemize +16 bits +\end_inset + + +\begin_inset Text -info break - list all breakpoints -\layout Itemize +\layout Standard -info stack - show the function call stack. -\layout Itemize +PRODL:WREG +\end_inset + + + + +\begin_inset Text -info frame - show information about the current execution frame. -\layout Itemize +\layout Standard -info registers - show content of all registers. -\layout Subsubsection* +24 bits +\end_inset + + +\begin_inset Text -step \layout Standard -Step program until it reaches a different source line. - Note: pressing repeats the last command. -\layout Subsubsection* +PRODH:PRODL:WREG +\end_inset + + + + +\begin_inset Text -next \layout Standard -Step program, proceeding through subroutine calls. -\layout Subsubsection* +32 bits +\end_inset + + +\begin_inset Text -run \layout Standard -Start debugged program. -\layout Subsubsection* +FSR0L:PRODH:PRODL:WREG +\end_inset + + + + +\begin_inset Text -ptype variable \layout Standard -Print type information of the variable. -\layout Subsubsection* +>32 bits +\end_inset + + +\begin_inset Text -print variable \layout Standard -print value of variable. -\layout Subsubsection* +on stack, FSR0 points to the beginning +\end_inset + + + -file filename -\layout Standard +\end_inset -load the given file name. - Note this is an alternate method of loading file for debugging. -\layout Subsubsection* -frame +\layout Subsection + +Interrupts \layout Standard -print information about current frame. -\layout Subsubsection* - -set srcmode -\layout Standard +An interrupt +\begin_inset LatexCommand \index{PIC16!interrupt} -Toggle between C source & assembly source. -\layout Subsubsection* +\end_inset -! simulator command -\layout Standard + service routine (ISR) is declared using the +\emph on +interrupt +\emph default + keyword. +\layout LyX-Code -Send the string following '!' to the simulator, the simulator response is - displayed. - Note the debugger does not interpret the command being sent to the simulator, - so if a command like 'go' is sent the debugger can loose its execution - context and may display incorrect values. -\layout Subsubsection* +void isr(void) interrupt +\emph on +n +\layout LyX-Code -quit -\layout Standard +{ +\layout LyX-Code -"Watch me now. - Iam going Down. - My name is Bobby Brown" -\layout Subsection +... +\layout LyX-Code -Interfacing SDCDB with DDD -\layout Comment +} +\layout Standard -The screenshot was converted from png to eps with: -\begin_inset Quotes sld -\end_inset -bmeps -c -e8f -p3 ddd_example.png >ddd_example.eps -\begin_inset Quotes srd -\end_inset +\emph on +n +\emph default + is the interrupt number, which for PIC18F devices can be: +\layout Standard +\align center - which produces a pretty compact eps file which is free from compression - artifacts. -\layout Comment +\begin_inset Tabular + + + + + + + +\begin_inset Text -The screenshot was included in sdccman.lyx cvs version 1.120 but later removed - as this broke the build system on Sourceforge (pdf-file was broken. - pdflatex does not accept eps files). \layout Standard -The -\emph on -p -\emph default -ortable + \emph on n -\emph default -etwork -\emph on -g -\emph default -raphics File -\size footnotesize +\end_inset + + +\begin_inset Text -\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewcvs.cgi/*checkout*/sdcc/trunk/sdcc/doc/figures/ddd_example.png} +\layout Standard +Interrupt Vector \end_inset + + +\begin_inset Text +\layout Standard -\size default - shows a screenshot of a debugging session with DDD -\begin_inset LatexCommand \index{DDD (debugger)} - +Interrupt Vector Address \end_inset + + + + +\begin_inset Text - (Unix only) on a simulated 8032. - The debugging session might not run as smoothly as the screenshot suggests. - The debugger allows setting of breakpoints, displaying and changing variables, - single stepping through C and assembler code. - -\newline -The source was compiled with -\family sans -\series bold +\layout Standard -\newline +0 +\end_inset + + +\begin_inset Text -\newline -sdcc - -\family default -\series default +\layout Standard -\begin_inset ERT -status Collapsed +RESET vector +\end_inset + + +\begin_inset Text \layout Standard -\backslash -/ +0x000000 \end_inset + + + + +\begin_inset Text +\layout Standard -\family sans -\series bold --debug ddd_example.c -\family default -\series default - -\family sans -\series bold - -\newline -\family default -\series default +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +1 +\end_inset + + +\begin_inset Text -\newline -and DDD was invoked with -\family sans -\series bold +\layout Standard -\newline -\newline -ddd -debugger 'sdcdb -cpu 8032 ddd_example' -\layout Subsection +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +HIGH priority interrupts +\end_inset + + +\begin_inset Text -Interfacing SDCDB with XEmacs -\begin_inset LatexCommand \index{XEmacs} +\layout Standard +0x000008 \end_inset + + + + +\begin_inset Text +\layout Standard -\begin_inset LatexCommand \index{Emacs} - +2 \end_inset - + + +\begin_inset Text \layout Standard -Two files (in emacs lisp) are provided for the interfacing with XEmacs, - sdcdb.el and sdcdbsrc.el. - These two files can be found in the $(prefix)/bin directory after the installat -ion is complete. - These files need to be loaded into XEmacs for the interface to work. - This can be done at XEmacs startup time by inserting the following into - your '.xemacs' file (which can be found in your HOME directory): -\newline +LOW priority interrupts +\end_inset + + +\begin_inset Text -\newline +\layout Standard -\family typewriter -(load-file sdcdbsrc.el) -\family default +0x000018 +\end_inset + + + -\newline +\end_inset -\newline -.xemacs is a lisp file so the () around the command is REQUIRED. - The files can also be loaded dynamically while XEmacs is running, set the - environment variable 'EMACSLOADPATH' to the installation bin directory - (/bin), then enter the following command ESC-x load-file sdcdbsrc. - To start the interface enter the following command: -\newline -\newline +\layout Standard -\family sans +When generating assembly code for ISR the code generator places a +\noun on +goto +\noun default +instruction at the +\emph on +Interrupt Vector Address +\emph default + which points at the genetated ISR. + This single GOTO instruction is part of an automatically generated +\emph on +interrupt entry point +\emph default + function. + The actuall ISR code is placed as normally would in the code space. + Upon interrupt request, the GOTO instruction is executed which jumps to + the ISR code. + When declaring interrupt functions as _naked this GOTO instruction is \series bold -ESC-x sdcdbsrc -\family default +not \series default + generated. + The whole interrupt functions is therefore placed at the Interrupt Vector + Address of the specific interrupt. + This is not a problem for the LOW priority interrupts, but it is a problem + for the RESET and the HIGH priority interrupts because code may be written + at the next interrupt´s vector address and cause undeterminate program + behaviour if that interrupt is raised. +\begin_inset Foot +collapsed false -\newline +\layout Standard -\newline -You will prompted to enter the file name to be debugged. - -\newline +This is not a problem when +\layout Enumerate -\newline -The command line options that are passed to the simulator directly are bound - to default values in the file sdcdbsrc.el. - The variables are listed below, these values maybe changed as required. +this is a HIGH interrupt ISR and LOW interrupts are +\emph on +disabled +\emph default + or not used. +\layout Enumerate + +when the ISR is small enough not to reach the next interrupt´s vector address. +\end_inset + + +\layout Standard + + +\emph on +n +\emph default + is possible to be omitted. + This way a function is generated similar to an ISR, but it is not assigned + to any interrupt. +\layout Standard + +When entering an interrupt, currently the PIC16 +\begin_inset LatexCommand \index{PIC16} + +\end_inset + + port automatically saves the following registers: \layout Itemize -sdcdbsrc-cpu-type '51 +WREG \layout Itemize -sdcdbsrc-frequency '11059200 +STATUS \layout Itemize -sdcdbsrc-serial nil +BSR +\layout Itemize + +PROD (PRODL and PRODH) +\layout Itemize + +FSR0 (FSR0L and FSR0H) \layout Standard -The following is a list of key mapping for the debugger interface. +These registers are restored upon return from the interrupt routine. +\begin_inset Foot +collapsed false + +\layout Standard + +NOTE that when the _naked attribute is specified for an interrupt routine, + then NO registers are stored or restored. +\end_inset + + +\layout Subsection + +Generic Pointers +\layout Standard + +Generic pointers are implemented in PIC16 port as 3-byte (24-bit) types. + There are 3 types of generic pointers currently implemented data, code + and eeprom pointers. + They are differentiated by the value of the 7th and 6th bits of the upper + byte: +\layout Standard +\align center + +\begin_inset Tabular + + + + + + + + + +\begin_inset Text + +\layout Standard + +pointer type +\end_inset + + +\begin_inset Text + +\layout Standard + +7th bit +\end_inset + + +\begin_inset Text + +\layout Standard + +6th bit +\end_inset + + +\begin_inset Text + +\layout Standard + +rest of the pointer +\end_inset + + +\begin_inset Text + +\layout Standard + +description +\end_inset + + + + +\begin_inset Text + +\layout Standard + +data +\end_inset + + +\begin_inset Text + +\layout Standard + +1 +\end_inset + + +\begin_inset Text + +\layout Standard + +0 +\end_inset + + +\begin_inset Text + \layout Standard -\SpecialChar ~ \family typewriter +\shape slanted +\emph on +uuuuuu uuuuxxxx xxxxxxxx +\end_inset + + +\begin_inset Text -\newline -;;\SpecialChar ~ -Current Listing :: -\newline -;;key\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -binding\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -Comment -\newline -;;---\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ --------\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -------- -\newline -;; -\newline -;;\SpecialChar ~ +\layout Standard + +a 12-bit data pointer in data RAM memory +\end_inset + + + + +\begin_inset Text + +\layout Standard + +code +\end_inset + + +\begin_inset Text + +\layout Standard + +0 +\end_inset + + +\begin_inset Text + +\layout Standard + +0 +\end_inset + + +\begin_inset Text + +\layout Standard + + +\family typewriter +\shape slanted +\emph on +uxxxxx xxxxxxxx xxxxxxxx +\end_inset + + +\begin_inset Text + +\layout Standard + +a 21-bit code pointer in FLASH memory +\end_inset + + + + +\begin_inset Text + +\layout Standard + +eeprom +\end_inset + + +\begin_inset Text + +\layout Standard + +0 +\end_inset + + +\begin_inset Text + +\layout Standard + +1 +\end_inset + + +\begin_inset Text + +\layout Standard + + +\family typewriter +\shape slanted +\emph on +uuuuuu uuuuuuxx xxxxxxxx +\end_inset + + +\begin_inset Text + +\layout Standard + +a 10-bit eeprom pointer in EEPROM memory +\end_inset + + + + +\begin_inset Text + +\layout Standard + +(unimplemented) +\end_inset + + +\begin_inset Text + +\layout Standard + +1 +\end_inset + + +\begin_inset Text + +\layout Standard + +1 +\end_inset + + +\begin_inset Text + +\layout Standard + + +\family typewriter +\shape slanted +\emph on +xxxxxx xxxxxxxx xxxxxxxx +\end_inset + + +\begin_inset Text + +\layout Standard + +unimplemented pointer type +\end_inset + + + + +\end_inset + + +\layout Standard + +Generic pointer are read and written with a set of library functions which + read/write 1, 2, 3, 4 bytes. +\layout Subsection + +PIC16 C Libraries +\layout Subsubsection + +Standard I/O Streams +\layout Standard + +In the +\emph on +stdio.h +\emph default + the type FILE is defined as: +\layout LyX-Code + +typedef char * FILE; +\layout Standard + +This type is the stream type implemented I/O in the PIC18F devices. + Also the standard input and output streams are declared in stdio.h: +\layout LyX-Code + +extern FILE * stdin; +\layout LyX-Code + +extern FILE * stdout; +\layout Standard + +The FILE type is actually a generic pointer which defines one more type + of generic pointers, the +\emph on +stream +\emph default +pointer. + This new type has the format: +\layout Standard +\align center + +\begin_inset Tabular + + + + + + + + + + + +\begin_inset Text + +\layout Standard + +pointer type +\end_inset + + +\begin_inset Text + +\layout Standard + +<7:6> +\end_inset + + +\begin_inset Text + +\layout Standard + +<5> +\end_inset + + +\begin_inset Text + +\layout Standard + +<4> +\end_inset + + +\begin_inset Text + +\layout Standard + +<3:0> +\end_inset + + +\begin_inset Text + +\layout Standard + +rest of the pointer +\end_inset + + +\begin_inset Text + +\layout Standard + +descrption +\end_inset + + + + +\begin_inset Text + +\layout Standard + +stream +\end_inset + + +\begin_inset Text + +\layout Standard + +00 +\end_inset + + +\begin_inset Text + +\layout Standard + +1 +\end_inset + + +\begin_inset Text + +\layout Standard + +0 +\end_inset + + +\begin_inset Text + +\layout Standard + +nnnn +\end_inset + + +\begin_inset Text + +\layout Standard + + +\family typewriter +\shape slanted +\emph on +uuuuuuuu uuuuuuuu +\end_inset + + +\begin_inset Text + +\layout Standard + +upper byte high nubble is 0x2n, the rest are zeroes +\end_inset + + + + +\end_inset + + +\layout Standard + +Currently implemented there are 3 types of streams defined: +\layout Standard +\align center + +\begin_inset Tabular + + + + + + + + +\begin_inset Text + +\layout Standard + +stream type +\end_inset + + +\begin_inset Text + +\layout Standard + +value +\end_inset + + +\begin_inset Text + +\layout Standard + +module +\end_inset + + +\begin_inset Text + +\layout Standard + +description +\end_inset + + + + +\begin_inset Text + +\layout Standard + +STREAM_USART +\end_inset + + +\begin_inset Text + +\layout Standard + + +\family typewriter +0x200000UL +\end_inset + + +\begin_inset Text + +\layout Standard + +USART +\end_inset + + +\begin_inset Text + +\layout Standard + +Writes/Reads characters via the USART peripheral +\end_inset + + + + +\begin_inset Text + +\layout Standard + +STREAM_MSSP +\end_inset + + +\begin_inset Text + +\layout Standard + + +\family typewriter +0x210000UL +\end_inset + + +\begin_inset Text + +\layout Standard + +MSSP +\end_inset + + +\begin_inset Text + +\layout Standard + +Writes/Reads characters via the MSSP peripheral +\end_inset + + + + +\begin_inset Text + +\layout Standard + +STREAM_USER +\end_inset + + +\begin_inset Text + +\layout Standard + + +\family typewriter +0x2f0000UL +\end_inset + + +\begin_inset Text + +\layout Standard + +(none) +\end_inset + + +\begin_inset Text + +\layout Standard + +Writes/Reads characters via used defined functions +\end_inset + + + + +\end_inset + + +\layout Standard + +The stream identifiers are declared as macros in the stdio.h header. +\layout Standard + +In the libc library there exist the functions that are used to write to + each of the above streams. + These are +\layout List +\labelwidthstring 00.00.0000 + +_ +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +_stream_usart_putchar writes a character at the USART stream +\layout List +\labelwidthstring 00.00.0000 + +_ +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +_stream_mssp_putchar writes a character at the MSSP stream +\layout List +\labelwidthstring 00.00.0000 + +putchar dummy function. + This writes a character to a user specified manner. +\layout Standard + +In order to increase performance +\emph on +putchar +\emph default +is declared in stdio.h as having its parameter in WREG (it has the wparam + keyword). + In stdio.h exists the macro PUTCHAR(arg) that defines the putchar function + in a user-friendly way. + +\emph on +arg +\emph default + is the name of the variable that holds the character to print. + An example follows: +\layout LyX-Code + +#include +\newline +#include +\newline + +\newline +PUTCHAR( c ) +\layout LyX-Code + +{ +\layout LyX-Code + + PORTA = c; /* dump character c to PORTA */ +\layout LyX-Code + +} +\newline + +\newline +void main(void) +\layout LyX-Code + +{ +\layout LyX-Code + + stdout = STREAM_USER; /* this is not necessary, since stdout points +\layout LyX-Code + + * by default to STREAM_USER */ +\layout LyX-Code + + printf (¨This is a printf test +\backslash +n¨); +\layout LyX-Code + +} +\layout LyX-Code + +\layout Subsubsection + +Printing functions +\layout Standard + +PIC16 contains an implementation of the printf-family of functions. + There exist the following functions: +\layout LyX-Code + +extern unsigned int sprintf(char *buf, char *fmt, ...); +\layout LyX-Code + +extern unsigned int vsprintf(char *buf, char *fmt, va_list ap); +\layout LyX-Code + +\layout LyX-Code + +extern unsigned int printf(char *fmt, ...); +\layout LyX-Code + +extern unsigned int vprintf(char *fmt, va_lista ap); +\layout LyX-Code + +\layout LyX-Code + +extern unsigned int fprintf(FILE *fp, char *fmt, ...); +\layout LyX-Code + +extern unsigned int vfprintf(FILE *fp, char *fmt, va_list ap); +\layout Standard + +For sprintf and vsprintf +\emph on +buf +\emph default +should normally be a data pointer where the resulting string will be placed. + No range checking is done so the user should allocate the necessery buffer. + For fprintf and vfprintf +\emph on +fp +\emph default + should be a stream pointer (i.e. + stdout, STREAM_MSSP, etc...). +\layout Subsubsection + +Signals +\layout Standard + +The PIC18F family of microcontrollers supports a number of interrupt sources. + A list of these interrupts is shown in the following table: +\layout Standard +\align center + +\begin_inset Tabular + + + + + + + + +\begin_inset Text + +\layout Standard + +signal name +\end_inset + + +\begin_inset Text + +\layout Standard + +description +\end_inset + + +\begin_inset Text + +\layout Standard + +signal name +\end_inset + + +\begin_inset Text + +\layout Standard + +descritpion +\end_inset + + + + +\begin_inset Text + +\layout Standard + +SIG_RB +\end_inset + + +\begin_inset Text + +\layout Standard + +PORTB change interrupt +\end_inset + + +\begin_inset Text + +\layout Standard + +SIG_EE +\end_inset + + +\begin_inset Text + +\layout Standard + +EEPROM/FLASH write complete interrupt +\end_inset + + + + +\begin_inset Text + +\layout Standard + +SIG_INT0 +\end_inset + + +\begin_inset Text + +\layout Standard + +INT0 external interrupt +\end_inset + + +\begin_inset Text + +\layout Standard + +SIG_BCOL +\end_inset + + +\begin_inset Text + +\layout Standard + +Bus collision interrupt +\end_inset + + + + +\begin_inset Text + +\layout Standard + +SIG_INT1 +\end_inset + + +\begin_inset Text + +\layout Standard + +INT1 external interrupt +\end_inset + + +\begin_inset Text + +\layout Standard + +SIG_LVD +\end_inset + + +\begin_inset Text + +\layout Standard + +Low voltage detect interrupt +\end_inset + + + + +\begin_inset Text + +\layout Standard + +SIG_INT2 +\end_inset + + +\begin_inset Text + +\layout Standard + +INT2 external interrupt +\end_inset + + +\begin_inset Text + +\layout Standard + +SIG_PSP +\end_inset + + +\begin_inset Text + +\layout Standard + +Parallel slave port interrupt +\end_inset + + + + +\begin_inset Text + +\layout Standard + +SIG_CCP1 +\end_inset + + +\begin_inset Text + +\layout Standard + +CCP1 module interrupt +\end_inset + + +\begin_inset Text + +\layout Standard + +SIG_AD +\end_inset + + +\begin_inset Text + +\layout Standard + +AD convertion complete interrupt +\end_inset + + + + +\begin_inset Text + +\layout Standard + +SIG_CCP2 +\end_inset + + +\begin_inset Text + +\layout Standard + +CCP2 module interrupt +\end_inset + + +\begin_inset Text + +\layout Standard + +SIG_RC +\end_inset + + +\begin_inset Text + +\layout Standard + +USART receive interrupt +\end_inset + + + + +\begin_inset Text + +\layout Standard + +SIG_TMR0 +\end_inset + + +\begin_inset Text + +\layout Standard + +TMR0 overflow interrupt +\end_inset + + +\begin_inset Text + +\layout Standard + +SIG_TX +\end_inset + + +\begin_inset Text + +\layout Standard + +USART transmit interrupt +\end_inset + + + + +\begin_inset Text + +\layout Standard + +SIG_TMR1 +\end_inset + + +\begin_inset Text + +\layout Standard + +TMR1 overflow interrupt +\end_inset + + +\begin_inset Text + +\layout Standard + +SIG_MSSP +\end_inset + + +\begin_inset Text + +\layout Standard + +SSP receive/transmit interrupt +\end_inset + + + + +\begin_inset Text + +\layout Standard + +SIG_TMR2 +\end_inset + + +\begin_inset Text + +\layout Standard + +TMR2 matches PR2 interrupt +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + + + +\begin_inset Text + +\layout Standard + +SIG_TMR3 +\end_inset + + +\begin_inset Text + +\layout Standard + +TMR3 overflow interrupt +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + + + +\end_inset + + +\layout Standard + +The prototypes for these names are defined in the header file +\emph on +signal.h +\emph default + . +\layout Standard + +In order to simplify signal handling, a number of macros is provided: +\layout List +\labelwidthstring 00.00.0000 + +DEF_INTHIGH(name) begin the definition of the interrupt dispatch table for + high priority interrupts. + +\emph on +name +\emph default + is the function name to use. +\layout List +\labelwidthstring 00.00.0000 + +DEF_INTLOW(name) begin the definition of the interrupt dispatch table fo + low priority interrupt. + +\emph on +name +\emph default + is the function name to use. +\layout List +\labelwidthstring 00.00.0000 + +DEF_HANDLER(sig,handler) define a handler for signal +\emph on +sig. +\layout List +\labelwidthstring 00.00.0000 + +END_DEF end the declaration of the dispatch table. +\layout Standard + +Additionally there are two more macros to simplify the declaration of the + signal handler: +\layout List +\labelwidthstring 00.00.0000 + + +\series medium +SIGHANDLER(handler) +\series default +this declares the function prototype for the +\emph on +handler +\emph default + function. +\layout List +\labelwidthstring 00.00.0000 + +SIGHANDLERNAKED(handler) same as SIGHANDLER() but declares a naked function. +\layout Standard + +An example of using the macros above is shown below: +\layout LyX-Code + +#include +\layout LyX-Code + +#include +\newline + +\newline +DEF_INTHIGH(high_int) +\layout LyX-Code + +DEF_HANDLER(SIG_TMR0, _tmr0_handler) +\layout LyX-Code + +DEF_HANDLER(SIG_BCOL, _bcol_handler) +\layout LyX-Code + +END_DEF +\newline + +\newline +SIGHANDLER(_tmr0_handler) +\layout LyX-Code + +{ +\layout LyX-Code + + /* action to be taken when timer 0 overflows */ +\layout LyX-Code + +} +\newline + +\newline +SIGHANDLERNAKED(_bcol_handler) +\layout LyX-Code + +{ +\layout LyX-Code + + _asm +\layout LyX-Code + + /* action to be taken when bus collision occurs */ +\layout LyX-Code + + retfie +\layout LyX-Code + + _endasm; +\layout LyX-Code + +} +\layout Standard + + +\series bold +NOTES: +\series default + Special care should be taken when using the above scheme: +\layout Itemize + +do not place a colon (;) at the end of the DEF_* and END_DEF macros. +\layout Itemize + +when declaring SIGHANDLERNAKED handler never forget to use +\emph on +retfie +\emph default + for proper returning. +\layout Subsection + +PIC16 Port -- Tips +\layout Standard + +Here you can find some general tips for compiling programs with SDCC/pic16. +\layout Subsubsection + +Stack size +\layout Standard + +The default stack +\begin_inset LatexCommand \index{PIC16!stack} + +\end_inset + + size (that is 64 bytes) probably is enough for many programs. + One must take care that when there are many levels of function nesting, + or there is excessive usage of stack, its size should be extended. + An example of such a case is the printf/sprintf family of functions. + If you encounter problems like not being able to print integers, then you + need to set the stack size around the maximum (256 for small stack model). + The following diagram shows what happens when calling printf to print an + integer: +\layout LyX-Code + +printf () --> ltoa () --> ultoa () --> divschar () +\layout Standard + +It is should be understood that stack is easily consumed when calling complicate +d functions. + Using command line arguments like - +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-fommit-frame-pointer might reduce stack usage by not creating unnecessery + stack frames. + Other ways to reduce stack usage may exist. +\layout Subsection + +Known bugs +\layout Standard + +The PIC16 Port currently does not pass SDCC's regression test +\begin_inset LatexCommand \index{Regression test (PIC16)} + +\end_inset + + suite (see section +\begin_inset LatexCommand \ref{sec:Quality-control} + +\end_inset + +) and thus the nightly regression tests for the PIC16 target are currently + disabled for all hosts except for +\emph on +Linux on Opteron. + +\emph default + This means you can see the result of the PIC16 regression tests f.e. + by checking the log files in +\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/regression_test_results/amd64-unknown-linux2.3/} + +\end_inset + + (pick the most up to date file there, scroll down, lend a hand). +\layout Chapter + +Debugging +\layout Standard + +There are several approaches to debugging your code. + This chapter is meant to show your options and to give detail on some of + them: +\newline + +\newline +When writing your code: +\layout Itemize + +write your code with debugging in mind (avoid duplicating code, put conceptually + similar variables into structs, use structured code, have strategic points + within your code where all variables are consistent, ...) +\layout Itemize + +run a syntax-checking tool like splint +\begin_inset LatexCommand \index{splint (syntax checking tool)} + +\end_inset + + +\begin_inset LatexCommand \index{lint (syntax checking tool)} + +\end_inset + + (see - +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-more-pedantic +\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT} + +\end_inset + +) over the code. +\layout Itemize + +for the high level code use a C-compiler (like f.e. + GCC) to compile run and debug the code on your host. + See (see - +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-more-pedantic +\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT} + +\end_inset + + ) on howto handle syntax extensions like __xdata, __at(), ... + +\layout Itemize + +use another C-compiler to compile code for your target. + Always an option but not recommended:) And not very likely to help you. + If you seriously consider walking this path you should at least occasionally + check portability of your code. + Most commercial compiler vendors will offer an evaluation version so you + can test compile your code or snippets of your code. +\layout Standard + +Debugging on a simulator: +\layout Itemize + +there is a separate section about SDCDB (section +\begin_inset LatexCommand \ref{cha:Debugging-with-SDCDB} + +\end_inset + +) below. +\layout Itemize + +or (8051 specific) use a freeware/commercial simulator which interfaces + to the AOMF +\begin_inset LatexCommand \index{AOMF, AOMF51} + +\end_inset + + file (see +\begin_inset LatexCommand \ref{OMF file} + +\end_inset + +) optionally generated by SDCC. +\layout Standard + +Debugging On-target: +\layout Itemize + +use a MCU port pin to serially output debug data to the RS232 port of your + host. + You'll probably want some level shifting device typically involving a MAX232 + or similar IC. + If the hardware serial port of the MCU is not available search for 'Software + UART' in your favourite search machine. +\layout Itemize + +use an on-target monitor. + In this context a monitor is a small program which usually accepts commands + via a serial line and allows to set program counter, to single step through + a program and read/write memory locations. + For the 8051 good examples of monitors are paulmon and cmon51 (see section + +\begin_inset LatexCommand \ref{sec:Related-open-source-tools} + +\end_inset + +). +\layout Itemize + +toggle MCU port pins at strategic points within your code and use an oscilloscop +e. + A +\emph on +digital oscilloscope +\emph default + +\begin_inset LatexCommand \index{Oscilloscope} + +\end_inset + + with deep trace memory is really helpful especially if you have to debug + a realtime application. + If you need to monitor more pins than your oscilloscope provides you can + sometimes get away with a small R-2R network. + On a single channel oscilloscope you could f.e. + monitor 2 push-pull driven pins by connecting one via a 10\SpecialChar ~ +k +\begin_inset Formula $\Omega$ +\end_inset + + resistor and the other one by a 5\SpecialChar ~ +k +\begin_inset Formula $\Omega$ +\end_inset + + resistor to the oscilloscope probe (check output drive capability of the + pins you want to monitor). + If you need to monitor many more pins a +\emph on +logic analyzer +\emph default + will be handy. +\layout Itemize + +use an ICE ( +\emph on +i +\emph default +n +\emph on +c +\emph default +ircuit +\emph on +e +\emph default +mulator +\begin_inset LatexCommand \index{ICE (in circuit emulator)} + +\end_inset + +). + Usually very expensive. + And very nice to have too. + And usually locks you (for years...) to the devices the ICE can emulate. + +\layout Itemize + +use a remote debugger. + In most 8-bit systems the symbol information is not available on the target, + and a complete debugger is too bulky for the target system. + Therefore usually a debugger on the host system connects to an on-target + debugging stub which accepts only primitive commands. + +\newline +Terms to enter into your favourite search engine could be 'remote debugging', + 'gdb stub' or 'inferior debugger'. + (is there one?) +\layout Itemize + +use an on target hardware debugger. + Some of the more modern MCUs include hardware support for setting break + points and monitoring/changing variables by using dedicated hardware pins. + This facility doesn't require additional code to run on the target and + +\emph on +usually +\emph default + doesn't affect runtime behaviour until a breakpoint is hit. + For the mcs51 most hardware debuggers use the AOMF +\begin_inset LatexCommand \index{AOMF, AOMF51} + +\end_inset + + file (see +\begin_inset LatexCommand \ref{OMF file} + +\end_inset + +) as input file. + +\layout Standard + +Last not least: +\layout Itemize + +if you are not familiar with any of the following terms you're likely to + run into problems rather sooner than later: +\emph on +volatile +\emph default +, +\emph on +atomic +\emph default +, +\emph on +memory map +\emph default +, +\emph on +overlay +\emph default +. + As an embedded programmer you +\emph on +have +\emph default + to know them so why not look them up +\emph on +before +\emph default + you have problems?) +\layout Itemize + +tell someone else about your problem (actually this is a surprisingly effective + means to hunt down the bug even if the listener is not familiar with your + environment). + As 'failure to communicate' is probably one of the job-induced deformations + of an embedded programmer this is highly encouraged. +\layout Section + +Debugging with SDCDB +\begin_inset LatexCommand \label{cha:Debugging-with-SDCDB} + +\end_inset + + +\begin_inset LatexCommand \index{SDCDB (debugger)} + +\end_inset + + +\layout Standard + +SDCC is distributed with a source level debugger +\begin_inset LatexCommand \index{Debugger} + +\end_inset + +. + The debugger uses a command line interface, the command repertoire of the + debugger has been kept as close to gdb +\begin_inset LatexCommand \index{gdb} + +\end_inset + + (the GNU debugger) as possible. + The configuration and build process is part of the standard compiler installati +on, which also builds and installs the debugger in the target directory + specified during configuration. + The debugger allows you debug BOTH at the C source and at the ASM source + level. +\layout Subsection + +Compiling for Debugging +\layout Standard + +The - +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-debug +\begin_inset LatexCommand \index{-\/-debug} + +\end_inset + + option must be specified for all files for which debug information is to + be generated. + The compiler generates a .adb file for each of these files. + The linker creates the .cdb +\begin_inset LatexCommand \index{.cdb} + +\end_inset + + file from the .adb +\begin_inset LatexCommand \index{.adb} + +\end_inset + + files and the address information. + This .cdb is used by the debugger. +\layout Subsection + +How the Debugger Works +\layout Standard + +When the - +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-debug option is specified the compiler generates extra symbol information + some of which are put into the assembler source and some are put into the + .adb file. + Then the linker creates the .cdb file from the individual .adb files with + the address information for the symbols. + The debugger reads the symbolic information generated by the compiler & + the address information generated by the linker. + It uses the SIMULATOR (Daniel's S51) to execute the program, the program + execution is controlled by the debugger. + When a command is issued for the debugger, it translates it into appropriate + commands for the simulator. + (Currently SDCDM only connects to the simulator but +\emph on +newcdb +\emph default + at +\begin_inset LatexCommand \url{http://ec2drv.sf.net/} + +\end_inset + + is an effort to connect directly to the hardware.) +\layout Subsection + +Starting the Debugger SDCDB +\layout Standard + +The debugger can be started using the following command line. + (Assume the file you are debugging has the file name foo). +\newline + +\newline + +\family sans +\series bold +sdcdb foo +\newline + +\family default +\series default + +\newline +The debugger will look for the following files. +\layout Itemize + +foo.c - the source file. +\layout Itemize + +foo.cdb - the debugger symbol information file. +\layout Itemize + +foo.ihx - the Intel hex format +\begin_inset LatexCommand \index{Intel hex format} + +\end_inset + + object file. +\layout Subsection + +SDCDB Command Line Options +\layout Itemize + +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-directory= this option can used to specify the directory + search list. + The debugger will look into the directory list specified for source, cdb + & ihx files. + The items in the directory list must be separated by ':', e.g. + if the source files can be in the directories /home/src1 and /home/src2, + the - +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-directory option should be - +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-directory=/home/src1:/home/src2. + Note there can be no spaces in the option. + +\layout Itemize + +-cd - change to the . +\layout Itemize + +-fullname - used by GUI front ends. +\layout Itemize + +-cpu - this argument is passed to the simulator please see the + simulator docs for details. +\layout Itemize + +-X this options is passed to the simulator please see + the simulator docs for details. +\layout Itemize + +-s passed to simulator see the simulator docs for details. +\layout Itemize + +-S passed to simulator see the simulator docs for details. +\layout Itemize + +-k passed to simulator see the simulator docs for details. +\layout Subsection + +SDCDB Debugger Commands +\layout Standard + +As mentioned earlier the command interface for the debugger has been deliberatel +y kept as close the GNU debugger gdb, as possible. + This will help the integration with existing graphical user interfaces + (like ddd, xxgdb or xemacs) existing for the GNU debugger. + If you use a graphical user interface for the debugger you can skip this + section. +\layout Subsubsection* + +break [line | file:line | function | file:function] +\layout Standard + +Set breakpoint at specified line or function: +\newline + +\newline + +\family sans +\series bold +sdcdb>break 100 +\newline +sdcdb>break foo.c:100 +\newline +sdcdb>break funcfoo +\newline +sdcdb>break foo.c:funcfoo +\layout Subsubsection* + +clear [line | file:line | function | file:function ] +\layout Standard + +Clear breakpoint at specified line or function: +\newline + +\newline + +\family sans +\series bold +sdcdb>clear 100 +\newline +sdcdb>clear foo.c:100 +\newline +sdcdb>clear funcfoo +\newline +sdcdb>clear foo.c:funcfoo +\layout Subsubsection* + +continue +\layout Standard + +Continue program being debugged, after breakpoint. +\layout Subsubsection* + +finish +\layout Standard + +Execute till the end of the current function. +\layout Subsubsection* + +delete [n] +\layout Standard + +Delete breakpoint number 'n'. + If used without any option clear ALL user defined break points. +\layout Subsubsection* + +info [break | stack | frame | registers ] +\layout Itemize + +info break - list all breakpoints +\layout Itemize + +info stack - show the function call stack. +\layout Itemize + +info frame - show information about the current execution frame. +\layout Itemize + +info registers - show content of all registers. +\layout Subsubsection* + +step +\layout Standard + +Step program until it reaches a different source line. + Note: pressing repeats the last command. +\layout Subsubsection* + +next +\layout Standard + +Step program, proceeding through subroutine calls. +\layout Subsubsection* + +run +\layout Standard + +Start debugged program. +\layout Subsubsection* + +ptype variable +\layout Standard + +Print type information of the variable. +\layout Subsubsection* + +print variable +\layout Standard + +print value of variable. +\layout Subsubsection* + +file filename +\layout Standard + +load the given file name. + Note this is an alternate method of loading file for debugging. +\layout Subsubsection* + +frame +\layout Standard + +print information about current frame. +\layout Subsubsection* + +set srcmode +\layout Standard + +Toggle between C source & assembly source. +\layout Subsubsection* + +! simulator command +\layout Standard + +Send the string following '!' to the simulator, the simulator response is + displayed. + Note the debugger does not interpret the command being sent to the simulator, + so if a command like 'go' is sent the debugger can loose its execution + context and may display incorrect values. +\layout Subsubsection* + +quit +\layout Standard + +"Watch me now. + Iam going Down. + My name is Bobby Brown" +\layout Subsection + +Interfacing SDCDB with DDD +\layout Standard + + +\begin_inset Note +collapsed true + +\layout Standard + +The screenshot was converted from png to eps with: +\begin_inset Quotes sld +\end_inset + +bmeps -c -e8f -p3 ddd_example.png >ddd_example.eps +\begin_inset Quotes srd +\end_inset + + which produces a pretty compact eps file which is free from compression + artifacts. +\layout Standard + +The screenshot was included in sdccman.lyx cvs version 1.120 but later removed + as this broke the build system on Sourceforge (pdf-file was broken. + pdflatex does not accept eps files). +\end_inset + + +\layout Standard + +The +\emph on +p +\emph default +ortable +\emph on +n +\emph default +etwork +\emph on +g +\emph default +raphics File +\size footnotesize + +\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewcvs.cgi/*checkout*/sdcc/trunk/sdcc/doc/figures/ddd_example.png} + +\end_inset + + +\size default + shows a screenshot of a debugging session with DDD +\begin_inset LatexCommand \index{DDD (debugger)} + +\end_inset + + (Unix only) on a simulated 8032. + The debugging session might not run as smoothly as the screenshot suggests. + The debugger allows setting of breakpoints, displaying and changing variables, + single stepping through C and assembler code. + +\newline +The source was compiled with +\family sans +\series bold + +\newline + +\newline +sdcc - +\family default +\series default + +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + + +\family sans +\series bold +-debug ddd_example.c +\family default +\series default + +\family sans +\series bold + +\newline + +\family default +\series default + +\newline +and DDD was invoked with +\family sans +\series bold + +\newline + +\newline +ddd -debugger "sdcdb -cpu 8032 ddd_example" +\layout Standard + + +\begin_inset Note +collapsed false + +\layout Standard + +Check that the double quotes or an apostroph within the command line survive + the LyX tool chain. + Previously the apostrophs got slanted in the PDF output so a cut and paste + did not work. +\end_inset + + +\layout Subsection + +Interfacing SDCDB with XEmacs +\begin_inset LatexCommand \index{XEmacs} + +\end_inset + + +\begin_inset LatexCommand \index{Emacs} + +\end_inset + + +\layout Standard + +Two files (in emacs lisp) are provided for the interfacing with XEmacs, + sdcdb.el and sdcdbsrc.el. + These two files can be found in the $(prefix)/bin directory after the installat +ion is complete. + These files need to be loaded into XEmacs for the interface to work. + This can be done at XEmacs startup time by inserting the following into + your '.xemacs' file (which can be found in your HOME directory): +\newline + +\newline + +\family typewriter +(load-file sdcdbsrc.el) +\family default + +\newline + +\newline +.xemacs is a lisp file so the () around the command is REQUIRED. + The files can also be loaded dynamically while XEmacs is running, set the + environment variable 'EMACSLOADPATH' to the installation bin directory + (/bin), then enter the following command ESC-x load-file sdcdbsrc. + To start the interface enter the following command: +\newline + +\newline + +\family sans +\series bold +ESC-x sdcdbsrc +\family default +\series default + +\newline + +\newline +You will prompted to enter the file name to be debugged. + +\newline + +\newline +The command line options that are passed to the simulator directly are bound + to default values in the file sdcdbsrc.el. + The variables are listed below, these values maybe changed as required. +\layout Itemize + +sdcdbsrc-cpu-type '51 +\layout Itemize + +sdcdbsrc-frequency '11059200 +\layout Itemize + +sdcdbsrc-serial nil +\layout Standard + +The following is a list of key mapping for the debugger interface. +\layout Standard +\pagebreak_bottom +\SpecialChar ~ + +\family typewriter + +\newline +;;\SpecialChar ~ +Current Listing :: +\newline +;;key\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +binding\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +Comment +\newline +;;---\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +-------\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +------- +\newline +;; +\newline +;;\SpecialChar ~ n\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -23351,7 +25628,7 @@ Toggle list mode \newline \layout Chapter -\pagebreak_top + TIPS \layout Standard @@ -23497,70 +25774,6 @@ Declare the variables to be local whenever possible, especially loop control variables (induction). \layout Itemize -Since the compiler does not always do implicit integral promotion, the programme -r should do an explicit cast when integral promotion is required. -\layout Itemize - -Reducing the size of division, multiplication & modulus operations can reduce - code size substantially. - Take the following code for example. -\begin_deeper -\layout Verse - - -\family typewriter -foobar(unsigned int p1, unsigned char ch) -\newline -{ -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -unsigned char ch1 = p1 % ch ; -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -.... -\newline -} -\layout Standard - -For the modulus operation the variable ch will be promoted to unsigned int - first then the modulus operation will be performed (this will lead to a - call to support routine _moduint()), and the result will be casted to a - char. - If the code is changed to -\layout Verse - - -\family typewriter -foobar(unsigned int p1, unsigned char ch) -\newline -{ -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -unsigned char ch1 = (unsigned char)p1 % ch ; -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -.... -\newline -} -\layout Standard - -It would substantially reduce the code generated (future versions of the - compiler will be smart enough to detect such optimization opportunities). -\end_deeper -\layout Itemize - Have a look at the assembly listing to get a \begin_inset Quotes sld \end_inset @@ -23778,6 +25991,8 @@ Tools \layout Standard + +\series bold Name \end_inset @@ -23786,6 +26001,8 @@ Name \layout Standard + +\series bold Purpose \end_inset @@ -23794,6 +26011,8 @@ Purpose \layout Standard + +\series bold Directory \end_inset @@ -23804,7 +26023,12 @@ Directory \layout Standard -ucSsim +uCsim +\begin_inset LatexCommand \index{uCsim} + +\end_inset + + \end_inset @@ -24192,14 +26416,16 @@ Documentation \begin_inset Tabular - - - + + + \begin_inset Text \layout Standard + +\series bold Subject / Title \end_inset @@ -24208,7 +26434,9 @@ Subject / Title \layout Standard -Where to get / filename + +\series bold +Filename / Where to get \end_inset @@ -24227,6 +26455,22 @@ SDCC Compiler User Guide \layout Standard You're reading it right now +\emph on + \SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + +\hfill +online at: +\emph default + +\newline + +\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/sdccman.pdf} + +\end_inset + + \end_inset @@ -24245,6 +26489,22 @@ Changelog of SDCC \layout Standard sdcc/Changelog +\emph on + \SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + +\hfill +online at: +\emph default + +\newline + +\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/ChangeLog} + +\end_inset + + \end_inset @@ -24264,7 +26524,9 @@ ASXXXX \end_inset - Assemblers and ASLINK + Assemblers and +\newline +ASLINK \begin_inset LatexCommand \index{aslink} \end_inset @@ -24276,13 +26538,29 @@ ASXXXX Relocating Linker \end_inset - - -\begin_inset Text + + +\begin_inset Text + +\layout Standard + +sdcc/as/doc/asxhtm.html +\emph on +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + +\hfill +online at: +\emph default + +\newline + +\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/as/doc/asxhtm.html} + +\end_inset -\layout Standard -sdcc/as/doc/asxhtm.html \end_inset @@ -24305,7 +26583,23 @@ SDCC regression test \layout Standard -sdcc/doc/test_suite_spec.pdf +sdcc/doc/test_suite_spec.pdf +\emph on +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + +\hfill +online at: +\emph default + +\newline + +\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/test_suite_spec.pdf} + +\end_inset + + \end_inset @@ -24323,7 +26617,23 @@ Various notes \layout Standard -sdcc/doc/* +sdcc/doc/* +\emph on +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + +\hfill +online at: +\emph default + +\newline + +\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/sdcc/trunk/sdcc/doc/} + +\end_inset + + \end_inset @@ -24346,7 +26656,23 @@ Notes on debugging with SDCDB \layout Standard -sdcc/debugger/README +sdcc/debugger/README +\emph on +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + +\hfill +online at +\emph default +: +\newline + +\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/debugger/README} + +\end_inset + + \end_inset @@ -24356,7 +26682,12 @@ sdcc/debugger/README \layout Standard -Software simulator for microcontrollers +uCsim +\begin_inset LatexCommand \index{uCsim} + +\end_inset + + Software simulator for microcontrollers \end_inset @@ -24381,8 +26712,23 @@ sdcc/sim/ucsim/doc \emph default \bar default \noun default -\color default -/index.html +/index.html +\emph on +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + +\hfill +online at: +\emph default + +\newline + +\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/sim/ucsim/doc/index.html} + +\end_inset + + \end_inset @@ -24405,7 +26751,23 @@ Temporary notes on the pic16 \layout Standard -sdcc/src/pic16/NOTES +sdcc/src/pic16/NOTES +\emph on +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + +\hfill +online at: +\newline + +\emph default + +\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/src/pic16/NOTES} + +\end_inset + + \end_inset @@ -24440,8 +26802,23 @@ cdbfileformat.pd \emph default \bar default \noun default -\color default f +\emph on + \SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + +\hfill +online at: +\emph default + +\newline + +\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/cdbfileformat.pdf} + +\end_inset + + \end_inset @@ -24478,9 +26855,181 @@ Related open source tools \begin_inset Text -\layout Standard +\layout Standard + + +\series bold +Name +\end_inset + + +\begin_inset Text + +\layout Standard + + +\series bold +Purpose +\end_inset + + +\begin_inset Text + +\layout Standard + + +\series bold +Where to get +\end_inset + + + + +\begin_inset Text + +\layout Standard + +gpsim +\begin_inset LatexCommand \index{gpsim (pic simulator)} + +\end_inset + + +\end_inset + + +\begin_inset Text + +\layout Standard + +PIC simulator +\end_inset + + +\begin_inset Text + +\layout Standard + + +\begin_inset LatexCommand \url{http://www.dattalo.com/gnupic/gpsim.html} + +\end_inset + + +\end_inset + + + + +\begin_inset Text + +\layout Standard + +gputils +\begin_inset LatexCommand \index{gputils (pic tools)} + +\end_inset + + +\end_inset + + +\begin_inset Text + +\layout Standard + +GNU PIC utilities +\end_inset + + +\begin_inset Text + +\layout Standard + + +\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils} + +\end_inset + + +\end_inset + + + + +\begin_inset Text + +\layout Standard + +flP5 +\end_inset + + +\begin_inset Text + +\layout Standard + +PIC programmer +\end_inset + + +\begin_inset Text + +\layout Standard + + +\begin_inset LatexCommand \url{http://freshmeat.net/projects/flp5/} + +\end_inset + + +\end_inset + + + + +\begin_inset Text + +\layout Standard + +ec2drv/newcdb +\end_inset + + +\begin_inset Text + +\layout Standard + +Tools for Silicon Laboratories JTAG debug adapter, partly based on SDCDB + (Unix only) +\end_inset + + +\begin_inset Text + +\layout Standard + + +\begin_inset LatexCommand \url{http://sourceforge.net/projects/ec2drv} + +\end_inset + + +\end_inset + + + + +\begin_inset Text + +\layout Standard + +indent +\begin_inset LatexCommand \index{indent (source formatting tool)} + +\end_inset + -Name \end_inset @@ -24488,7 +27037,7 @@ Name \layout Standard -Purpose +Formats C source - Master of the white spaces \end_inset @@ -24496,7 +27045,12 @@ Purpose \layout Standard -Where to get + +\begin_inset LatexCommand \url{http://directory.fsf.org/GNU/indent.html} + +\end_inset + + \end_inset @@ -24506,8 +27060,8 @@ Where to get \layout Standard -gpsim -\begin_inset LatexCommand \index{gpsim (pic simulator)} +srecord +\begin_inset LatexCommand \index{srecord (bin, hex, ... tool)} \end_inset @@ -24519,7 +27073,7 @@ gpsim \layout Standard -PIC simulator +Object file conversion, checksumming, ... \end_inset @@ -24528,7 +27082,7 @@ PIC simulator \layout Standard -\begin_inset LatexCommand \url{http://www.dattalo.com/gnupic/gpsim.html} +\begin_inset LatexCommand \url{http://sourceforge.net/projects/srecord} \end_inset @@ -24542,8 +27096,8 @@ PIC simulator \layout Standard -gputils -\begin_inset LatexCommand \index{gputils (pic tools)} +objdump +\begin_inset LatexCommand \index{objdump (tool)} \end_inset @@ -24555,7 +27109,33 @@ gputils \layout Standard -GNU PIC utilities +Object file conversion, ... +\end_inset + + +\begin_inset Text + +\layout Standard + +Part of binutils (should be there anyway) +\end_inset + + + + +\begin_inset Text + +\layout Standard + +cmon51 +\end_inset + + +\begin_inset Text + +\layout Standard + +8051 monitor (hex up-/download, single step, disassemble) \end_inset @@ -24564,7 +27144,7 @@ GNU PIC utilities \layout Standard -\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils} +\begin_inset LatexCommand \url{http://sourceforge.net/projects/cmon51} \end_inset @@ -24578,7 +27158,12 @@ GNU PIC utilities \layout Standard -flP5 +doxygen +\begin_inset LatexCommand \index{doxygen (source documentation tool)} + +\end_inset + + \end_inset @@ -24586,7 +27171,7 @@ flP5 \layout Standard -PIC programmer +Source code documentation system \end_inset @@ -24595,7 +27180,7 @@ PIC programmer \layout Standard -\begin_inset LatexCommand \url{http://freshmeat.net/projects/flp5/} +\begin_inset LatexCommand \url{http://www.doxygen.org} \end_inset @@ -24609,7 +27194,7 @@ PIC programmer \layout Standard -ec2drv/newcdb +kdevelop \end_inset @@ -24617,8 +27202,7 @@ ec2drv/newcdb \layout Standard -Tools for Silicon Laboratories JTAG debug adapter, partly based on SDCDB - (Unix only) +IDE (has anyone tried integrating SDCC & SDCDB? Unix only) \end_inset @@ -24627,7 +27211,7 @@ Tools for Silicon Laboratories JTAG debug adapter, partly based on SDCDB \layout Standard -\begin_inset LatexCommand \url{http://sourceforge.net/projects/ec2drv} +\begin_inset LatexCommand \url{http://www.kdevelop.org} \end_inset @@ -24641,12 +27225,7 @@ Tools for Silicon Laboratories JTAG debug adapter, partly based on SDCDB \layout Standard -indent -\begin_inset LatexCommand \index{indent (source formatting tool)} - -\end_inset - - +paulmon \end_inset @@ -24654,7 +27233,7 @@ indent \layout Standard -Formats C source - Master of the white spaces +8051 monitor (hex up-/download, single step, disassemble) \end_inset @@ -24663,7 +27242,7 @@ Formats C source - Master of the white spaces \layout Standard -\begin_inset LatexCommand \url{http://directory.fsf.org/GNU/indent.html} +\begin_inset LatexCommand \url{http://www.pjrc.com/tech/8051/paulmon2.html} \end_inset @@ -24677,8 +27256,8 @@ Formats C source - Master of the white spaces \layout Standard -srecord -\begin_inset LatexCommand \index{srecord (bin, hex, ... tool)} +splint +\begin_inset LatexCommand \index{splint (syntax checking tool)} \end_inset @@ -24690,7 +27269,12 @@ srecord \layout Standard -Object file conversion, checksumming, ... +Statically checks c sources (see +\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT} + +\end_inset + +) \end_inset @@ -24699,7 +27283,7 @@ Object file conversion, checksumming, ... \layout Standard -\begin_inset LatexCommand \url{http://sourceforge.net/projects/srecord} +\begin_inset LatexCommand \url{http://www.splint.org} \end_inset @@ -24707,14 +27291,14 @@ Object file conversion, checksumming, ... \end_inset - + \begin_inset Text \layout Standard -objdump -\begin_inset LatexCommand \index{objdump (tool)} +ddd +\begin_inset LatexCommand \index{DDD (debugger)} \end_inset @@ -24726,7 +27310,12 @@ objdump \layout Standard -Object file conversion, ... +Debugger, serves nicely as GUI to SDCDB +\begin_inset LatexCommand \index{SDCDB (debugger)} + +\end_inset + + (Unix only) \end_inset @@ -24734,17 +27323,43 @@ Object file conversion, ... \layout Standard -Part of binutils (should be there anyway) + +\begin_inset LatexCommand \url{http://www.gnu.org/software/ddd/} + +\end_inset + + \end_inset - + + +\end_inset + + +\newline + +\layout Section + +Related documentation / recommended reading +\layout Standard +\align left + +\begin_inset Tabular + + + + + + \begin_inset Text \layout Standard -cmon51 + +\series bold +Name \end_inset @@ -24752,7 +27367,9 @@ cmon51 \layout Standard -8051 monitor (hex up-/download, single step, disassemble) + +\series bold +Subject / Title \end_inset @@ -24761,11 +27378,8 @@ cmon51 \layout Standard -\begin_inset LatexCommand \url{http://sourceforge.net/projects/cmon51} - -\end_inset - - +\series bold +Where to get \end_inset @@ -24775,12 +27389,16 @@ cmon51 \layout Standard -doxygen -\begin_inset LatexCommand \index{doxygen (source documentation tool)} - -\end_inset - +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +c-refcard.pdf \end_inset @@ -24788,7 +27406,12 @@ doxygen \layout Standard -Source code documentation system +C Reference Card +\begin_inset LatexCommand \index{C Reference card} + +\end_inset + +, 2 pages \end_inset @@ -24797,7 +27420,7 @@ Source code documentation system \layout Standard -\begin_inset LatexCommand \url{http://www.doxygen.org} +\begin_inset LatexCommand \url{http://refcards.com/refcards/c/index.html} \end_inset @@ -24811,7 +27434,7 @@ Source code documentation system \layout Standard -kdevelop +c-faq \end_inset @@ -24819,7 +27442,12 @@ kdevelop \layout Standard -IDE (has anyone tried integrating SDCC & SDCDB? Unix only) +C-FAQ +\begin_inset LatexCommand \index{C FAQ} + +\end_inset + + \end_inset @@ -24828,7 +27456,7 @@ IDE (has anyone tried integrating SDCC & SDCDB? Unix only) \layout Standard -\begin_inset LatexCommand \url{http://www.kdevelop.org} +\begin_inset LatexCommand \url{http://www.c-faq.com} \end_inset @@ -24842,7 +27470,7 @@ IDE (has anyone tried integrating SDCC & SDCDB? Unix only) \layout Standard -paulmon +ISO/IEC 9899:TC2 \end_inset @@ -24850,7 +27478,15 @@ paulmon \layout Standard -8051 monitor (hex up-/download, single step, disassemble) + +\begin_inset Quotes sld +\end_inset + +C-Standard +\begin_inset Quotes srd +\end_inset + + \end_inset @@ -24859,7 +27495,9 @@ paulmon \layout Standard -\begin_inset LatexCommand \url{http://www.pjrc.com/tech/8051/paulmon2.html} +\size footnotesize + +\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899} \end_inset @@ -24873,12 +27511,7 @@ paulmon \layout Standard -splint -\begin_inset LatexCommand \index{splint (syntax checking tool)} - -\end_inset - - +ISO/IEC DTR 18037 \end_inset @@ -24886,12 +27519,15 @@ splint \layout Standard -Statically checks c sources (see -\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT} +\begin_inset Quotes sld \end_inset -) +Extensions for Embedded C +\begin_inset Quotes srd +\end_inset + + \end_inset @@ -24900,7 +27536,9 @@ Statically checks c sources (see \layout Standard -\begin_inset LatexCommand \url{http://www.splint.org} +\size footnotesize + +\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1021.pdf} \end_inset @@ -24908,18 +27546,12 @@ Statically checks c sources (see \end_inset - + \begin_inset Text \layout Standard -ddd -\begin_inset LatexCommand \index{DDD (debugger)} - -\end_inset - - \end_inset @@ -24927,25 +27559,40 @@ ddd \layout Standard -Debugger, serves nicely as GUI to SDCDB -\begin_inset LatexCommand \index{SDCDB (debugger)} - +Latest datasheet of target CPU \end_inset + + +\begin_inset Text - (Unix only) +\layout Standard + +vendor \end_inset - + + + \begin_inset Text \layout Standard +\end_inset + + +\begin_inset Text -\begin_inset LatexCommand \url{http://www.gnu.org/software/ddd/} +\layout Standard +Revision history of datasheet \end_inset + + +\begin_inset Text +\layout Standard +vendor \end_inset @@ -24958,30 +27605,47 @@ Debugger, serves nicely as GUI to SDCDB \layout Section -Related documentation / recommended reading +Application notes specifically for SDCC +\layout Standard + +SDCC makes no claims about the completeness of this list and about up-to-datenes +s or correctness of the application notes +\begin_inset LatexCommand \index{Application notes} + +\end_inset + +. \layout Standard \align left +\size footnotesize + \begin_inset Tabular - - - + + + \begin_inset Text \layout Standard -Name + +\series bold +\size footnotesize +Vendor \end_inset - + \begin_inset Text \layout Standard + +\series bold +\size footnotesize Subject / Title \end_inset @@ -24990,6 +27654,9 @@ Subject / Title \layout Standard + +\series bold +\size footnotesize Where to get \end_inset @@ -25001,15 +27668,8 @@ Where to get \layout Standard -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -c-refcard.pdf +\size footnotesize +Maxim / Dallas \end_inset @@ -25017,12 +27677,14 @@ c-refcard.pdf \layout Standard -C Reference Card -\begin_inset LatexCommand \index{C Reference card} + +\size footnotesize +Using the SDCC Compiler for the DS80C400 +\begin_inset LatexCommand \index{DS80C400} \end_inset -, 2 pages + \end_inset @@ -25031,7 +27693,9 @@ C Reference Card \layout Standard -\begin_inset LatexCommand \url{http://refcards.com/refcards/c/index.html} +\size footnotesize + +\begin_inset LatexCommand \url{http://pdfserv.maxim-ic.com/en/an/AN3346.pdf} \end_inset @@ -25045,20 +27709,24 @@ C Reference Card \layout Standard -c-faq + +\size footnotesize +Maxim / Dallas \end_inset - + \begin_inset Text \layout Standard -C-FAQ -\begin_inset LatexCommand \index{C FAQ} -\end_inset +\size footnotesize +Using the Free SDCC C Compiler to Develop Firmware for the DS89C420/430/440/450 +\begin_inset LatexCommand \index{DS89C4x0} +\end_inset + Family of Microcontrollers \end_inset @@ -25067,7 +27735,9 @@ C-FAQ \layout Standard -\begin_inset LatexCommand \url{http://www.c-faq.com} +\size footnotesize + +\begin_inset LatexCommand \url{http://pdfserv.maxim-ic.com/en/an/AN3477.pdf} \end_inset @@ -25081,7 +27751,9 @@ C-FAQ \layout Standard -ISO/IEC 9899:TC2 + +\size footnotesize +Silicon Laboratories / Cygnal \end_inset @@ -25090,11 +27762,10 @@ ISO/IEC 9899:TC2 \layout Standard -\begin_inset Quotes sld -\end_inset +\size footnotesize +Integrating SDCC 8051 Tools Into The Silicon Labs IDE +\begin_inset LatexCommand \index{IDE} -C-Standard -\begin_inset Quotes srd \end_inset @@ -25108,7 +27779,7 @@ C-Standard \size footnotesize -\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899} +\begin_inset LatexCommand \url{http://www.silabs.com/public/documents/tpub_doc/anote/Microcontrollers/en/an198.pdf} \end_inset @@ -25122,7 +27793,9 @@ C-Standard \layout Standard -ISO/IEC DTR 18037 + +\size footnotesize +Ramtron / Goal Semiconductor \end_inset @@ -25131,14 +27804,8 @@ ISO/IEC DTR 18037 \layout Standard -\begin_inset Quotes sld -\end_inset - -Extensions for Embedded C -\begin_inset Quotes srd -\end_inset - - +\size footnotesize +Interfacing SDCC to Syn and Textpad \end_inset @@ -25149,7 +27816,7 @@ Extensions for Embedded C \size footnotesize -\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1021.pdf} +\begin_inset LatexCommand \url{http://www.ramtron.com/doc/Products/Microcontroller/Support_Tools.asp} \end_inset @@ -25163,6 +27830,9 @@ Extensions for Embedded C \layout Standard + +\size footnotesize +Ramtron / Goal Semiconductor \end_inset @@ -25170,7 +27840,9 @@ Extensions for Embedded C \layout Standard -Latest datasheet of target CPU + +\size footnotesize +Installing and Configuring SDCC and Crimson Editor \end_inset @@ -25178,7 +27850,14 @@ Latest datasheet of target CPU \layout Standard -vendor + +\size footnotesize + +\begin_inset LatexCommand \url{http://www.ramtron.com/doc/Products/Microcontroller/Support_Tools.asp} + +\end_inset + + \end_inset @@ -25188,6 +27867,9 @@ vendor \layout Standard + +\size footnotesize +Texas Instruments \end_inset @@ -25195,7 +27877,9 @@ vendor \layout Standard -Revision history of datasheet + +\size footnotesize +MSC12xx Programming with SDCC \end_inset @@ -25203,7 +27887,14 @@ Revision history of datasheet \layout Standard -vendor + +\size footnotesize + +\begin_inset LatexCommand \url{http://focus.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=sbaa109&fileType=pdf} + +\end_inset + + \end_inset @@ -25212,1575 +27903,2211 @@ vendor \end_inset -\newline - \layout Section -Application notes specifically for SDCC +Some Questions \layout Standard -SDCC makes no claims about the completeness of this list and about up-to-datenes -s or correctness of the application notes -\begin_inset LatexCommand \index{Application notes} +Some questions answered, some pointers given - it might be time to in turn + ask +\emph on +you +\emph default + some questions: +\layout Itemize -\end_inset +can you solve your project with the selected microcontroller? Would you + find out early or rather late that your target is too small/slow/whatever? + Can you switch to a slightly better device if it doesn't fit? +\layout Itemize -. -\layout Standard -\align left +should you solve the problem with an 8 bit CPU? Or would a 16/32 bit CPU + and/or another programming language be more adequate? Would an operating + system on the target device help? +\layout Itemize -\size footnotesize +if you solved the problem, will the marketing department be happy? +\layout Itemize -\begin_inset Tabular - - - - - - - -\begin_inset Text +if the marketing department is happy, will customers be happy? +\layout Itemize + +if you're the project manager, marketing department and maybe even the customer + in one person, have you tried to see the project from the outside? +\layout Itemize + +is the project done if you think it is done? Or is just that other interface/pro +tocol/feature/configuration/option missing? How about website, manual(s), + internationali(z|s)ation, packaging, labels, 2nd source for components, + electromagnetic compatability/interference, documentation for production, + production test software, update mechanism, patent issues? +\layout Itemize +is your project adequately positioned in that magic triangle: fame, fortune, + fun? \layout Standard +Maybe not all answers to these questions are known and some answers may + even be +\emph on +no +\emph default +, nevertheless knowing these questions may help you to avoid burnout +\begin_inset Foot +collapsed false + +\layout Standard -\size footnotesize -Vendor +burnout is bad for electronic devices, programmers and motorcycle tyres \end_inset - - -\begin_inset Text -\layout Standard +. + Chances are you didn't want to hear some of them... +\layout Chapter +Support +\begin_inset LatexCommand \index{Support} -\size footnotesize -Subject / Title \end_inset - - -\begin_inset Text + +\layout Standard + +SDCC has grown to be a large project. + The compiler alone (without the preprocessor, assembler and linker) is + well over 150,000 lines of code (blank stripped). + The open source nature of this project is a key to its continued growth + and support. + You gain the benefit and support of many active software developers and + end users. + Is SDCC perfect? No, that's why we need your help. + The developers take pride in fixing reported bugs. + You can help by reporting the bugs and helping other SDCC users. + There are lots of ways to contribute, and we encourage you to take part + in making SDCC a great software package. + \layout Standard +The SDCC project is hosted on the SDCC sourceforge site at +\begin_inset LatexCommand \htmlurl{http://sourceforge.net/projects/sdcc} -\size footnotesize -Where to get \end_inset - - - - -\begin_inset Text -\layout Standard +. + You'll find the complete set of mailing lists +\begin_inset LatexCommand \index{Mailing list(s)} + +\end_inset + +, forums, bug reporting system, patch submission +\begin_inset LatexCommand \index{Patch submission} +\end_inset + + system, download +\begin_inset LatexCommand \index{download} -\size footnotesize -Maxim / Dallas \end_inset - - -\begin_inset Text -\layout Standard + area and Subversion code repository +\begin_inset LatexCommand \index{Subversion code repository} +\end_inset -\size footnotesize -Using the SDCC Compiler for the DS80C400 -\begin_inset LatexCommand \index{DS80C400} + there. +\layout Section + +Reporting Bugs +\begin_inset LatexCommand \index{Bug reporting} \end_inset +\begin_inset LatexCommand \index{Reporting bugs} + \end_inset - - -\begin_inset Text + \layout Standard +The recommended way of reporting bugs is using the infrastructure of the + sourceforge site. + You can follow the status of bug reports there and have an overview about + the known bugs. +\layout Standard -\size footnotesize +Bug reports are automatically forwarded to the developer mailing list and + will be fixed ASAP. + When reporting a bug, it is very useful to include a small test program + (the smaller the better) which reproduces the problem. + If you can isolate the problem by looking at the generated assembly code, + this can be very helpful. + Compiling your program with the - +\begin_inset ERT +status Collapsed -\begin_inset LatexCommand \url{http://pdfserv.maxim-ic.com/en/an/AN3346.pdf} +\layout Standard +\backslash +/ \end_inset +-dumpall +\begin_inset LatexCommand \index{-\/-dumpall} \end_inset - - - - -\begin_inset Text -\layout Standard + option can sometimes be useful in locating optimization problems. + When reporting a bug please make sure you: +\layout Enumerate +Attach the code you are compiling with SDCC. + +\layout Enumerate -\size footnotesize -Maxim / Dallas -\end_inset - - -\begin_inset Text +Specify the exact command you use to run SDCC, or attach your Makefile. + +\layout Enumerate + +Specify the SDCC version (type " +\family sans +\series bold +sdcc -v +\family default +\series default +"), your platform, and operating system. + +\layout Enumerate + +Provide an exact copy of any error message or incorrect output. + +\layout Enumerate +Put something meaningful in the subject of your message. \layout Standard +Please attempt to include these 5 important parts, as applicable, in all + requests for support or when reporting any problems or bugs with SDCC. + Though this will make your message lengthy, it will greatly improve your + chance that SDCC users and developers will be able to help you. + Some SDCC developers are frustrated by bug reports without code provided + that they can use to reproduce and ultimately fix the problem, so please + be sure to provide sample code if you are reporting a bug! +\layout Standard -\size footnotesize -Using the Free SDCC C Compiler to Develop Firmware for the DS89C420/430/440/450 -\begin_inset LatexCommand \index{DS89C4x0} +Please have a short check that you are using a recent version of SDCC and + the bug is not yet known. + This is the link for reporting bugs: +\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=100599} \end_inset - Family of Microcontrollers +. + With SDCC on average having more than 200 downloads +\begin_inset LatexCommand \index{download} + \end_inset - - -\begin_inset Text + + on sourceforge per day +\begin_inset Foot +collapsed false \layout Standard +220 daily downloads on average Jan-Sept 2006 and about 150 daily downloads + between 2002 and 2005. + This does not include other methods of distribution. +\end_inset -\size footnotesize + there must be some users. + So it's not exactly easy to find a new bug. + If you find one we need it: +\emph on +reporting bugs is good +\emph default +. +\layout Section -\begin_inset LatexCommand \url{http://pdfserv.maxim-ic.com/en/an/AN3477.pdf} +Requesting Features +\begin_inset LatexCommand \label{sub:Requesting-Features} \end_inset +\begin_inset LatexCommand \index{Feature request} + \end_inset - - - - -\begin_inset Text -\layout Standard +\begin_inset LatexCommand \index{Requesting features} -\size footnotesize -Silicon Laboratories / Cygnal \end_inset - - -\begin_inset Text + \layout Standard +Like bug reports feature requests are forwarded to the developer mailing + list. + This is the link for requesting features: +\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599} -\size footnotesize -Integrating SDCC 8051 Tools Into The Silicon Labs IDE -\begin_inset LatexCommand \index{IDE} +\end_inset + +. +\layout Section + +Submitting patches +\layout Standard + +Like bug reports contributed patches are forwarded to the developer mailing + list. + This is the link for submitting patches +\begin_inset LatexCommand \index{Patch submission} \end_inset +: +\begin_inset LatexCommand \url{http://sourceforge.net/tracker/?group_id=599&atid=300599} \end_inset - - -\begin_inset Text +. \layout Standard +You need to specify some parameters to the +\family typewriter +diff +\family default + command for the patches to be useful. + If you modified more than one file a patch created f.e. + with +\family sans +\series bold -\size footnotesize - -\begin_inset LatexCommand \url{http://www.silabs.com/public/documents/tpub_doc/anote/Microcontrollers/en/an198.pdf} +\begin_inset Quotes sld +\end_inset +diff -Naur unmodified_directory modified_directory >my_changes.patch +\begin_inset Quotes srd \end_inset +\family default +\series default + will be fine, otherwise +\family sans +\series bold + +\begin_inset Quotes sld \end_inset - - - - -\begin_inset Text -\layout Standard +diff -u sourcefile.c.orig sourcefile.c >my_changes.patch +\begin_inset Quotes srd +\end_inset -\size footnotesize -Ramtron / Goal Semiconductor -\end_inset - - -\begin_inset Text +\series default + +\family default +will do. +\layout Section +Getting Help \layout Standard +These links should take you directly to the +\begin_inset LatexCommand \url[Mailing lists]{http://sourceforge.net/mail/?group_id=599} -\size footnotesize -Interfacing SDCC to Syn and Textpad \end_inset - - -\begin_inset Text -\layout Standard +\begin_inset Foot +collapsed false + +\layout Standard -\size footnotesize +Traffic on sdcc-devel and sdcc-user is about 100 mails/month each not counting + automated messages (mid 2003) +\end_inset -\begin_inset LatexCommand \url{http://www.ramtron.com/doc/Products/Microcontroller/Support_Tools.asp} + and the +\begin_inset LatexCommand \url[Forums]{http://sourceforge.net/forum/?group_id=599} \end_inset +, lists +\begin_inset LatexCommand \index{Mailing list(s)} \end_inset - - - - -\begin_inset Text + and forums are archived and searchable so if you are lucky someone already + had a similar problem. + While mails to the lists themselves are delivered promptly their web front + end on sourceforge sometimes shows a severe time lag (up to several weeks), + if you're seriously using SDCC please consider subscribing to the lists. +\layout Section + +ChangeLog \layout Standard +You can follow the status of the Subversion version +\begin_inset LatexCommand \index{version} -\size footnotesize -Ramtron / Goal Semiconductor \end_inset - - -\begin_inset Text -\layout Standard + of SDCC by watching the Changelog +\begin_inset LatexCommand \index{Changelog} + +\end_inset + in the Subversion repository +\size footnotesize + +\begin_inset LatexCommand \htmlurl{http://svn.sourceforge.net/viewcvs.cgi/*checkout*/sdcc/trunk/sdcc/ChangeLog} -\size footnotesize -Installing and Configuring SDCC and Crimson Editor \end_inset - - -\begin_inset Text - -\layout Standard +. +\layout Section -\size footnotesize +Subversion Source Code Repository +\layout Standard -\begin_inset LatexCommand \url{http://www.ramtron.com/doc/Products/Microcontroller/Support_Tools.asp} +The output of +\family sans +\series bold +sdcc --version +\family default +\series default + or the filenames of the snapshot versions of SDCC include date and its + Subversion +\begin_inset LatexCommand \index{Subversion code repository} \end_inset + number. + Subversion allows to download the source of recent or previous versions + +\begin_inset LatexCommand \url{http://sourceforge.net/svn/?group_id=599} \end_inset - - - - -\begin_inset Text - -\layout Standard + (by number or by date). + An on-line source code browser and detailled instructions are also available + there. + SDCC versions starting from 1999 up to now are available (currently the + versions prior to the conversion from cvs +\begin_inset LatexCommand \index{cvs|see{Subversion}} -\size footnotesize -Texas Instruments \end_inset - - -\begin_inset Text -\layout Standard + to Subversion (April 2006) are either by accessible by Subversion or by + cvs). +\layout Section +Release policy +\begin_inset LatexCommand \index{Release policy} -\size footnotesize -MSC12xx Programming with SDCC \end_inset - - -\begin_inset Text - -\layout Standard -\size footnotesize +\layout Standard -\begin_inset LatexCommand \url{http://focus.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=sbaa109&fileType=pdf} +Historically there often were long delays between official releases and + the sourceforge download area tends to get not updated at all. + Excuses in the past might have referred to problems with live range analysis, + but as this was fixed a while ago, the current problem is that another + excuse has to be found. + Kidding aside, we have to get better there! On the other hand there are + daily snapshots available at +\begin_inset LatexCommand \htmlurl[snap]{http://sdcc.sourceforge.net/snap.php} \end_inset +, and you can always build the very last version (hopefully with many bugs + fixed, and features added) from the source code available at +\begin_inset LatexCommand \htmlurl[Source]{http://sdcc.sourceforge.net/snap.php#Source} \end_inset - - - -\end_inset +. + A release wiki +\begin_inset LatexCommand \index{wiki} +\end_inset -\layout Section -Some Questions -\layout Standard +\begin_inset LatexCommand \index{Release wiki} -Some questions answered, some pointers given - it might be time to in turn - ask -\emph on -you -\emph default - some questions: -\layout Itemize +\end_inset -can you solve your project with the selected microcontroller? Would you - find out early or rather late that your target is too small/slow/whatever? - Can you switch to a slightly better device if it doesn't fit? -\layout Itemize + at +\begin_inset LatexCommand \url{http://sdcc.sf.net/release_wiki/} -should you solve the problem with an 8 bit CPU? Or would a 16/32 bit CPU - and/or another programming language be more adequate? Would an operating - system on the target device help? -\layout Itemize +\end_inset -if you solved the problem, will the marketing department be happy? -\layout Itemize + also holds some information about past and future releases. +\layout Section -if the marketing department is happy, will customers be happy? -\layout Itemize +Examples +\begin_inset LatexCommand \index{Examples} -if you're the project manager, marketing department and maybe even the customer - in one person, have you tried to see the project from the outside? -\layout Itemize +\end_inset -is the project done if you think it is done? Or is just that other interface/pro -tocol/feature/configuration/option missing? How about website, manual(s), - internationali(z|s)ation, packaging, labels, 2nd source for components, - electromagnetic compatability/interference, documentation for production, - production test software, update mechanism, patent issues? -\layout Itemize -is your project adequately positioned in that magic triangle: fame, fortune, - fun? \layout Standard -Maybe not all answers to these questions are known and some answers may - even be +You'll find some small examples in the directory \emph on -no +sdcc/device/examples/. + \emph default -, nevertheless knowing these questions may help you to avoid burnout -\begin_inset Foot -collapsed false +More examples and libraries are available at +\emph on + The SDCC Open Knowledge Resource +\begin_inset LatexCommand \url{http://sdccokr.dl9sec.de/} -\layout Standard +\end_inset + + +\emph default +web site or at +\begin_inset LatexCommand \url{http://www.pjrc.com/tech/8051/} -burnout is bad for electronic devices, programmers and motorcycle tyres \end_inset . - Chances are you didn't want to hear some of them... -\layout Chapter - -Support -\begin_inset LatexCommand \index{Support} +\layout Standard -\end_inset +\begin_inset Note +collapsed true \layout Standard -SDCC has grown to be a large project. - The compiler alone (without the preprocessor, assembler and linker) is - well over 150,000 lines of code (blank stripped). - The open source nature of this project is a key to its continued growth - and support. - You gain the benefit and support of many active software developers and - end users. - Is SDCC perfect? No, that's why we need your help. - The developers take pride in fixing reported bugs. - You can help by reporting the bugs and helping other SDCC users. - There are lots of ways to contribute, and we encourage you to take part - in making SDCC a great software package. - +I did insert a reference to Paul's web site here although it seems rather + dedicated to a specific 8032 board (I think it's okay because it f.e. + shows LCD/Harddisc interface and has a free 8051 monitor. + Independent 8032 board vendors face hard competition of heavily subsidized + development boards anyway). \layout Standard -The SDCC project is hosted on the SDCC sourceforge site at -\begin_inset LatexCommand \htmlurl{http://sourceforge.net/projects/sdcc} - +Maybe we should include some links to real world applications. + Preferably pointer to pointers (one for each architecture) so this stays + manageable here? \end_inset -. - You'll find the complete set of mailing lists -\begin_inset LatexCommand \index{Mailing list(s)} -\end_inset +\layout Section -, forums, bug reporting system, patch submission -\begin_inset LatexCommand \index{Patch submission} +Quality control +\begin_inset LatexCommand \label{sec:Quality-control} \end_inset - system, download -\begin_inset LatexCommand \index{download} + +\begin_inset LatexCommand \index{Quality control} \end_inset - area and Subversion code repository -\begin_inset LatexCommand \index{Subversion code repository} -\end_inset +\layout Standard - there. -\layout Section +The compiler is passed through nightly compile and build checks. + The so called +\shape italic +regression tests +\shape default -Reporting Bugs -\begin_inset LatexCommand \index{Bug reporting} +\begin_inset LatexCommand \index{Regression test} \end_inset - -\begin_inset LatexCommand \index{Reporting bugs} + check that SDCC itself compiles flawlessly on several host platforms (i386, + Opteron, 64 bit Alpha, ppc64, MacOS X on PPC, Solaris on Sparc) and checks + the quality of the code generated by SDCC by running the code for several + target platforms through simulators. + The regression test suite comprises more than 100 files which expand to + more than 500 test cases which include more than 4500 tests. + The results of these tests are published daily on SDCC's snapshot page + (click on the red or green symbols on the right side of +\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/snap.php} \end_inset - +). \layout Standard -The recommended way of reporting bugs is using the infrastructure of the - sourceforge site. - You can follow the status of bug reports there and have an overview about - the known bugs. -\layout Standard +There is a separate document +\shape italic +test_suite.pdf +\begin_inset LatexCommand \index{Test suite} -Bug reports are automatically forwarded to the developer mailing list and - will be fixed ASAP. - When reporting a bug, it is very useful to include a small test program - (the smaller the better) which reproduces the problem. - If you can isolate the problem by looking at the generated assembly code, - this can be very helpful. - Compiling your program with the - -\begin_inset ERT -status Collapsed +\end_inset -\layout Standard -\backslash -/ +\shape default + +\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/test_suite_spec.pdf} + \end_inset --dumpall -\begin_inset LatexCommand \index{-\/-dumpall} + about the regression test suite. +\layout Standard + +You'll find the test code in the directory +\shape italic +sdcc/support/regression +\shape default +. + You can run these tests manually by running +\family sans +make +\family default + in this directory (or f.e. + +\family sans +\series bold +\begin_inset Quotes sld \end_inset - option can sometimes be useful in locating optimization problems. - When reporting a bug please make sure you: -\layout Enumerate - -Attach the code you are compiling with SDCC. - -\layout Enumerate +make test-mcs51 +\begin_inset Quotes srd +\end_inset -Specify the exact command you use to run SDCC, or attach your Makefile. - -\layout Enumerate -Specify the SDCC version (type " -\family sans -\series bold -sdcc -v \family default \series default -"), your platform, and operating system. - -\layout Enumerate + if you don't want to run the complete tests). + The test code might also be interesting if you want to look for examples +\begin_inset LatexCommand \index{Examples} -Provide an exact copy of any error message or incorrect output. - -\layout Enumerate +\end_inset -Put something meaningful in the subject of your message. -\layout Standard + checking corner cases of SDCC or if you plan to submit patches +\begin_inset LatexCommand \index{Patch submission} -Please attempt to include these 5 important parts, as applicable, in all - requests for support or when reporting any problems or bugs with SDCC. - Though this will make your message lengthy, it will greatly improve your - chance that SDCC users and developers will be able to help you. - Some SDCC developers are frustrated by bug reports without code provided - that they can use to reproduce and ultimately fix the problem, so please - be sure to provide sample code if you are reporting a bug! +\end_inset + +. \layout Standard -Please have a short check that you are using a recent version of SDCC and - the bug is not yet known. - This is the link for reporting bugs: -\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=100599} +The 14bit pic port uses a different set of regression tests +\begin_inset LatexCommand \index{Regression test (PIC14)} \end_inset +, you'll find them in the directory +\shape italic +sdcc/src/regression +\shape default . - With SDCC on average having more than 200 downloads -\begin_inset LatexCommand \index{download} +\layout Section -\end_inset +Use of SDCC in Education +\layout Standard - on sourceforge per day +In short: +\emph on +highly +\emph default + encouraged \begin_inset Foot collapsed false \layout Standard -220 daily downloads on average Jan-Sept 2006 and about 150 daily downloads - between 2002 and 2005. - This does not include other methods of distribution. +the phrase "use in education" might evoke the association " +\emph on +only +\emph default + fit for use in education". + This connotation is not intended but nevertheless risked as the licensing + of SDCC makes it difficult to offer educational discounts \end_inset - there must be some users. - So it's not exactly easy to find a new bug. - If you find one we need it: +. + If your rationales are to: +\layout Enumerate + +give students a chance to understand the \emph on -reporting bugs is good +complete \emph default -. -\layout Section + steps of code generation +\layout Enumerate -Requesting Features -\begin_inset LatexCommand \label{sub:Requesting-Features} +have a curriculum that can be extended for years. + Then you could use an fpga board as target and your curriculum will seamlessly + extend from logic synthesis ( +\begin_inset LatexCommand \url[http://www.opencores.org]{opencores.org} \end_inset - -\begin_inset LatexCommand \index{Feature request} +, +\begin_inset LatexCommand \url[Oregano]{http://www.oregano.at/ip/ip01.htm} \end_inset - -\begin_inset LatexCommand \index{Requesting features} +), over assembly programming, to C to FPGA compilers ( +\begin_inset LatexCommand \url[FPGAC]{http://sf.net/projects/fpgac} \end_inset +) and to C. +\layout Enumerate -\layout Standard - -Like bug reports feature requests are forwarded to the developer mailing - list. - This is the link for requesting features: -\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599} +be able to insert excursions about skills like using a revision control + system, submitting/applying patches, using a type-setting (as opposed to + word-processing) engine LyX/LaTeX, using +\begin_inset LatexCommand \url[SourceForge]{http://www.sf.net} \end_inset -. -\layout Section +, following some +\begin_inset LatexCommand \url[netiquette]{http://en.wikipedia.org/wiki/Netiquette} -Submitting patches -\layout Standard +\end_inset -Like bug reports contributed patches are forwarded to the developer mailing - list. - This is the link for submitting patches -\begin_inset LatexCommand \index{Patch submission} +, understanding BSD/LGPL/GPL/Proprietary licensing, growth models of Open + Source Software, CPU simulation, compiler regression tests +\begin_inset LatexCommand \index{Regression test} \end_inset -: -\begin_inset LatexCommand \url{http://sourceforge.net/tracker/?group_id=599&atid=300599} +. + +\newline +And if there should be a shortage of ideas then you can always point students + to the ever-growing feature request list +\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599} \end_inset . -\layout Standard +\layout Enumerate -You need to specify some parameters to the -\family typewriter -diff -\family default - command for the patches to be useful. - If you modified more than one file a patch created f.e. - with -\family sans -\series bold +not tie students to a specific host platform and instead allow them to use + a host platform of +\emph on +their +\emph default + choice (among them Alpha, i386, i386_64, MacOs, Mips, Sparc, Windows and + eventually +\begin_inset LatexCommand \url[OLPC]{http://www.laptop.org} -\begin_inset Quotes sld \end_inset -diff -Naur unmodified_directory modified_directory >my_changes.patch -\begin_inset Quotes srd -\end_inset +) +\layout Enumerate +not encourage students to use illegal copies of educational software +\layout Enumerate -\family default -\series default - will be fine, otherwise -\family sans -\series bold +be immune to licensing/availability/price changes of the chosen tool chain +\layout Enumerate -\begin_inset Quotes sld -\end_inset +be able to change to a new target platform without having to adopt a new + tool chain +\layout Enumerate -diff -u sourcefile.c.orig sourcefile.c >my_changes.patch -\begin_inset Quotes srd -\end_inset +have complete control over and insight into the tool chain +\layout Enumerate +make your students aware about the pros and cons of open source software + development +\layout Enumerate -\series default - -\family default -will do. +give back to the public as you are probably at least partially publically + funded +\layout Enumerate + +give students a chance to publically prove their skills and to possibly + see a world wide impact +\layout Standard +\pagebreak_bottom +then SDCC is probably among the first choices. + Well, probably SDCC might be the only choice. +\layout Chapter + +SDCC Technical Data \layout Section -Getting Help +Optimizations +\begin_inset LatexCommand \index{Optimizations} + +\end_inset + + \layout Standard -These links should take you directly to the -\begin_inset LatexCommand \url[Mailing lists]{http://sourceforge.net/mail/?group_id=599} +SDCC performs a host of standard optimizations in addition to some MCU specific + optimizations. + +\layout Subsection + +Sub-expression Elimination +\begin_inset LatexCommand \index{Subexpression elimination} \end_inset -\begin_inset Foot -collapsed false +\layout Standard + +The compiler does local and +\emph on +g +\emph default +lobal +\emph on +c +\emph default +ommon +\emph on +s +\emph default +ubexpression +\emph on +e +\emph default +limination, e.g.: +\layout Verse + +\family typewriter +i = x + y + 1; +\newline +j = x + y; \layout Standard -Traffic on sdcc-devel and sdcc-user is about 100 mails/month each not counting - automated messages (mid 2003) -\end_inset +will be translated to +\layout Verse + + +\family typewriter +iTemp = x + y; +\newline +i = iTemp + 1; +\newline +j = iTemp; +\layout Standard - and the -\begin_inset LatexCommand \url[Forums]{http://sourceforge.net/forum/?group_id=599} +Some subexpressions are not as obvious as the above example, e.g.: +\layout Verse -\end_inset -, lists -\begin_inset LatexCommand \index{Mailing list(s)} +\family typewriter +a->b[i].c = 10; +\newline +a->b[i].d = 11; +\layout Standard -\end_inset +In this case the address arithmetic a->b[i] will be computed only once; + the equivalent code in C would be. +\layout Verse - and forums are archived and searchable so if you are lucky someone already - had a similar problem. - While mails to the lists themselves are delivered promptly their web front - end on sourceforge sometimes shows a severe time lag (up to several weeks), - if you're seriously using SDCC please consider subscribing to the lists. -\layout Section -ChangeLog +\family typewriter +iTemp = a->b[i]; +\newline +iTemp.c = 10; +\newline +iTemp.d = 11; \layout Standard -You can follow the status of the Subversion version -\begin_inset LatexCommand \index{version} - -\end_inset +The compiler will try to keep these temporary variables in registers. +\layout Subsection - of SDCC by watching the Changelog -\begin_inset LatexCommand \index{Changelog} +Dead-Code Elimination +\begin_inset LatexCommand \index{Dead-code elimination} \end_inset - in the Subversion repository -\size footnotesize - -\begin_inset LatexCommand \htmlurl{http://svn.sourceforge.net/viewcvs.cgi/*checkout*/sdcc/trunk/sdcc/ChangeLog} -\end_inset +\layout Verse -. -\layout Section -Subversion Source Code Repository +\family typewriter +int global; +\newline + +\newline +void f () { +\newline +\SpecialChar ~ +\SpecialChar ~ +int i; +\newline +\SpecialChar ~ +\SpecialChar ~ +i = 1; \SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* dead store */ +\newline +\SpecialChar ~ +\SpecialChar ~ +global = 1;\SpecialChar ~ +/* dead store */ +\newline +\SpecialChar ~ +\SpecialChar ~ +global = 2; +\newline +\SpecialChar ~ +\SpecialChar ~ +return; +\newline +\SpecialChar ~ +\SpecialChar ~ +global = 3;\SpecialChar ~ +/* unreachable */ +\newline +} \layout Standard -The output of -\family sans -\series bold -sdcc --version -\family default -\series default - or the filenames of the snapshot versions of SDCC include date and its - Subversion -\begin_inset LatexCommand \index{Subversion code repository} +will be changed to +\layout Verse -\end_inset - number. - Subversion allows to download the source of recent or previous versions - -\begin_inset LatexCommand \url{http://sourceforge.net/svn/?group_id=599} +\family typewriter +int global; +\newline -\end_inset +\newline +void f () { +\newline +\SpecialChar ~ +\SpecialChar ~ +global = 2; +\newline +} +\layout Subsection - (by number or by date). - An on-line source code browser and detailled instructions are also available - there. - SDCC versions starting from 1999 up to now are available (currently the - versions prior to the conversion from cvs -\begin_inset LatexCommand \index{cvs|see{Subversion}} +Copy-Propagation +\begin_inset LatexCommand \index{Copy propagation} \end_inset - to Subversion (April 2006) are either by accessible by Subversion or by - cvs). -\layout Section - -Release policy -\begin_inset LatexCommand \index{Release policy} -\end_inset +\layout Verse +\family typewriter +int f() { +\newline +\SpecialChar ~ +\SpecialChar ~ +int i, j; +\newline +\SpecialChar ~ +\SpecialChar ~ +i = 10; +\newline +\SpecialChar ~ +\SpecialChar ~ +j = i; +\newline +\SpecialChar ~ +\SpecialChar ~ +return j; +\newline +} \layout Standard -Historically there often were long delays between official releases and - the sourceforge download area tends to get not updated at all. - Excuses in the past might have referred to problems with live range analysis, - but as this was fixed a while ago, the current problem is that another - excuse has to be found. - Kidding aside, we have to get better there! On the other hand there are - daily snapshots available at -\begin_inset LatexCommand \htmlurl[snap]{http://sdcc.sourceforge.net/snap.php} +will be changed to +\layout Verse -\end_inset -, and you can always build the very last version (hopefully with many bugs - fixed, and features added) from the source code available at -\begin_inset LatexCommand \htmlurl[Source]{http://sdcc.sourceforge.net/snap.php#Source} +\family typewriter +int f() { +\newline +\SpecialChar ~ +\SpecialChar ~ +int i, j; +\newline +\SpecialChar ~ +\SpecialChar ~ +i = 10; +\newline +\SpecialChar ~ +\SpecialChar ~ +j = 10; +\newline +\SpecialChar ~ +\SpecialChar ~ +return 10; +\newline +} +\layout Standard + +Note: the dead stores created by this copy propagation will be eliminated + by dead-code elimination. +\layout Subsection + +Loop Optimizations +\begin_inset LatexCommand \index{Loop optimization} \end_inset -. -\layout Section -Examples -\begin_inset LatexCommand \index{Examples} +\begin_inset LatexCommand \label{sub:Loop-Optimizations} \end_inset \layout Standard -You'll find some small examples in the directory +Two types of loop optimizations are done by SDCC \emph on -sdcc/device/examples/. - +loop invariant \emph default -More examples and libraries are available at + lifting and \emph on - The SDCC Open Knowledge Resource -\begin_inset LatexCommand \url{http://sdccokr.dl9sec.de/} + strength reduction +\emph default + of loop induction variables. + In addition to the strength reduction the optimizer marks the induction + variables and the register allocator tries to keep the induction variables + in registers for the duration of the loop. + Because of this preference of the register allocator +\begin_inset LatexCommand \index{Register allocation} \end_inset - -\emph default -web site or at -\begin_inset LatexCommand \url{http://www.pjrc.com/tech/8051/} +, loop induction optimization causes an increase in register pressure, which + may cause unwanted spilling of other temporary variables into the stack +\begin_inset LatexCommand \index{stack} \end_inset -. -\layout Comment + / data space. + The compiler will generate a warning message when it is forced to allocate + extra space either on the stack or data space. + If this extra space allocation is undesirable then induction optimization + can be eliminated either for the entire source file (with - +\begin_inset ERT +status Collapsed -I did insert a reference to Paul's web site here although it seems rather - dedicated to a specific 8032 board (I think it's okay because it f.e. - shows LCD/Harddisc interface and has a free 8051 monitor. - Independent 8032 board vendors face hard competition of heavily subsidized - development boards anyway). -\layout Comment +\layout Standard -Maybe we should include some links to real world applications. - Preferably pointer to pointers (one for each architecture) so this stays - manageable here? -\layout Section +\backslash +/ +\end_inset -Quality control -\begin_inset LatexCommand \label{sec:Quality-control} +-noinduction option) or for a given function only using #pragma\SpecialChar ~ +noinduction +\begin_inset LatexCommand \index{\#pragma noinduction} \end_inset +. +\newline + +\newline +Loop Invariant: +\layout Verse + -\begin_inset LatexCommand \index{Quality control} +\family typewriter +for (i = 0 ; i < 100 ; i ++) +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +f += k + l; +\layout Standard -\end_inset +changed to +\layout Verse +\family typewriter +itemp = k + l; +\newline +for (i = 0; i < 100; i++) +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +f += itemp; \layout Standard -The compiler is passed through nightly compile and build checks. - The so called -\shape italic -regression tests -\shape default +As mentioned previously some loop invariants are not as apparent, all static + address computations are also moved out of the loop. +\newline -\begin_inset LatexCommand \index{Regression test} +\newline +Strength Reduction +\begin_inset LatexCommand \index{Strength reduction} \end_inset - check that SDCC itself compiles flawlessly on several host platforms (i386, - Opteron, 64 bit Alpha, ppc64, MacOS X on PPC, Solaris on Sparc) and checks - the quality of the code generated by SDCC by running the code for several - target platforms through simulators. - The regression test suite comprises more than 100 files which expand to - more than 500 test cases which include more than 4500 tests. - The results of these tests are published daily on SDCC's snapshot page - (click on the red or green symbols on the right side of -\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/snap.php} +, this optimization substitutes an expression by a cheaper expression: +\layout Verse -\end_inset -). +\family typewriter +for (i=0;i < 100; i++) +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +ar[i*5] = i*3; \layout Standard -There is a separate document -\shape italic -test_suite.pdf -\begin_inset LatexCommand \index{Test suite} +changed to +\layout Verse + + +\family typewriter +itemp1 = 0; +\newline +itemp2 = 0; +\newline +for (i=0;i< 100;i++) { +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +ar[itemp1] = itemp2; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +itemp1 += 5; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +itemp2 += 3; +\newline +} +\layout Standard + +The more expensive multiplication +\begin_inset LatexCommand \index{Multiplication} \end_inset + is changed to a less expensive addition. +\layout Subsection -\shape default - -\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/test_suite_spec.pdf} +Loop Reversing +\begin_inset LatexCommand \index{Loop reversing} \end_inset - about the regression test suite. -\layout Standard -You'll find the test code in the directory -\shape italic -sdcc/support/regression -\shape default -. - You can run these tests manually by running -\family sans -make -\family default - in this directory (or f.e. - -\family sans -\series bold +\layout Standard -\begin_inset Quotes sld +This optimization is done to reduce the overhead of checking loop boundaries + for every iteration. + Some simple loops can be reversed and implemented using a +\begin_inset Quotes eld \end_inset -make test-mcs51 -\begin_inset Quotes srd +decrement and jump if not zero +\begin_inset Quotes erd \end_inset + instruction. + SDCC checks for the following criterion to determine if a loop is reversible + (note: more sophisticated compilers use data-dependency analysis to make + this determination, SDCC uses a more simple minded analysis). +\layout Itemize + +The 'for' loop is of the form +\newline -\family default -\series default - if you don't want to run the complete tests). - The test code might also be interesting if you want to look for examples -\begin_inset LatexCommand \index{Examples} +\newline + +\family typewriter +for( = ; [< | <=] ; [++ | + += 1]) +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + +\layout Itemize +The does not contain +\begin_inset Quotes eld \end_inset - checking corner cases of SDCC or if you plan to submit patches -\begin_inset LatexCommand \index{Patch submission} +continue +\begin_inset Quotes erd +\end_inset + or 'break +\begin_inset Quotes erd \end_inset . -\layout Standard +\layout Itemize -The 14bit pic port uses a different set of regression tests -\begin_inset LatexCommand \index{Regression test (PIC14)} +All goto's are contained within the loop. +\layout Itemize -\end_inset +No function calls within the loop. +\layout Itemize -, you'll find them in the directory -\shape italic -sdcc/src/regression -\shape default -. -\layout Section +The loop control variable is not assigned any value within the loop +\layout Itemize -Use of SDCC in Education -\layout Standard +The loop control variable does NOT participate in any arithmetic operation + within the loop. +\layout Itemize -In short: -\emph on -highly -\emph default - encouraged -\begin_inset Foot -collapsed false +There are NO switch statements in the loop. +\layout Subsection +Algebraic Simplifications \layout Standard -the phrase "use in education" might evoke the association " -\emph on -only -\emph default - fit for use in education". - This connotation is not intended but nevertheless risked as the licensing - of SDCC makes it difficult to offer educational discounts -\end_inset +SDCC does numerous algebraic simplifications, the following is a small sub-set + of these optimizations. +\layout Verse -. - If your rationales are to: -\layout Enumerate -give students a chance to understand the -\emph on -complete -\emph default - steps of code generation -\layout Enumerate +\family typewriter +i = j + 0;\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + /* changed to: */\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + i = j; +\newline +i /= 2;\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + /* changed to: */\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + i >>= 1; +\newline +i = j - j;\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + /* changed to: */\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + i = 0; +\newline +i = j / 1;\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + /* changed to: */\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + i = j; +\layout Standard -have a curriculum that can be extended for years. - Then you could use an fpga board as target and your curriculum will seamlessly - extend from logic synthesis ( -\begin_inset LatexCommand \url[http://www.opencores.org]{opencores.org} +Note the subexpressions +\begin_inset LatexCommand \index{Subexpression} \end_inset -, -\begin_inset LatexCommand \url[Oregano]{http://www.oregano.at/ip/ip01.htm} - -\end_inset + given above are generally introduced by macro expansions or as a result + of copy/constant propagation. +\layout Subsection -), over assembly programming, to C to FPGA compilers ( -\begin_inset LatexCommand \url[FPGAC]{http://sf.net/projects/fpgac} +'switch' Statements +\begin_inset LatexCommand \label{sub:'switch'-Statements} \end_inset -) and to C. -\layout Enumerate - -be able to insert excursions about skills like using a revision control - system, submitting/applying patches, using a type-setting (as opposed to - word-processing) engine LyX/LaTeX, using -\begin_inset LatexCommand \url[SourceForge]{http://www.sf.net} - -\end_inset -, following some -\begin_inset LatexCommand \url[netiquette]{http://en.wikipedia.org/wiki/Netiquette} +\begin_inset LatexCommand \index{switch statement} \end_inset -, understanding BSD/LGPL/GPL/Proprietary licensing, growth models of Open - Source Software, CPU simulation, compiler regression tests -\begin_inset LatexCommand \index{Regression test} -\end_inset +\layout Standard -. - -\newline -And if there should be a shortage of ideas then you can always point students - to the ever-growing feature request list -\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599} +SDCC can optimize switch statements to jump tables +\begin_inset LatexCommand \index{jump tables} \end_inset . -\layout Enumerate - -not tie students to a specific host platform and instead allow them to use - a host platform of -\emph on -their -\emph default - choice (among them Alpha, i386, i386_64, MacOs, Mips, Sparc, Windows and - eventually -\begin_inset LatexCommand \url[OLPC]{http://www.laptop.org} - -\end_inset - -) -\layout Enumerate - -not encourage students to use illegal copies of educational software -\layout Enumerate - -be immune to licensing/availability/price changes of the chosen tool chain -\layout Enumerate - -be able to change to a new target platform without having to adopt a new - tool chain -\layout Enumerate - -have complete control over and insight into the tool chain -\layout Enumerate - -make your students aware about the pros and cons of open source software - development -\layout Enumerate - -give back to the public as you are probably at least partially publically - funded -\layout Enumerate - -give students a chance to publically prove their skills and to possibly - see a world wide impact -\layout Standard - -then SDCC is probably among the first choices. - Well, probably SDCC might be the only choice. -\layout Chapter -\pagebreak_top -SDCC Technical Data -\layout Section - -Optimizations -\begin_inset LatexCommand \index{Optimizations} + It makes the decision based on an estimate of the generated code size. + SDCC is quite liberal in the requirements for jump table generation: +\layout Itemize -\end_inset +The labels need not be in order, and the starting number need not be one + or zero, the case labels are in numerical sequence or not too many case + labels are missing. +\begin_deeper +\layout Verse -\layout Standard +\family typewriter +switch(i) {\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +switch (i) { +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 4: ...\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 0: ... + +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 5: ...\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 1: ... + +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 3: ...\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ -SDCC performs a host of standard optimizations in addition to some MCU specific - optimizations. +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 6: ...\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 3: ... -\layout Subsection - -Sub-expression Elimination -\begin_inset LatexCommand \index{Subexpression elimination} - -\end_inset - - -\layout Standard - -The compiler does local and -\emph on -g -\emph default -lobal -\emph on -c -\emph default -ommon -\emph on -s -\emph default -ubexpression -\emph on -e -\emph default -limination, e.g.: -\layout Verse - - -\family typewriter -i = x + y + 1; \newline -j = x + y; -\layout Standard - -will be translated to -\layout Verse - - -\family typewriter -iTemp = x + y; +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 7: ...\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 4: ... + \newline -i = iTemp + 1; +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 8: ...\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 5: ... + \newline -j = iTemp; -\layout Standard - -Some subexpressions are not as obvious as the above example, e.g.: -\layout Verse - - -\family typewriter -a->b[i].c = 10; +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 9: ...\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 6: ... + \newline -a->b[i].d = 11; -\layout Standard - -In this case the address arithmetic a->b[i] will be computed only once; - the equivalent code in C would be. -\layout Verse - - -\family typewriter -iTemp = a->b[i]; +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 10: ...\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 7: ... + \newline -iTemp.c = 10; +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 11: ...\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +case 8: ... + \newline -iTemp.d = 11; +}\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +} \layout Standard -The compiler will try to keep these temporary variables in registers. -\layout Subsection +Both the above switch statements will be implemented using a jump-table. + The example to the right side is slightly more efficient as the check for + the lower boundary of the jump-table is not needed. +\end_deeper +\layout Itemize -Dead-Code Elimination -\begin_inset LatexCommand \index{Dead-code elimination} +The number of case labels is not larger than supported by the target architectur +e. +\layout Itemize -\end_inset +If the case labels are not in numerical sequence ('gaps' between cases) + SDCC checks whether a jump table with additionally inserted dummy cases + is still attractive. + +\layout Itemize +If the starting number is not zero and a check for the lower boundary of + the jump-table can thus be eliminated SDCC might insert dummy cases 0, + ... + . +\layout Standard +Switch statements which have large gaps in the numeric sequence or those + that have too many case labels can be split into more than one switch statement + for efficient code generation, e.g.: \layout Verse \family typewriter -int global; +switch (i) { \newline - +\SpecialChar ~ +\SpecialChar ~ +case 1: ... + \newline -void f () { +\SpecialChar ~ +\SpecialChar ~ +case 2: ... + \newline \SpecialChar ~ \SpecialChar ~ -int i; +case 3: ... + \newline \SpecialChar ~ \SpecialChar ~ -i = 1; \SpecialChar ~ +case 4: ... + +\newline \SpecialChar ~ \SpecialChar ~ +case 5: ... + +\newline \SpecialChar ~ \SpecialChar ~ -/* dead store */ +case 6: ... + \newline \SpecialChar ~ \SpecialChar ~ -global = 1;\SpecialChar ~ -/* dead store */ +case 7: ... + \newline \SpecialChar ~ \SpecialChar ~ -global = 2; +case 101: ... + \newline \SpecialChar ~ \SpecialChar ~ -return; +case 102: ... + \newline \SpecialChar ~ \SpecialChar ~ -global = 3;\SpecialChar ~ -/* unreachable */ +case 103: ... + \newline -} -\layout Standard - -will be changed to -\layout Verse - - -\family typewriter -int global; +\SpecialChar ~ +\SpecialChar ~ +case 104: ... + \newline - +\SpecialChar ~ +\SpecialChar ~ +case 105: ... + \newline -void f () { +\SpecialChar ~ +\SpecialChar ~ +case 106: ... + \newline \SpecialChar ~ \SpecialChar ~ -global = 2; +case 107: ... + \newline } -\layout Subsection - -Copy-Propagation -\begin_inset LatexCommand \index{Copy propagation} - -\end_inset - +\layout Standard +If the above switch statement is broken down into two switch statements \layout Verse \family typewriter -int f() { +switch (i) { \newline \SpecialChar ~ \SpecialChar ~ -int i, j; +case 1: ... + \newline \SpecialChar ~ \SpecialChar ~ -i = 10; +case 2: ... + \newline \SpecialChar ~ \SpecialChar ~ -j = i; +case 3: ... + \newline \SpecialChar ~ \SpecialChar ~ -return j; +case 4: ... + +\newline +\SpecialChar ~ +\SpecialChar ~ +case 5: ... + +\newline +\SpecialChar ~ +\SpecialChar ~ +case 6: ... + +\newline +\SpecialChar ~ +\SpecialChar ~ +case 7: ... + \newline } \layout Standard -will be changed to +and \layout Verse \family typewriter -int f() { +switch (i) { \newline \SpecialChar ~ \SpecialChar ~ -int i, j; +case 101: ... + \newline \SpecialChar ~ \SpecialChar ~ -i = 10; +case 102: ... + \newline \SpecialChar ~ \SpecialChar ~ -j = 10; +case 103: ... + \newline \SpecialChar ~ \SpecialChar ~ -return 10; +case 104: ... + +\newline +\SpecialChar ~ +\SpecialChar ~ +case 105: ... + +\newline +\SpecialChar ~ +\SpecialChar ~ +case 106: ... + +\newline +\SpecialChar ~ +\SpecialChar ~ +case 107: ... + \newline } \layout Standard -Note: the dead stores created by this copy propagation will be eliminated - by dead-code elimination. -\layout Subsection - -Loop Optimizations -\begin_inset LatexCommand \index{Loop optimization} +then both the switch statements will be implemented using jump-tables whereas + the unmodified switch statement will not be. +\layout Standard -\end_inset +\begin_inset Note +collapsed true -\begin_inset LatexCommand \label{sub:Loop-Optimizations} +\layout Standard +There might be reasons which SDCC cannot know about to either favour or + not favour jump tables. + If the target system has to be as quick for the last switch case as for + the first (pro jump table), or if the switch argument is known to be zero + in the majority of the cases (contra jump table). \end_inset \layout Standard -Two types of loop optimizations are done by SDCC +The pragma nojtbound +\begin_inset LatexCommand \index{\#pragma nojtbound} + +\end_inset + + can be used to turn off checking the \emph on -loop invariant +j \emph default - lifting and +ump \emph on - strength reduction +t \emph default - of loop induction variables. - In addition to the strength reduction the optimizer marks the induction - variables and the register allocator tries to keep the induction variables - in registers for the duration of the loop. - Because of this preference of the register allocator -\begin_inset LatexCommand \index{Register allocation} +able +\emph on +bound +\emph default +aries. + It has no effect if a default label is supplied. + Use of this pragma is dangerous: if the switch +\begin_inset LatexCommand \index{switch statement} \end_inset -, loop induction optimization causes an increase in register pressure, which - may cause unwanted spilling of other temporary variables into the stack -\begin_inset LatexCommand \index{stack} + argument is not matched by a case statement the processor will happily + jump into Nirvana. +\layout Subsection -\end_inset +Bit-shifting Operations +\begin_inset LatexCommand \index{Bit shifting} - / data space. - The compiler will generate a warning message when it is forced to allocate - extra space either on the stack or data space. - If this extra space allocation is undesirable then induction optimization - can be eliminated either for the entire source file (with - -\begin_inset ERT -status Collapsed +\end_inset +. \layout Standard -\backslash -/ -\end_inset +Bit shifting is one of the most frequently used operation in embedded programmin +g. + SDCC tries to implement bit-shift operations in the most efficient way + possible, e.g.: +\layout Verse --noinduction option) or for a given function only using #pragma\SpecialChar ~ -noinduction -\begin_inset LatexCommand \index{\#pragma noinduction} -\end_inset +\family typewriter +unsigned char i; +\newline +... + +\newline +i >>= 4; +\newline +... +\layout Standard -. +generates the following code: +\layout Verse + + +\family typewriter +mov\SpecialChar ~ + a,_i +\newline +swap a +\newline +anl\SpecialChar ~ + a,#0x0f \newline +mov\SpecialChar ~ + _i,a +\layout Standard -\newline -Loop Invariant: +In general SDCC will never setup a loop if the shift count is known. + Another example: \layout Verse \family typewriter -for (i = 0 ; i < 100 ; i ++) +unsigned int i; \newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -f += k + l; +... + +\newline +i >>= 9; +\newline +... \layout Standard -changed to +will generate: \layout Verse \family typewriter -itemp = k + l; -\newline -for (i = 0; i < 100; i++) -\newline +mov\SpecialChar ~ \SpecialChar ~ +a,(_i + 1) +\newline +mov\SpecialChar ~ \SpecialChar ~ +(_i + 1),#0x00 +\newline +clr\SpecialChar ~ \SpecialChar ~ +c +\newline +rrc\SpecialChar ~ \SpecialChar ~ -f += itemp; -\layout Standard - -As mentioned previously some loop invariants are not as apparent, all static - address computations are also moved out of the loop. +a \newline +mov\SpecialChar ~ +\SpecialChar ~ +_i,a +\layout Subsection -\newline -Strength Reduction -\begin_inset LatexCommand \index{Strength reduction} +Bit-rotation +\begin_inset LatexCommand \index{Bit rotation} \end_inset -, this optimization substitutes an expression by a cheaper expression: -\layout Verse - -\family typewriter -for (i=0;i < 100; i++) -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -ar[i*5] = i*3; \layout Standard -changed to +A special case of the bit-shift operation is bit rotation +\begin_inset LatexCommand \index{rotating bits} + +\end_inset + +, SDCC recognizes the following expression to be a left bit-rotation: \layout Verse \family typewriter -itemp1 = 0; -\newline -itemp2 = 0; -\newline -for (i=0;i< 100;i++) { -\newline +\series bold +unsigned +\series default \SpecialChar ~ \SpecialChar ~ +char i;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -ar[itemp1] = itemp2; -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -itemp1 += 5; -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -itemp2 += 3; +/* unsigned is needed for rotation */ \newline -} -\layout Standard - -The more expensive multiplication -\begin_inset LatexCommand \index{Multiplication} - -\end_inset - - is changed to a less expensive addition. -\layout Subsection - -Loop Reversing -\begin_inset LatexCommand \index{Loop reversing} - -\end_inset +... + +\newline +i = ((i << 1) | (i >> 7)); +\family default +\newline +\family typewriter +... \layout Standard -This optimization is done to reduce the overhead of checking loop boundaries - for every iteration. - Some simple loops can be reversed and implemented using a -\begin_inset Quotes eld -\end_inset - -decrement and jump if not zero -\begin_inset Quotes erd -\end_inset - - instruction. - SDCC checks for the following criterion to determine if a loop is reversible - (note: more sophisticated compilers use data-dependency analysis to make - this determination, SDCC uses a more simple minded analysis). -\layout Itemize - -The 'for' loop is of the form -\newline +will generate the following code: +\layout Verse -\newline \family typewriter -for( = ; [< | <=] ; [++ | - += 1]) -\newline +mov\SpecialChar ~ \SpecialChar ~ +a,_i +\newline +rl\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +a +\newline +mov\SpecialChar ~ \SpecialChar ~ - -\layout Itemize - -The does not contain -\begin_inset Quotes eld -\end_inset - -continue -\begin_inset Quotes erd -\end_inset - - or 'break -\begin_inset Quotes erd -\end_inset - -. -\layout Itemize - -All goto's are contained within the loop. -\layout Itemize - -No function calls within the loop. -\layout Itemize +_i,a +\layout Standard -The loop control variable is not assigned any value within the loop -\layout Itemize +SDCC uses pattern matching on the parse tree to determine this operation.Variatio +ns of this case will also be recognized as bit-rotation, i.e.: +\layout Verse -The loop control variable does NOT participate in any arithmetic operation - within the loop. -\layout Itemize -There are NO switch statements in the loop. +\family typewriter +i = ((i >> 7) | (i << 1)); /* left-bit rotation */ \layout Subsection -Algebraic Simplifications +Nibble and Byte Swapping \layout Standard -SDCC does numerous algebraic simplifications, the following is a small sub-set - of these optimizations. +Other special cases of the bit-shift operations are nibble or byte swapping +\begin_inset LatexCommand \index{swapping nibbles/bytes} + +\end_inset + +, SDCC recognizes the following expressions: \layout Verse \family typewriter -i = j + 0;\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - /* changed to: */\SpecialChar ~ -\SpecialChar ~ +\series bold +unsigned +\series default \SpecialChar ~ \SpecialChar ~ - i = j; +char i; \newline -i /= 2;\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - /* changed to: */\SpecialChar ~ -\SpecialChar ~ + +\series bold +unsigned +\series default \SpecialChar ~ \SpecialChar ~ - i >>= 1; +int j; \newline -i = j - j;\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - /* changed to: */\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - i = 0; +... + \newline -i = j / 1;\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - /* changed to: */\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - i = j; +i = ((i << 4) | (i >> 4)); +\family default + +\newline + +\family typewriter +j = ((j << 8) | (j >> 8)); +\layout Standard + +and generates a swap instruction for the nibble swapping +\begin_inset LatexCommand \index{Nibble swapping} + +\end_inset + + or move instructions for the byte swapping +\begin_inset LatexCommand \index{Byte swapping} + +\end_inset + +. + The +\begin_inset Quotes sld +\end_inset + +j +\begin_inset Quotes srd +\end_inset + + example can be used to convert from little to big-endian or vice versa. + If you want to change the endianness of a +\emph on +signed +\emph default + integer you have to cast to +\family typewriter +(unsigned int) +\family default + first. \layout Standard -Note the subexpressions -\begin_inset LatexCommand \index{Subexpression} +Note that SDCC stores numbers in little-endian +\begin_inset Foot +collapsed false + +\layout Standard + +Usually 8-bit processors don't care much about endianness. + This is not the case for the standard 8051 which only has an instruction + to increment its +\emph on +dptr +\emph default + +\begin_inset LatexCommand \index{DPTR} \end_inset - given above are generally introduced by macro expansions or as a result - of copy/constant propagation. -\layout Subsection +-datapointer +\emph on + +\emph default +so little-endian is the more efficient byte order. +\end_inset -'switch' Statements -\begin_inset LatexCommand \label{sub:'switch'-Statements} + +\begin_inset LatexCommand \index{little-endian} \end_inset -\begin_inset LatexCommand \index{switch statement} +\begin_inset LatexCommand \index{Endianness} \end_inset + format (i.e. + lowest order first). +\layout Subsection -\layout Standard +Highest Order Bit +\begin_inset LatexCommand \index{Highest Order Bit} -SDCC can optimize switch statements to jump tables -\begin_inset LatexCommand \index{jump tables} +\end_inset + + / Any Order Bit +\begin_inset LatexCommand \index{Any Order Bit} \end_inset -. - It makes the decision based on an estimate of the generated code size. - SDCC is quite liberal in the requirements for jump table generation: -\layout Itemize -The labels need not be in order, and the starting number need not be one - or zero, the case labels are in numerical sequence or not too many case - labels are missing. -\begin_deeper +\layout Standard + +It is frequently required to obtain the highest order bit of an integral + type (long, int, short or char types). + Also obtaining any other order bit is not uncommon. + SDCC recognizes the following expressions to yield the highest order bit + and generates optimized code for it, e.g.: \layout Verse \family typewriter -switch(i) {\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ +unsigned int gint; +\newline + +\newline +foo () { +\newline \SpecialChar ~ \SpecialChar ~ +unsigned char hob1, aob1; +\newline \SpecialChar ~ \SpecialChar ~ +bit hob2, hob3, aob2, aob3; +\newline \SpecialChar ~ \SpecialChar ~ +... + +\newline \SpecialChar ~ \SpecialChar ~ +hob1 = (gint >> 15) & 1; +\newline \SpecialChar ~ \SpecialChar ~ +hob2 = (gint >> 15) & 1; +\newline \SpecialChar ~ \SpecialChar ~ +hob3 = gint & 0x8000; +\newline \SpecialChar ~ \SpecialChar ~ +aob1 = (gint >> 9) & 1; +\newline \SpecialChar ~ \SpecialChar ~ +aob2 = (gint >> 8) & 1; +\newline \SpecialChar ~ \SpecialChar ~ -switch (i) { +aob3 = gint & 0x0800; \newline \SpecialChar ~ \SpecialChar ~ -\SpecialChar ~ -case 4: ...\SpecialChar ~ +.. + +\newline +} +\layout Standard + +will generate the following code: +\layout Verse + + +\family typewriter \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -26806,16 +30133,10 @@ case 4: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 0: ... - + 61 ;\SpecialChar ~ + hob.c 7 \newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -case 5: ...\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ +000A E5*01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -26830,6 +30151,7 @@ case 5: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 62\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -26837,16 +30159,14 @@ case 5: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ -case 1: ... - + a,(_gint + 1) \newline +000C 23\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 3: ...\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -26861,6 +30181,7 @@ case 3: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 63\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -26868,17 +30189,12 @@ case 3: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + rl\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - + a \newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -case 6: ...\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ +000D 54 01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -26893,6 +30209,7 @@ case 6: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 64\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -26900,17 +30217,11 @@ case 6: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + anl\SpecialChar ~ \SpecialChar ~ -case 3: ... - + a,#0x01 \newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -case 7: ...\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ +000F F5*02\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -26925,6 +30236,7 @@ case 7: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 65\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -26932,17 +30244,13 @@ case 7: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ -case 4: ... - + _foo_hob1_1_1,a \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 8: ...\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -26965,16 +30273,10 @@ case 8: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 5: ... - + 66 ;\SpecialChar ~ + hob.c 8 \newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -case 9: ...\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ +0011 E5*01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -26989,6 +30291,7 @@ case 9: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 67\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -26996,16 +30299,14 @@ case 9: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ -case 6: ... - + a,(_gint + 1) \newline +0013 33\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 10: ...\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27020,6 +30321,7 @@ case 10: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 68\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27027,16 +30329,11 @@ case 10: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + rlc\SpecialChar ~ \SpecialChar ~ -case 7: ... - + a \newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -case 11: ...\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ +0014 92*00\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27051,6 +30348,7 @@ case 11: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 69\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27058,16 +30356,10 @@ case 11: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ -case 8: ... - + _foo_hob2_1_1,c \newline -}\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27093,595 +30385,149 @@ case 8: ... \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -} -\layout Standard - -Both the above switch statements will be implemented using a jump-table. - The example to the right side is slightly more efficient as the check for - the lower boundary of the jump-table is not needed. -\end_deeper -\layout Itemize - -The number of case labels is not larger than supported by the target architectur -e. -\layout Itemize - -If the case labels are not in numerical sequence ('gaps' between cases) - SDCC checks whether a jump table with additionally inserted dummy cases - is still attractive. - -\layout Itemize - -If the starting number is not zero and a check for the lower boundary of - the jump-table can thus be eliminated SDCC might insert dummy cases 0, - ... - . -\layout Standard - -Switch statements which have large gaps in the numeric sequence or those - that have too many case labels can be split into more than one switch statement - for efficient code generation, e.g.: -\layout Verse - - -\family typewriter -switch (i) { + 66 ;\SpecialChar ~ + hob.c 9 \newline +0016 E5*01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 1: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 2: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 3: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 4: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 5: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 6: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 7: ... - -\newline + 67\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 101: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 102: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 103: ... - -\newline \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ -case 104: ... - + a,(_gint + 1) \newline +0018 33\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 105: ... - -\newline -\SpecialChar ~ \SpecialChar ~ -case 106: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 107: ... - -\newline -} -\layout Standard - -If the above switch statement is broken down into two switch statements -\layout Verse - - -\family typewriter -switch (i) { -\newline \SpecialChar ~ \SpecialChar ~ -case 1: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 2: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 3: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 4: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 5: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 6: ... - -\newline + 68\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 7: ... - -\newline -} -\layout Standard - -and -\layout Verse - - -\family typewriter -switch (i) { -\newline \SpecialChar ~ \SpecialChar ~ -case 101: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 102: ... - -\newline \SpecialChar ~ + rlc\SpecialChar ~ \SpecialChar ~ -case 103: ... - + a \newline +0019 92*01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 104: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 105: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 106: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 107: ... - -\newline -} -\layout Standard - -then both the switch statements will be implemented using jump-tables whereas - the unmodified switch statement will not be. -\layout Comment - -There might be reasons which SDCC cannot know about to either favour or - not favour jump tables. - If the target system has to be as quick for the last switch case as for - the first (pro jump table), or if the switch argument is known to be zero - in the majority of the cases (contra jump table). -\layout Standard - -The pragma nojtbound -\begin_inset LatexCommand \index{\#pragma nojtbound} - -\end_inset - - can be used to turn off checking the -\emph on -j -\emph default -ump -\emph on -t -\emph default -able -\emph on -bound -\emph default -aries. - It has no effect if a default label is supplied. - Use of this pragma is dangerous: if the switch -\begin_inset LatexCommand \index{switch statement} - -\end_inset - - argument is not matched by a case statement the processor will happily - jump into Nirvana. -\layout Subsection - -Bit-shifting Operations -\begin_inset LatexCommand \index{Bit shifting} - -\end_inset - -. -\layout Standard - -Bit shifting is one of the most frequently used operation in embedded programmin -g. - SDCC tries to implement bit-shift operations in the most efficient way - possible, e.g.: -\layout Verse - - -\family typewriter -unsigned char i; -\newline -... - -\newline -i >>= 4; -\newline -... -\layout Standard - -generates the following code: -\layout Verse - - -\family typewriter -mov\SpecialChar ~ - a,_i -\newline -swap a -\newline -anl\SpecialChar ~ - a,#0x0f -\newline -mov\SpecialChar ~ - _i,a -\layout Standard - -In general SDCC will never setup a loop if the shift count is known. - Another example: -\layout Verse - - -\family typewriter -unsigned int i; -\newline -... - -\newline -i >>= 9; -\newline -... -\layout Standard - -will generate: -\layout Verse - - -\family typewriter -mov\SpecialChar ~ \SpecialChar ~ -a,(_i + 1) -\newline -mov\SpecialChar ~ \SpecialChar ~ -(_i + 1),#0x00 -\newline -clr\SpecialChar ~ \SpecialChar ~ -c -\newline -rrc\SpecialChar ~ \SpecialChar ~ -a -\newline -mov\SpecialChar ~ \SpecialChar ~ -_i,a -\layout Subsection - -Bit-rotation -\begin_inset LatexCommand \index{Bit rotation} - -\end_inset - - -\layout Standard - -A special case of the bit-shift operation is bit rotation -\begin_inset LatexCommand \index{rotating bits} - -\end_inset - -, SDCC recognizes the following expression to be a left bit-rotation: -\layout Verse - - -\family typewriter -\series bold -unsigned -\series default +\SpecialChar ~ + 69\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -char i;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ + _foo_hob3_1_1,c +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -/* unsigned is needed for rotation */ -\newline -... - -\newline -i = ((i << 1) | (i >> 7)); -\family default - -\newline - -\family typewriter -... -\layout Standard - -will generate the following code: -\layout Verse - - -\family typewriter -mov\SpecialChar ~ \SpecialChar ~ -a,_i -\newline -rl\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -a -\newline -mov\SpecialChar ~ \SpecialChar ~ -_i,a -\layout Standard - -SDCC uses pattern matching on the parse tree to determine this operation.Variatio -ns of this case will also be recognized as bit-rotation, i.e.: -\layout Verse - - -\family typewriter -i = ((i >> 7) | (i << 1)); /* left-bit rotation */ -\layout Subsection - -Nibble and Byte Swapping -\layout Standard - -Other special cases of the bit-shift operations are nibble or byte swapping -\begin_inset LatexCommand \index{swapping nibbles/bytes} - -\end_inset - -, SDCC recognizes the following expressions: -\layout Verse - - -\family typewriter -\series bold -unsigned -\series default \SpecialChar ~ \SpecialChar ~ -char i; -\newline - -\series bold -unsigned -\series default \SpecialChar ~ \SpecialChar ~ -int j; -\newline -... - -\newline -i = ((i << 4) | (i >> 4)); -\family default - -\newline - -\family typewriter -j = ((j << 8) | (j >> 8)); -\layout Standard - -and generates a swap instruction for the nibble swapping -\begin_inset LatexCommand \index{Nibble swapping} - -\end_inset - - or move instructions for the byte swapping -\begin_inset LatexCommand \index{Byte swapping} - -\end_inset - -. - The -\begin_inset Quotes sld -\end_inset - -j -\begin_inset Quotes srd -\end_inset - - example can be used to convert from little to big-endian or vice versa. - If you want to change the endianness of a -\emph on -signed -\emph default - integer you have to cast to -\family typewriter -(unsigned int) -\family default - first. -\layout Standard - -Note that SDCC stores numbers in little-endian -\begin_inset Foot -collapsed false - -\layout Standard - -Usually 8-bit processors don't care much about endianness. - This is not the case for the standard 8051 which only has an instruction - to increment its -\emph on -dptr -\emph default - -\begin_inset LatexCommand \index{DPTR} - -\end_inset - --datapointer -\emph on - -\emph default -so little-endian is the more efficient byte order. -\end_inset - - -\begin_inset LatexCommand \index{little-endian} - -\end_inset - - -\begin_inset LatexCommand \index{Endianness} - -\end_inset - - format (i.e. - lowest order first). -\layout Subsection - -Highest Order Bit -\begin_inset LatexCommand \index{Highest Order Bit} - -\end_inset - - / Any Order Bit -\begin_inset LatexCommand \index{Any Order Bit} - -\end_inset - - -\layout Standard - -It is frequently required to obtain the highest order bit of an integral - type (long, int, short or char types). - Also obtaining any other order bit is not uncommon. - SDCC recognizes the following expressions to yield the highest order bit - and generates optimized code for it, e.g.: -\layout Verse - - -\family typewriter -unsigned int gint; -\newline - -\newline -foo () { -\newline \SpecialChar ~ \SpecialChar ~ -unsigned char hob1, aob1; -\newline \SpecialChar ~ \SpecialChar ~ -bit hob2, hob3, aob2, aob3; -\newline \SpecialChar ~ \SpecialChar ~ -... - -\newline \SpecialChar ~ \SpecialChar ~ -hob1 = (gint >> 15) & 1; -\newline \SpecialChar ~ \SpecialChar ~ -hob2 = (gint >> 15) & 1; -\newline \SpecialChar ~ \SpecialChar ~ -hob3 = gint & 0x8000; +\SpecialChar ~ + 70 ;\SpecialChar ~ + hob.c 10 \newline +001B E5*01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -aob1 = (gint >> 9) & 1; -\newline \SpecialChar ~ \SpecialChar ~ -aob2 = (gint >> 8) & 1; -\newline \SpecialChar ~ \SpecialChar ~ -aob3 = gint & 0x0800; -\newline \SpecialChar ~ \SpecialChar ~ -.. - +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + 71\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + mov\SpecialChar ~ +\SpecialChar ~ + a,(_gint + 1) \newline -} -\layout Standard - -will generate the following code: -\layout Verse - - -\family typewriter +001D 03\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27699,6 +30545,7 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 72\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27706,11 +30553,12 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + rr\SpecialChar ~ \SpecialChar ~ - 61 ;\SpecialChar ~ - hob.c 7 +\SpecialChar ~ + a \newline -000A E5*01\SpecialChar ~ +001E 54 01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27725,7 +30573,7 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 62\SpecialChar ~ + 73\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27733,12 +30581,11 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - mov\SpecialChar ~ + anl\SpecialChar ~ \SpecialChar ~ - a,(_gint + 1) + a,#0x01 \newline -000C 23\SpecialChar ~ -\SpecialChar ~ +0020 F5*03\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27753,22 +30600,21 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 74\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 63\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ + _foo_aob1_1_1,a +\newline \SpecialChar ~ - rl\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - a -\newline -000D 54 01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27783,7 +30629,6 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 64\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27791,11 +30636,11 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - anl\SpecialChar ~ \SpecialChar ~ - a,#0x01 + 75 ;\SpecialChar ~ + hob.c 11 \newline -000F F5*02\SpecialChar ~ +0022 E5*01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27810,7 +30655,7 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 65\SpecialChar ~ + 76\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27820,8 +30665,9 @@ will generate the following code: \SpecialChar ~ mov\SpecialChar ~ \SpecialChar ~ - _foo_hob1_1_1,a + a,(_gint + 1) \newline +0024 13\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27839,6 +30685,7 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 77\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27846,11 +30693,11 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + rrc\SpecialChar ~ \SpecialChar ~ - 66 ;\SpecialChar ~ - hob.c 8 + a \newline -0011 E5*01\SpecialChar ~ +0025 92*02\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27865,7 +30712,7 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 67\SpecialChar ~ + 78\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27875,9 +30722,8 @@ will generate the following code: \SpecialChar ~ mov\SpecialChar ~ \SpecialChar ~ - a,(_gint + 1) + _foo_aob2_1_1,c \newline -0013 33\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27895,7 +30741,6 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 68\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27903,11 +30748,11 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - rlc\SpecialChar ~ \SpecialChar ~ - a + 79 ;\SpecialChar ~ + hob.c 12 \newline -0014 92*00\SpecialChar ~ +0027 E5*01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27922,7 +30767,7 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 69\SpecialChar ~ + 80\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27932,8 +30777,9 @@ will generate the following code: \SpecialChar ~ mov\SpecialChar ~ \SpecialChar ~ - _foo_hob2_1_1,c + a,(_gint + 1) \newline +0029 A2 E3\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27948,6 +30794,7 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 81\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27955,14 +30802,11 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 66 ;\SpecialChar ~ - hob.c 9 + c,acc[3] \newline -0016 E5*01\SpecialChar ~ +002B 92*03\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27977,7 +30821,7 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 67\SpecialChar ~ + 82\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -27987,39 +30831,102 @@ will generate the following code: \SpecialChar ~ mov\SpecialChar ~ \SpecialChar ~ - a,(_gint + 1) + _foo_aob3_1_1,c +\layout Standard + +Other variations of these cases however will +\emph on +not +\emph default + be recognized. + They are standard C expressions, so I heartily recommend these be the only + way to get the highest order bit, (it is portable). + Of course it will be recognized even if it is embedded in other expressions, + e.g.: +\layout Verse + + +\family typewriter +xyz = gint + ((gint >> 15) & 1); +\layout Standard + +will still be recognized. +\layout Subsection + +Higher Order Byte +\begin_inset LatexCommand \index{Higher Order Byte} + +\end_inset + + / Higher Order Word +\begin_inset LatexCommand \index{Higher Order Word} + +\end_inset + + +\layout Standard + +It is also frequently required to obtain a higher order byte or word of + a larger integral type (long, int or short types). + SDCC recognizes the following expressions to yield the higher order byte + or word and generates optimized code for it, e.g.: +\layout Verse + + +\family typewriter +unsigned int gint; +\newline +unsigned long int glong; +\newline + +\newline +foo () { \newline -0018 33\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +unsigned char hob1, hob2; +\newline \SpecialChar ~ \SpecialChar ~ +unsigned int how1, how2; +\newline \SpecialChar ~ \SpecialChar ~ +... + +\newline \SpecialChar ~ \SpecialChar ~ +hob1 = (gint >> 8) & 0xFF; +\newline \SpecialChar ~ \SpecialChar ~ +hob2 = glong >> 24; +\newline \SpecialChar ~ - 68\SpecialChar ~ \SpecialChar ~ +how1 = (glong >> 16) & 0xFFFF; +\newline \SpecialChar ~ \SpecialChar ~ +how2 = glong >> 8; +\newline \SpecialChar ~ \SpecialChar ~ +.. + +\newline +} +\layout Standard + +will generate the following code: +\layout Verse + + +\family typewriter \SpecialChar ~ \SpecialChar ~ - rlc\SpecialChar ~ \SpecialChar ~ - a -\newline -0019 92*01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28034,7 +30941,6 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 69\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28042,10 +30948,11 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - mov\SpecialChar ~ \SpecialChar ~ - _foo_hob3_1_1,c + 91 ;\SpecialChar ~ + hob.c 15 \newline +0037 85*01*06\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28057,6 +30964,7 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 92\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28064,17 +30972,16 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ + _foo_hob1_1_1,(_gint + 1) +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 70 ;\SpecialChar ~ - hob.c 10 -\newline -001B E5*01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28089,19 +30996,18 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 71\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 93 ;\SpecialChar ~ + hob.c 16 +\newline +003A 85*05*07\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - mov\SpecialChar ~ \SpecialChar ~ - a,(_gint + 1) -\newline -001D 03\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28110,6 +31016,7 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 94\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28117,9 +31024,11 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ + _foo_hob2_1_1,(_glong + 3) +\newline \SpecialChar ~ - 72\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28127,12 +31036,8 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - rr\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - a -\newline -001E 54 01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28147,23 +31052,23 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 73\SpecialChar ~ \SpecialChar ~ + 95 ;\SpecialChar ~ + hob.c 17 +\newline +003D 85*04*08\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - anl\SpecialChar ~ \SpecialChar ~ - a,#0x01 -\newline -0020 F5*03\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 96\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28171,10 +31076,13 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ + _foo_how1_1_1,(_glong + 2) +\newline +0040 85*05*09\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 74\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28182,11 +31090,9 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - mov\SpecialChar ~ \SpecialChar ~ - _foo_aob1_1_1,a -\newline \SpecialChar ~ + 97\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28194,7 +31100,11 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ + (_foo_how1_1_1 + 1),(_glong + 3) +\newline +0043 85*03*0A\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28206,18 +31116,19 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 98\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 75 ;\SpecialChar ~ - hob.c 11 -\newline -0022 E5*01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ + _foo_how2_1_1,(_glong + 1) +\newline +0046 85*04*0B\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28229,7 +31140,7 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 76\SpecialChar ~ + 99\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -28239,1525 +31150,2746 @@ will generate the following code: \SpecialChar ~ mov\SpecialChar ~ \SpecialChar ~ - a,(_gint + 1) + (_foo_how2_1_1 + 1),(_glong + 2) +\layout Standard + +Again, variations of these cases may +\emph on +not +\emph default + be recognized. + They are standard C expressions, so I heartily recommend these be the only + way to get the higher order byte/word, (it is portable). + Of course it will be recognized even if it is embedded in other expressions, + e.g.: +\layout Verse + + +\family typewriter +xyz = gint + ((gint >> 8) & 0xFF); +\layout Standard + +will still be recognized. +\layout Subsection + +Peephole Optimizer +\begin_inset LatexCommand \label{sub:Peephole-Optimizer} + +\end_inset + + +\begin_inset LatexCommand \index{Peephole optimizer} + +\end_inset + + +\layout Standard + +The compiler uses a rule based, pattern matching and re-writing mechanism + for peep-hole optimization. + It is inspired by +\emph on +copt +\emph default + a peep-hole optimizer by Christopher W. + Fraser (cwfraser\SpecialChar ~ +@\SpecialChar ~ +microsoft.com). + A default set of rules are compiled into the compiler, additional rules + may be added with the +\emph on +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-peep-file +\begin_inset LatexCommand \index{-\/-peep-file} + +\end_inset + + +\emph default + option. + The rule language is best illustrated with examples. +\layout Verse + + +\family typewriter +replace { \newline -0024 13\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ - 77\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - rrc\SpecialChar ~ \SpecialChar ~ - a +mov %1,a \newline -0025 92*02\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 78\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +mov a,%1 +\newline +} by { +\newline \SpecialChar ~ \SpecialChar ~ +mov %1,a +\newline +} +\layout Standard + +The above rule will change the following assembly +\begin_inset LatexCommand \index{Assembler routines} + +\end_inset + + sequence: +\layout Verse + + +\family typewriter +mov r1,a +\newline +mov a,r1 +\layout Standard + +to +\layout Verse + + +\family typewriter +mov r1,a +\layout Standard + +Note: All occurrences of a +\emph on +%n +\emph default + (pattern variable) must denote the same string. + With the above rule, the assembly sequence: +\layout Verse + + +\family typewriter +mov r1,a +\newline +mov a,r2 +\layout Standard + +will remain unmodified. +\newline + +\newline +Other special case optimizations may be added by the user (via +\emph on +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-peep-file option +\emph default +). + E.g. + some variants of the 8051 MCU +\begin_inset LatexCommand \index{MCS51 variants} + +\end_inset + + allow only +\family typewriter +ajmp +\family default + and +\family typewriter +acall +\family default +. + The following two rules will change all +\family typewriter +ljmp +\family default + and +\family typewriter +lcall +\family default + to +\family typewriter +ajmp +\family default + and +\family typewriter +acall +\layout Verse + + +\family typewriter +replace { lcall %1 } by { acall %1 } +\newline +replace { ljmp %1 } by { ajmp %1 } +\layout Standard + +The +\emph on +inline-assembler code +\emph default + is also passed through the peep hole optimizer, thus the peephole optimizer + can also be used as an assembly level macro expander. + The rules themselves are MCU dependent whereas the rule language infra-structur +e is MCU independent. + Peephole optimization rules for other MCU can be easily programmed using + the rule language. +\newline + +\newline +The syntax for a rule is as follows: +\layout Verse + + +\family typewriter +rule := replace [ restart ] '{' ' +\backslash +n' +\newline \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + '}' by '{' ' +\backslash +n' +\newline \SpecialChar ~ - mov\SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + ' +\backslash +n' +\newline \SpecialChar ~ - _foo_aob2_1_1,c + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + '}' [if ] ' +\backslash +n' +\layout Standard + + := assembly instruction (each instruction including + labels must be on a separate line). +\newline + +\newline +The optimizer will apply to the rules one by one from the top in the sequence + of their appearance, it will terminate when all rules are exhausted. + If the 'restart' option is specified, then the optimizer will start matching + the rules again from the top, this option for a rule is expensive (performance) +, it is intended to be used in situations where a transformation will trigger + the same rule again. + An example of this (not a good one, it has side effects) is the following + rule: +\layout Verse + + +\family typewriter +replace restart { \newline \SpecialChar ~ \SpecialChar ~ +pop %1 +\newline \SpecialChar ~ \SpecialChar ~ +push %1 } by { +\newline \SpecialChar ~ \SpecialChar ~ +; nop +\newline +} +\layout Standard + +Note that the replace pattern cannot be a blank, but can be a comment line. + Without the 'restart' option only the innermost 'pop' 'push' pair would + be eliminated, i.e.: +\layout Verse + + +\family typewriter +pop ar1 +\newline +pop ar2 +\newline +push ar2 +\newline +push ar1 +\layout Standard + +would result in: +\layout Verse + + +\family typewriter +pop ar1 +\newline +; nop +\newline +push ar1 +\layout Standard + + +\emph on +with +\emph default + the restart option the rule will be applied again to the resulting code + and then all the pop-push pairs will be eliminated to yield: +\layout Verse + + +\family typewriter +; nop +\newline +; nop +\layout Standard + +A conditional function can be attached to a rule. + Attaching rules are somewhat more involved, let me illustrate this with + an example. +\layout Verse + + +\family typewriter +replace { +\newline \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ +ljmp %5 +\newline +%2: +\newline +} by { +\newline \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ +sjmp %5 +\newline +%2: +\newline +} if labelInRange +\layout Standard + +The optimizer does a look-up of a function name table defined in function + +\emph on +callFuncByName +\emph default + in the source file SDCCpeeph.c, with the name +\emph on +labelInRange +\emph default +. + If it finds a corresponding entry the function is called. + Note there can be no parameters specified for these functions, in this + case the use of +\emph on +%5 +\emph default + is crucial, since the function +\emph on +labelInRange +\emph default + expects to find the label in that particular variable (the hash table containin +g the variable bindings is passed as a parameter). + If you want to code more such functions, take a close look at the function + labelInRange and the calling mechanism in source file SDCCpeeph.c. + Currently implemented are +\emph on +labelInRange, labelRefCount, labelIsReturnOnly, operandsNotSame, xramMovcOption, + 24bitMode, portIsDS390, 24bitModeAndPortDS390 +\emph default +and +\emph on + notVolatile +\emph default +. +\layout Standard + +I know this whole thing is a little kludgey, but maybe some day we will + have some better means. + If you are looking at this file, you will see the default rules that are + compiled into the compiler, you can add your own rules in the default set + there if you get tired of specifying the - +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-peep-file option. +\layout Section + +ANSI-Compliance +\begin_inset LatexCommand \index{ANSI-compliance} + +\end_inset + + +\begin_inset LatexCommand \label{sub:ANSI-Compliance} + +\end_inset + + +\layout Standard + +The latest publically available version of the standard +\emph on +ISO/IEC 9899 - Programming languages - C +\emph default + should be available at: +\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899} + +\end_inset + +. +\newline + +\layout Standard + +Deviations from the compliance: +\layout Itemize + +functions are not reentrant +\begin_inset LatexCommand \index{reentrant} + +\end_inset + + unless explicitly declared as such or the +\series bold +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-stack-auto +\begin_inset LatexCommand \index{-\/-stack-auto} + +\end_inset + + +\series default + command line option is specified. +\layout Itemize + +structures +\begin_inset LatexCommand \index{struct} + +\end_inset + + and unions +\begin_inset LatexCommand \index{union} + +\end_inset + + cannot be assigned values directly, cannot be passed as function parameters + or assigned to each other and cannot be a return value +\begin_inset LatexCommand \index{return value} + +\end_inset + + from a function, e.g.: +\begin_deeper +\layout Verse + + +\family typewriter +struct s { ... + }; +\newline +struct s s1, s2; +\newline +foo() +\newline +{ +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +... + +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +s1 = s2 ; /* is invalid in SDCC although allowed in ANSI */ +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 79 ;\SpecialChar ~ - hob.c 12 +... + +\newline +} +\newline + +\series bold +struct +\series default + s foo1 ( +\series bold +struct +\series default + s parms) /* invalid in SDCC although allowed in ANSI */ +\newline +{ \newline -0027 E5*01\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +struct s rets; +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +... + +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 80\SpecialChar ~ +return rets; /* is invalid in SDCC although allowed in ANSI */ +\newline +} +\end_deeper +\layout Itemize + +initialization of structure arrays must be fully braced. +\begin_deeper +\layout Verse + + +\family typewriter +struct s { char x } a[] = {1, 2};\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +/* invalid in SDCC */ +\newline +struct s { char x } a[] = {{1}, {2}}; /* OK */ +\end_deeper +\layout Itemize + +'long long +\begin_inset LatexCommand \index{long long (not supported)} + +\end_inset + +' (64 bit integers +\begin_inset LatexCommand \index{int (64 bit) (not supported)} + +\end_inset + +) not supported. +\layout Itemize + +'double +\begin_inset LatexCommand \index{double (not supported)} + +\end_inset + +' precision floating point +\begin_inset LatexCommand \index{Floating point support} + +\end_inset + +not supported. +\layout Itemize + +Old K&R style +\begin_inset LatexCommand \index{K\&R style} + +\end_inset + + function declarations are NOT allowed. +\begin_deeper +\layout Verse + + +\family typewriter +foo(i,j) /* this old style of function declarations */ +\newline +int i,j; /* are valid in ANSI but not valid in SDCC */ +\newline +{ +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - mov\SpecialChar ~ \SpecialChar ~ - a,(_gint + 1) +... + +\newline +} +\end_deeper +\layout Itemize + +Most enhancements in C99 are not supported, f.e.: +\begin_deeper +\layout Verse + + +\family typewriter +\series bold +inline +\begin_inset LatexCommand \index{inline (not supported)} + +\end_inset + + +\series default + int increment (int a) { return a+1; } /* is invalid in SDCC although allowed + in C99. + An empty define +\emph on +#define inline +\emph default + can be used as a work around */ +\newline + +\newline +for ( +\series bold +int +\series default + i=0; i<10; i++) /* is invalid in SDCC although allowed in C99 */ +\end_deeper +\layout Itemize + +Certain words that are valid identifiers in the standard may be reserved + words in SDCC unless the +\series bold +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-std-c89 +\begin_inset LatexCommand \index{-\/-std-c89} + +\end_inset + + or - +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-std-c99 +\begin_inset LatexCommand \index{-\/-std-c99} + +\end_inset + + +\series default + command line options are used. + These may include (depending on the selected processor): 'at', 'banked', + 'bit', 'code', 'critical', 'data', 'eeprom', 'far', 'flash', 'idata', 'interrup +t', 'near', 'nonbanked', 'pdata', 'reentrant', 'sbit', 'sfr', 'shadowregs', + 'sram', 'using', 'wparam', 'xdata', '_overlay', '_asm', '_endasm', and + '_naked'. + Compliant equivalents of these keywords are always available in a form + that begin with two underscores +\begin_inset LatexCommand \index{\_\_ (prefix for extended keywords)} + +\end_inset + +, f.e. + '__data' instead of 'data'. +\layout Section + +Cyclomatic Complexity +\begin_inset LatexCommand \index{Cyclomatic complexity} + +\end_inset + + +\layout Standard + +Cyclomatic complexity of a function is defined as the number of independent + paths the program can take during execution of the function. + This is an important number since it defines the number test cases you + have to generate to validate the function. + The accepted industry standard for complexity number is 10, if the cyclomatic + complexity reported by SDCC exceeds 10 you should think about simplification + of the function logic. + Note that the complexity level is not related to the number of lines of + code in a function. + Large functions can have low complexity, and small functions can have large + complexity levels. + +\newline + +\newline +SDCC uses the following formula to compute the complexity: +\newline + +\layout Standard + +complexity = (number of edges in control flow graph) - (number of nodes + in control flow graph) + 2; +\newline + +\newline +Having said that the industry standard is 10, you should be aware that in + some cases it be may unavoidable to have a complexity level of less than + 10. + For example if you have switch statement with more than 10 case labels, + each case label adds one to the complexity level. + The complexity level is by no means an absolute measure of the algorithmic + complexity of the function, it does however provide a good starting point + for which functions you might look at for further optimization. +\layout Section + +Retargetting for other Processors +\layout Standard + +The issues for retargetting the compiler are far too numerous to be covered + by this document. + What follows is a brief description of each of the seven phases of the + compiler and its MCU dependency. +\layout Itemize + +Parsing the source and building the annotated parse tree. + This phase is largely MCU independent (except for the language extensions). + Syntax & semantic checks are also done in this phase, along with some initial + optimizations like back patching labels and the pattern matching optimizations + like bit-rotation etc. +\layout Itemize + +The second phase involves generating an intermediate code which can be easy + manipulated during the later phases. + This phase is entirely MCU independent. + The intermediate code generation assumes the target machine has unlimited + number of registers, and designates them with the name iTemp. + The compiler can be made to dump a human readable form of the code generated + by using the - +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-dumpraw option. +\layout Itemize + +This phase does the bulk of the standard optimizations and is also MCU independe +nt. + This phase can be broken down into several sub-phases: +\newline + +\newline +Break down intermediate code (iCode) into basic blocks. +\newline +Do control flow & data flow analysis on the basic blocks. +\newline +Do local common subexpression elimination, then global subexpression elimination +\newline +Dead code elimination +\newline +Loop optimizations +\newline +If loop optimizations caused any changes then do 'global subexpression eliminati +on' and 'dead code elimination' again. +\layout Itemize + +This phase determines the live-ranges; by live range I mean those iTemp + variables defined by the compiler that still survive after all the optimization +s. + Live range analysis +\begin_inset LatexCommand \index{Live range analysis} + +\end_inset + + is essential for register allocation, since these computation determines + which of these iTemps will be assigned to registers, and for how long. +\layout Itemize + +Phase five is register allocation. + There are two parts to this process. \newline -0029 A2 E3\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 81\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - mov\SpecialChar ~ -\SpecialChar ~ - c,acc[3] + \newline -002B 92*03\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 82\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - mov\SpecialChar ~ -\SpecialChar ~ - _foo_aob3_1_1,c +The first part I call 'register packing' (for lack of a better term). + In this case several MCU specific expression folding is done to reduce + register pressure. +\newline + +\newline +The second part is more MCU independent and deals with allocating registers + to the remaining live ranges. + A lot of MCU specific code does creep into this phase because of the limited + number of index registers available in the 8051. +\layout Itemize + +The Code generation phase is (unhappily), entirely MCU dependent and very + little (if any at all) of this code can be reused for other MCU. + However the scheme for allocating a homogenized assembler operand for each + iCode operand may be reused. +\layout Itemize + +As mentioned in the optimization section the peep-hole optimizer is rule + based system, which can reprogrammed for other MCUs. +\layout Standard + +More information is available in a wiki +\begin_inset LatexCommand \index{wiki} + +\end_inset + + (preliminary link +\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/release_wiki/index.php?page=SDCC+internals+and+porting} + +\end_inset + +) and in the thread +\begin_inset LatexCommand \url{http://sf.net/mailarchive/message.php?msg_id=13954144} + +\end_inset + + . +\layout Chapter + +Compiler internals +\begin_inset LatexCommand \index{Compiler internals} + +\end_inset + + +\layout Section + +The anatomy of the compiler +\begin_inset LatexCommand \label{sub:The-anatomy-of} + +\end_inset + + +\layout Standard + + +\shape italic +This is an excerpt from an article published in Circuit Cellar Magazine + in +\series bold +August 2000 +\series default +. + It's a little outdated (the compiler is much more efficient now and user/develo +per friendly), but pretty well exposes the guts of it all. +\shape default + +\newline + +\newline +The current version of SDCC can generate code for Intel 8051 and Z80 MCU. + It is fairly easy to retarget for other 8-bit MCU. + Here we take a look at some of the internals of the compiler. + +\layout Paragraph* + +Parsing +\begin_inset LatexCommand \index{Parsing} + +\end_inset + + +\layout Standard + +Parsing the input source file and creating an AST (Annotated Syntax Tree +\begin_inset LatexCommand \index{Annotated syntax tree} + +\end_inset + +). + This phase also involves propagating types (annotating each node of the + parse tree with type information) and semantic analysis. + There are some MCU specific parsing rules. + For example the storage classes, the extended storage classes are MCU specific + while there may be a xdata storage class for 8051 there is no such storage + class for z80 or Atmel AVR. + SDCC allows MCU specific storage class extensions, i.e. + xdata will be treated as a storage class specifier when parsing 8051 C + code but will be treated as a C identifier when parsing z80 or ATMEL AVR + C code. +\layout Paragraph* + +Generating iCode +\begin_inset LatexCommand \index{iCode} + +\end_inset + + +\layout Standard + +Intermediate code generation. + In this phase the AST is broken down into three-operand form (iCode). + These three operand forms are represented as doubly linked lists. + ICode is the term given to the intermediate form generated by the compiler. + ICode example section shows some examples of iCode generated for some simple + C source functions. +\layout Paragraph* + +Optimizations +\begin_inset LatexCommand \index{Optimizations} + +\end_inset + +. +\layout Standard + +Bulk of the target independent optimizations is performed in this phase. + The optimizations include constant propagation, common sub-expression eliminati +on, loop invariant code movement, strength reduction of loop induction variables + and dead-code elimination. +\layout Paragraph* + +Live range analysis +\begin_inset LatexCommand \index{Live range analysis} + +\end_inset + + +\layout Standard + +During intermediate code generation phase, the compiler assumes the target + machine has infinite number of registers and generates a lot of temporary + variables. + The live range computation determines the lifetime of each of these compiler-ge +nerated temporaries. + A picture speaks a thousand words. + ICode example sections show the live range annotations for each of the + operand. + It is important to note here, each iCode is assigned a number in the order + of its execution in the function. + The live ranges are computed in terms of these numbers. + The from number is the number of the iCode which first defines the operand + and the to number signifies the iCode which uses this operand last. +\layout Paragraph* + +Register Allocation +\begin_inset LatexCommand \index{Register allocation} + +\end_inset + + +\layout Standard + +The register allocation determines the type and number of registers needed + by each operand. + In most MCUs only a few registers can be used for indirect addressing. + In case of 8051 for example the registers R0 & R1 can be used to indirectly + address the internal ram and DPTR to indirectly address the external ram. + The compiler will try to allocate the appropriate register to pointer variables + if it can. + ICode example section shows the operands annotated with the registers assigned + to them. + The compiler will try to keep operands in registers as much as possible; + there are several schemes the compiler uses to do achieve this. + When the compiler runs out of registers the compiler will check to see + if there are any live operands which is not used or defined in the current + basic block being processed, if there are any found then it will push that + operand and use the registers in this block, the operand will then be popped + at the end of the basic block. + +\layout Standard + +There are other MCU specific considerations in this phase. + Some MCUs have an accumulator; very short-lived operands could be assigned + to the accumulator instead of a general-purpose register. +\layout Paragraph* + +Code generation +\layout Standard + +Figure II gives a table of iCode +\begin_inset LatexCommand \index{iCode} + +\end_inset + + operations supported by the compiler. + The code generation involves translating these operations into corresponding + assembly code for the processor. + This sounds overly simple but that is the essence of code generation. + Some of the iCode operations are generated on a MCU specific manner for + example, the z80 port does not use registers to pass parameters so the + SEND and RECV iCode operations will not be generated, and it also does + not support JUMPTABLES. + +\newline + +\layout Standard + + +\size footnotesize +Figure II +\begin_inset Tabular + + + + + + + + +\begin_inset Text + +\layout Standard + + +\series bold +iCode +\series default + +\begin_inset LatexCommand \index{iCode} + +\end_inset + + +\end_inset + + +\begin_inset Text + +\layout Standard + + +\series bold +Operands +\end_inset + + +\begin_inset Text + +\layout Standard + + +\series bold +Description +\end_inset + + +\begin_inset Text + +\layout Standard + + +\series bold +C Equivalent +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +'!' +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +NOT operation +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = ! IC_LEFT; +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +'~' +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Bitwise complement of +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = ~IC_LEFT; +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +RRC +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Rotate right with carry +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = (IC_LEFT << 1) | (IC_LEFT >> (sizeof(IC_LEFT)*8-1)); +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +RLC +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Rotate left with carry +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = (IC_LEFT << (sizeof(LC_LEFT)*8-1) ) | (IC_LEFT >> 1); +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +GETHBIT +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Get the highest order bit of IC_LEFT +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = (IC_LEFT >> (sizeof(IC_LEFT)*8 -1)); +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +UNARYMINUS +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Unary minus +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = - IC_LEFT; +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IPUSH +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Push the operand into stack +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +NONE +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IPOP +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Pop the operand from the stack +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +NONE +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +CALL +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Call the function represented by IC_LEFT +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = IC_LEFT(); +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +PCALL +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Call via function pointer +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = (*IC_LEFT)(); +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +RETURN +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Return the value in operand IC_LEFT +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +return IC_LEFT; +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +LABEL +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LABEL() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Label +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LABEL: +\end_inset + + + + +\begin_inset Text + \layout Standard -Other variations of these cases however will -\emph on -not -\emph default - be recognized. - They are standard C expressions, so I heartily recommend these be the only - way to get the highest order bit, (it is portable). - Of course it will be recognized even if it is embedded in other expressions, - e.g.: -\layout Verse +\size footnotesize +GOTO +\end_inset + + +\begin_inset Text -\family typewriter -xyz = gint + ((gint >> 15) & 1); \layout Standard -will still be recognized. -\layout Subsection -Higher Order Byte -\begin_inset LatexCommand \index{Higher Order Byte} +\size footnotesize +IC_LABEL() +\end_inset + + +\begin_inset Text + +\layout Standard + +\size footnotesize +Goto label \end_inset + + +\begin_inset Text + +\layout Standard - / Higher Order Word -\begin_inset LatexCommand \index{Higher Order Word} +\size footnotesize +goto IC_LABEL(); \end_inset + + + + +\begin_inset Text +\layout Standard + + +\size footnotesize +'+' +\end_inset + + +\begin_inset Text \layout Standard -It is also frequently required to obtain a higher order byte or word of - a larger integral type (long, int or short types). - SDCC recognizes the following expressions to yield the higher order byte - or word and generates optimized code for it, e.g.: -\layout Verse +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_inset + + +\begin_inset Text -\family typewriter -unsigned int gint; -\newline -unsigned long int glong; -\newline +\layout Standard + + +\size footnotesize +Addition +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = IC_LEFT + IC_RIGHT +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +'-' +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Subtraction +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = IC_LEFT - IC_RIGHT +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +'*' +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Multiplication +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = IC_LEFT * IC_RIGHT; +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +'/' +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Division +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = IC_LEFT / IC_RIGHT; +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +'%' +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_inset + + +\begin_inset Text -\newline -foo () { -\newline -\SpecialChar ~ -\SpecialChar ~ -unsigned char hob1, hob2; -\newline -\SpecialChar ~ -\SpecialChar ~ -unsigned int how1, how2; -\newline -\SpecialChar ~ -\SpecialChar ~ -... - -\newline -\SpecialChar ~ -\SpecialChar ~ -hob1 = (gint >> 8) & 0xFF; -\newline -\SpecialChar ~ -\SpecialChar ~ -hob2 = glong >> 24; -\newline -\SpecialChar ~ -\SpecialChar ~ -how1 = (glong >> 16) & 0xFFFF; -\newline -\SpecialChar ~ -\SpecialChar ~ -how2 = glong >> 8; -\newline -\SpecialChar ~ -\SpecialChar ~ -.. - -\newline -} \layout Standard -will generate the following code: -\layout Verse +\size footnotesize +Modulus +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = IC_LEFT % IC_RIGHT; +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +'<' +\end_inset + + +\begin_inset Text -\family typewriter -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 91 ;\SpecialChar ~ - hob.c 15 -\newline -0037 85*01*06\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 92\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - mov\SpecialChar ~ -\SpecialChar ~ - _foo_hob1_1_1,(_gint + 1) -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 93 ;\SpecialChar ~ - hob.c 16 -\newline -003A 85*05*07\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 94\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - mov\SpecialChar ~ -\SpecialChar ~ - _foo_hob2_1_1,(_glong + 3) -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 95 ;\SpecialChar ~ - hob.c 17 -\newline -003D 85*04*08\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 96\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - mov\SpecialChar ~ -\SpecialChar ~ - _foo_how1_1_1,(_glong + 2) -\newline -0040 85*05*09\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 97\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - mov\SpecialChar ~ -\SpecialChar ~ - (_foo_how1_1_1 + 1),(_glong + 3) -\newline -0043 85*03*0A\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 98\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - mov\SpecialChar ~ -\SpecialChar ~ - _foo_how2_1_1,(_glong + 1) -\newline -0046 85*04*0B\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - 99\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - mov\SpecialChar ~ -\SpecialChar ~ - (_foo_how2_1_1 + 1),(_glong + 2) \layout Standard -Again, variations of these cases may -\emph on -not -\emph default - be recognized. - They are standard C expressions, so I heartily recommend these be the only - way to get the higher order byte/word, (it is portable). - Of course it will be recognized even if it is embedded in other expressions, - e.g.: -\layout Verse +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_inset + + +\begin_inset Text -\family typewriter -xyz = gint + ((gint >> 8) & 0xFF); \layout Standard -will still be recognized. -\layout Subsection -Peephole Optimizer -\begin_inset LatexCommand \label{sub:Peephole-Optimizer} +\size footnotesize +Less than +\end_inset + + +\begin_inset Text + +\layout Standard + +\size footnotesize +IC_RESULT = IC_LEFT < IC_RIGHT; \end_inset + + + + +\begin_inset Text +\layout Standard -\begin_inset LatexCommand \index{Peephole optimizer} +\size footnotesize +'>' \end_inset + + +\begin_inset Text +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_inset + + +\begin_inset Text \layout Standard -The compiler uses a rule based, pattern matching and re-writing mechanism - for peep-hole optimization. - It is inspired by -\emph on -copt -\emph default - a peep-hole optimizer by Christopher W. - Fraser (cwfraser\SpecialChar ~ -@\SpecialChar ~ -microsoft.com). - A default set of rules are compiled into the compiler, additional rules - may be added with the -\emph on -- -\begin_inset ERT -status Collapsed + +\size footnotesize +Greater than +\end_inset + + +\begin_inset Text \layout Standard -\backslash -/ + +\size footnotesize +IC_RESULT = IC_LEFT > IC_RIGHT; \end_inset + + + + +\begin_inset Text --peep-file -\begin_inset LatexCommand \index{-\/-peep-file} +\layout Standard + +\size footnotesize +EQ_OP \end_inset + + +\begin_inset Text - -\emph default - option. - The rule language is best illustrated with examples. -\layout Verse +\layout Standard -\family typewriter -replace { -\newline -\SpecialChar ~ -\SpecialChar ~ -mov %1,a -\newline -\SpecialChar ~ -\SpecialChar ~ -mov a,%1 -\newline -} by { -\newline -\SpecialChar ~ -\SpecialChar ~ -mov %1,a -\newline -} +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +Equal to +\end_inset + + +\begin_inset Text + \layout Standard -The above rule will change the following assembly -\begin_inset LatexCommand \index{Assembler routines} +\size footnotesize +IC_RESULT = IC_LEFT == IC_RIGHT; \end_inset + + + + +\begin_inset Text - sequence: -\layout Verse +\layout Standard -\family typewriter -mov r1,a -\newline -mov a,r1 +\size footnotesize +AND_OP +\end_inset + + +\begin_inset Text + \layout Standard -to -\layout Verse +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_inset + + +\begin_inset Text -\family typewriter -mov r1,a \layout Standard -Note: All occurrences of a -\emph on -%n -\emph default - (pattern variable) must denote the same string. - With the above rule, the assembly sequence: -\layout Verse +\size footnotesize +Logical and operation +\end_inset + + +\begin_inset Text -\family typewriter -mov r1,a -\newline -mov a,r2 \layout Standard -will remain unmodified. -\newline -\newline -Other special case optimizations may be added by the user (via -\emph on -- -\begin_inset ERT -status Collapsed +\size footnotesize +IC_RESULT = IC_LEFT && IC_RIGHT; +\end_inset + + + + +\begin_inset Text \layout Standard -\backslash -/ + +\size footnotesize +OR_OP \end_inset + + +\begin_inset Text + +\layout Standard --peep-file option -\emph default -). - E.g. - some variants of the 8051 MCU -\begin_inset LatexCommand \index{MCS51 variants} +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() \end_inset + + +\begin_inset Text - allow only -\family typewriter -ajmp -\family default - and -\family typewriter -acall -\family default -. - The following two rules will change all -\family typewriter -ljmp -\family default - and -\family typewriter -lcall -\family default - to -\family typewriter -ajmp -\family default - and -\family typewriter -acall -\layout Verse +\layout Standard -\family typewriter -replace { lcall %1 } by { acall %1 } -\newline -replace { ljmp %1 } by { ajmp %1 } +\size footnotesize +Logical or operation +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size footnotesize +IC_RESULT = IC_LEFT || IC_RIGHT; +\end_inset + + + + +\begin_inset Text + \layout Standard -The -\emph on -inline-assembler code -\emph default - is also passed through the peep hole optimizer, thus the peephole optimizer - can also be used as an assembly level macro expander. - The rules themselves are MCU dependent whereas the rule language infra-structur -e is MCU independent. - Peephole optimization rules for other MCU can be easily programmed using - the rule language. -\newline - -\newline -The syntax for a rule is as follows: -\layout Verse +\size footnotesize +'^' +\end_inset + + +\begin_inset Text -\family typewriter -rule := replace [ restart ] '{' ' -\backslash -n' -\newline -\SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - '}' by '{' ' -\backslash -n' -\newline -\SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - ' -\backslash -n' -\newline -\SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - '}' [if ] ' -\backslash -n' \layout Standard - := assembly instruction (each instruction including - labels must be on a separate line). -\newline - -\newline -The optimizer will apply to the rules one by one from the top in the sequence - of their appearance, it will terminate when all rules are exhausted. - If the 'restart' option is specified, then the optimizer will start matching - the rules again from the top, this option for a rule is expensive (performance) -, it is intended to be used in situations where a transformation will trigger - the same rule again. - An example of this (not a good one, it has side effects) is the following - rule: -\layout Verse +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_inset + + +\begin_inset Text -\family typewriter -replace restart { -\newline -\SpecialChar ~ -\SpecialChar ~ -pop %1 -\newline -\SpecialChar ~ -\SpecialChar ~ -push %1 } by { -\newline -\SpecialChar ~ -\SpecialChar ~ -; nop -\newline -} \layout Standard -Note that the replace pattern cannot be a blank, but can be a comment line. - Without the 'restart' option only the innermost 'pop' 'push' pair would - be eliminated, i.e.: -\layout Verse +\size footnotesize +Exclusive OR +\end_inset + + +\begin_inset Text -\family typewriter -pop ar1 -\newline -pop ar2 -\newline -push ar2 -\newline -push ar1 \layout Standard -would result in: -\layout Verse +\size footnotesize +IC_RESULT = IC_LEFT ^ IC_RIGHT; +\end_inset + + + + +\begin_inset Text -\family typewriter -pop ar1 -\newline -; nop -\newline -push ar1 \layout Standard -\emph on -with -\emph default - the restart option the rule will be applied again to the resulting code - and then all the pop-push pairs will be eliminated to yield: -\layout Verse +\size footnotesize +'|' +\end_inset + + +\begin_inset Text +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_inset + + +\begin_inset Text -\family typewriter -; nop -\newline -; nop \layout Standard -A conditional function can be attached to a rule. - Attaching rules are somewhat more involved, let me illustrate this with - an example. -\layout Verse +\size footnotesize +Bitwise OR +\end_inset + + +\begin_inset Text -\family typewriter -replace { -\newline -\SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ -ljmp %5 -\newline -%2: -\newline -} by { -\newline -\SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ -sjmp %5 -\newline -%2: -\newline -} if labelInRange \layout Standard -The optimizer does a look-up of a function name table defined in function - -\emph on -callFuncByName -\emph default - in the source file SDCCpeeph.c, with the name -\emph on -labelInRange -\emph default -. - If it finds a corresponding entry the function is called. - Note there can be no parameters specified for these functions, in this - case the use of -\emph on -%5 -\emph default - is crucial, since the function -\emph on -labelInRange -\emph default - expects to find the label in that particular variable (the hash table containin -g the variable bindings is passed as a parameter). - If you want to code more such functions, take a close look at the function - labelInRange and the calling mechanism in source file SDCCpeeph.c. - Currently implemented are -\emph on -labelInRange, labelRefCount, labelIsReturnOnly, operandsNotSame, xramMovcOption, - 24bitMode, portIsDS390, 24bitModeAndPortDS390 -\emph default -and -\emph on - notVolatile -\emph default -. + +\size footnotesize +IC_RESULT = IC_LEFT | IC_RIGHT; +\end_inset + + + + +\begin_inset Text + \layout Standard -I know this whole thing is a little kludgey, but maybe some day we will - have some better means. - If you are looking at this file, you will see the default rules that are - compiled into the compiler, you can add your own rules in the default set - there if you get tired of specifying the - -\begin_inset ERT -status Collapsed + +\size footnotesize +BITWISEAND +\end_inset + + +\begin_inset Text \layout Standard -\backslash -/ + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() \end_inset + + +\begin_inset Text --peep-file option. -\layout Section +\layout Standard -ANSI-Compliance -\begin_inset LatexCommand \index{ANSI-compliance} +\size footnotesize +Bitwise AND \end_inset + + +\begin_inset Text +\layout Standard -\begin_inset LatexCommand \label{sub:ANSI-Compliance} +\size footnotesize +IC_RESULT = IC_LEFT & IC_RIGHT; \end_inset - + + + + +\begin_inset Text \layout Standard -The latest publically available version of the standard -\emph on -ISO/IEC 9899 - Programming languages - C -\emph default - should be available at: -\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899} +\size footnotesize +LEFT_OP \end_inset + + +\begin_inset Text -. -\newline +\layout Standard + + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_inset + + +\begin_inset Text \layout Standard -Deviations from the compliance: -\layout Itemize -functions are not reentrant -\begin_inset LatexCommand \index{reentrant} +\size footnotesize +Left shift +\end_inset + + +\begin_inset Text + +\layout Standard + +\size footnotesize +IC_RESULT = IC_LEFT << IC_RIGHT \end_inset + + + + +\begin_inset Text - unless explicitly declared as such or the -\series bold -- -\begin_inset ERT -status Collapsed +\layout Standard + + +\size footnotesize +RIGHT_OP +\end_inset + + +\begin_inset Text \layout Standard -\backslash -/ + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() \end_inset + + +\begin_inset Text --stack-auto -\begin_inset LatexCommand \index{-\/-stack-auto} +\layout Standard + +\size footnotesize +Right shift \end_inset + + +\begin_inset Text + +\layout Standard -\series default - command line option is specified. -\layout Itemize +\size footnotesize +IC_RESULT = IC_LEFT >> IC_RIGHT +\end_inset + + + + +\begin_inset Text -structures -\begin_inset LatexCommand \index{struct} +\layout Standard + +\size footnotesize +GET_VALUE_ +\newline +AT_ ADDRESS \end_inset + + +\begin_inset Text + +\layout Standard - and unions -\begin_inset LatexCommand \index{union} +\size footnotesize +IC_LEFT() IC_RESULT() \end_inset + + +\begin_inset Text - cannot be assigned values directly, cannot be passed as function parameters - or assigned to each other and cannot be a return value -\begin_inset LatexCommand \index{return value} +\layout Standard + +\size footnotesize +Indirect fetch \end_inset + + +\begin_inset Text - from a function, e.g.: -\begin_deeper -\layout Verse +\layout Standard -\family typewriter -struct s { ... - }; -\newline -struct s s1, s2; -\newline -foo() -\newline -{ -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -... - -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -s1 = s2 ; /* is invalid in SDCC although allowed in ANSI */ -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -... - -\newline -} -\newline +\size footnotesize +IC_RESULT = (*IC_LEFT); +\end_inset + + + + +\begin_inset Text -\series bold -struct -\series default - s foo1 ( -\series bold -struct -\series default - s parms) /* invalid in SDCC although allowed in ANSI */ -\newline -{ -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -struct s rets; -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -... - -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -return rets; /* is invalid in SDCC although allowed in ANSI */ -\newline -} -\end_deeper -\layout Itemize +\layout Standard -initialization of structure arrays must be fully braced. -\begin_deeper -\layout Verse +\size footnotesize +POINTER_SET +\end_inset + + +\begin_inset Text -\family typewriter -struct s { char x } a[] = {1, 2};\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -/* invalid in SDCC */ -\newline -struct s { char x } a[] = {{1}, {2}}; /* OK */ -\end_deeper -\layout Itemize +\layout Standard -'long long -\begin_inset LatexCommand \index{long long (not supported)} +\size footnotesize +IC_RIGHT() IC_RESULT() \end_inset + + +\begin_inset Text + +\layout Standard -' (64 bit integers -\begin_inset LatexCommand \index{int (64 bit) (not supported)} +\size footnotesize +Indirect set \end_inset + + +\begin_inset Text -) not supported. -\layout Itemize +\layout Standard -'double -\begin_inset LatexCommand \index{double (not supported)} -\end_inset +\size footnotesize +(*IC_RESULT) = IC_RIGHT; +\end_inset + + + + +\begin_inset Text + +\layout Standard -' precision floating point -\begin_inset LatexCommand \index{Floating point support} +\size footnotesize +'=' \end_inset + + +\begin_inset Text -not supported. -\layout Itemize +\layout Standard -Old K&R style -\begin_inset LatexCommand \index{K\&R style} +\size footnotesize +IC_RIGHT() IC_RESULT() \end_inset + + +\begin_inset Text - function declarations are NOT allowed. -\begin_deeper -\layout Verse - +\layout Standard -\family typewriter -foo(i,j) /* this old style of function declarations */ -\newline -int i,j; /* are valid in ANSI but not valid in SDCC */ -\newline -{ -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -... - -\newline -} -\end_deeper -\layout Itemize -Most enhancements in C99 are not supported, f.e.: -\begin_deeper -\layout Verse +\size footnotesize +Assignment +\end_inset + + +\begin_inset Text +\layout Standard -\family typewriter -\series bold -inline -\begin_inset LatexCommand \index{inline (not supported)} +\size footnotesize +IC_RESULT = IC_RIGHT; \end_inset + + + + +\begin_inset Text +\layout Standard -\series default - int increment (int a) { return a+1; } /* is invalid in SDCC although allowed - in C99. - An empty define -\emph on -#define inline -\emph default - can be used as a work around */ -\newline - -\newline -for ( -\series bold -int -\series default - i=0; i<10; i++) /* is invalid in SDCC although allowed in C99 */ -\end_deeper -\layout Itemize -Certain words that are valid identifiers in the standard may be reserved - words in SDCC unless the -\series bold -- -\begin_inset ERT -status Collapsed +\size footnotesize +IFX +\end_inset + + +\begin_inset Text \layout Standard -\backslash -/ -\end_inset - --std-c89 -\begin_inset LatexCommand \index{-\/-std-c89} +\size footnotesize +IC_COND IC_TRUE IC_LABEL \end_inset - - or - -\begin_inset ERT -status Collapsed + + +\begin_inset Text \layout Standard -\backslash -/ + +\size footnotesize +Conditional jump. + If true label is present then jump to true label if condition is true else + jump to false label if condition is false \end_inset + + +\begin_inset Text + +\layout Standard --std-c99 -\begin_inset LatexCommand \index{-\/-std-c99} +\size footnotesize +if (IC_COND) goto IC_TRUE; +\newline +\SpecialChar ~ +\SpecialChar ~ +Or +\newline +If (!IC_COND) goto IC_FALSE; \end_inset + + + + +\begin_inset Text +\layout Standard -\series default - command line options are used. - These may include (depending on the selected processor): 'at', 'banked', - 'bit', 'code', 'critical', 'data', 'eeprom', 'far', 'flash', 'idata', 'interrup -t', 'near', 'nonbanked', 'pdata', 'reentrant', 'sbit', 'sfr', 'shadowregs', - 'sram', 'using', 'wparam', 'xdata', '_overlay', '_asm', '_endasm', and - '_naked'. - Compliant equivalents of these keywords are always available in a form - that begin with two underscores -\begin_inset LatexCommand \index{\_\_ (prefix for extended keywords)} +\size footnotesize +ADDRESS_OF \end_inset + + +\begin_inset Text -, f.e. - '__data' instead of 'data'. -\layout Section +\layout Standard -Cyclomatic Complexity -\begin_inset LatexCommand \index{Cyclomatic complexity} +\size footnotesize +IC_LEFT() IC_RESULT() \end_inset - + + +\begin_inset Text \layout Standard -Cyclomatic complexity of a function is defined as the number of independent - paths the program can take during execution of the function. - This is an important number since it defines the number test cases you - have to generate to validate the function. - The accepted industry standard for complexity number is 10, if the cyclomatic - complexity reported by SDCC exceeds 10 you should think about simplification - of the function logic. - Note that the complexity level is not related to the number of lines of - code in a function. - Large functions can have low complexity, and small functions can have large - complexity levels. - -\newline -\newline -SDCC uses the following formula to compute the complexity: -\newline +\size footnotesize +Address of +\end_inset + + +\begin_inset Text \layout Standard -complexity = (number of edges in control flow graph) - (number of nodes - in control flow graph) + 2; -\newline -\newline -Having said that the industry standard is 10, you should be aware that in - some cases it be may unavoidable to have a complexity level of less than - 10. - For example if you have switch statement with more than 10 case labels, - each case label adds one to the complexity level. - The complexity level is by no means an absolute measure of the algorithmic - complexity of the function, it does however provide a good starting point - for which functions you might look at for further optimization. -\layout Section +\size footnotesize +IC_RESULT = &IC_LEFT(); +\end_inset + + + + +\begin_inset Text -Retargetting for other Processors \layout Standard -The issues for retargetting the compiler are far too numerous to be covered - by this document. - What follows is a brief description of each of the seven phases of the - compiler and its MCU dependency. -\layout Itemize - -Parsing the source and building the annotated parse tree. - This phase is largely MCU independent (except for the language extensions). - Syntax & semantic checks are also done in this phase, along with some initial - optimizations like back patching labels and the pattern matching optimizations - like bit-rotation etc. -\layout Itemize -The second phase involves generating an intermediate code which can be easy - manipulated during the later phases. - This phase is entirely MCU independent. - The intermediate code generation assumes the target machine has unlimited - number of registers, and designates them with the name iTemp. - The compiler can be made to dump a human readable form of the code generated - by using the - -\begin_inset ERT -status Collapsed +\size footnotesize +JUMPTABLE +\end_inset + + +\begin_inset Text \layout Standard -\backslash -/ -\end_inset --dumpraw option. -\layout Itemize +\size footnotesize +IC_JTCOND IC_JTLABELS +\end_inset + + +\begin_inset Text -This phase does the bulk of the standard optimizations and is also MCU independe -nt. - This phase can be broken down into several sub-phases: -\newline +\layout Standard -\newline -Break down intermediate code (iCode) into basic blocks. -\newline -Do control flow & data flow analysis on the basic blocks. -\newline -Do local common subexpression elimination, then global subexpression elimination -\newline -Dead code elimination -\newline -Loop optimizations -\newline -If loop optimizations caused any changes then do 'global subexpression eliminati -on' and 'dead code elimination' again. -\layout Itemize -This phase determines the live-ranges; by live range I mean those iTemp - variables defined by the compiler that still survive after all the optimization -s. - Live range analysis -\begin_inset LatexCommand \index{Live range analysis} +\size footnotesize +Jump to list of labels depending on the value of JTCOND +\end_inset + + +\begin_inset Text -\end_inset +\layout Standard - is essential for register allocation, since these computation determines - which of these iTemps will be assigned to registers, and for how long. -\layout Itemize -Phase five is register allocation. - There are two parts to this process. -\newline +\size footnotesize +Switch statement +\end_inset + + + + +\begin_inset Text -\newline -The first part I call 'register packing' (for lack of a better term). - In this case several MCU specific expression folding is done to reduce - register pressure. -\newline +\layout Standard -\newline -The second part is more MCU independent and deals with allocating registers - to the remaining live ranges. - A lot of MCU specific code does creep into this phase because of the limited - number of index registers available in the 8051. -\layout Itemize -The Code generation phase is (unhappily), entirely MCU dependent and very - little (if any at all) of this code can be reused for other MCU. - However the scheme for allocating a homogenized assembler operand for each - iCode operand may be reused. -\layout Itemize +\size footnotesize +CAST +\end_inset + + +\begin_inset Text -As mentioned in the optimization section the peep-hole optimizer is rule - based system, which can reprogrammed for other MCUs. -\layout Chapter +\layout Standard -Compiler internals -\begin_inset LatexCommand \index{Compiler internals} +\size footnotesize +IC_RIGHT() IC_LEFT() IC_RESULT() \end_inset + + +\begin_inset Text +\layout Standard -\layout Section -The anatomy of the compiler -\begin_inset LatexCommand \label{sub:The-anatomy-of} +\size footnotesize +Cast types +\end_inset + + +\begin_inset Text + +\layout Standard + +\size footnotesize +IC_RESULT = (typeof IC_LEFT) IC_RIGHT; \end_inset + + + + +\begin_inset Text + +\layout Standard +\size footnotesize +SEND +\end_inset + + +\begin_inset Text + \layout Standard -\shape italic -This is an excerpt from an article published in Circuit Cellar Magazine - in -\series bold -August 2000 -\series default -. - It's a little outdated (the compiler is much more efficient now and user/develo -per friendly), but pretty well exposes the guts of it all. -\shape default +\size footnotesize +IC_LEFT() +\end_inset + + +\begin_inset Text + +\layout Standard -\newline +\size footnotesize +This is used for passing parameters in registers; \newline -The current version of SDCC can generate code for Intel 8051 and Z80 MCU. - It is fairly easy to retarget for other 8-bit MCU. - Here we take a look at some of the internals of the compiler. - -\layout Paragraph* +move IC_LEFT to the next available parameter register. +\end_inset + + +\begin_inset Text + +\layout Standard -Parsing -\begin_inset LatexCommand \index{Parsing} +\size footnotesize +None \end_inset + + + + +\begin_inset Text - \layout Standard -Parsing the input source file and creating an AST (Annotated Syntax Tree -\begin_inset LatexCommand \index{Annotated syntax tree} +\size footnotesize +RECV \end_inset + + +\begin_inset Text -). - This phase also involves propagating types (annotating each node of the - parse tree with type information) and semantic analysis. - There are some MCU specific parsing rules. - For example the storage classes, the extended storage classes are MCU specific - while there may be a xdata storage class for 8051 there is no such storage - class for z80 or Atmel AVR. - SDCC allows MCU specific storage class extensions, i.e. - xdata will be treated as a storage class specifier when parsing 8051 C - code but will be treated as a C identifier when parsing z80 or ATMEL AVR - C code. -\layout Paragraph* +\layout Standard -Generating iCode -\begin_inset LatexCommand \index{iCode} +\size footnotesize +IC_RESULT() \end_inset - + + +\begin_inset Text \layout Standard -Intermediate code generation. - In this phase the AST is broken down into three-operand form (iCode). - These three operand forms are represented as doubly linked lists. - ICode is the term given to the intermediate form generated by the compiler. - ICode example section shows some examples of iCode generated for some simple - C source functions. -\layout Paragraph* - -Optimizations -\begin_inset LatexCommand \index{Optimizations} +\size footnotesize +This is used for receiving parameters passed in registers; +\newline +Move the values in the next parameter register to IC_RESULT \end_inset + + +\begin_inset Text -. \layout Standard -Bulk of the target independent optimizations is performed in this phase. - The optimizations include constant propagation, common sub-expression eliminati -on, loop invariant code movement, strength reduction of loop induction variables - and dead-code elimination. -\layout Paragraph* - -Live range analysis -\begin_inset LatexCommand \index{Live range analysis} +\size footnotesize +None \end_inset - + + + + +\begin_inset Text \layout Standard -During intermediate code generation phase, the compiler assumes the target - machine has infinite number of registers and generates a lot of temporary - variables. - The live range computation determines the lifetime of each of these compiler-ge -nerated temporaries. - A picture speaks a thousand words. - ICode example sections show the live range annotations for each of the - operand. - It is important to note here, each iCode is assigned a number in the order - of its execution in the function. - The live ranges are computed in terms of these numbers. - The from number is the number of the iCode which first defines the operand - and the to number signifies the iCode which uses this operand last. -\layout Paragraph* -Register Allocation -\begin_inset LatexCommand \index{Register allocation} +\shape slanted +\size footnotesize +(some more have been added) +\end_inset + + +\begin_inset Text + +\layout Standard \end_inset + + +\begin_inset Text + +\layout Standard +\end_inset + + +\begin_inset Text \layout Standard -The register allocation determines the type and number of registers needed - by each operand. - In most MCUs only a few registers can be used for indirect addressing. - In case of 8051 for example the registers R0 & R1 can be used to indirectly - address the internal ram and DPTR to indirectly address the external ram. - The compiler will try to allocate the appropriate register to pointer variables - if it can. - ICode example section shows the operands annotated with the registers assigned - to them. - The compiler will try to keep operands in registers as much as possible; - there are several schemes the compiler uses to do achieve this. - When the compiler runs out of registers the compiler will check to see - if there are any live operands which is not used or defined in the current - basic block being processed, if there are any found then it will push that - operand and use the registers in this block, the operand will then be popped - at the end of the basic block. + +\shape slanted +\size footnotesize +see f.e. -\layout Standard +\family typewriter +gen51Code() +\family default + in +\family typewriter +src/mcs51/gen.c +\end_inset + + + + +\end_inset -There are other MCU specific considerations in this phase. - Some MCUs have an accumulator; very short-lived operands could be assigned - to the accumulator instead of a general-purpose register. -\layout Paragraph* -Code generation \layout Standard -Figure II gives a table of iCode operations supported by the compiler. - The code generation involves translating these operations into corresponding - assembly code for the processor. - This sounds overly simple but that is the essence of code generation. - Some of the iCode operations are generated on a MCU specific manner for - example, the z80 port does not use registers to pass parameters so the - SEND and RECV iCode operations will not be generated, and it also does - not support JUMPTABLES. - -\newline -\series bold -\shape italic -\color red - -\layout Comment +\begin_inset Note +collapsed true + +\layout Standard In the original article Figure II was announced to be downloadable on \shape italic Circuit Cellar \shape default 's web site. - Unfortunately it never seemed to have shown up there, so: where is Figure - II? + ftp://ftp.circuitcellar.com/pub/Circuit_Cellar/2000/121/dutta.ZIP +\end_inset + + \layout Paragraph* ICode Example