SODebug.h
上传用户:joranyuan
上传日期:2022-06-23
资源大小:3306k
文件大小:3k
源码类别:

网络

开发平台:

Others

  1. #include <stdarg.h>
  2. //#include <stdio.h>
  3. //#define SCRATCH 16
  4. #define SCRATCH 64
  5. #define BUF_LEN 256
  6. char debugbuf[BUF_LEN];
  7. //init comm port (56K baud, mica2 only, use 19K baud for mica2dot, mica....) for debug
  8. // call this from startup routine
  9. void init_debug(){           
  10.   outp(0,UBRR0H); 
  11.   outp(15, UBRR0L);                              //set baud rate
  12.   outp((1<<U2X),UCSR0A);                         // Set UART double speed
  13.   outp(((1 << UCSZ1) | (1 << UCSZ0)) , UCSR0C);  // Set frame format: 8 data-bits, 1 stop-bit
  14.   inp(UDR0); 
  15.   outp((1 << TXEN) ,UCSR0B);   // Enable uart reciever and transmitter
  16.  }
  17. //init comm port (19K baud) for mica2dot for debug
  18. // call this from startup routine
  19. void init_debug_mica2dot(){
  20.     outp(0,UBRR0H);            // Set baudrate to 19.2 KBps
  21.     outp(12, UBRR0L);
  22.     outp(0,UCSR0A);            // Disable U2X and MPCM
  23.     outp(((1 << UCSZ1) | (1 << UCSZ0)) , UCSR0C);
  24.     inp(UDR0); 
  25.     outp((1 << TXEN) ,UCSR0B);
  26.  }
  27. // output a char to the uart void UARTPutChar(char c) {   if (c == 'n')     UARTPutChar('r');   loop_until_bit_is_set(UCSR0A, UDRE);   outb(UDR0,c); } void writedebug() {   int i = 0;
  28.   UARTPutChar('n');                //write a carriage return 1st             while (debugbuf[i] != 'n')      UARTPutChar(debugbuf[i++]); //    UARTPutChar('n');    } #define SPRINTF              //use this sprintf function
  29. #ifdef SPRINTF
  30. int sprintf(uint8_t *buf, const uint8_t *format, ...)
  31. /* simplified sprintf */
  32. {
  33.   uint8_t scratch[SCRATCH];
  34.   uint8_t format_flag;
  35.   uint16_t u_val=0, base;
  36.   uint8_t *ptr;
  37.   va_list ap;
  38.   bool b_ChkForNegInt = FALSE;
  39.   va_start (ap, format);
  40.   for (;;){
  41.     while ((format_flag = *format++) != '%'){      /* Until '%' or '' */
  42.       if (!format_flag){va_end (ap); return (0);}
  43.       *buf = format_flag; buf++; *buf=0;
  44.     }
  45.     b_ChkForNegInt = FALSE;
  46.     switch (format_flag = *format++){
  47.     case 'c':
  48.       format_flag = va_arg(ap,int);
  49.     default:
  50.       *buf = format_flag; buf++; *buf=0;
  51.       continue;
  52.     case 'S':
  53.     case 's':
  54.       ptr = va_arg(ap,char *);
  55.       strcat(buf, ptr);
  56.       continue;
  57.     case 'o':
  58.       base = 8;
  59.       *buf = '0'; buf++; *buf=0;
  60.       goto CONVERSION_LOOP;
  61.     case 'i':
  62.         b_ChkForNegInt = TRUE;
  63.    //     if (((int)u_val) < 0){
  64.    //     u_val = - u_val;
  65.    //     *buf = '-'; buf++; *buf=0;
  66.    //   }
  67.       /* no break -> run into next case */
  68.     case 'u':
  69.       base = 10;
  70.       goto CONVERSION_LOOP;
  71.     case 'x':
  72.       base = 16;
  73.     CONVERSION_LOOP:
  74.       u_val = va_arg(ap,int);
  75.       if (b_ChkForNegInt){
  76.         if (((int)u_val) < 0){
  77.           u_val = - u_val;
  78.           *buf = '-'; buf++; *buf=0;
  79.         }
  80.       }
  81.      
  82.       ptr = scratch + SCRATCH;
  83.       *--ptr = 0;
  84.       do {
  85.         char ch = u_val % base + '0';
  86.         if (ch > '9')
  87.           ch += 'a' - '9' - 1;
  88.         *--ptr = ch;
  89.         u_val /= base;
  90.       } while (u_val);
  91.       strcat(buf, ptr);
  92.       buf += strlen(ptr);
  93.     }
  94.   }
  95. }
  96. #endif
  97. #define SO_NO_DEBUG 0
  98. #define SO_DEBUG             //turn on debug output
  99. #ifdef SO_DEBUG #define SODbg(__x,__args...) {  char bStatus; if(__x != SO_NO_DEBUG){  
  100.       bStatus=bit_is_set(SREG,7);   cli();       sprintf(debugbuf,__args);
  101.       writedebug();   if (bStatus) sei();  }    
  102.     } #else
  103. #define SODbg(__x,__args...)
  104. #endif