⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lpc2000_dbg_printf.lst

📁 Philips LPC2138 Demo Application with Keil C
💻 LST
📖 第 1 页 / 共 3 页
字号:
ARM COMPILER V2.42,  lpc2000_dbg_printf                                                    27/03/06  10:45:50  PAGE 1   


ARM COMPILER V2.42, COMPILATION OF MODULE lpc2000_dbg_printf
OBJECT MODULE PLACED IN .\obj\lpc2000_dbg_printf.obj
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe src\lpc2000_dbg_printf.c THUMB DEBUG PRINT(.\LST\LPC2000_DBG_PRINTF.LST) TAB
                    -S(4) OBJECT(.\obj\lpc2000_dbg_printf.obj) 

stmt  level    source

    1          //#########################################################################
    2          // printf.c
    3          //
    4          // *** printf() based on sprintf() from gcctest9.c Volker Oth
    5          //
    6          // *** Changes made by Holger Klabunde
    7          // Now takes format strings from FLASH (was into RAM ! before)
    8          // Fixed bug for %i, %I. u_val was used before it had the right value
    9          // Added %d, %D (is same as %i, %I)
   10          // Support for long variables %li, %ld, %Lu, %LX ....
   11          // %x, %X now gives upper case hex characters A,B,C,D,E,F
   12          // Output can be redirected in a single function: myputchar()
   13          // Make printf() smaller by commenting out a few #defines
   14          // Added some SPACE and ZERO padding %02x or % 3u up to 9 characters
   15          // 
   16          // Todo:
   17          // %f, %F for floating point numbers
   18          //
   19          // *** Changes made by Martin Thomas for the efsl debug output:
   20          // - removed AVR "progmem"
   21          // - added function pointer for "putchar"
   22          // - devopen function
   23          //
   24          //#########################################################################
   25          
   26          #include <stdarg.h>
   27          #include <string.h>
   28          #include "lpc2000_dbg_printf.h"
   29          
   30          #define SCRATCH 12  //32Bits go up to 4GB + 1 Byte for \0
   31          
   32          //Spare some program space by making a comment of all not used format flag lines
   33          #define USE_LONG    // %lx, %Lu and so on, else only 16 bit integer is allowed
   34          //#define USE_OCTAL // %o, %O Octal output. Who needs this ?
   35          #define USE_STRING      // %s, %S Strings as parameters
   36          #define USE_CHAR    // %c, %C Chars as parameters
   37          #define USE_INTEGER // %i, %I Remove this format flag. %d, %D does the same
   38          #define USE_HEX     // %x, %X Hexadezimal output
   39          #define USE_UPPERHEX    // %x, %X outputs A,B,C... else a,b,c...
   40          #ifndef USE_HEX
                #undef USE_UPPERHEX    // ;)
               #endif
   43          #define USE_UPPER   // uncommenting this removes %C,%D,%I,%O,%S,%U,%X and %L..
   44                                  // only lowercase format flags are used
   45          #define PADDING         //SPACE and ZERO padding
   46          
   47          
   48          static int (*putcharfunc)(int c);
   49          
   50          void lpc2000_debug_devopen( int(*put)(int) )
   51          {
   52   1         putcharfunc = put;
   53   1      }
   54          
   55          static void myputchar(unsigned char c)
   56          {
   57   1          if(c == '\n') putcharfunc('\r');
   58   1          putcharfunc(c);
ARM COMPILER V2.42,  lpc2000_dbg_printf                                                    27/03/06  10:45:50  PAGE 2   

   59   1      }
   60          
   61          void lpc2000_debug_printf(char const *format, ...)
   62          {
   63   1        unsigned char scratch[SCRATCH];
   64   1        unsigned char format_flag;
   65   1        unsigned short base;
   66   1        unsigned char *ptr;
   67   1        unsigned char issigned=0;
   68   1        va_list ap;
   69   1      
   70   1      #ifdef USE_LONG
   71   1        unsigned char islong=0;
   72   1        unsigned long u_val=0;
   73   1        long s_val=0;
   74   1      #else
                 unsigned int u_val=0;
                 int s_val=0;
               #endif
   78   1      
   79   1        unsigned char fill;
   80   1        unsigned char width;
   81   1      
   82   1        va_start (ap, format);
   83   1        for (;;){
   84   2          while ((format_flag = *(format++)) != '%'){      // Until '%' or '\0' 
   85   3            if (!format_flag){va_end (ap); return;}
   86   3            myputchar(format_flag);
   87   3          }
   88   2      
   89   2          issigned=0; //default unsigned
   90   2          base = 10;
   91   2      
   92   2          format_flag = *format++; //get char after '%'
   93   2      
   94   2      #ifdef PADDING
   95   2          width=0; //no formatting
   96   2          fill=0;  //no formatting
   97   2          if(format_flag=='0' || format_flag==' ') //SPACE or ZERO padding  ?
   98   2           {
   99   3            fill=format_flag;
  100   3            format_flag = *format++; //get char after padding char
  101   3            if(format_flag>='0' && format_flag<='9')
  102   3             {
  103   4              width=format_flag-'0';
  104   4              format_flag = *format++; //get char after width char
  105   4             }
  106   3           }
  107   2      #endif
  108   2      
  109   2      #ifdef USE_LONG
  110   2          islong=0; //default int value
  111   2      #ifdef USE_UPPER
  112   2          if(format_flag=='l' || format_flag=='L') //Long value 
  113   2      #else
                   if(format_flag=='l') //Long value 
               #endif
  116   2           {
  117   3            islong=1;
  118   3            format_flag = *format++; //get char after 'l' or 'L'
  119   3           }
  120   2      #endif
  121   2      
  122   2          switch (format_flag)
  123   2          {
  124   3      #ifdef USE_CHAR
ARM COMPILER V2.42,  lpc2000_dbg_printf                                                    27/03/06  10:45:50  PAGE 3   

  125   3          case 'c':
  126   3      #ifdef USE_UPPER
  127   3          case 'C':
  128   3      #endif
  129   3            format_flag = va_arg(ap,int);
  130   3            // no break -> run into default
  131   3      #endif
  132   3      
  133   3          default:
  134   3            myputchar(format_flag);
  135   3            continue;
  136   3      
  137   3      #ifdef USE_STRING
  138   3      #ifdef USE_UPPER
  139   3          case 'S':
  140   3      #endif
  141   3          case 's':
  142   3            ptr = (unsigned char*)va_arg(ap,char *);
  143   3            while(*ptr) { myputchar(*ptr); ptr++; }
  144   3            continue;
  145   3      #endif
  146   3      
  147   3      #ifdef USE_OCTAL
                   case 'o':
               #ifdef USE_UPPER
                   case 'O':
               #endif
                     base = 8;
                     myputchar('0');
                     goto CONVERSION_LOOP;
               #endif
  156   3      
  157   3      #ifdef USE_INTEGER //don't use %i, is same as %d
  158   3          case 'i':
  159   3      #ifdef USE_UPPER
  160   3          case 'I':
  161   3      #endif
  162   3      #endif
  163   3          case 'd':
  164   3      #ifdef USE_UPPER
  165   3          case 'D':
  166   3      #endif
  167   3            issigned=1;
  168   3            // no break -> run into next case
  169   3          case 'u':
  170   3      #ifdef USE_UPPER
  171   3          case 'U':
  172   3      #endif
  173   3      
  174   3      //don't insert some case below this if USE_HEX is undefined !
  175   3      //or put       goto CONVERSION_LOOP;  before next case.
  176   3      #ifdef USE_HEX
  177   3            goto CONVERSION_LOOP;
  178   3          case 'x':
  179   3      #ifdef USE_UPPER
  180   3          case 'X':
  181   3      #endif
  182   3            base = 16;
  183   3      #endif
  184   3      
  185   3          CONVERSION_LOOP:
  186   3      
  187   3            if(issigned) //Signed types
  188   3             {
  189   4      #ifdef USE_LONG
  190   4              if(islong) { s_val = va_arg(ap,long); }
ARM COMPILER V2.42,  lpc2000_dbg_printf                                                    27/03/06  10:45:50  PAGE 4   

  191   4              else { s_val = va_arg(ap,int); }
  192   4      #else
                       s_val = va_arg(ap,int);
               #endif
  195   4      
  196   4              if(s_val < 0) //Value negativ ?
  197   4               {
  198   5                s_val = - s_val; //Make it positiv
  199   5                myputchar('-');    //Output sign
  200   5               }
  201   4      
  202   4              u_val = (unsigned long)s_val;
  203   4             }
  204   3            else //Unsigned types
  205   3             {
  206   4      #ifdef USE_LONG
  207   4              if(islong) { u_val = va_arg(ap,unsigned long); }
  208   4              else { u_val = va_arg(ap,unsigned int); }
  209   4      #else
                       u_val = va_arg(ap,unsigned int);
               #endif
  212   4             }
  213   3          
  214   3            ptr = scratch + SCRATCH;
  215   3            *--ptr = 0;
  216   3            do
  217   3             {
  218   4              char ch = u_val % base + '0';
  219   4      #ifdef USE_HEX
  220   4              if (ch > '9')
  221   4               {
  222   5                ch += 'a' - '9' - 1;
  223   5      #ifdef USE_UPPERHEX
  224   5                ch-=0x20;
  225   5      #endif
  226   5               }
  227   4      #endif          
  228   4              *--ptr = ch;
  229   4              u_val /= base;
  230   4      
  231   4      #ifdef PADDING
  232   4              if(width) width--; //calculate number of padding chars
  233   4      #endif
  234   4            } while (u_val);
  235   3      
  236   3      #ifdef PADDING
  237   3           while(width--) *--ptr = fill; //insert padding chars             

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -