Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
逆着光、寻觅
rt-thread
提交
feed84b2
R
rt-thread
项目概览
逆着光、寻觅
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
feed84b2
编写于
2月 20, 2023
作者:
Z
zhkag
提交者:
guo
2月 21, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix rt_kprint 64bit error
上级
1c2daeaf
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
182 addition
and
64 deletion
+182
-64
src/kservice.c
src/kservice.c
+182
-64
未找到文件。
src/kservice.c
浏览文件 @
feed84b2
...
...
@@ -41,6 +41,7 @@
/* use precision */
#define RT_PRINTF_PRECISION
#define RT_PRINTF_SPECIAL
/**
* @addtogroup KernelService
...
...
@@ -688,20 +689,20 @@ RTM_EXPORT(rt_show_version);
* @return the duplicated string pointer.
*/
#ifdef RT_KPRINTF_USING_LONGLONG
rt_inline
int
divide
(
long
long
*
n
,
int
base
)
rt_inline
int
divide
(
unsigned
long
long
*
n
,
int
base
)
#else
rt_inline
int
divide
(
long
*
n
,
int
base
)
rt_inline
int
divide
(
unsigned
long
*
n
,
int
base
)
#endif
/* RT_KPRINTF_USING_LONGLONG */
{
int
res
;
/* optimized for processor which does not support divide instructions. */
#ifdef RT_KPRINTF_USING_LONGLONG
res
=
(
int
)((
(
unsigned
long
long
)
*
n
)
%
base
);
*
n
=
(
long
long
)((
(
unsigned
long
long
)
*
n
)
/
base
);
res
=
(
int
)((
*
n
)
%
base
);
*
n
=
(
long
long
)((
*
n
)
/
base
);
#else
res
=
(
int
)((
(
unsigned
long
)
*
n
)
%
base
);
*
n
=
(
long
)((
(
unsigned
long
)
*
n
)
/
base
);
res
=
(
int
)((
*
n
)
%
base
);
*
n
=
(
long
)((
*
n
)
/
base
);
#endif
return
res
;
...
...
@@ -727,34 +728,38 @@ rt_inline int skip_atoi(const char **s)
static
char
*
print_number
(
char
*
buf
,
char
*
end
,
#ifdef RT_KPRINTF_USING_LONGLONG
long
long
num
,
unsigned
long
long
num
,
#else
long
num
,
unsigned
long
num
,
#endif
/* RT_KPRINTF_USING_LONGLONG */
int
base
,
int
qualifier
,
int
s
,
#ifdef RT_PRINTF_PRECISION
int
precision
,
#endif
/* RT_PRINTF_PRECISION */
int
type
)
{
char
c
,
sign
;
char
c
=
0
,
sign
=
0
;
#ifdef RT_KPRINTF_USING_LONGLONG
char
tmp
[
64
];
char
tmp
[
64
]
=
{
0
}
;
#else
char
tmp
[
32
];
char
tmp
[
32
]
=
{
0
}
;
#endif
/* RT_KPRINTF_USING_LONGLONG */
int
precision_bak
=
precision
;
const
char
*
digits
;
const
char
*
digits
=
RT_NULL
;
static
const
char
small_digits
[]
=
"0123456789abcdef"
;
static
const
char
large_digits
[]
=
"0123456789ABCDEF"
;
int
i
,
size
;
int
i
=
0
;
int
size
=
0
;
size
=
s
;
digits
=
(
type
&
LARGE
)
?
large_digits
:
small_digits
;
if
(
type
&
LEFT
)
{
type
&=
~
ZEROPAD
;
}
c
=
(
type
&
ZEROPAD
)
?
'0'
:
' '
;
...
...
@@ -762,30 +767,65 @@ static char *print_number(char *buf,
sign
=
0
;
if
(
type
&
SIGN
)
{
if
(
num
<
0
)
switch
(
qualifier
)
{
sign
=
'-'
;
num
=
-
num
;
case
'h'
:
if
((
rt_int16_t
)
num
<
0
)
{
sign
=
'-'
;
num
=
(
rt_uint16_t
)
-
num
;
}
break
;
case
'L'
:
case
'l'
:
if
((
long
)
num
<
0
)
{
sign
=
'-'
;
num
=
(
unsigned
long
)
-
num
;
}
break
;
case
0
:
default:
if
((
rt_int32_t
)
num
<
0
)
{
sign
=
'-'
;
num
=
(
rt_uint32_t
)
-
num
;
}
break
;
}
if
(
sign
!=
'-'
)
{
if
(
type
&
PLUS
)
{
sign
=
'+'
;
}
else
if
(
type
&
SPACE
)
{
sign
=
' '
;
}
}
else
if
(
type
&
PLUS
)
sign
=
'+'
;
else
if
(
type
&
SPACE
)
sign
=
' '
;
}
#ifdef RT_PRINTF_SPECIAL
if
(
type
&
SPECIAL
)
{
if
(
base
==
2
||
base
==
16
)
{
size
-=
2
;
}
else
if
(
base
==
8
)
{
size
--
;
}
}
#endif
/* RT_PRINTF_SPECIAL */
i
=
0
;
if
(
num
==
0
)
{
tmp
[
i
++
]
=
'0'
;
}
else
{
while
(
num
!=
0
)
...
...
@@ -794,7 +834,9 @@ static char *print_number(char *buf,
#ifdef RT_PRINTF_PRECISION
if
(
i
>
precision
)
{
precision
=
i
;
}
size
-=
precision
;
#else
size
-=
i
;
...
...
@@ -803,12 +845,17 @@ static char *print_number(char *buf,
if
(
!
(
type
&
(
ZEROPAD
|
LEFT
)))
{
if
((
sign
)
&&
(
size
>
0
))
{
size
--
;
}
while
(
size
--
>
0
)
{
if
(
buf
<
end
)
{
*
buf
=
' '
;
}
++
buf
;
}
}
...
...
@@ -844,7 +891,10 @@ static char *print_number(char *buf,
else
if
(
base
==
16
)
{
if
(
buf
<
end
)
{
*
buf
=
'0'
;
}
++
buf
;
if
(
buf
<
end
)
{
...
...
@@ -861,7 +911,10 @@ static char *print_number(char *buf,
while
(
size
--
>
0
)
{
if
(
buf
<
end
)
{
*
buf
=
c
;
}
++
buf
;
}
}
...
...
@@ -870,7 +923,10 @@ static char *print_number(char *buf,
while
(
i
<
precision
--
)
{
if
(
buf
<
end
)
{
*
buf
=
'0'
;
}
++
buf
;
}
#endif
/* RT_PRINTF_PRECISION */
...
...
@@ -879,14 +935,20 @@ static char *print_number(char *buf,
while
(
i
--
>
0
&&
(
precision_bak
!=
0
))
{
if
(
buf
<
end
)
{
*
buf
=
tmp
[
i
];
}
++
buf
;
}
while
(
size
--
>
0
)
{
if
(
buf
<
end
)
{
*
buf
=
' '
;
}
++
buf
;
}
...
...
@@ -909,21 +971,21 @@ static char *print_number(char *buf,
rt_weak
int
rt_vsnprintf
(
char
*
buf
,
rt_size_t
size
,
const
char
*
fmt
,
va_list
args
)
{
#ifdef RT_KPRINTF_USING_LONGLONG
unsigned
long
long
num
;
unsigned
long
long
num
=
0
;
#else
rt_uint32_t
num
;
unsigned
long
num
=
0
;
#endif
/* RT_KPRINTF_USING_LONGLONG */
int
i
,
len
;
char
*
str
,
*
end
,
c
;
const
char
*
s
;
int
i
=
0
,
len
=
0
;
char
*
str
=
RT_NULL
,
*
end
=
RT_NULL
,
c
=
0
;
const
char
*
s
=
RT_NULL
;
rt_uint8_t
base
;
/* the base of number */
rt_uint8_t
flags
;
/* flags to print number */
rt_uint8_t
qualifier
;
/* 'h', 'l', or 'L' for integer fields */
rt_int32_t
field_width
;
/* width of output field */
rt_uint8_t
base
=
0
;
/* the base of number */
rt_uint8_t
flags
=
0
;
/* flags to print number */
rt_uint8_t
qualifier
=
0
;
/* 'h', 'l', or 'L' for integer fields */
rt_int32_t
field_width
=
0
;
/* width of output field */
#ifdef RT_PRINTF_PRECISION
int
precision
;
/* min. # of digits for integers and max for a string */
int
precision
=
0
;
/* min. # of digits for integers and max for a string */
#endif
/* RT_PRINTF_PRECISION */
str
=
buf
;
...
...
@@ -941,7 +1003,10 @@ rt_weak int rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list arg
if
(
*
fmt
!=
'%'
)
{
if
(
str
<
end
)
{
*
str
=
*
fmt
;
}
++
str
;
continue
;
}
...
...
@@ -963,7 +1028,10 @@ rt_weak int rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list arg
/* get field width */
field_width
=
-
1
;
if
(
_ISDIGIT
(
*
fmt
))
field_width
=
skip_atoi
(
&
fmt
);
if
(
_ISDIGIT
(
*
fmt
))
{
field_width
=
skip_atoi
(
&
fmt
);
}
else
if
(
*
fmt
==
'*'
)
{
++
fmt
;
...
...
@@ -982,14 +1050,20 @@ rt_weak int rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list arg
if
(
*
fmt
==
'.'
)
{
++
fmt
;
if
(
_ISDIGIT
(
*
fmt
))
precision
=
skip_atoi
(
&
fmt
);
if
(
_ISDIGIT
(
*
fmt
))
{
precision
=
skip_atoi
(
&
fmt
);
}
else
if
(
*
fmt
==
'*'
)
{
++
fmt
;
/* it's the next argument */
precision
=
va_arg
(
args
,
int
);
}
if
(
precision
<
0
)
precision
=
0
;
if
(
precision
<
0
)
{
precision
=
0
;
}
}
#endif
/* RT_PRINTF_PRECISION */
/* get the conversion qualifier */
...
...
@@ -1028,7 +1102,10 @@ rt_weak int rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list arg
/* get character */
c
=
(
rt_uint8_t
)
va_arg
(
args
,
int
);
if
(
str
<
end
)
*
str
=
c
;
if
(
str
<
end
)
{
*
str
=
c
;
}
++
str
;
/* put width */
...
...
@@ -1041,11 +1118,17 @@ rt_weak int rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list arg
case
's'
:
s
=
va_arg
(
args
,
char
*
);
if
(
!
s
)
s
=
"(NULL)"
;
if
(
!
s
)
{
s
=
"(NULL)"
;
}
for
(
len
=
0
;
(
len
!=
field_width
)
&&
(
s
[
len
]
!=
'\0'
);
len
++
);
#ifdef RT_PRINTF_PRECISION
if
(
precision
>
0
&&
len
>
precision
)
len
=
precision
;
if
(
precision
>
0
&&
len
>
precision
)
{
len
=
precision
;
}
#endif
/* RT_PRINTF_PRECISION */
if
(
!
(
flags
&
LEFT
))
...
...
@@ -1075,21 +1158,28 @@ rt_weak int rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list arg
if
(
field_width
==
-
1
)
{
field_width
=
sizeof
(
void
*
)
<<
1
;
#ifdef RT_PRINTF_SPECIAL
field_width
+=
2
;
/* `0x` prefix */
flags
|=
SPECIAL
;
#endif
flags
|=
ZEROPAD
;
}
#ifdef RT_PRINTF_PRECISION
str
=
print_number
(
str
,
end
,
(
long
)
va_arg
(
args
,
void
*
),
16
,
field_width
,
precision
,
flags
);
(
unsigned
long
)
va_arg
(
args
,
void
*
),
16
,
qualifier
,
field_width
,
precision
,
flags
);
#else
str
=
print_number
(
str
,
end
,
(
long
)
va_arg
(
args
,
void
*
),
16
,
field_width
,
flags
);
#endif
/* RT_PRINTF_PRECISION */
(
unsigned
long
)
va_arg
(
args
,
void
*
),
16
,
qualifier
,
field_width
,
flags
);
#endif
continue
;
case
'%'
:
if
(
str
<
end
)
*
str
=
'%'
;
if
(
str
<
end
)
{
*
str
=
'%'
;
}
++
str
;
continue
;
...
...
@@ -1114,12 +1204,18 @@ rt_weak int rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list arg
break
;
default:
if
(
str
<
end
)
*
str
=
'%'
;
if
(
str
<
end
)
{
*
str
=
'%'
;
}
++
str
;
if
(
*
fmt
)
{
if
(
str
<
end
)
*
str
=
*
fmt
;
if
(
str
<
end
)
{
*
str
=
*
fmt
;
}
++
str
;
}
else
...
...
@@ -1130,35 +1226,42 @@ rt_weak int rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list arg
}
#ifdef RT_KPRINTF_USING_LONGLONG
if
(
qualifier
==
'L'
)
num
=
va_arg
(
args
,
long
long
);
if
(
qualifier
==
'L'
)
{
num
=
va_arg
(
args
,
unsigned
long
long
);
}
else
if
(
qualifier
==
'l'
)
#else
if
(
qualifier
==
'l'
)
#endif
/* RT_KPRINTF_USING_LONGLONG */
{
num
=
va_arg
(
args
,
rt_uint32_t
);
if
(
flags
&
SIGN
)
num
=
(
rt_int32_t
)
num
;
num
=
va_arg
(
args
,
unsigned
long
);
}
else
if
(
qualifier
==
'h'
)
{
num
=
(
rt_uint16_t
)
va_arg
(
args
,
int
);
if
(
flags
&
SIGN
)
num
=
(
rt_int16_t
)
num
;
num
=
(
rt_uint16_t
)
va_arg
(
args
,
rt_int32_t
);
if
(
flags
&
SIGN
)
{
num
=
(
rt_int16_t
)
num
;
}
}
else
{
num
=
va_arg
(
args
,
rt_uint32_t
);
if
(
flags
&
SIGN
)
num
=
(
rt_int32_t
)
num
;
num
=
(
rt_uint32_t
)
va_arg
(
args
,
unsigned
long
);
}
#ifdef RT_PRINTF_PRECISION
str
=
print_number
(
str
,
end
,
num
,
base
,
field_width
,
precision
,
flags
);
str
=
print_number
(
str
,
end
,
num
,
base
,
qualifier
,
field_width
,
precision
,
flags
);
#else
str
=
print_number
(
str
,
end
,
num
,
base
,
field_width
,
flags
);
#endif
/* RT_PRINTF_PRECISION */
str
=
print_number
(
str
,
end
,
num
,
base
,
qualifier
,
field_width
,
flags
);
#endif
}
if
(
size
>
0
)
{
if
(
str
<
end
)
*
str
=
'\0'
;
if
(
str
<
end
)
{
*
str
=
'\0'
;
}
else
{
end
[
-
1
]
=
'\0'
;
...
...
@@ -1185,7 +1288,7 @@ RTM_EXPORT(rt_vsnprintf);
*/
int
rt_snprintf
(
char
*
buf
,
rt_size_t
size
,
const
char
*
fmt
,
...)
{
rt_int32_t
n
;
rt_int32_t
n
=
0
;
va_list
args
;
va_start
(
args
,
fmt
);
...
...
@@ -1224,7 +1327,7 @@ RTM_EXPORT(rt_vsprintf);
*/
int
rt_sprintf
(
char
*
buf
,
const
char
*
format
,
...)
{
rt_int32_t
n
;
rt_int32_t
n
=
0
;
va_list
arg_ptr
;
va_start
(
arg_ptr
,
format
);
...
...
@@ -1325,7 +1428,10 @@ RTM_EXPORT(rt_hw_console_output);
*/
void
rt_kputs
(
const
char
*
str
)
{
if
(
!
str
)
return
;
if
(
!
str
)
{
return
;
}
#ifdef RT_USING_DEVICE
if
(
_console_device
==
RT_NULL
)
...
...
@@ -1351,7 +1457,7 @@ void rt_kputs(const char *str)
rt_weak
int
rt_kprintf
(
const
char
*
fmt
,
...)
{
va_list
args
;
rt_size_t
length
;
rt_size_t
length
=
0
;
static
char
rt_log_buf
[
RT_CONSOLEBUF_SIZE
];
va_start
(
args
,
fmt
);
...
...
@@ -1362,7 +1468,10 @@ rt_weak int rt_kprintf(const char *fmt, ...)
* length. */
length
=
rt_vsnprintf
(
rt_log_buf
,
sizeof
(
rt_log_buf
)
-
1
,
fmt
,
args
);
if
(
length
>
RT_CONSOLEBUF_SIZE
-
1
)
{
length
=
RT_CONSOLEBUF_SIZE
-
1
;
}
#ifdef RT_USING_DEVICE
if
(
_console_device
==
RT_NULL
)
{
...
...
@@ -1708,10 +1817,10 @@ void rt_page_free(void *addr, rt_size_t npages)
*/
rt_weak
void
*
rt_malloc_align
(
rt_size_t
size
,
rt_size_t
align
)
{
void
*
ptr
;
void
*
align_ptr
;
int
uintptr_size
;
rt_size_t
align_size
;
void
*
ptr
=
RT_NULL
;
void
*
align_ptr
=
RT_NULL
;
int
uintptr_size
=
0
;
rt_size_t
align_size
=
0
;
/* sizeof pointer */
uintptr_size
=
sizeof
(
void
*
);
...
...
@@ -1822,16 +1931,25 @@ const rt_uint8_t __lowest_bit_bitmap[] =
*/
int
__rt_ffs
(
int
value
)
{
if
(
value
==
0
)
return
0
;
if
(
value
==
0
)
{
return
0
;
}
if
(
value
&
0xff
)
{
return
__lowest_bit_bitmap
[
value
&
0xff
]
+
1
;
}
if
(
value
&
0xff00
)
{
return
__lowest_bit_bitmap
[(
value
&
0xff00
)
>>
8
]
+
9
;
}
if
(
value
&
0xff0000
)
{
return
__lowest_bit_bitmap
[(
value
&
0xff0000
)
>>
16
]
+
17
;
}
return
__lowest_bit_bitmap
[(
value
&
0xff000000
)
>>
24
]
+
25
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录