Browse Source

Merge pull request #5310 from mysterywolf/printf2

[kservice] 优化RT_PRINTF_LONGLONG,减少重复代码
Bernard Xiong 3 years ago
parent
commit
9c78680f36
2 changed files with 124 additions and 142 deletions
  1. 111 111
      src/Kconfig
  2. 13 31
      src/kservice.c

+ 111 - 111
src/Kconfig

@@ -115,37 +115,40 @@ config RT_USING_TIMER_SOFT
         thread.
 
 if RT_USING_TIMER_SOFT
-config RT_TIMER_THREAD_PRIO
-    int "The priority level value of timer thread"
-    default 4
-
-config RT_TIMER_THREAD_STACK_SIZE
-    int "The stack size of timer thread"
-    default 512
+    config RT_TIMER_THREAD_PRIO
+        int "The priority level value of timer thread"
+        default 4
 
+    config RT_TIMER_THREAD_STACK_SIZE
+        int "The stack size of timer thread"
+        default 512
 endif
 
 menu "kservice optimization"
 
-config RT_KSERVICE_USING_STDLIB
-    bool "Enable kservice to use standard C library"
-    default n
+    config RT_KSERVICE_USING_STDLIB
+        bool "Enable kservice to use standard C library"
+        default n
 
-config RT_KSERVICE_USING_TINY_SIZE
-    bool "Enable kservice to use tiny size"
-    default n
+    config RT_KSERVICE_USING_TINY_SIZE
+        bool "Enable kservice to use tiny size"
+        default n
 
-config RT_USING_ASM_MEMCPY
-    bool
-    default n
+    config RT_USING_ASM_MEMCPY
+        bool
+        default n
 
-config RT_USING_ASM_MEMSET
-    bool
-    default n
+    config RT_USING_ASM_MEMSET
+        bool
+        default n
 
-config RT_USING_TINY_FFS
-    bool "Enable kservice to use tiny ffs"
-    default n
+    config RT_USING_TINY_FFS
+        bool "Enable kservice to use tiny finding first bit set method"
+        default n
+
+    config RT_PRINTF_LONGLONG
+        bool "Enable rt_printf-family functions to support long long format"
+        default n
 
 endmenu
 
@@ -155,121 +158,122 @@ menuconfig RT_DEBUG
 
 if RT_DEBUG
 
-config RT_DEBUG_COLOR
-    bool "Enable color debugging log"
-    default n
+    config RT_DEBUG_COLOR
+        bool "Enable color debugging log"
+        default n
 
-config RT_DEBUG_INIT_CONFIG
-    bool "Enable debugging of components initialization"
-    default n
+    config RT_DEBUG_INIT_CONFIG
+        bool "Enable debugging of components initialization"
+        default n
 
-config RT_DEBUG_INIT
-    int
-    default 1 if RT_DEBUG_INIT_CONFIG
+    config RT_DEBUG_INIT
+        int
+        default 1 if RT_DEBUG_INIT_CONFIG
 
-config RT_DEBUG_THREAD_CONFIG
-    bool "Enable debugging of Thread State Changes"
-    default n
+    config RT_DEBUG_THREAD_CONFIG
+        bool "Enable debugging of Thread State Changes"
+        default n
 
-config RT_DEBUG_THREAD
-    int
-    default 1 if RT_DEBUG_THREAD_CONFIG
+    config RT_DEBUG_THREAD
+        int
+        default 1 if RT_DEBUG_THREAD_CONFIG
 
-config RT_DEBUG_SCHEDULER_CONFIG
-    bool "Enable debugging of Scheduler"
-    default n
+    config RT_DEBUG_SCHEDULER_CONFIG
+        bool "Enable debugging of Scheduler"
+        default n
 
-config RT_DEBUG_SCHEDULER
-    int
-    default 1 if RT_DEBUG_SCHEDULER_CONFIG
+    config RT_DEBUG_SCHEDULER
+        int
+        default 1 if RT_DEBUG_SCHEDULER_CONFIG
 
-config RT_DEBUG_IPC_CONFIG
-    bool "Enable debugging of IPC"
-    default n
+    config RT_DEBUG_IPC_CONFIG
+        bool "Enable debugging of IPC"
+        default n
 
-config RT_DEBUG_IPC
-    int
-    default 1 if RT_DEBUG_IPC_CONFIG
+    config RT_DEBUG_IPC
+        int
+        default 1 if RT_DEBUG_IPC_CONFIG
 
-config RT_DEBUG_TIMER_CONFIG
-    bool "Enable debugging of Timer"
-    default n
+    config RT_DEBUG_TIMER_CONFIG
+        bool "Enable debugging of Timer"
+        default n
 
-config RT_DEBUG_TIMER
-    int
-    default 1 if RT_DEBUG_TIMER_CONFIG
+    config RT_DEBUG_TIMER
+        int
+        default 1 if RT_DEBUG_TIMER_CONFIG
 
-config RT_DEBUG_IRQ_CONFIG
-    bool "Enable debugging of IRQ(Interrupt Request)"
-    default n
+    config RT_DEBUG_IRQ_CONFIG
+        bool "Enable debugging of IRQ(Interrupt Request)"
+        default n
 
-config RT_DEBUG_IRQ
-    int
-    default 1 if RT_DEBUG_IRQ_CONFIG
+    config RT_DEBUG_IRQ
+        int
+        default 1 if RT_DEBUG_IRQ_CONFIG
 
-config RT_DEBUG_MEM_CONFIG
-    bool "Enable debugging of Small Memory Algorithm"
-    default n
+    config RT_DEBUG_MEM_CONFIG
+        bool "Enable debugging of Small Memory Algorithm"
+        default n
 
-config RT_DEBUG_MEM
-    int
-    default 1 if RT_DEBUG_MEM_CONFIG
+    config RT_DEBUG_MEM
+        int
+        default 1 if RT_DEBUG_MEM_CONFIG
 
-config RT_DEBUG_SLAB_CONFIG
-    bool "Enable debugging of SLAB Memory Algorithm"
-    default n
+    config RT_DEBUG_SLAB_CONFIG
+        bool "Enable debugging of SLAB Memory Algorithm"
+        default n
 
-config RT_DEBUG_SLAB
-    int
-    default 1 if RT_DEBUG_SLAB_CONFIG
+    config RT_DEBUG_SLAB
+        int
+        default 1 if RT_DEBUG_SLAB_CONFIG
 
-config RT_DEBUG_MEMHEAP_CONFIG
-    bool "Enable debugging of Memory Heap Algorithm"
-    default n
+    config RT_DEBUG_MEMHEAP_CONFIG
+        bool "Enable debugging of Memory Heap Algorithm"
+        default n
 
-config RT_DEBUG_MEMHEAP
-    int
-    default 1 if RT_DEBUG_MEMHEAP_CONFIG
+    config RT_DEBUG_MEMHEAP
+        int
+        default 1 if RT_DEBUG_MEMHEAP_CONFIG
 
-config RT_DEBUG_MODULE_CONFIG
-    bool "Enable debugging of Application Module"
-    default n
+    config RT_DEBUG_MODULE_CONFIG
+        bool "Enable debugging of Application Module"
+        default n
 
-config RT_DEBUG_MODULE
-    int
-    default 1 if RT_DEBUG_MODULE_CONFIG
+    config RT_DEBUG_MODULE
+        int
+        default 1 if RT_DEBUG_MODULE_CONFIG
 
 endif
 
 menu "Inter-Thread communication"
 
-config RT_USING_SEMAPHORE
-    bool "Enable semaphore"
-    default y
+    config RT_USING_SEMAPHORE
+        bool "Enable semaphore"
+        default y
 
-config RT_USING_MUTEX
-    bool "Enable mutex"
-    default y
+    config RT_USING_MUTEX
+        bool "Enable mutex"
+        default y
 
-config RT_USING_EVENT
-    bool "Enable event flag"
-    default y
+    config RT_USING_EVENT
+        bool "Enable event flag"
+        default y
 
-config RT_USING_MAILBOX
-    bool "Enable mailbox"
-    default y
+    config RT_USING_MAILBOX
+        bool "Enable mailbox"
+        default y
 
-config RT_USING_MESSAGEQUEUE
-    bool "Enable message queue"
-    default y
+    config RT_USING_MESSAGEQUEUE
+        bool "Enable message queue"
+        default y
+
+    config RT_USING_SIGNALS
+        bool "Enable signals"
+        select RT_USING_MEMPOOL
+        default n
+        help
+            A signal is an asynchronous notification sent to a specific thread
+            in order to notify it of an event that occurred.
 
-config RT_USING_SIGNALS
-    bool "Enable signals"
-    select RT_USING_MEMPOOL
-    default n
-    help
-        A signal is an asynchronous notification sent to a specific thread
-        in order to notify it of an event that occurred.
 endmenu
 
 menu "Memory Management"
@@ -375,10 +379,6 @@ menu "Kernel Device Object"
         config RT_CONSOLE_DEVICE_NAME
             string "the device name for console"
             default "uart"
-
-        config RT_PRINTF_LONGLONG
-            bool "rt_kprintf support long long"
-            default n
     endif
 
 endmenu

+ 13 - 31
src/kservice.c

@@ -593,7 +593,6 @@ RTM_EXPORT(rt_show_version);
 /* private function */
 #define _ISDIGIT(c)  ((unsigned)((c) - '0') < 10)
 
-#ifdef RT_PRINTF_LONGLONG
 /**
  * This function will duplicate a string.
  *
@@ -603,44 +602,38 @@ RTM_EXPORT(rt_show_version);
  *
  * @return the duplicated string pointer.
  */
+#ifdef RT_PRINTF_LONGLONG
 rt_inline int divide(long long *n, int base)
+#else
+rt_inline int divide(long *n, int base)
+#endif /* RT_PRINTF_LONGLONG */
 {
     int res;
 
     /* optimized for processor which does not support divide instructions. */
     if (base == 10)
     {
+#ifdef RT_PRINTF_LONGLONG
         res = (int)(((unsigned long long)*n) % 10U);
         *n = (long long)(((unsigned long long)*n) / 10U);
-    }
-    else
-    {
-        res = (int)(((unsigned long long)*n) % 16U);
-        *n = (long long)(((unsigned long long)*n) / 16U);
-    }
-
-    return res;
-}
 #else
-rt_inline int divide(long *n, int base)
-{
-    int res;
-
-    /* optimized for processor which does not support divide instructions. */
-    if (base == 10)
-    {
         res = (int)(((unsigned long)*n) % 10U);
         *n = (long)(((unsigned long)*n) / 10U);
+#endif
     }
     else
     {
+#ifdef RT_PRINTF_LONGLONG
+        res = (int)(((unsigned long long)*n) % 16U);
+        *n = (long long)(((unsigned long long)*n) / 16U);
+#else
         res = (int)(((unsigned long)*n) % 16U);
         *n = (long)(((unsigned long)*n) / 16U);
+#endif
     }
 
     return res;
 }
-#endif /* RT_PRINTF_LONGLONG */
 
 rt_inline int skip_atoi(const char **s)
 {
@@ -659,7 +652,6 @@ rt_inline int skip_atoi(const char **s)
 #define SPECIAL     (1 << 5)    /* 0x */
 #define LARGE       (1 << 6)    /* use 'ABCDEF' instead of 'abcdef' */
 
-#ifdef RT_PRINTF_PRECISION
 static char *print_number(char *buf,
                           char *end,
 #ifdef RT_PRINTF_LONGLONG
@@ -669,20 +661,10 @@ static char *print_number(char *buf,
 #endif /* RT_PRINTF_LONGLONG */
                           int   base,
                           int   s,
+#ifdef RT_PRINTF_PRECISION
                           int   precision,
-                          int   type)
-#else
-static char *print_number(char *buf,
-                          char *end,
-#ifdef RT_PRINTF_LONGLONG
-                          long long  num,
-#else
-                          long  num,
-#endif /* RT_PRINTF_LONGLONG */
-                          int   base,
-                          int   s,
-                          int   type)
 #endif /* RT_PRINTF_PRECISION */
+                          int   type)
 {
     char c, sign;
 #ifdef RT_PRINTF_LONGLONG