Browse Source

[kservice] 优化RT_PRINTF_LONGLONG,减少重复代码

Meco Man 3 years ago
parent
commit
6a863ef65c
2 changed files with 16 additions and 23 deletions
  1. 5 5
      src/Kconfig
  2. 11 18
      src/kservice.c

+ 5 - 5
src/Kconfig

@@ -144,7 +144,11 @@ config RT_USING_ASM_MEMSET
     default n
 
 config RT_USING_TINY_FFS
-    bool "Enable kservice to use tiny ffs"
+    bool "Enable kservice to use tiny finding first bit set method"
+    default n
+
+config RT_PRINTF_LONGLONG
+    bool "Enable rt_xprintf functions to support long long format"
     default n
 
 endmenu
@@ -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

+ 11 - 18
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)
 {