Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
yunqingabc
rt-thread
提交
0bf7ed76
R
rt-thread
项目概览
yunqingabc
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
1
Star
0
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,发现更多精彩内容 >>
提交
0bf7ed76
编写于
9月 17, 2013
作者:
B
bernard
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of
https://github.com/RT-Thread/rt-thread
上级
77096894
47c152ee
变更
23
显示空白变更内容
内联
并排
Showing
23 changed file
with
749 addition
and
161 deletion
+749
-161
.travis.yml
.travis.yml
+5
-2
bsp/simulator/SConstruct
bsp/simulator/SConstruct
+4
-7
bsp/simulator/applications/application.c
bsp/simulator/applications/application.c
+6
-0
bsp/simulator/applications/platform.c
bsp/simulator/applications/platform.c
+0
-5
bsp/simulator/drivers/SConscript
bsp/simulator/drivers/SConscript
+11
-3
bsp/simulator/drivers/sdl_fb.c
bsp/simulator/drivers/sdl_fb.c
+18
-0
bsp/simulator/rtconfig.py
bsp/simulator/rtconfig.py
+11
-4
bsp/stm32f10x/applications/application.c
bsp/stm32f10x/applications/application.c
+2
-1
components/drivers/include/rtdevice.h
components/drivers/include/rtdevice.h
+95
-25
components/drivers/src/pipe.c
components/drivers/src/pipe.c
+91
-45
components/drivers/src/portal.c
components/drivers/src/portal.c
+256
-0
components/drivers/src/ringbuffer.c
components/drivers/src/ringbuffer.c
+97
-4
components/drivers/usb/usbdevice/class/cdc_vcom.c
components/drivers/usb/usbdevice/class/cdc_vcom.c
+5
-5
components/finsh/cmd.c
components/finsh/cmd.c
+2
-0
components/finsh/finsh.h
components/finsh/finsh.h
+24
-23
components/libc/minilibc/sys/time.h
components/libc/minilibc/sys/time.h
+2
-0
components/utilities/logtrace/log_file.c
components/utilities/logtrace/log_file.c
+30
-19
components/utilities/logtrace/log_trace.c
components/utilities/logtrace/log_trace.c
+0
-9
include/rtdef.h
include/rtdef.h
+2
-0
libcpu/sim/posix/cpu_port.c
libcpu/sim/posix/cpu_port.c
+6
-6
src/ipc.c
src/ipc.c
+8
-1
tools/building.py
tools/building.py
+5
-2
tools/tools/clang-analyze.py
tools/tools/clang-analyze.py
+69
-0
未找到文件。
.travis.yml
浏览文件 @
0bf7ed76
...
...
@@ -6,18 +6,21 @@ notifications:
before_script
:
# travis has changed to 64-bit and we require 32-bit compatibility libraries
-
sudo apt-get update
-
"
sudo
apt-get
-qq
install
libc6:i386
libgcc1:i386
gcc-4.6-base:i386
libstdc++5:i386
libstdc++6:i386
||
true"
-
"
sudo
apt-get
-qq
install
clang
gcc-multilib
libc6:i386
libgcc1:i386
gcc-4.6-base:i386
libstdc++5:i386
libstdc++6:i386
libsdl-dev
||
true"
-
"
[
$RTT_TOOL_CHAIN
=
'sourcery-arm'
]
&&
curl
-s
https://sourcery.mentor.com/public/gnu_toolchain/arm-none-eabi/arm-2012.09-63-arm-none-eabi-i686-pc-linux-gnu.tar.bz2
|
sudo
tar
xjf
-
-C
/opt
&&
export
RTT_EXEC_PATH=/opt/arm-2012.09/bin
&&
/opt/arm-2012.09/bin/arm-none-eabi-gcc
--version
||
true"
-
"
[
$RTT_TOOL_CHAIN
=
'sourcery-mips'
]
&&
curl
-s
https://sourcery.mentor.com/public/gnu_toolchain/mips-sde-elf/mips-2012.09-98-mips-sde-elf-i686-pc-linux-gnu.tar.bz2
|
sudo
tar
xjf
-
-C
/opt
&&
export
RTT_EXEC_PATH=/opt/mips-2012.09/bin
&&
/opt/mips-2012.09/bin/mips-sde-elf-gcc
--version
||
true"
-
"
[
$RTT_TOOL_CHAIN
=
'sourcery-ppc'
]
&&
curl
-s
https://sourcery.mentor.com/public/gnu_toolchain/powerpc-eabi/freescale-2011.03-39-powerpc-eabi-i686-pc-linux-gnu.tar.bz2
|
sudo
tar
xjf
-
-C
/opt
&&
export
RTT_EXEC_PATH=/opt/freescale-2011.03/bin
&&
/opt/freescale-2011.03/bin/powerpc-eabi-gcc
--version
||
true"
-
"
[
$RTT_TOOL_CHAIN
=
'atmel-avr32'
]
&&
curl
-s
http://www.atmel.com/images/avr32-gnu-toolchain-3.4.1.348-linux.any.x86.tar.gz
|
sudo
tar
xzf
-
-C
/opt
&&
export
RTT_EXEC_PATH=/opt/avr32-gnu-toolchain-linux_x86/bin
&&
/opt/avr32-gnu-toolchain-linux_x86/bin/avr32-gcc
--version
&&
curl
-sO
http://www.atmel.com/images/avr-headers-3.2.3.970.zip
&&
unzip
-qq
avr-headers-3.2.3.970.zip
-d
bsp/$RTT_BSP
||
true"
-
export RTT_ROOT=`pwd`
-
export RTT_CC='gcc'
-
"
[
x$RTT_CC
==
x
]
&&
export
RTT_CC='gcc'
||
true"
-
git clone --depth 1 https://github.com/RT-Thread/RTGUI.git $HOME/RTGUI
-
export RTT_RTGUI=$HOME/RTGUI/components/rtgui
script
:
-
scons -C bsp/$RTT_BSP
env
:
-
RTT_BSP='simulator' RTT_CC='clang-analyze' RTT_EXEC_PATH=/usr/share/clang/scan-build
-
RTT_BSP='at91sam9260' RTT_TOOL_CHAIN='sourcery-arm'
-
RTT_BSP='avr32uc3b0' RTT_TOOL_CHAIN='atmel-avr32'
# - RTT_BSP='bf533' # no scons
...
...
bsp/simulator/SConstruct
浏览文件 @
0bf7ed76
...
...
@@ -73,6 +73,10 @@ elif rtconfig.PLATFORM == 'mingw':
LINK
=
rtconfig
.
LINK
,
LINKFLAGS
=
rtconfig
.
LFLAGS
)
env
[
'LIBS'
]
=
libs
env
.
PrependENVPath
(
'PATH'
,
rtconfig
.
EXEC_PATH
)
elif
rtconfig
.
CROSS_TOOL
==
'clang-analyze'
:
TARGET
=
'rtthread'
env
=
Environment
(
toolpath
=
[
os
.
path
.
join
(
RTT_ROOT
,
'tools'
,
'tools'
)],
tools
=
[
rtconfig
.
CROSS_TOOL
])
else
:
TARGET
=
'rtthread'
env
[
'CC'
]
=
rtconfig
.
CC
...
...
@@ -84,13 +88,6 @@ else:
objs
=
PrepareBuilding
(
env
,
RTT_ROOT
,
has_libcpu
=
False
,
remove_components
=
[
'rtgui'
])
if
GetDepend
(
'RT_USING_RTGUI'
):
sdl_lib
=
[
'SDL'
,
'SDLmain'
]
sdl_lib_path
=
[
os
.
path
.
abspath
(
'SDL/lib/x86'
)]
sdl_include_path
=
[
os
.
path
.
abspath
(
'SDL/include'
)]
env
.
Append
(
LIBS
=
sdl_lib
)
env
.
Append
(
LIBPATH
=
sdl_lib_path
)
env
.
Append
(
CPPPATH
=
sdl_include_path
)
if
RTT_RTGUI
:
objs
+=
SConscript
(
os
.
path
.
join
(
RTT_RTGUI
,
'SConscript'
),
variant_dir
=
'build/components/rtgui'
,
...
...
bsp/simulator/applications/application.c
浏览文件 @
0bf7ed76
...
...
@@ -30,6 +30,12 @@ void rt_init_thread_entry(void *parameter)
/* initialization RT-Thread Components */
rt_components_init
();
#ifdef RT_USING_RTGUI
/* start sdl thread to simulate an LCD. SDL may depend on DFS and should be
* called after rt_components_init. */
rt_hw_sdl_start
();
#endif
/* RT_USING_RTGUI */
#if defined(RT_USING_COMPONENTS_INIT) && defined(__GNUC__) && defined(RT_USING_FINSH)
finsh_set_device
(
RT_CONSOLE_DEVICE_NAME
);
#endif
...
...
bsp/simulator/applications/platform.c
浏览文件 @
0bf7ed76
...
...
@@ -17,11 +17,6 @@ void rt_platform_init(void)
#endif
/* RT_USING_DFS */
#ifdef RT_USING_RTGUI
/* start sdl thread to simulate an LCD */
rt_hw_sdl_start
();
#endif
/* RT_USING_RTGUI */
#ifdef _WIN32
rt_thread_idle_sethook
(
rt_hw_win32_low_cpu
);
#endif
...
...
bsp/simulator/drivers/SConscript
浏览文件 @
0bf7ed76
...
...
@@ -3,10 +3,19 @@ from building import *
cwd
=
GetCurrentDir
()
src
=
Glob
(
'*.c'
)
LIBS
=
[]
LIBPATH
=
[]
CPPPATH
=
[
cwd
]
# remove no need file.
if
GetDepend
(
'RT_USING_RTGUI'
)
==
False
:
SrcRemove
(
src
,
'sdl_fb.c'
)
else
:
LIBS
.
append
(
'SDL'
)
if
sys
.
platform
==
'win32'
:
LIBPATH
.
append
(
os
.
path
.
abspath
(
os
.
path
.
join
(
cwd
,
'../SDL/lib/x86'
)))
CPPPATH
.
append
(
os
.
path
.
abspath
(
os
.
path
.
join
(
cwd
,
'../SDL/include'
)))
if
GetDepend
(
'RT_USING_DFS'
)
==
False
or
GetDepend
(
'RT_USING_DFS_ELMFAT'
)
==
False
:
SrcRemove
(
src
,
'sd_sim.c'
)
if
GetDepend
(
'RT_USING_DFS'
)
==
False
or
GetDepend
(
'RT_USING_MTD_NAND'
)
==
False
:
...
...
@@ -20,8 +29,7 @@ if GetDepend('RT_USING_MODULE') == False:
if
sys
.
platform
[
0
:
5
]
==
"linux"
:
#check whether under linux
SrcRemove
(
src
,
[
'module_win32.c'
,
'dfs_win32.c'
])
CPPPATH
=
[
cwd
]
group
=
DefineGroup
(
'Drivers'
,
src
,
depend
=
[
''
],
CPPPATH
=
CPPPATH
)
group
=
DefineGroup
(
'Drivers'
,
src
,
depend
=
[
''
],
CPPPATH
=
CPPPATH
,
LIBS
=
LIBS
,
LIBPATH
=
LIBPATH
)
Return
(
'group'
)
bsp/simulator/drivers/sdl_fb.c
浏览文件 @
0bf7ed76
...
...
@@ -152,8 +152,12 @@ static void sdlfb_hw_init(void)
#ifdef _WIN32
static
HANDLE
sdl_ok_event
=
NULL
;
static
DWORD
WINAPI
sdl_loop
(
LPVOID
lpParam
)
#else
static
pthread_mutex_t
sdl_ok_mutex
;
static
pthread_cond_t
sdl_ok_event
;
static
void
*
sdl_loop
(
void
*
lpParam
)
#endif
{
...
...
@@ -167,14 +171,19 @@ static void *sdl_loop(void *lpParam)
/* set the getchar without buffer */
sigfillset
(
&
sigmask
);
pthread_sigmask
(
SIG_BLOCK
,
&
sigmask
,
&
oldmask
);
pthread_mutex_lock
(
&
sdl_ok_mutex
);
#endif
sdlfb_hw_init
();
device
=
rt_device_find
(
"sdl"
);
RT_ASSERT
(
device
);
rtgui_graphic_set_device
(
device
);
#ifdef _WIN32
SetEvent
(
sdl_ok_event
);
#else
pthread_cond_signal
(
&
sdl_ok_event
);
pthread_mutex_unlock
(
&
sdl_ok_mutex
);
#endif
/* handle SDL event */
while
(
!
quit
)
...
...
@@ -338,11 +347,20 @@ void rt_hw_sdl_start(void)
/* Linux */
pthread_t
pid
;
int
res
;
pthread_mutex_init
(
&
sdl_ok_mutex
,
NULL
);
pthread_cond_init
(
&
sdl_ok_event
,
NULL
);
res
=
pthread_create
(
&
pid
,
NULL
,
&
sdl_loop
,
NULL
);
if
(
res
)
{
printf
(
"pthread create sdl thread faild, <%d>
\n
"
,
res
);
exit
(
EXIT_FAILURE
);
}
pthread_mutex_lock
(
&
sdl_ok_mutex
);
pthread_cond_wait
(
&
sdl_ok_event
,
&
sdl_ok_mutex
);
pthread_mutex_destroy
(
&
sdl_ok_mutex
);
pthread_cond_destroy
(
&
sdl_ok_event
);
#endif
}
bsp/simulator/rtconfig.py
浏览文件 @
0bf7ed76
import
os
# toolchains options
ARCH
=
'sim'
#CROSS_TOOL='msvc' or 'gcc' or 'mingw'
...
...
@@ -5,12 +7,15 @@ ARCH='sim'
# 'gcc' is for linux
CROSS_TOOL
=
'msvc'
if
os
.
getenv
(
'RTT_CC'
):
CROSS_TOOL
=
os
.
getenv
(
'RTT_CC'
)
# cross_tool provides the cross compiler
# EXEC_PATH is the compiler execute path
if
CROSS_TOOL
==
'gcc'
:
if
CROSS_TOOL
==
'gcc'
or
CROSS_TOOL
==
'clang-analyze'
:
CPU
=
'posix'
PLATFORM
=
'gcc'
EXEC_PATH
=
'
/usr/bin/gcc
'
EXEC_PATH
=
''
elif
CROSS_TOOL
==
'mingw'
:
CPU
=
'win32'
...
...
@@ -21,11 +26,13 @@ elif CROSS_TOOL == 'msvc':
CPU
=
'win32'
PLATFORM
=
'cl'
EXEC_PATH
=
''
else
:
else
:
print
"bad CROSS TOOL!"
exit
(
1
)
if
os
.
getenv
(
'RTT_EXEC_PATH'
):
EXEC_PATH
=
os
.
getenv
(
'RTT_EXEC_PATH'
)
BUILD
=
'debug'
#BUILD = ''
...
...
bsp/stm32f10x/applications/application.c
浏览文件 @
0bf7ed76
...
...
@@ -111,7 +111,6 @@ void rt_init_thread_entry(void* parameter)
#ifdef RT_USING_RTGUI
{
extern
void
rtgui_system_server_init
(
void
);
extern
void
rt_hw_lcd_init
();
extern
void
rtgui_touch_hw_init
(
void
);
...
...
@@ -132,8 +131,10 @@ void rt_init_thread_entry(void* parameter)
/* set lcd device as rtgui graphic driver */
rtgui_graphic_set_device
(
lcd
);
#ifndef RT_USING_COMPONENTS_INIT
/* init rtgui system server */
rtgui_system_server_init
();
#endif
calibration_set_restore
(
cali_setup
);
calibration_set_after
(
cali_store
);
...
...
components/drivers/include/rtdevice.h
浏览文件 @
0bf7ed76
...
...
@@ -45,9 +45,9 @@ struct rt_ringbuffer
/* use the msb of the {read,write}_index as mirror bit. You can see this as
* if the buffer adds a virtual mirror and the pointers point either to the
* normal or to the mirrored buffer. If the write_index has the same value
* with the read_index, but in
differenct mirro, the buffer is full. While
*
if the write_index and the read_index are the same and within the sam
e
* mirror, the buffer is empty. The ASCII art of the ringbuffer is:
* with the read_index, but in
a different mirror, the buffer is full.
*
While if the write_index and the read_index are the same and within th
e
*
same
mirror, the buffer is empty. The ASCII art of the ringbuffer is:
*
* mirror = 0 mirror = 1
* +---+---+---+---+---+---+---+|+~~~+~~~+~~~+~~~+~~~+~~~+~~~+
...
...
@@ -73,31 +73,30 @@ struct rt_ringbuffer
rt_int16_t
buffer_size
;
};
/*
* return the size of data in rb
*/
rt_inline
rt_uint16_t
RT_RINGBUFFER_SIZE
(
struct
rt_ringbuffer
*
rb
)
/*
portal device
*/
struct
rt_portal_device
{
if
(
rb
->
read_index
==
rb
->
write_index
)
{
if
(
rb
->
read_mirror
==
rb
->
write_mirror
)
/* we are in the same side, the ringbuffer is empty. */
return
0
;
else
return
rb
->
buffer_size
;
}
else
{
if
(
rb
->
write_index
>
rb
->
read_index
)
return
rb
->
write_index
-
rb
->
read_index
;
else
return
rb
->
buffer_size
-
(
rb
->
read_index
-
rb
->
write_index
);
}
}
/** return the size of empty space in rb */
#define RT_RINGBUFFER_EMPTY(rb) ((rb)->buffer_size - RT_RINGBUFFER_SIZE(rb))
struct
rt_device
parent
;
struct
rt_device
*
write_dev
;
struct
rt_device
*
read_dev
;
};
/* pipe device */
#define PIPE_DEVICE(device) ((struct rt_pipe_device*)(device))
enum
rt_pipe_flag
{
/* both read and write won't block */
RT_PIPE_FLAG_NONBLOCK_RDWR
=
0x00
,
/* read would block */
RT_PIPE_FLAG_BLOCK_RD
=
0x01
,
/* write would block */
RT_PIPE_FLAG_BLOCK_WR
=
0x02
,
/* write to this pipe will discard some data when the pipe is full.
* When this flag is set, RT_PIPE_FLAG_BLOCK_WR will be ignored since write
* operation will always be success. */
RT_PIPE_FLAG_FORCE_WR
=
0x04
,
};
struct
rt_pipe_device
{
struct
rt_device
parent
;
...
...
@@ -105,9 +104,14 @@ struct rt_pipe_device
/* ring buffer in pipe device */
struct
rt_ringbuffer
ringbuffer
;
enum
rt_pipe_flag
flag
;
/* suspended list */
rt_list_t
suspended_read_list
;
rt_list_t
suspended_write_list
;
struct
rt_portal_device
*
write_portal
;
struct
rt_portal_device
*
read_portal
;
};
#define RT_DATAQUEUE_EVENT_UNKNOWN 0x00
...
...
@@ -157,31 +161,97 @@ void rt_ringbuffer_init(struct rt_ringbuffer *rb,
rt_size_t
rt_ringbuffer_put
(
struct
rt_ringbuffer
*
rb
,
const
rt_uint8_t
*
ptr
,
rt_uint16_t
length
);
rt_size_t
rt_ringbuffer_put_force
(
struct
rt_ringbuffer
*
rb
,
const
rt_uint8_t
*
ptr
,
rt_uint16_t
length
);
rt_size_t
rt_ringbuffer_putchar
(
struct
rt_ringbuffer
*
rb
,
const
rt_uint8_t
ch
);
rt_size_t
rt_ringbuffer_putchar_force
(
struct
rt_ringbuffer
*
rb
,
const
rt_uint8_t
ch
);
rt_size_t
rt_ringbuffer_get
(
struct
rt_ringbuffer
*
rb
,
rt_uint8_t
*
ptr
,
rt_uint16_t
length
);
rt_size_t
rt_ringbuffer_getchar
(
struct
rt_ringbuffer
*
rb
,
rt_uint8_t
*
ch
);
enum
rt_ringbuffer_state
{
RT_RINGBUFFER_EMPTY
,
RT_RINGBUFFER_FULL
,
/* half full is neither full nor empty */
RT_RINGBUFFER_HALFFULL
,
};
rt_inline
rt_uint16_t
rt_ringbuffer_get_size
(
struct
rt_ringbuffer
*
rb
)
{
RT_ASSERT
(
rb
!=
RT_NULL
);
return
rb
->
buffer_size
;
}
rt_inline
enum
rt_ringbuffer_state
rt_ringbuffer_status
(
struct
rt_ringbuffer
*
rb
)
{
if
(
rb
->
read_index
==
rb
->
write_index
)
{
if
(
rb
->
read_mirror
==
rb
->
write_mirror
)
return
RT_RINGBUFFER_EMPTY
;
else
return
RT_RINGBUFFER_FULL
;
}
return
RT_RINGBUFFER_HALFFULL
;
}
/** return the size of data in rb */
rt_inline
rt_uint16_t
rt_ringbuffer_data_len
(
struct
rt_ringbuffer
*
rb
)
{
switch
(
rt_ringbuffer_status
(
rb
))
{
case
RT_RINGBUFFER_EMPTY
:
return
0
;
case
RT_RINGBUFFER_FULL
:
return
rb
->
buffer_size
;
case
RT_RINGBUFFER_HALFFULL
:
default:
if
(
rb
->
write_index
>
rb
->
read_index
)
return
rb
->
write_index
-
rb
->
read_index
;
else
return
rb
->
buffer_size
-
(
rb
->
read_index
-
rb
->
write_index
);
};
}
/** return the size of empty space in rb */
#define rt_ringbuffer_space_len(rb) ((rb)->buffer_size - rt_ringbuffer_data_len(rb))
/**
* Pipe Device
*/
rt_err_t
rt_pipe_init
(
struct
rt_pipe_device
*
pipe
,
const
char
*
name
,
enum
rt_pipe_flag
flag
,
rt_uint8_t
*
buf
,
rt_size_t
size
);
rt_err_t
rt_pipe_detach
(
struct
rt_pipe_device
*
pipe
);
#ifdef RT_USING_HEAP
rt_err_t
rt_pipe_create
(
const
char
*
name
,
rt_size_t
size
);
rt_err_t
rt_pipe_create
(
const
char
*
name
,
enum
rt_pipe_flag
flag
,
rt_size_t
size
);
void
rt_pipe_destroy
(
struct
rt_pipe_device
*
pipe
);
#endif
/**
* Portal for DeviceDriver
*/
rt_err_t
rt_portal_init
(
struct
rt_portal_device
*
portal
,
const
char
*
portal_name
,
const
char
*
write_dev
,
const
char
*
read_dev
);
rt_err_t
rt_portal_detach
(
struct
rt_portal_device
*
portal
);
#ifdef RT_USING_HEAP
rt_err_t
rt_portal_create
(
const
char
*
name
,
const
char
*
write_dev
,
const
char
*
read_dev
);
void
rt_portal_destroy
(
struct
rt_portal_device
*
portal
);
#endif
/**
* DataQueue for DeviceDriver
*/
...
...
components/drivers/src/pipe.c
浏览文件 @
0bf7ed76
...
...
@@ -26,6 +26,26 @@
#include <rtthread.h>
#include <rtdevice.h>
static
void
_rt_pipe_resume_writer
(
struct
rt_pipe_device
*
pipe
)
{
if
(
!
rt_list_isempty
(
&
pipe
->
suspended_write_list
))
{
rt_thread_t
thread
;
RT_ASSERT
(
pipe
->
flag
&
RT_PIPE_FLAG_BLOCK_WR
);
/* get suspended thread */
thread
=
rt_list_entry
(
pipe
->
suspended_write_list
.
next
,
struct
rt_thread
,
tlist
);
/* resume the write thread */
rt_thread_resume
(
thread
);
rt_schedule
();
}
}
static
rt_size_t
rt_pipe_read
(
rt_device_t
dev
,
rt_off_t
pos
,
void
*
buffer
,
...
...
@@ -39,13 +59,26 @@ static rt_size_t rt_pipe_read(rt_device_t dev,
pipe
=
PIPE_DEVICE
(
dev
);
RT_ASSERT
(
pipe
!=
RT_NULL
);
if
(
!
(
pipe
->
flag
&
RT_PIPE_FLAG_BLOCK_RD
))
{
level
=
rt_hw_interrupt_disable
();
read_nbytes
=
rt_ringbuffer_get
(
&
(
pipe
->
ringbuffer
),
buffer
,
size
);
/* if the ringbuffer is empty, there won't be any writer waiting */
if
(
read_nbytes
)
_rt_pipe_resume_writer
(
pipe
);
rt_hw_interrupt_enable
(
level
);
return
read_nbytes
;
}
thread
=
rt_thread_self
();
/* current context checking */
RT_DEBUG_NOT_IN_INTERRUPT
;
do
{
do
{
level
=
rt_hw_interrupt_disable
();
read_nbytes
=
rt_ringbuffer_get
(
&
(
pipe
->
ringbuffer
),
buffer
,
size
);
if
(
read_nbytes
==
0
)
...
...
@@ -60,31 +93,39 @@ static rt_size_t rt_pipe_read(rt_device_t dev,
}
else
{
if
(
!
rt_list_isempty
(
&
pipe
->
suspended_write_list
))
_rt_pipe_resume_writer
(
pipe
);
rt_hw_interrupt_enable
(
level
);
break
;
}
}
while
(
read_nbytes
==
0
);
return
read_nbytes
;
}
static
void
_rt_pipe_resume_reader
(
struct
rt_pipe_device
*
pipe
)
{
if
(
pipe
->
parent
.
rx_indicate
)
pipe
->
parent
.
rx_indicate
(
&
pipe
->
parent
,
rt_ringbuffer_data_len
(
&
pipe
->
ringbuffer
));
if
(
!
rt_list_isempty
(
&
pipe
->
suspended_read_list
))
{
rt_thread_t
thread
;
RT_ASSERT
(
pipe
->
flag
&
RT_PIPE_FLAG_BLOCK_RD
);
/* get suspended thread */
thread
=
rt_list_entry
(
pipe
->
suspended_write
_list
.
next
,
thread
=
rt_list_entry
(
pipe
->
suspended_read
_list
.
next
,
struct
rt_thread
,
tlist
);
/* resume the write
thread */
/* resume the read
thread */
rt_thread_resume
(
thread
);
rt_hw_interrupt_enable
(
level
);
rt_schedule
();
}
else
{
rt_hw_interrupt_enable
(
level
);
}
break
;
}
}
while
(
read_nbytes
==
0
);
return
read_nbytes
;
}
struct
rt_pipe_device
*
_pipe
=
RT_NULL
;
static
rt_size_t
rt_pipe_write
(
rt_device_t
dev
,
rt_off_t
pos
,
const
void
*
buffer
,
...
...
@@ -97,16 +138,32 @@ static rt_size_t rt_pipe_write(rt_device_t dev,
pipe
=
PIPE_DEVICE
(
dev
);
RT_ASSERT
(
pipe
!=
RT_NULL
);
if
(
_pipe
==
RT_NULL
)
_pipe
=
pipe
;
if
((
pipe
->
flag
&
RT_PIPE_FLAG_FORCE_WR
)
||
!
(
pipe
->
flag
&
RT_PIPE_FLAG_BLOCK_WR
))
{
level
=
rt_hw_interrupt_disable
();
if
(
pipe
->
flag
&
RT_PIPE_FLAG_FORCE_WR
)
write_nbytes
=
rt_ringbuffer_put_force
(
&
(
pipe
->
ringbuffer
),
buffer
,
size
);
else
write_nbytes
=
rt_ringbuffer_put
(
&
(
pipe
->
ringbuffer
),
buffer
,
size
);
_rt_pipe_resume_reader
(
pipe
);
rt_hw_interrupt_enable
(
level
);
return
write_nbytes
;
}
thread
=
rt_thread_self
();
/* current context checking */
RT_DEBUG_NOT_IN_INTERRUPT
;
do
{
do
{
level
=
rt_hw_interrupt_disable
();
write_nbytes
=
rt_ringbuffer_put
(
&
(
pipe
->
ringbuffer
),
buffer
,
size
);
if
(
write_nbytes
==
0
)
...
...
@@ -122,26 +179,11 @@ static rt_size_t rt_pipe_write(rt_device_t dev,
}
else
{
if
(
!
rt_list_isempty
(
&
pipe
->
suspended_read_list
))
{
/* get suspended thread */
thread
=
rt_list_entry
(
pipe
->
suspended_read_list
.
next
,
struct
rt_thread
,
tlist
);
/* resume the read thread */
rt_thread_resume
(
thread
);
rt_hw_interrupt_enable
(
level
);
rt_schedule
();
}
else
{
_rt_pipe_resume_reader
(
pipe
);
rt_hw_interrupt_enable
(
level
);
}
break
;
}
}
while
(
write_nbytes
==
0
);
}
while
(
write_nbytes
==
0
);
return
write_nbytes
;
}
...
...
@@ -157,6 +199,7 @@ static rt_err_t rt_pipe_control(rt_device_t dev, rt_uint8_t cmd, void *args)
*
* @param pipe the pipe device
* @param name the name of pipe device
* @param flag the attribute of the pipe device
* @param buf the buffer of pipe device
* @param size the size of pipe device buffer
*
...
...
@@ -164,6 +207,7 @@ static rt_err_t rt_pipe_control(rt_device_t dev, rt_uint8_t cmd, void *args)
*/
rt_err_t
rt_pipe_init
(
struct
rt_pipe_device
*
pipe
,
const
char
*
name
,
enum
rt_pipe_flag
flag
,
rt_uint8_t
*
buf
,
rt_size_t
size
)
{
...
...
@@ -177,8 +221,10 @@ rt_err_t rt_pipe_init(struct rt_pipe_device *pipe,
/* initialize ring buffer */
rt_ringbuffer_init
(
&
pipe
->
ringbuffer
,
buf
,
size
);
pipe
->
flag
=
flag
;
/* create pipe */
pipe
->
parent
.
type
=
RT_Device_Class_
Char
;
pipe
->
parent
.
type
=
RT_Device_Class_
Pipe
;
pipe
->
parent
.
init
=
RT_NULL
;
pipe
->
parent
.
open
=
RT_NULL
;
pipe
->
parent
.
close
=
RT_NULL
;
...
...
@@ -204,7 +250,7 @@ rt_err_t rt_pipe_detach(struct rt_pipe_device *pipe)
RTM_EXPORT
(
rt_pipe_detach
);
#ifdef RT_USING_HEAP
rt_err_t
rt_pipe_create
(
const
char
*
name
,
rt_size_t
size
)
rt_err_t
rt_pipe_create
(
const
char
*
name
,
enum
rt_pipe_flag
flag
,
rt_size_t
size
)
{
rt_uint8_t
*
rb_memptr
=
RT_NULL
;
struct
rt_pipe_device
*
pipe
=
RT_NULL
;
...
...
@@ -223,7 +269,7 @@ rt_err_t rt_pipe_create(const char *name, rt_size_t size)
return
-
RT_ENOMEM
;
}
return
rt_pipe_init
(
pipe
,
name
,
rb_memptr
,
size
);
return
rt_pipe_init
(
pipe
,
name
,
flag
,
rb_memptr
,
size
);
}
RTM_EXPORT
(
rt_pipe_create
);
...
...
components/drivers/src/portal.c
0 → 100644
浏览文件 @
0bf7ed76
/*
* File : portal.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2013, RT-Thread Development Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Change Logs:
* Date Author Notes
* 2013-08-19 Grissiom initial version
*/
#include <rtthread.h>
#include <rtdevice.h>
#define PT_WRITE_DEV(pt) (((struct rt_portal_device*)pt)->write_dev)
#define PT_READ_DEV(pt) (((struct rt_portal_device*)pt)->read_dev)
static
rt_err_t
_portal_init
(
rt_device_t
dev
)
{
rt_err_t
err
;
struct
rt_portal_device
*
portal
;
RT_ASSERT
(
dev
);
portal
=
(
struct
rt_portal_device
*
)
dev
;
err
=
rt_device_init
(
portal
->
write_dev
);
if
(
err
!=
RT_EOK
)
return
err
;
err
=
rt_device_init
(
portal
->
read_dev
);
return
err
;
}
static
rt_err_t
_portal_open
(
rt_device_t
dev
,
rt_uint16_t
oflag
)
{
rt_err_t
err
;
struct
rt_portal_device
*
portal
;
RT_ASSERT
(
dev
);
if
(
!
oflag
)
return
-
RT_ERROR
;
portal
=
(
struct
rt_portal_device
*
)
dev
;
if
(
oflag
&
RT_DEVICE_OFLAG_RDONLY
)
{
err
=
rt_device_open
(
portal
->
read_dev
,
RT_DEVICE_OFLAG_RDONLY
);
if
(
err
!=
RT_EOK
)
return
err
;
}
if
(
oflag
&
RT_DEVICE_OFLAG_WRONLY
)
{
err
=
rt_device_open
(
portal
->
write_dev
,
RT_DEVICE_OFLAG_WRONLY
);
if
(
err
!=
RT_EOK
)
return
err
;
}
return
RT_EOK
;
}
static
rt_err_t
_portal_close
(
rt_device_t
dev
)
{
struct
rt_portal_device
*
portal
;
RT_ASSERT
(
dev
);
portal
=
(
struct
rt_portal_device
*
)
dev
;
rt_device_close
(
portal
->
write_dev
);
rt_device_close
(
portal
->
read_dev
);
return
RT_EOK
;
}
static
rt_size_t
_portal_read
(
rt_device_t
dev
,
rt_off_t
pos
,
void
*
buffer
,
rt_size_t
size
)
{
return
rt_device_read
(
PT_READ_DEV
(
dev
),
pos
,
buffer
,
size
);
}
static
rt_size_t
_portal_write
(
rt_device_t
dev
,
rt_off_t
pos
,
const
void
*
buffer
,
rt_size_t
size
)
{
return
rt_device_write
(
PT_WRITE_DEV
(
dev
),
pos
,
buffer
,
size
);
}
static
rt_err_t
_portal_rx_indicate
(
rt_device_t
dev
,
rt_size_t
size
)
{
struct
rt_pipe_device
*
pipe
;
RT_ASSERT
(
dev
&&
dev
->
type
==
RT_Device_Class_Pipe
);
pipe
=
(
struct
rt_pipe_device
*
)
dev
;
if
(
pipe
->
read_portal
->
parent
.
rx_indicate
)
return
pipe
->
read_portal
->
parent
.
rx_indicate
(
(
rt_device_t
)
pipe
->
read_portal
,
size
);
return
-
RT_ENOSYS
;
}
static
rt_err_t
_portal_tx_complete
(
rt_device_t
dev
,
void
*
buf
)
{
struct
rt_pipe_device
*
pipe
;
RT_ASSERT
(
dev
&&
dev
->
type
==
RT_Device_Class_Pipe
);
pipe
=
(
struct
rt_pipe_device
*
)
dev
;
if
(
pipe
->
write_portal
->
parent
.
tx_complete
)
return
pipe
->
write_portal
->
parent
.
tx_complete
(
(
rt_device_t
)
pipe
->
write_portal
,
buf
);
return
-
RT_ENOSYS
;
}
/**
* This function will initialize a portal device and put it under control of
* resource management.
*
* Portal is a device that connect devices
*
* Currently, you can only connect pipes in portal. Pipes are unidirectional.
* But with portal, you can construct a bidirectional device with two pipes.
* The inner connection is just like this:
*
* portal0 portal1
* read || || write
* <--<---||<---<---||<---<-- (pipe0)
* || ||
* -->--->||--->--->||--->--> (pipe1)
* write || || read
*
* You will always construct two portals on two pipes, say, "portal0" and
* "portal1". Data written into "portal0" can be retrieved in "portal1" and
* vice versa. `rx_indicate` and `tx_complete` events are propagated
* accordingly.
*
* @param portal the portal device
* @param portal_name the name of the portal device
* @param write_dev the name of the pipe device that this portal write into
* @param read_dev the name of the pipe device that this portal read from
*
* @return the operation status, RT_EOK on successful. -RT_ENOSYS on one pipe
* device could not be found.
*/
rt_err_t
rt_portal_init
(
struct
rt_portal_device
*
portal
,
const
char
*
portal_name
,
const
char
*
write_dev
,
const
char
*
read_dev
)
{
rt_device_t
dev
;
RT_ASSERT
(
portal
);
portal
->
parent
.
type
=
RT_Device_Class_Portal
;
portal
->
parent
.
init
=
_portal_init
;
portal
->
parent
.
open
=
_portal_open
;
portal
->
parent
.
close
=
_portal_close
;
portal
->
parent
.
write
=
_portal_write
;
portal
->
parent
.
read
=
_portal_read
;
/* single control of the two devices makes no sense */
portal
->
parent
.
control
=
RT_NULL
;
dev
=
rt_device_find
(
write_dev
);
if
(
dev
==
RT_NULL
)
return
-
RT_ENOSYS
;
RT_ASSERT
(
dev
->
type
==
RT_Device_Class_Pipe
);
portal
->
write_dev
=
dev
;
rt_device_set_tx_complete
(
&
portal
->
parent
,
dev
->
tx_complete
);
rt_device_set_tx_complete
(
dev
,
_portal_tx_complete
);
((
struct
rt_pipe_device
*
)
dev
)
->
write_portal
=
portal
;
dev
=
rt_device_find
(
read_dev
);
if
(
dev
==
RT_NULL
)
{
rt_device_set_tx_complete
(
dev
,
portal
->
parent
.
tx_complete
);
return
-
RT_ENOSYS
;
}
RT_ASSERT
(
dev
->
type
==
RT_Device_Class_Pipe
);
portal
->
read_dev
=
dev
;
rt_device_set_rx_indicate
(
&
portal
->
parent
,
dev
->
rx_indicate
);
rt_device_set_rx_indicate
(
dev
,
_portal_rx_indicate
);
((
struct
rt_pipe_device
*
)
dev
)
->
read_portal
=
portal
;
return
rt_device_register
(
&
(
portal
->
parent
),
portal_name
,
RT_DEVICE_FLAG_RDWR
);
}
RTM_EXPORT
(
rt_portal_init
);
/**
* This function will detach a portal device from resource management
*
* @param portal the portal device
*
* @return the operation status, RT_EOK on successful
*/
rt_err_t
rt_portal_detach
(
struct
rt_portal_device
*
portal
)
{
return
rt_device_unregister
(
&
portal
->
parent
);
}
RTM_EXPORT
(
rt_portal_detach
);
#ifdef RT_USING_HEAP
rt_err_t
rt_portal_create
(
const
char
*
name
,
const
char
*
write_dev
,
const
char
*
read_dev
)
{
struct
rt_portal_device
*
portal
;
portal
=
(
struct
rt_portal_device
*
)
rt_calloc
(
1
,
sizeof
(
*
portal
));
if
(
portal
==
RT_NULL
)
return
-
RT_ENOMEM
;
return
rt_portal_init
(
portal
,
name
,
write_dev
,
read_dev
);
}
RTM_EXPORT
(
rt_portal_create
);
void
rt_portal_destroy
(
struct
rt_portal_device
*
portal
)
{
if
(
portal
==
RT_NULL
)
return
;
rt_portal_detach
(
portal
);
rt_free
(
portal
);
return
;
}
RTM_EXPORT
(
rt_portal_destroy
);
#endif
/* RT_USING_HEAP */
components/drivers/src/ringbuffer.c
浏览文件 @
0bf7ed76
...
...
@@ -44,6 +44,9 @@ void rt_ringbuffer_init(struct rt_ringbuffer *rb,
}
RTM_EXPORT
(
rt_ringbuffer_init
);
/**
* put a block of data into ring buffer
*/
rt_size_t
rt_ringbuffer_put
(
struct
rt_ringbuffer
*
rb
,
const
rt_uint8_t
*
ptr
,
rt_uint16_t
length
)
...
...
@@ -53,7 +56,7 @@ rt_size_t rt_ringbuffer_put(struct rt_ringbuffer *rb,
RT_ASSERT
(
rb
!=
RT_NULL
);
/* whether has enough space */
size
=
RT_RINGBUFFER_EMPTY
(
rb
);
size
=
rt_ringbuffer_space_len
(
rb
);
/* no space */
if
(
size
==
0
)
...
...
@@ -88,6 +91,59 @@ rt_size_t rt_ringbuffer_put(struct rt_ringbuffer *rb,
}
RTM_EXPORT
(
rt_ringbuffer_put
);
/**
* put a block of data into ring buffer
*
* When the buffer is full, it will discard the old data.
*/
rt_size_t
rt_ringbuffer_put_force
(
struct
rt_ringbuffer
*
rb
,
const
rt_uint8_t
*
ptr
,
rt_uint16_t
length
)
{
enum
rt_ringbuffer_state
old_state
;
RT_ASSERT
(
rb
!=
RT_NULL
);
old_state
=
rt_ringbuffer_status
(
rb
);
if
(
length
>
rb
->
buffer_size
)
length
=
rb
->
buffer_size
;
if
(
rb
->
buffer_size
-
rb
->
write_index
>
length
)
{
/* read_index - write_index = empty space */
memcpy
(
&
rb
->
buffer_ptr
[
rb
->
write_index
],
ptr
,
length
);
/* this should not cause overflow because there is enough space for
* length of data in current mirror */
rb
->
write_index
+=
length
;
if
(
old_state
==
RT_RINGBUFFER_FULL
)
rb
->
read_index
=
rb
->
write_index
;
return
length
;
}
memcpy
(
&
rb
->
buffer_ptr
[
rb
->
write_index
],
&
ptr
[
0
],
rb
->
buffer_size
-
rb
->
write_index
);
memcpy
(
&
rb
->
buffer_ptr
[
0
],
&
ptr
[
rb
->
buffer_size
-
rb
->
write_index
],
length
-
(
rb
->
buffer_size
-
rb
->
write_index
));
/* we are going into the other side of the mirror */
rb
->
write_mirror
=
~
rb
->
write_mirror
;
rb
->
write_index
=
length
-
(
rb
->
buffer_size
-
rb
->
write_index
);
if
(
old_state
==
RT_RINGBUFFER_FULL
)
{
rb
->
read_mirror
=
~
rb
->
read_mirror
;
rb
->
read_index
=
rb
->
write_index
;
}
return
length
;
}
RTM_EXPORT
(
rt_ringbuffer_put_force
);
/**
* get data from ring buffer
*/
...
...
@@ -100,7 +156,7 @@ rt_size_t rt_ringbuffer_get(struct rt_ringbuffer *rb,
RT_ASSERT
(
rb
!=
RT_NULL
);
/* whether has enough data */
size
=
RT_RINGBUFFER_SIZE
(
rb
);
size
=
rt_ringbuffer_data_len
(
rb
);
/* no data */
if
(
size
==
0
)
...
...
@@ -143,7 +199,7 @@ rt_size_t rt_ringbuffer_putchar(struct rt_ringbuffer *rb, const rt_uint8_t ch)
RT_ASSERT
(
rb
!=
RT_NULL
);
/* whether has enough space */
if
(
!
RT_RINGBUFFER_EMPTY
(
rb
))
if
(
!
rt_ringbuffer_space_len
(
rb
))
return
0
;
rb
->
buffer_ptr
[
rb
->
write_index
]
=
ch
;
...
...
@@ -163,6 +219,43 @@ rt_size_t rt_ringbuffer_putchar(struct rt_ringbuffer *rb, const rt_uint8_t ch)
}
RTM_EXPORT
(
rt_ringbuffer_putchar
);
/**
* put a character into ring buffer
*
* When the buffer is full, it will discard one old data.
*/
rt_size_t
rt_ringbuffer_putchar_force
(
struct
rt_ringbuffer
*
rb
,
const
rt_uint8_t
ch
)
{
enum
rt_ringbuffer_state
old_state
;
RT_ASSERT
(
rb
!=
RT_NULL
);
old_state
=
rt_ringbuffer_status
(
rb
);
rb
->
buffer_ptr
[
rb
->
write_index
]
=
ch
;
/* flip mirror */
if
(
rb
->
write_index
==
rb
->
buffer_size
-
1
)
{
rb
->
write_mirror
=
~
rb
->
write_mirror
;
rb
->
write_index
=
0
;
if
(
old_state
==
RT_RINGBUFFER_FULL
)
{
rb
->
read_mirror
=
~
rb
->
read_mirror
;
rb
->
read_index
=
rb
->
write_index
;
}
}
else
{
rb
->
write_index
++
;
if
(
old_state
==
RT_RINGBUFFER_FULL
)
rb
->
read_index
=
rb
->
write_index
;
}
return
1
;
}
RTM_EXPORT
(
rt_ringbuffer_putchar_force
);
/**
* get a character from a ringbuffer
*/
...
...
@@ -171,7 +264,7 @@ rt_size_t rt_ringbuffer_getchar(struct rt_ringbuffer *rb, rt_uint8_t *ch)
RT_ASSERT
(
rb
!=
RT_NULL
);
/* ringbuffer is empty */
if
(
!
RT_RINGBUFFER_SIZE
(
rb
))
if
(
!
rt_ringbuffer_data_len
(
rb
))
return
0
;
/* put character */
...
...
components/drivers/usb/usbdevice/class/cdc_vcom.c
浏览文件 @
0bf7ed76
...
...
@@ -188,7 +188,7 @@ static rt_err_t _ep_in_handler(udevice_t device, uclass_t cls, rt_size_t size)
eps
=
(
cdc_eps_t
)
cls
->
eps
;
level
=
rt_hw_interrupt_disable
();
remain
=
RT_RINGBUFFER_SIZE
(
&
tx_ringbuffer
);
remain
=
rt_ringbuffer_data_len
(
&
tx_ringbuffer
);
if
(
remain
!=
0
)
{
/* although vcom_in_sending is set in SOF handler in the very
...
...
@@ -453,7 +453,7 @@ static rt_err_t _class_sof_handler(udevice_t device, uclass_t cls)
eps
=
(
cdc_eps_t
)
cls
->
eps
;
size
=
RT_RINGBUFFER_SIZE
(
&
tx_ringbuffer
);
size
=
rt_ringbuffer_data_len
(
&
tx_ringbuffer
);
if
(
size
==
0
)
return
-
RT_EFULL
;
...
...
@@ -611,7 +611,7 @@ static int _vcom_putc(struct rt_serial_device *serial, char c)
* data out soon. But we cannot rely on that and if we wait to long, just
* return. */
for
(
cnt
=
500
;
RT_RINGBUFFER_EMPTY
(
&
tx_ringbuffer
)
==
0
&&
cnt
;
rt_ringbuffer_space_len
(
&
tx_ringbuffer
)
==
0
&&
cnt
;
cnt
--
)
{
/*rt_kprintf("wait for %d\n", cnt);*/
...
...
@@ -628,7 +628,7 @@ static int _vcom_putc(struct rt_serial_device *serial, char c)
}
level
=
rt_hw_interrupt_disable
();
if
(
RT_RINGBUFFER_EMPTY
(
&
tx_ringbuffer
))
if
(
rt_ringbuffer_space_len
(
&
tx_ringbuffer
))
{
rt_ringbuffer_putchar
(
&
tx_ringbuffer
,
c
);
}
...
...
@@ -646,7 +646,7 @@ static int _vcom_getc(struct rt_serial_device *serial)
result
=
-
1
;
level
=
rt_hw_interrupt_disable
();
if
(
RT_RINGBUFFER_SIZE
(
&
rx_ringbuffer
))
if
(
rt_ringbuffer_data_len
(
&
rx_ringbuffer
))
{
rt_ringbuffer_getchar
(
&
rx_ringbuffer
,
&
ch
);
result
=
ch
;
...
...
components/finsh/cmd.c
浏览文件 @
0bf7ed76
...
...
@@ -455,6 +455,8 @@ static long _list_device(struct rt_list_node *list)
"SPI Device"
,
"SDIO Bus"
,
"PM Pseudo Device"
,
"Pipe"
,
"Portal Device"
,
"Miscellaneous Device"
,
"Unknown"
};
...
...
components/finsh/finsh.h
浏览文件 @
0bf7ed76
...
...
@@ -237,33 +237,34 @@ struct finsh_sysvar* finsh_sysvar_lookup(const char* name);
*/
#ifdef _MSC_VER
#define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \
const char __fsym_##name##_name[] = #alias; \
const char __fsym_##name##_desc[] = #desc; \
__declspec(allocate("FSymTab$f")) const struct finsh_syscall __fsym_##name = \
const char __fsym_##alias##_name[] = #alias; \
const char __fsym_##alias##_desc[] = #desc; \
__declspec(allocate("FSymTab$f")) \
const struct finsh_syscall __fsym_##alias = \
{ \
__fsym_##
name
##_name, \
__fsym_##
name
##_desc, \
__fsym_##
alias
##_name, \
__fsym_##
alias
##_desc, \
(syscall_func)&name \
};
#elif defined(__TI_COMPILER_VERSION__)
#define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \
__TI_FINSH_EXPORT_FUNCTION(__fsym_##
name
); \
const char __fsym_##
name
##_name[] = #alias; \
const char __fsym_##
name
##_desc[] = #desc; \
const struct finsh_syscall __fsym_##
name
= \
__TI_FINSH_EXPORT_FUNCTION(__fsym_##
alias
); \
const char __fsym_##
alias
##_name[] = #alias; \
const char __fsym_##
alias
##_desc[] = #desc; \
const struct finsh_syscall __fsym_##
alias
= \
{ \
__fsym_##
name
##_name, \
__fsym_##
name
##_desc, \
__fsym_##
alias
##_name, \
__fsym_##
alias
##_desc, \
(syscall_func)&name \
};
#else
#define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \
const char __fsym_##
name
##_name[] = #alias; \
const char __fsym_##
name
##_desc[] = #desc; \
const struct finsh_syscall __fsym_##
name
SECTION("FSymTab")= \
const char __fsym_##
alias
##_name[] = #alias; \
const char __fsym_##
alias
##_desc[] = #desc; \
const struct finsh_syscall __fsym_##
alias
SECTION("FSymTab")= \
{ \
__fsym_##
name
##_name, \
__fsym_##
name
##_desc, \
__fsym_##
alias
##_name, \
__fsym_##
alias
##_desc, \
(syscall_func)&name \
};
#endif
/* FINSH_FUNCTION_EXPORT_ALIAS defines */
...
...
@@ -324,11 +325,11 @@ struct finsh_sysvar* finsh_sysvar_lookup(const char* name);
(syscall_func)&name \
};
#define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \
const char __fsym_##
name
##_name[] = #alias; \
__TI_FINSH_EXPORT_FUNCTION(__fsym_##
name
); \
const struct finsh_syscall __fsym_##
name
= \
const char __fsym_##
alias
##_name[] = #alias; \
__TI_FINSH_EXPORT_FUNCTION(__fsym_##
alias
); \
const struct finsh_syscall __fsym_##
alias
= \
{ \
__fsym_##
name
##_name, \
__fsym_##
alias
##_name, \
(syscall_func)&name \
};
...
...
@@ -351,10 +352,10 @@ struct finsh_sysvar* finsh_sysvar_lookup(const char* name);
};
#define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \
const char __fsym_##
name
##_name[] = #alias; \
const struct finsh_syscall __fsym_##
name
SECTION("FSymTab")= \
const char __fsym_##
alias
##_name[] = #alias; \
const struct finsh_syscall __fsym_##
alias
SECTION("FSymTab")= \
{ \
__fsym_##
name
##_name, \
__fsym_##
alias
##_name, \
(syscall_func)&name \
};
...
...
components/libc/minilibc/sys/time.h
浏览文件 @
0bf7ed76
...
...
@@ -40,4 +40,6 @@ struct tm {
const
char
*
tm_zone
;
/* Timezone abbreviation. */
};
int
gettimeofday
(
struct
timeval
*
tp
,
void
*
ignore
);
#endif
components/utilities/logtrace/log_file.c
浏览文件 @
0bf7ed76
...
...
@@ -41,52 +41,56 @@ struct file_device
static
struct
file_device
_file_device
;
/* common device interface */
rt_err_t
fdevice_open
(
rt_device_t
dev
,
rt_uint16_t
oflag
)
static
rt_err_t
fdevice_open
(
rt_device_t
dev
,
rt_uint16_t
oflag
)
{
int
fd
;
struct
file_device
*
file
=
(
struct
file_device
*
)
dev
;
if
(
file
->
fd
>=
0
)
return
-
RT_EBUSY
;
struct
file_device
*
fdev
=
(
struct
file_device
*
)
dev
;
fd
=
open
(
file
->
filename
,
O_RDONLY
,
0
);
if
(
fdev
->
fd
>=
0
)
return
-
RT_EBUSY
;
/* test and open */
fd
=
open
(
fdev
->
filename
,
O_RDONLY
,
0
);
if
(
fd
>=
0
)
{
close
(
fd
);
/* file exists */
fd
=
open
(
file
->
filename
,
O_WRONLY
|
O_APPEND
,
0
);
fd
=
open
(
fdev
->
filename
,
O_WRONLY
|
O_APPEND
,
0
);
}
else
{
/* file not exists */
fd
=
open
(
f
ile
->
filename
,
O_WRONLY
|
O_CREAT
,
0
);
fd
=
open
(
f
dev
->
filename
,
O_WRONLY
|
O_CREAT
,
0
);
}
fdev
->
fd
=
fd
;
file
->
fd
=
fd
;
return
RT_EOK
;
}
rt_err_t
fdevice_close
(
rt_device_t
dev
)
static
rt_err_t
fdevice_close
(
rt_device_t
dev
)
{
rt_err_t
result
;
struct
file_device
*
fdev
=
(
struct
file_device
*
)
dev
;
struct
file_device
*
file
=
(
struct
file_device
*
)
dev
;
if
(
file
->
fd
<
0
)
return
-
RT_EBUSY
;
if
(
fdev
->
fd
<
0
)
return
-
RT_EBUSY
;
result
=
close
(
f
ile
->
fd
);
result
=
close
(
f
dev
->
fd
);
if
(
result
==
0
)
{
f
ile
->
fd
=
-
1
;
f
dev
->
fd
=
-
1
;
}
return
result
;
}
rt_size_t
fdevice_write
(
rt_device_t
dev
,
rt_off_t
pos
,
const
void
*
buffer
,
rt_size_t
size
)
static
rt_size_t
fdevice_write
(
rt_device_t
dev
,
rt_off_t
pos
,
const
void
*
buffer
,
rt_size_t
size
)
{
struct
file_device
*
file
=
(
struct
file_device
*
)
dev
;
if
(
file
->
fd
<
0
)
return
0
;
struct
file_device
*
fdev
=
(
struct
file_device
*
)
dev
;
if
(
fdev
->
fd
<
0
)
return
0
;
return
write
(
f
ile
->
fd
,
buffer
,
size
);
return
write
(
f
dev
->
fd
,
buffer
,
size
);
}
void
log_trace_file_init
(
const
char
*
filename
)
...
...
@@ -112,4 +116,11 @@ void log_trace_file_init(const char *filename)
_file_device
.
fd
=
-
1
;
}
#endif // RT_USING_DFS
void
log_trace_set_file
(
const
char
*
filename
)
{
log_trace_file_init
(
filename
);
log_trace_set_device
(
"logfile"
);
}
FINSH_FUNCTION_EXPORT_ALIAS
(
log_trace_set_file
,
log_file
,
set
output
filename
of
log
trace
);
#endif
/* RT_USING_DFS */
components/utilities/logtrace/log_trace.c
浏览文件 @
0bf7ed76
...
...
@@ -416,12 +416,3 @@ rt_err_t log_trace_set_device(const char *device_name)
}
FINSH_FUNCTION_EXPORT_ALIAS
(
log_trace_set_device
,
log_device
,
set
device
of
log
trace
);
#ifdef RT_USING_DFS
void
log_trace_set_file
(
const
char
*
filename
)
{
log_trace_file_init
(
filename
);
log_trace_set_device
(
"logfile"
);
}
FINSH_FUNCTION_EXPORT_ALIAS
(
log_trace_set_file
,
log_file
,
set
output
filename
of
log
trace
);
#endif // RT_USING_DFS
include/rtdef.h
浏览文件 @
0bf7ed76
...
...
@@ -739,6 +739,8 @@ enum rt_device_class_type
RT_Device_Class_SPIDevice
,
/**< SPI device */
RT_Device_Class_SDIO
,
/**< SDIO bus device */
RT_Device_Class_PM
,
/**< PM pseudo device */
RT_Device_Class_Pipe
,
/**< Pipe device */
RT_Device_Class_Portal
,
/**< Portal device */
RT_Device_Class_Miscellaneous
,
/**< Miscellaneous device */
RT_Device_Class_Unknown
/**< unknown device */
};
...
...
libcpu/sim/posix/cpu_port.c
浏览文件 @
0bf7ed76
...
...
@@ -363,12 +363,6 @@ void rt_hw_interrupt_enable(rt_base_t level)
/*TODO: It may need to unmask the signal */
}
void
rt_hw_context_switch_interrupt
(
rt_uint32_t
from
,
rt_uint32_t
to
)
{
rt_hw_context_switch
(
from
,
to
);
}
void
rt_hw_context_switch
(
rt_uint32_t
from
,
rt_uint32_t
to
)
{
...
...
@@ -400,6 +394,12 @@ void rt_hw_context_switch(rt_uint32_t from,
pthread_mutex_unlock
(
ptr_int_mutex
);
}
void
rt_hw_context_switch_interrupt
(
rt_uint32_t
from
,
rt_uint32_t
to
)
{
rt_hw_context_switch
(
from
,
to
);
}
void
rt_hw_context_switch_to
(
rt_uint32_t
to
)
{
//set to thread
...
...
src/ipc.c
浏览文件 @
0bf7ed76
...
...
@@ -45,6 +45,7 @@
* 2010-10-26 yi.qiu add module support in rt_mp_delete and rt_mq_delete
* 2010-11-10 Bernard add IPC reset command implementation.
* 2011-12-18 Bernard add more parameter checking in message queue
* 2013-09-14 Grissiom add an option check in rt_event_recv
*/
#include <rtthread.h>
...
...
@@ -1079,7 +1080,8 @@ RTM_EXPORT(rt_event_send);
*
* @param event the fast event object
* @param set the interested event set
* @param option the receive option
* @param option the receive option, either RT_EVENT_FLAG_AND or
* RT_EVENT_FLAG_OR should be set.
* @param timeout the waiting time
* @param recved the received event
*
...
...
@@ -1125,6 +1127,11 @@ rt_err_t rt_event_recv(rt_event_t event,
if
(
event
->
set
&
set
)
status
=
RT_EOK
;
}
else
{
/* either RT_EVENT_FLAG_AND or RT_EVENT_FLAG_OR should be set */
RT_ASSERT
(
0
);
}
if
(
status
==
RT_EOK
)
{
...
...
tools/building.py
浏览文件 @
0bf7ed76
...
...
@@ -113,8 +113,11 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
AS
=
'true'
,)
env
[
"ENV"
].
update
(
x
for
x
in
os
.
environ
.
items
()
if
x
[
0
].
startswith
(
"CCC_"
))
# only check, don't compile. ccc-analyzer use CCC_CC as the CC.
env
[
'ENV'
][
'CCC_CC'
]
=
'true'
env
[
'ENV'
][
'CCC_CXX'
]
=
'true'
# fsyntax-only will give us some additional warning messages
env
[
'ENV'
][
'CCC_CC'
]
=
'clang'
env
.
Append
(
CFLAGS
=
[
'-fsyntax-only'
,
'-Wall'
,
'-Wno-invalid-source-encoding'
])
env
[
'ENV'
][
'CCC_CXX'
]
=
'clang++'
env
.
Append
(
CXXFLAGS
=
[
'-fsyntax-only'
,
'-Wall'
,
'-Wno-invalid-source-encoding'
])
# remove the POST_ACTION as it will cause meaningless errors(file not
# found or something like that).
rtconfig
.
POST_ACTION
=
''
...
...
tools/tools/clang-analyze.py
0 → 100644
浏览文件 @
0bf7ed76
"""
Tool-specific initialization for Clang static analyzer
There normally shouldn't be any need to import this module directly.
It will usually be imported through the generic SCons.Tool.Tool()
selection method.
"""
__revision__
=
"tools/clang-analyze.py 2013-09-06 grissiom"
import
os
import
os.path
import
SCons.Action
import
SCons.Builder
import
SCons.Defaults
import
SCons.Tool
import
SCons.Util
import
rtconfig
def
generate
(
env
):
assert
(
rtconfig
.
CROSS_TOOL
==
'clang-analyze'
)
# let gnu_tools setup a basic env(learnt from SCons/Tools/mingw.py)
gnu_tools
=
[
'gcc'
,
'g++'
,
'gnulink'
,
'ar'
,
'gas'
,
'm4'
]
for
tool
in
gnu_tools
:
SCons
.
Tool
.
Tool
(
tool
)(
env
)
# then we could stand on the shoulders of gaints
env
[
'CC'
]
=
'ccc-analyzer'
env
[
'CXX'
]
=
'c++-analyzer'
env
[
'AS'
]
=
'true'
env
[
'AR'
]
=
'true'
env
[
'LINK'
]
=
'true'
env
[
'CFLAGS'
]
=
[
'-fsyntax-only'
,
'-Wall'
,
'-Wno-invalid-source-encoding'
]
env
[
'LINKFLAGS'
]
=
'-Wl,--gc-sections'
env
[
'ARFLAGS'
]
=
'-rc'
# only check, don't compile. ccc-analyzer use CCC_CC as the CC.
# fsyntax-only will give us some additional warning messages
env
[
'ENV'
][
'CCC_CC'
]
=
'clang'
env
[
'ENV'
][
'CCC_CXX'
]
=
'clang++'
# setup the output dir and format
env
[
'ENV'
][
'CCC_ANALYZER_HTML'
]
=
'./build/'
env
[
'ENV'
][
'CCC_ANALYZER_OUTPUT_FORMAT'
]
=
'html'
# Some setting from the platform also have to be overridden:
env
[
'OBJSUFFIX'
]
=
'.o'
env
[
'LIBPREFIX'
]
=
'lib'
env
[
'LIBSUFFIX'
]
=
'.a'
if
rtconfig
.
EXEC_PATH
:
if
not
os
.
path
.
exists
(
rtconfig
.
EXEC_PATH
):
print
print
'warning: rtconfig.EXEC_PATH(%s) does not exists.'
%
rtconfig
.
EXEC_PATH
print
return
env
.
AppendENVPath
(
'PATH'
,
rtconfig
.
EXEC_PATH
)
def
exists
(
env
):
return
env
.
Detect
([
'ccc-analyzer'
,
'c++-analyzer'
])
# Local Variables:
# tab-width:4
# indent-tabs-mode:nil
# End:
# vim: set expandtab tabstop=4 shiftwidth=4:
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录