📄 lpc2000_dbg_printf.lst
字号:
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 + -