Răsfoiți Sursa

Merge branch 'master' of github.com:RT-Thread/rt-thread

prife 12 ani în urmă
părinte
comite
3478420fad
3 a modificat fișierele cu 1863 adăugiri și 394 ștergeri
  1. 129 118
      bsp/simulator/readme.txt
  2. 1430 0
      bsp/simulator/rtthread.def
  3. 304 276
      components/net/lwip/src/netif/ethernetif.c

+ 129 - 118
bsp/simulator/readme.txt

@@ -1,23 +1,35 @@
 说明: 本BSP可以如下演示
-默认演示realtouch GUI效果,并提供了一个贪吃的demo用于演示
-
-目前支持的功能有
-1). LWIP(可以打开LWIP选项,不过尚存在bug,不建议使用)
-2). 文件系统支持,支持ELM FatFS,UFFS,JFFS2
-3). RTGUI支持
-   目前SVN中的RTGUI源码可以直接用于simulator。
-   如果读者想快速在simulator上体验RTGUI,那么不需要修改任何文件,首先在命令行中使用
-   scons --target=vs -s
-   生成工程后,打开project.vsproj编译,即可看到realtouch的ui出现,然后执行
-   在finsh中执行snake_main(),即可运行贪吃蛇demo
-   
-   再补充说明一点,RTGUI的最新源码目前是托管在git上。
-	   github网页:https://github.com/RT-Thread/RTGUI
-   如果要使用rtgui中的最新源码,共有两种方法。
+
+一 平台及组件支持
+目前rtconfig.py中支持的编译器有
+1). msvc 用于windows平台
+  此平台支持的组件
+    kernel
+    finsh
+    LWIP
+    DFS, ELM FatFS, UFFS, JFFS2, DFS_WIN32
+    RTGUI
+    APP MODULE
+2). mingw 用于windows平台
+    kernel
+    finsh
+    DFS, ELM FatFS, UFFS, DFS_WIN32
+    RTGUI
+    APP MODULE
+3). gcc 用于linux平台
+    kernel
+    finsh
+    DFS, ELM FatFS, UFFS
+    RTGUI
+
+二 组件配置
+1) RTGUI
+当前代码中已经不含RTGUI源码,因此读者需要配置一下才能在simulator中使用RTGUI
+RTGUI的最新源码目前是托管在github上:https://github.com/RT-Thread/RTGUI
+共有两种方法。
 方法1 添加环境变量
-   向系统环境变量中加入RTT_RTGUI,其值为刚才github上下载的rtgui源码包的路径。
-   例如笔者的rtgui源码包解压至 F:\Project\git\rt-gui\下
-   则将此环境变量配置为 F:\Project\git\rt-gui\components\rtgui
+   向系统加入RTT_RTGUI环境变量,其值为刚才github上下载的rtgui源码包的路径。
+   例如笔者的rtgui源码包解压至 F:\Project\git\rt-gui\下, 则将此环境变量配置为 F:\Project\git\rt-gui\components\rtgui
 方法2 不添加环境变量
    打开SConstruct文件,
  ....
@@ -37,106 +49,105 @@
    1)#号表示注释,类似于c语言中的//,
    2)其中15行的路径为你的RTGUI路径源码,注意不是压缩包路径,而是压缩包路径下的 components\rtgui目录的绝对路径。
 
-1 编译:
-1.1 使用Visual Studio(2005以上版本)
-    在命令行中执行 scons --target=vs -s 可以生成vs2005的工程,名为project.vsproj
-    
-    编译后运行
-   
-1.2 使用scons编译,在当前目录中打开cmd,输入
-    scons -j4
-    编译完成后会在当前目录下生成 rtthrad-win32.exe,双击即可运行。
-
-2. 测试文件系统
-运行:
-	编译后运行,会弹出CMD命令行窗口,可以看到控制台的输出信息,如下所示
-
-	 \ | /
-	- RT -     Thread Operating System
-	 / | \     1.1.0 build Oct 21 2012
-	 2006 - 2012 Copyright by rt-thread team
-	init jffs2 lock mutex okay
-	hello, world
-	finsh>>fatfs initialzation failed!
-	uffs initialzation failed!
-	jffs2 initialzation failed!
-	thread 29e4 exit
-	hello, world
-	hello, world
-	hello, world
-	hello, world
-	hello, world
-	hello, world
-	hello, world
-	hello, world
-	hello, world
-	thread 2898 exit
-
-	注意上面的信息显示,fatfs/uffs/jffs2均挂载失败,这是因为我们还没有为sd.bin创建fat分区,并且sd上也没有目录用于挂载jffs2和uffs。
-
-	并且此时当前bsp目录下,新增了三个文件用于模拟sd卡,nand flash与nor flash,它们是
-		sd.bin--模拟SD卡,挂载fat,大小为16M
-		nand.bin-模拟nand flash,挂载uffs,参数page=2048+64bytes,block=64pages,16M
-		nor.bin--模拟nor flash,挂载jffs2,型号为sst25vf,2M
-	
-	按下回车,出现finsh,然后输入如下命令格式化sd.bin
+三 编译
+1) 使用Visual Studio(2005以上版本)
+在当前目录中打开cmd,输入命令
+`scons --target=vs -s`
+可以生成project.vsproj,双击运行
 
+2) 命令行编译
+修改rtconfig.py, 配置合适的编译器(msvc/mingw/gcc),及其路径
+在当前目录中打开cmd,输入命令
+`scons -j4`
+编译完成后会在当前目录下生成 rtthrad-win32.exe,双击即可运行。
+
+四 程序测试
+1) 测试文件系统
+此时当前目录下,新增了三个文件
+ sd.bin--模拟SD卡,挂载fat,大小为16M
+ nand.bin-模拟nand flash,挂载uffs,参数page=2048+64bytes,block=64pages,16M
+ nor.bin--模拟nor flash,挂载jffs2,型号为sst25vf,2M
+第一次启动时,会看到fatfs挂在失败。
+按下回车,出现finsh,然后输入`mkfs("elm", "sd0")`格式化SD卡,如下所示
 	finsh>>mkfs("elm", "sd0")
 			0, 0x00000000
-	finsh>>
-
-	关闭程序重新运行,此时可以看到fatfs挂载成功,不过jffs2和uffs依然失败,如下所示。
-	 \ | /
-	- RT -     Thread Operating System
-	 / | \     1.1.0 build Oct 21 2012
-	 2006 - 2012 Copyright by rt-thread team
-	init jffs2 lock mutex okay
-	hello, world
-	finsh>>fatfs initialized!
-	uffs initialzation failed!
-	jffs2 initialzation failed!
-	
-	这是因为sd上还没有目录来用于挂载jffs2和uffs,在finsh中输入如下命令在sd上创建nand与nor文件夹,分别用于挂载uffs与jffs2文件系统。
-
-	finsh>>mkdir("/nand")
-			0, 0x00000000
-	finsh>>mkdir("/nor")
-			0, 0x00000000
-	finsh>>
-	然后再次关闭程序后重新运行,此时可以看到jffs2与uffs挂载成功。	
-
-	最终输出如下所示:
-
-	 \ | /
-	- RT -     Thread Operating System
-	 / | \     1.1.0 build Oct 21 2012
-	 2006 - 2012 Copyright by rt-thread team
-	init jffs2 lock mutex okay
-	hello, world
-	finsh>>fatfs initialized!
-	os  : system memory alloc 320 bytes
-	flsh: ECC size 24
-	flsh: UFFS consume spare data size 34
-	os  : system memory alloc 83520 bytes
-	os  : system memory alloc 52400 bytes
-	os  : system memory alloc 2048 bytes
-	tree: DIR 0, FILE 0, DATA 0
-	uffs initialized!
-	jffs2 initialized!
-	thread 2fb4 exit
-	hello, world
-	hello, world
-	hello, world
-	hello, world
-	hello, world
-	hello, world
-	hello, world
-	hello, world
-	hello, world
-	thread 312c exit
-
-Ok,到现在,一个完整的文件系统测试环境就搭建完毕了,enjoy~~
-
-3 测试RTGUI
-   启动后就会看到GUI窗口,分辨率800×480串口,并出现图形界面。
-   此时在finsh中输入 snake_main()并回车,即可运行贪吃蛇程序。
+然后重启程序,就可以看到fatfs挂载成功了
+
+2) 测试RTGUI
+启动后就会看到GUI窗口,分辨率800x480,此时在finsh中输入snake_main()并回车,即可运行贪吃蛇程序
+
+3) 测试APP module
+rtconfig.h中需要打开RT_USING_MODULE
+
+a. 生成rtthread.def文件
+使用msv编译主程序时需要此文件,使用MingW编译主程序时不需要
+msvc需要此文件才能生成正确导出符号的rtthread.dll和rtthread-win32.exe。
+此目录下默认自带了一个rtthread.def文件,当修改了rtconfig.h,禁用了某些组件时,则需要重新生成rtthread.def文件.
+生成方法:
+需要借助MingW工具,修改rtconfig.py中CROSS_TOOL为'mingw',然后打开CMD执行`scons --def`就会自动更新rtthread.def。
+
+b. 生成主程序
+  主程序可以使用msvc和mingw生成
+  如果rtconfig.h中的使能了RTGUI,则需要参考第二节第1小节配置RTGUI
+  a.1 使用msvc
+	  修改rtconfig.py中CROSS_TOOL为'msvc'
+	  首先要保证当前目录下有合适的rtthread.def文件,如果没有对默认的rtconfig.h作修改,则使用默认的rtthread.def即可
+	  CMD命令行执行`scons -j4`,即可生成rtthread.dll和 rtthread-win32.exe
+  a.2 使用mingw
+	  修改rtconfig.py中CROSS_TOOL为'mingw'
+	  CMD命令行执行`scons -j4`,这就会生成 rtthread.dll和 rtthread-win32.exe
+
+c. 生成app module
+  进入testdll目录,再次修改 testdll/SConstruct, 同样需要配置RTT_RTGUI路径,同 1中3)
+  在此目录下执行
+    `scons --app=basicapp`
+  就会在 basicapp/building目录下生成 basicapp.dll。 
+
+  然后运行simulator目录下的 rtthread-win32.exe, 在finsh中运行   
+    `exec("/testdll/basicapp/building/basicapp.dll")` 
+  如果觉得这个路径太长,就把 basicapp.dll复制到 simualtor目录下,执行
+    `exec("/basicapp.dll")`
+
+如果想编译RTGUI应用,如testdll目录下的snake,则需要对RTGUI打一点补丁,共有两个方法
+1. 注释掉 //#define RTGUI_USING_CAST_CHECK`
+找到rtgui_config.h源码,注释掉如下语句 
+//#define RTGUI_USING_CAST_CHECK`
+
+然后在testdll目录下打开CMD窗口,执行`scons --app=snake`,才可以正确编译,如果不注释掉上面的宏,则会出现链接错误。
+
+2. 不注释掉#define RTGUI_USING_CAST_CHECK`
+那么需要如下两个补丁
+1) 修改testdll/SConstruct文件
+diff --git a/bsp/simulator/testdll/SConstruct b/bsp/simulator/testdll/SConstruct
+index 3324f88..005289c 100644
+--- a/bsp/simulator/testdll/SConstruct
++++ b/bsp/simulator/testdll/SConstruct
+@@ -70,6 +70,7 @@ env.Append(CCFLAGS=rtconfig.CFLAGS)
+ env.Append(LINKFLAGS=rtconfig.LFLAGS)
+ env.Append(CPPPATH=CPPPATH)
+ env.Append(LIBS='rtthread', LIBPATH='../')
++env.Append(CPPDEFINES=['RTT_IN_MODULE'])
+ env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
+ 
+ PrepareModuleBuilding(env, RTT_ROOT)
+
+2) 修改RTGUI源码
+diff --git a/components/rtgui/include/rtgui/rtgui_object.h b/components/rtgui/include/rtgui/rtgui_object.h
+index 57fd47f..b32ee17 100644
+--- a/components/rtgui/include/rtgui/rtgui_object.h
++++ b/components/rtgui/include/rtgui/rtgui_object.h
+@@ -56,7 +56,12 @@ extern "C" {
+     typedef struct rtgui_type rtgui_type_t;
+ #define RTGUI_TYPE(type)            (struct rtgui_type*)&(_rtgui_##type)
+ 
++#ifdef RTT_IN_MODULE
++#define DECLARE_CLASS_TYPE(type)    _declspec(dllimport) const struct rtgui_type _rtgui_##type
++#else
+ #define DECLARE_CLASS_TYPE(type)    extern const struct rtgui_type _rtgui_##type
++#endif
++
+ #define DEFINE_CLASS_TYPE(type, name, parent, constructor, destructor, size) \
+     const struct rtgui_type _rtgui_##type = { \
+     name, \
+
+然后再编译snake,可以正确生成。测试方法同basicapp

+ 1430 - 0
bsp/simulator/rtthread.def

@@ -0,0 +1,1430 @@
+EXPORTS
+    MS_VC_EXCEPTION @1 DATA
+    OP_add_byte @2
+    OP_add_dword @3
+    OP_add_word @4
+    OP_and_byte @5
+    OP_and_dword @6
+    OP_and_word @7
+    OP_bw_byte @8
+    OP_bw_dword @9
+    OP_bw_word @10
+    OP_call @11
+    OP_div_byte @12
+    OP_div_dword @13
+    OP_div_word @14
+    OP_ld_byte @15
+    OP_ld_dword @16
+    OP_ld_value_byte @17
+    OP_ld_value_byte_stack @18
+    OP_ld_value_dword @19
+    OP_ld_value_dword_stack @20
+    OP_ld_value_word @21
+    OP_ld_value_word_stack @22
+    OP_ld_word @23
+    OP_mod_byte @24
+    OP_mod_dword @25
+    OP_mod_word @26
+    OP_mul_byte @27
+    OP_mul_dword @28
+    OP_mul_word @29
+    OP_no_op @30
+    OP_or_byte @31
+    OP_or_dword @32
+    OP_or_word @33
+    OP_pop @34
+    OP_shl_byte @35
+    OP_shl_dword @36
+    OP_shl_word @37
+    OP_shr_byte @38
+    OP_shr_dword @39
+    OP_shr_word @40
+    OP_st_byte @41
+    OP_st_dword @42
+    OP_st_word @43
+    OP_sub_byte @44
+    OP_sub_dword @45
+    OP_sub_word @46
+    OP_xor_byte @47
+    OP_xor_dword @48
+    OP_xor_word @49
+    RegisterSimulateInterrupt @50
+    SysTickInterruptHandle @51
+    TriggerSimulateInterrupt @52
+    WinThreadScheduler @53
+    YieldInterruptHandle @54
+    _BufFlush @55
+    _CheckObjBufRef @56
+    _FindMinimunPageIdFromDirtyList @57
+    __fsym_application @58 DATA
+    __fsym_application_desc @59 DATA
+    __fsym_application_name @60 DATA
+    __fsym_cat @61 DATA
+    __fsym_cat_desc @62 DATA
+    __fsym_cat_name @63 DATA
+    __fsym_copy @64 DATA
+    __fsym_copy_desc @65 DATA
+    __fsym_copy_name @66 DATA
+    __fsym_demo_xml @67 DATA
+    __fsym_demo_xml_desc @68 DATA
+    __fsym_demo_xml_name @69 DATA
+    __fsym_df @70 DATA
+    __fsym_df_desc @71 DATA
+    __fsym_df_name @72 DATA
+    __fsym_digfont_file @73 DATA
+    __fsym_digfont_file_desc @74 DATA
+    __fsym_digfont_file_name @75 DATA
+    __fsym_dump_tree @76 DATA
+    __fsym_dump_tree_desc @77 DATA
+    __fsym_dump_tree_name @78 DATA
+    __fsym_hello @79 DATA
+    __fsym_hello_desc @80 DATA
+    __fsym_hello_name @81 DATA
+    __fsym_list @82 DATA
+    __fsym_list_desc @83 DATA
+    __fsym_list_device @84 DATA
+    __fsym_list_device_desc @85 DATA
+    __fsym_list_device_name @86 DATA
+    __fsym_list_event @87 DATA
+    __fsym_list_event_desc @88 DATA
+    __fsym_list_event_name @89 DATA
+    __fsym_list_mailbox @90 DATA
+    __fsym_list_mailbox_desc @91 DATA
+    __fsym_list_mailbox_name @92 DATA
+    __fsym_list_mem @93 DATA
+    __fsym_list_mem_desc @94 DATA
+    __fsym_list_mem_name @95 DATA
+    __fsym_list_mod_detail @96 DATA
+    __fsym_list_mod_detail_desc @97 DATA
+    __fsym_list_mod_detail_name @98 DATA
+    __fsym_list_module @99 DATA
+    __fsym_list_module_desc @100 DATA
+    __fsym_list_module_name @101 DATA
+    __fsym_list_msgqueue @102 DATA
+    __fsym_list_msgqueue_desc @103 DATA
+    __fsym_list_msgqueue_name @104 DATA
+    __fsym_list_mutex @105 DATA
+    __fsym_list_mutex_desc @106 DATA
+    __fsym_list_mutex_name @107 DATA
+    __fsym_list_name @108 DATA
+    __fsym_list_sem @109 DATA
+    __fsym_list_sem_desc @110 DATA
+    __fsym_list_sem_name @111 DATA
+    __fsym_list_thread @112 DATA
+    __fsym_list_thread_desc @113 DATA
+    __fsym_list_thread_name @114 DATA
+    __fsym_list_timer @115 DATA
+    __fsym_list_timer_desc @116 DATA
+    __fsym_list_timer_name @117 DATA
+    __fsym_ls @118 DATA
+    __fsym_ls_desc @119 DATA
+    __fsym_ls_name @120 DATA
+    __fsym_mkdir @121 DATA
+    __fsym_mkdir_desc @122 DATA
+    __fsym_mkdir_name @123 DATA
+    __fsym_mkfs @124 DATA
+    __fsym_mkfs_desc @125 DATA
+    __fsym_mkfs_name @126 DATA
+    __fsym_nand_eraseall @127 DATA
+    __fsym_nand_eraseall_desc @128 DATA
+    __fsym_nand_eraseall_name @129 DATA
+    __fsym_rm @130 DATA
+    __fsym_rm_desc @131 DATA
+    __fsym_rm_name @132 DATA
+    __fsym_rt_hw_exit @133 DATA
+    __fsym_rt_hw_exit_desc @134 DATA
+    __fsym_rt_hw_exit_name @135 DATA
+    __fsym_rt_module_open @136 DATA
+    __fsym_rt_module_open_desc @137 DATA
+    __fsym_rt_module_open_name @138 DATA
+    __fsym_screenshot @139 DATA
+    __fsym_screenshot_desc @140 DATA
+    __fsym_screenshot_name @141 DATA
+    __fsym_sd_erase @142 DATA
+    __fsym_sd_erase_desc @143 DATA
+    __fsym_sd_erase_name @144 DATA
+    __fsym_snake_main @145 DATA
+    __fsym_snake_main_desc @146 DATA
+    __fsym_snake_main_name @147 DATA
+    __fsym_version @148 DATA
+    __fsym_version_desc @149 DATA
+    __fsym_version_name @150 DATA
+    __vsym_dummy @151 DATA
+    __vsym_dummy_desc @152 DATA
+    __vsym_dummy_name @153 DATA
+    _device @154 DATA
+    _draw_default @155
+    _driver @156 DATA
+    _framebuffer_mono_ops @157 DATA
+    _framebuffer_rgb565_ops @158 DATA
+    _framebuffer_rgb565p_ops @159 DATA
+    _onidle @160
+    _pipe @161 DATA
+    _pixel_mono_ops @162 DATA
+    _pixel_rgb565_ops @163 DATA
+    _pixel_rgb565p_ops @164 DATA
+    _pixel_rgb888_ops @165 DATA
+    _rt_errno @166
+    _rtgui_application @167 DATA
+    _rtgui_box @168 DATA
+    _rtgui_button @169 DATA
+    _rtgui_checkbox @170 DATA
+    _rtgui_combobox @171 DATA
+    _rtgui_container @172 DATA
+    _rtgui_cursor @173 DATA
+    _rtgui_digtube @174 DATA
+    _rtgui_edit @175 DATA
+    _rtgui_edit_constructor @176
+    _rtgui_edit_deconstructor @177
+    _rtgui_filelist @178 DATA
+    _rtgui_groupbox @179 DATA
+    _rtgui_iconbox @180 DATA
+    _rtgui_label @181 DATA
+    _rtgui_listbox @182 DATA
+    _rtgui_listctrl @183 DATA
+    _rtgui_listctrl_item_draw @184
+    _rtgui_listview @185 DATA
+    _rtgui_menu @186 DATA
+    _rtgui_mv_model @187 DATA
+    _rtgui_mv_view @188 DATA
+    _rtgui_mywidget @189 DATA
+    _rtgui_notebook @190 DATA
+    _rtgui_object @191 DATA
+    _rtgui_panel @192 DATA
+    _rtgui_plot @193 DATA
+    _rtgui_plot_curve @194 DATA
+    _rtgui_progressbar @195 DATA
+    _rtgui_radiobox @196 DATA
+    _rtgui_scrollbar @197 DATA
+    _rtgui_scrollbar_get_length @198
+    _rtgui_slider @199 DATA
+    _rtgui_staticline @200 DATA
+    _rtgui_textbox @201 DATA
+    _rtgui_textview @202 DATA
+    _rtgui_widget @203 DATA
+    _rtgui_win @204 DATA
+    _rtgui_wintitle @205 DATA
+    _syscall_table_begin @206 DATA
+    _syscall_table_end @207 DATA
+    _sysvar_table_begin @208 DATA
+    _sysvar_table_end @209 DATA
+    animation_event_handler @210
+    application @211
+    application_init @212
+    asc12 @213 DATA
+    asc12_font @214 DATA
+    asc16 @215 DATA
+    asc16_font @216 DATA
+    atoi @217
+    auto_window_close @218
+    benchmark_event_handler @219
+    black @220 DATA
+    blue @221 DATA
+    bmp_align_write @222
+    bmp_font_engine @223 DATA
+    bmpdt @224 DATA
+    cat @225
+    close @226
+    closedir @227
+    clust2sect @228
+    copy @229
+    cos_ydata @230 DATA
+    dark_grey @231 DATA
+    dc_client_engine @232 DATA
+    dc_event_handler @233
+    dc_hw_engine @234 DATA
+    default_background @235 DATA
+    default_foreground @236 DATA
+    demo_bitmap_open @237
+    demo_bitmap_showbox @238
+    demo_edit_event_handler @239
+    demo_edit_get_mem @240
+    demo_edit_readin_file @241
+    demo_edit_saveas_file @242
+    demo_image_rotate @243
+    demo_image_zoom_in @244
+    demo_image_zoom_out @245
+    demo_plot @246
+    demo_view @247
+    demo_view_animation @248
+    demo_view_benchmark @249
+    demo_view_bmp @250
+    demo_view_box @251
+    demo_view_buffer_animation @252
+    demo_view_button @253
+    demo_view_checkbox @254
+    demo_view_combobox @255
+    demo_view_dc @256
+    demo_view_dc_buffer @257
+    demo_view_digtube @258
+    demo_view_edit @259
+    demo_view_get_logic_rect @260
+    demo_view_get_rect @261
+    demo_view_instrument_panel @262
+    demo_view_label @263
+    demo_view_listbox @264
+    demo_view_listctrl @265
+    demo_view_menu @266
+    demo_view_mywidget @267
+    demo_view_next @268
+    demo_view_notebook @269
+    demo_view_prev @270
+    demo_view_progressbar @271
+    demo_view_radiobox @272
+    demo_view_scrollbar @273
+    demo_view_slider @274
+    demo_view_textbox @275
+    demo_view_window @276
+    demo_xml @277
+    df @278
+    dfs_elm_close @279
+    dfs_elm_flush @280
+    dfs_elm_getdents @281
+    dfs_elm_ioctl @282
+    dfs_elm_lseek @283
+    dfs_elm_mkfs @284
+    dfs_elm_mount @285
+    dfs_elm_open @286
+    dfs_elm_read @287
+    dfs_elm_rename @288
+    dfs_elm_stat @289
+    dfs_elm_statfs @290
+    dfs_elm_unlink @291
+    dfs_elm_unmount @292
+    dfs_elm_write @293
+    dfs_file_close @294
+    dfs_file_flush @295
+    dfs_file_getdents @296
+    dfs_file_ioctl @297
+    dfs_file_lseek @298
+    dfs_file_open @299
+    dfs_file_read @300
+    dfs_file_rename @301
+    dfs_file_stat @302
+    dfs_file_unlink @303
+    dfs_file_write @304
+    dfs_filesystem_get_partition @305
+    dfs_filesystem_lookup @306
+    dfs_init @307
+    dfs_lock @308
+    dfs_mkfs @309
+    dfs_mount @310
+    dfs_normalize_path @311
+    dfs_register @312
+    dfs_statfs @313
+    dfs_subdir @314
+    dfs_uffs_init @315
+    dfs_unlock @316
+    dfs_unmount @317
+    dfs_win32_dirdup @318
+    dfs_win32_init @319
+    diag_close @320
+    digfont_file @321
+    digitfont_40 @322 DATA
+    digtube_code_table @323 DATA
+    disable_foreground @324 DATA
+    disk_initialize @325
+    disk_ioctl @326
+    disk_read @327
+    disk_status @328
+    disk_write @329
+    dump_tree @330
+    ecc_hamming_compute256x @331
+    elm_get_vol @332
+    elm_init @333
+    f_chmod @334
+    f_close @335
+    f_getfree @336
+    f_lseek @337
+    f_mkdir @338
+    f_mkfs @339
+    f_mount @340
+    f_open @341
+    f_opendir @342
+    f_read @343
+    f_readdir @344
+    f_rename @345
+    f_seekdir @346
+    f_stat @347
+    f_sync @348
+    f_truncate @349
+    f_unlink @350
+    f_utime @351
+    f_write @352
+    fd_get @353
+    fd_is_open @354
+    fd_new @355
+    fd_put @356
+    fd_table @357 DATA
+    ff_cre_syncobj @358
+    ff_del_syncobj @359
+    ff_rel_grant @360
+    ff_req_grant @361
+    filesystem_operation_table @362 DATA
+    filesystem_table @363 DATA
+    finsh_auto_complete @364
+    finsh_compile_pc @365 DATA
+    finsh_compile_sp @366 DATA
+    finsh_compiler_run @367
+    finsh_errno @368
+    finsh_error_init @369
+    finsh_error_set @370
+    finsh_error_string @371
+    finsh_flush @372
+    finsh_get_device @373
+    finsh_get_echo @374
+    finsh_handle_history @375
+    finsh_heap @376 DATA
+    finsh_heap_allocate @377
+    finsh_heap_free @378
+    finsh_heap_init @379
+    finsh_init @380
+    finsh_node_allocate @381
+    finsh_node_init @382
+    finsh_node_new_char @383
+    finsh_node_new_id @384
+    finsh_node_new_int @385
+    finsh_node_new_long @386
+    finsh_node_new_ptr @387
+    finsh_node_new_string @388
+    finsh_parser_init @389
+    finsh_parser_run @390
+    finsh_pc @391 DATA
+    finsh_push_history @392
+    finsh_reset @393
+    finsh_run_line @394
+    finsh_set_device @395
+    finsh_set_echo @396
+    finsh_sp @397 DATA
+    finsh_stack_bottom @398
+    finsh_syscall_append @399
+    finsh_syscall_lookup @400
+    finsh_system_function_init @401
+    finsh_system_init @402
+    finsh_system_var_init @403
+    finsh_sysvar_append @404
+    finsh_sysvar_lookup @405
+    finsh_thread_entry @406
+    finsh_token_get_token @407
+    finsh_token_init @408
+    finsh_token_token @409
+    finsh_var_delete @410
+    finsh_var_init @411
+    finsh_var_insert @412
+    finsh_var_lookup @413
+    finsh_vm_run @414
+    finsh_vm_stack @415 DATA
+    food_deinit @416
+    food_init @417
+    food_num @418 DATA
+    fstat @419
+    get_fat @420
+    get_fattime @421
+    get_sbar_active_len @422
+    get_scrollbar_pos @423
+    getcwd @424
+    global_errno @425 DATA
+    global_node_table @426 DATA
+    global_syscall_list @427 DATA
+    global_sysvar_list @428 DATA
+    global_variable @429 DATA
+    green @430 DATA
+    heap @431 DATA
+    hello @432
+    high_light @433 DATA
+    hz16 @434 DATA
+    hz16_font @435 DATA
+    hz_bmp_font_engine @436 DATA
+    instrument_panel_event_handler @437
+    isalpha @438
+    isprint @439
+    items @440 DATA
+    kbd_event_set_key @441
+    light_grey @442 DATA
+    list @443
+    list_device @444
+    list_event @445
+    list_mailbox @446
+    list_mem @447
+    list_mod_detail @448
+    list_module @449
+    list_msgqueue @450
+    list_mutex @451
+    list_prefix @452
+    list_sem @453
+    list_thread @454
+    list_timer @455
+    ls @456
+    lseek @457
+    main @458
+    main_win @459 DATA
+    map @460 DATA
+    map_deinit @461
+    map_init @462
+    mkdir @463
+    mkfs @464
+    nand_eraseall @465
+    nand_ops @466 DATA
+    newdir @467 DATA
+    normal_window @468 DATA
+    normal_window_label @469 DATA
+    op_table @470 DATA
+    open @471
+    opendir @472
+    play_image @473 DATA
+    prevdir @474 DATA
+    progressbar_timeout @475
+    put_fat @476
+    read @477
+    readdir @478
+    red @479 DATA
+    rename @480
+    rewinddir @481
+    rgbRecord @482 DATA
+    rm @483
+    rmdir @484
+    rt_application_init @485
+    rt_calloc @486
+    rt_completion_done @487
+    rt_completion_init @488
+    rt_completion_wait @489
+    rt_components_init @490
+    rt_console_get_device @491
+    rt_console_set_device @492
+    rt_current_priority @493 DATA
+    rt_current_thread @494 DATA
+    rt_data_queue_init @495
+    rt_data_queue_peak @496
+    rt_data_queue_pop @497
+    rt_data_queue_push @498
+    rt_data_queue_reset @499
+    rt_device_close @500
+    rt_device_control @501
+    rt_device_find @502
+    rt_device_init @503
+    rt_device_init_all @504
+    rt_device_open @505
+    rt_device_read @506
+    rt_device_register @507
+    rt_device_set_rx_indicate @508
+    rt_device_set_tx_complete @509
+    rt_device_unregister @510
+    rt_device_write @511
+    rt_enter_critical @512
+    rt_event_control @513
+    rt_event_create @514
+    rt_event_delete @515
+    rt_event_detach @516
+    rt_event_init @517
+    rt_event_recv @518
+    rt_event_send @519
+    rt_exit_critical @520
+    rt_free @521
+    rt_free_align @522
+    rt_free_sethook @523
+    rt_get_errno @524
+    rt_hw_board_init @525
+    rt_hw_context_switch @526
+    rt_hw_context_switch_interrupt @527
+    rt_hw_context_switch_to @528
+    rt_hw_exit @529
+    rt_hw_interrupt_disable @530
+    rt_hw_interrupt_enable @531
+    rt_hw_mtd_nand_init @532
+    rt_hw_sdcard_init @533
+    rt_hw_sdl_start @534
+    rt_hw_serial_init @535
+    rt_hw_serial_register @536
+    rt_hw_sram_init @537
+    rt_hw_stack_init @538
+    rt_hw_usart_init @539
+    rt_hw_win32_low_cpu @540
+    rt_init_thread_entry @541
+    rt_interrupt_enter @542
+    rt_interrupt_from_thread @543 DATA
+    rt_interrupt_get_nest @544
+    rt_interrupt_leave @545
+    rt_interrupt_nest @546 DATA
+    rt_interrupt_to_thread @547 DATA
+    rt_kprintf @548
+    rt_lowest_bitmap @549 DATA
+    rt_malloc @550
+    rt_malloc_align @551
+    rt_malloc_sethook @552
+    rt_mb_control @553
+    rt_mb_create @554
+    rt_mb_delete @555
+    rt_mb_detach @556
+    rt_mb_init @557
+    rt_mb_recv @558
+    rt_mb_send @559
+    rt_mb_send_wait @560
+    rt_memcmp @561
+    rt_memcpy @562
+    rt_memmove @563
+    rt_memory_info @564
+    rt_memset @565
+    rt_module_destroy @566
+    rt_module_find @567
+    rt_module_load_sethook @568
+    rt_module_open @569
+    rt_module_self @570
+    rt_module_unload_sethook @571
+    rt_mq_control @572
+    rt_mq_create @573
+    rt_mq_delete @574
+    rt_mq_detach @575
+    rt_mq_init @576
+    rt_mq_recv @577
+    rt_mq_send @578
+    rt_mq_urgent @579
+    rt_mtd_nand_register_device @580
+    rt_mutex_control @581
+    rt_mutex_create @582
+    rt_mutex_delete @583
+    rt_mutex_detach @584
+    rt_mutex_init @585
+    rt_mutex_release @586
+    rt_mutex_take @587
+    rt_object_allocate @588
+    rt_object_attach_sethook @589
+    rt_object_container @590 DATA
+    rt_object_delete @591
+    rt_object_detach @592
+    rt_object_detach_sethook @593
+    rt_object_find @594
+    rt_object_get_information @595
+    rt_object_init @596
+    rt_object_is_systemobject @597
+    rt_object_put_hook @598 DATA
+    rt_object_put_sethook @599
+    rt_object_take_hook @600 DATA
+    rt_object_take_sethook @601
+    rt_object_trytake_hook @602 DATA
+    rt_object_trytake_sethook @603
+    rt_pipe_create @604
+    rt_pipe_destroy @605
+    rt_platform_init @606
+    rt_realloc @607
+    rt_ringbuffer_get @608
+    rt_ringbuffer_getchar @609
+    rt_ringbuffer_init @610
+    rt_ringbuffer_put @611
+    rt_ringbuffer_putchar @612
+    rt_schedule @613
+    rt_schedule_insert_thread @614
+    rt_schedule_remove_thread @615
+    rt_scheduler_sethook @616
+    rt_sem_control @617
+    rt_sem_create @618
+    rt_sem_delete @619
+    rt_sem_detach @620
+    rt_sem_init @621
+    rt_sem_release @622
+    rt_sem_take @623
+    rt_sem_trytake @624
+    rt_set_errno @625
+    rt_show_version @626
+    rt_snprintf @627
+    rt_sprintf @628
+    rt_strcasecmp @629
+    rt_strcmp @630
+    rt_strdup @631
+    rt_strlen @632
+    rt_strncmp @633
+    rt_strncpy @634
+    rt_strstr @635
+    rt_system_heap_init @636
+    rt_system_module_init @637
+    rt_system_object_init @638
+    rt_system_scheduler_init @639
+    rt_system_scheduler_start @640
+    rt_system_tick_init @641
+    rt_system_timer_init @642
+    rt_system_timer_thread_init @643
+    rt_thread_control @644
+    rt_thread_create @645
+    rt_thread_defunct @646 DATA
+    rt_thread_delay @647
+    rt_thread_delete @648
+    rt_thread_detach @649
+    rt_thread_find @650
+    rt_thread_idle_excute @651
+    rt_thread_idle_init @652
+    rt_thread_idle_sethook @653
+    rt_thread_init @654
+    rt_thread_priority_table @655 DATA
+    rt_thread_ready_priority_group @656 DATA
+    rt_thread_resume @657
+    rt_thread_self @658
+    rt_thread_sleep @659
+    rt_thread_startup @660
+    rt_thread_suspend @661
+    rt_thread_switch_interrupt_flag @662 DATA
+    rt_thread_timeout @663
+    rt_thread_yield @664
+    rt_tick_from_millisecond @665
+    rt_tick_get @666
+    rt_tick_increase @667
+    rt_tick_set @668
+    rt_timer_check @669
+    rt_timer_control @670
+    rt_timer_create @671
+    rt_timer_delete @672
+    rt_timer_detach @673
+    rt_timer_init @674
+    rt_timer_next_timeout_tick @675
+    rt_timer_start @676
+    rt_timer_stop @677
+    rt_timer_timeout_sethook @678
+    rt_vsprintf @679
+    rt_win_sharedir_init @680
+    rtgui_ack @681
+    rtgui_app_activate @682
+    rtgui_app_close @683
+    rtgui_app_create @684
+    rtgui_app_destroy @685
+    rtgui_app_event_handler @686
+    rtgui_app_exit @687
+    rtgui_app_get_onidle @688
+    rtgui_app_run @689
+    rtgui_app_self @690
+    rtgui_app_set_as_wm @691
+    rtgui_app_set_main_win @692
+    rtgui_app_set_onidle @693
+    rtgui_bitmap_font_draw_char @694
+    rtgui_blit_line_2_2_inv @695
+    rtgui_blit_line_direct @696
+    rtgui_blit_line_get @697
+    rtgui_blit_line_get_inv @698
+    rtgui_box_create @699
+    rtgui_box_destroy @700
+    rtgui_box_layout @701
+    rtgui_box_layout_rect @702
+    rtgui_button_create @703
+    rtgui_button_destroy @704
+    rtgui_button_event_handler @705
+    rtgui_button_set_onbutton @706
+    rtgui_button_set_pressed_image @707
+    rtgui_button_set_unpressed_image @708
+    rtgui_checkbox_create @709
+    rtgui_checkbox_destroy @710
+    rtgui_checkbox_event_handler @711
+    rtgui_checkbox_get_checked @712
+    rtgui_checkbox_set_checked @713
+    rtgui_checkbox_set_onbutton @714
+    rtgui_combobox_create @715
+    rtgui_combobox_destroy @716
+    rtgui_combobox_event_handler @717
+    rtgui_combobox_pdwin_ondeactive @718
+    rtgui_combobox_pdwin_onitem @719
+    rtgui_combobox_set_onselected @720
+    rtgui_combox_get_select @721
+    rtgui_container_add_child @722
+    rtgui_container_broadcast_event @723
+    rtgui_container_create @724
+    rtgui_container_destroy @725
+    rtgui_container_destroy_children @726
+    rtgui_container_dispatch_event @727
+    rtgui_container_dispatch_mouse_event @728
+    rtgui_container_event_handler @729
+    rtgui_container_get_first_child @730
+    rtgui_container_layout @731
+    rtgui_container_remove_child @732
+    rtgui_container_set_box @733
+    rtgui_dc_begin_drawing @734
+    rtgui_dc_buffer_create @735
+    rtgui_dc_buffer_get_pixel @736
+    rtgui_dc_client_create @737
+    rtgui_dc_client_init @738
+    rtgui_dc_destory @739
+    rtgui_dc_draw_annulus @740
+    rtgui_dc_draw_arc @741
+    rtgui_dc_draw_border @742
+    rtgui_dc_draw_byte @743
+    rtgui_dc_draw_circle @744
+    rtgui_dc_draw_digitfont @745
+    rtgui_dc_draw_digitfont_code @746
+    rtgui_dc_draw_ellipse @747
+    rtgui_dc_draw_focus_rect @748
+    rtgui_dc_draw_horizontal_line @749
+    rtgui_dc_draw_line @750
+    rtgui_dc_draw_mono_bmp @751
+    rtgui_dc_draw_polygon @752
+    rtgui_dc_draw_rect @753
+    rtgui_dc_draw_regular_polygon @754
+    rtgui_dc_draw_round_rect @755
+    rtgui_dc_draw_sector @756
+    rtgui_dc_draw_shaded_rect @757
+    rtgui_dc_draw_text @758
+    rtgui_dc_draw_text_stroke @759
+    rtgui_dc_draw_vertical_line @760
+    rtgui_dc_draw_word @761
+    rtgui_dc_end_drawing @762
+    rtgui_dc_fill_circle @763
+    rtgui_dc_fill_ellipse @764
+    rtgui_dc_fill_polygon @765
+    rtgui_dc_fill_rect_forecolor @766
+    rtgui_dc_fill_round_rect @767
+    rtgui_dc_fill_sector @768
+    rtgui_dc_hw_create @769
+    rtgui_digitfont_create @770
+    rtgui_digtube_create @771
+    rtgui_digtube_destroy @772
+    rtgui_digtube_event_handler @773
+    rtgui_edit_append_line @774
+    rtgui_edit_connect_line @775
+    rtgui_edit_create @776
+    rtgui_edit_delete_line @777
+    rtgui_edit_destroy @778
+    rtgui_edit_event_handler @779
+    rtgui_edit_get_current_point @780
+    rtgui_edit_get_index_by_line @781
+    rtgui_edit_get_line_by_index @782
+    rtgui_edit_get_mem_consume @783
+    rtgui_edit_insert_line @784
+    rtgui_edit_ondraw @785
+    rtgui_edit_readin_file @786
+    rtgui_edit_saveas_file @787
+    rtgui_edit_set_text @788
+    rtgui_edit_update @789
+    rtgui_empty_point @790 DATA
+    rtgui_empty_rect @791 DATA
+    rtgui_filelist_view_create @792
+    rtgui_filelist_view_destroy @793
+    rtgui_filelist_view_event_handler @794
+    rtgui_filelist_view_get_fullpath @795
+    rtgui_filelist_view_ondraw @796
+    rtgui_filelist_view_set_directory @797
+    rtgui_filelist_view_update_current @798
+    rtgui_filerw_close @799
+    rtgui_filerw_create_file @800
+    rtgui_filerw_create_mem @801
+    rtgui_filerw_eof @802
+    rtgui_filerw_mem_getdata @803
+    rtgui_filerw_read @804
+    rtgui_filerw_seek @805
+    rtgui_filerw_tell @806
+    rtgui_filerw_unlink @807
+    rtgui_filerw_write @808
+    rtgui_font_asc12 @809 DATA
+    rtgui_font_asc16 @810 DATA
+    rtgui_font_default @811
+    rtgui_font_derefer @812
+    rtgui_font_draw @813
+    rtgui_font_get_metrics @814
+    rtgui_font_get_string_width @815
+    rtgui_font_hz16 @816 DATA
+    rtgui_font_refer @817
+    rtgui_font_set_defaut @818
+    rtgui_font_system_add_font @819
+    rtgui_font_system_init @820
+    rtgui_font_system_remove_font @821
+    rtgui_framebuffer_get_ops @822
+    rtgui_free @823
+    rtgui_get_digfont_metrics @824
+    rtgui_get_mainwin_rect @825
+    rtgui_get_screen_rect @826
+    rtgui_get_server @827
+    rtgui_graphic_driver_get_default @828
+    rtgui_graphic_driver_get_default_framebuffer @829
+    rtgui_graphic_driver_get_framebuffer @830
+    rtgui_graphic_driver_get_rect @831
+    rtgui_graphic_driver_screen_update @832
+    rtgui_graphic_set_device @833
+    rtgui_groupbox_add_widget @834
+    rtgui_groupbox_create @835
+    rtgui_groupbox_destroy @836
+    rtgui_groupbox_event_handler @837
+    rtgui_groupbox_get_selected @838
+    rtgui_groupbox_layout @839
+    rtgui_groupbox_select_widget @840
+    rtgui_iconbox_create @841
+    rtgui_iconbox_destroy @842
+    rtgui_iconbox_event_handler @843
+    rtgui_iconbox_set_selected @844
+    rtgui_iconbox_set_text_position @845
+    rtgui_image_blit @846
+    rtgui_image_bmp_engine @847 DATA
+    rtgui_image_bmp_header_cfg @848
+    rtgui_image_bmp_init @849
+    rtgui_image_create @850
+    rtgui_image_create_from_file @851
+    rtgui_image_create_from_mem @852
+    rtgui_image_destroy @853
+    rtgui_image_get_engine_by_filename @854
+    rtgui_image_get_rect @855
+    rtgui_image_hdc_engine @856 DATA
+    rtgui_image_hdc_init @857
+    rtgui_image_hdcmm_engine @858 DATA
+    rtgui_image_palette_create @859
+    rtgui_image_register_engine @860
+    rtgui_image_rotate @861
+    rtgui_image_xpm_engine @862 DATA
+    rtgui_image_xpm_init @863
+    rtgui_image_zoom @864
+    rtgui_label_create @865
+    rtgui_label_destroy @866
+    rtgui_label_event_handler @867
+    rtgui_label_get_text @868
+    rtgui_label_set_text @869
+    rtgui_list_view_create @870
+    rtgui_list_view_destroy @871
+    rtgui_list_view_event_handler @872
+    rtgui_list_view_ondraw @873
+    rtgui_list_view_update_list @874
+    rtgui_listbox_create @875
+    rtgui_listbox_destroy @876
+    rtgui_listbox_event_handler @877
+    rtgui_listbox_ondraw @878
+    rtgui_listbox_set_current_item @879
+    rtgui_listbox_set_items @880
+    rtgui_listbox_set_onitem @881
+    rtgui_listctrl_create @882
+    rtgui_listctrl_destroy @883
+    rtgui_listctrl_event_handler @884
+    rtgui_listctrl_get_item_rect @885
+    rtgui_listctrl_set_current_item @886
+    rtgui_listctrl_set_itemheight @887
+    rtgui_listctrl_set_items @888
+    rtgui_listctrl_set_onitem @889
+    rtgui_mainwin_create @890
+    rtgui_malloc @891
+    rtgui_menu_create @892
+    rtgui_menu_destroy @893
+    rtgui_menu_hide @894
+    rtgui_menu_pop @895
+    rtgui_menu_set_onmenuhide @896
+    rtgui_menu_set_onmenupop @897
+    rtgui_mouse_fini @898
+    rtgui_mouse_init @899
+    rtgui_mouse_monitor_append @900
+    rtgui_mouse_monitor_contains_point @901
+    rtgui_mouse_monitor_remove @902
+    rtgui_mouse_moveto @903
+    rtgui_mouse_set_position @904
+    rtgui_mv_model_add_view @905
+    rtgui_mv_model_create @906
+    rtgui_mv_model_destroy @907
+    rtgui_mv_model_get_data @908
+    rtgui_mv_model_has_view @909
+    rtgui_mv_model_notify @910
+    rtgui_mv_model_remove_view @911
+    rtgui_mv_model_set_data @912
+    rtgui_mv_model_set_dimension @913
+    rtgui_mv_view_create @914
+    rtgui_mv_view_destroy @915
+    rtgui_mv_view_foreach_in_model @916
+    rtgui_mywidget_create @917
+    rtgui_mywidget_destroy @918
+    rtgui_mywidget_event_handler @919
+    rtgui_notebook_add @920
+    rtgui_notebook_add_image @921
+    rtgui_notebook_create @922
+    rtgui_notebook_destroy @923
+    rtgui_notebook_event_handler @924
+    rtgui_notebook_get_client_rect @925
+    rtgui_notebook_get_count @926
+    rtgui_notebook_get_current @927
+    rtgui_notebook_get_current_index @928
+    rtgui_notebook_get_widget_at @929
+    rtgui_notebook_remove @930
+    rtgui_notebook_set_current @931
+    rtgui_notebook_set_current_by_index @932
+    rtgui_object_check_cast @933
+    rtgui_object_create @934
+    rtgui_object_destroy @935
+    rtgui_object_event_handler @936
+    rtgui_object_object_type_get @937
+    rtgui_object_set_event_handler @938
+    rtgui_panel_create @939
+    rtgui_panel_destroy @940
+    rtgui_panel_event_handler @941
+    rtgui_pixel_device_get_ops @942
+    rtgui_plot_create @943
+    rtgui_plot_curve_create @944
+    rtgui_plot_curve_destroy @945
+    rtgui_plot_curve_get_x @946
+    rtgui_plot_curve_get_y @947
+    rtgui_plot_curve_set_x @948
+    rtgui_plot_curve_set_y @949
+    rtgui_plot_destroy @950
+    rtgui_plot_event_handler @951
+    rtgui_plot_ondraw @952
+    rtgui_plot_onmvmodel @953
+    rtgui_plot_set_base @954
+    rtgui_progressbar_create @955
+    rtgui_progressbar_destroy @956
+    rtgui_progressbar_event_handler @957
+    rtgui_progressbar_get_range @958
+    rtgui_progressbar_get_value @959
+    rtgui_progressbar_set_range @960
+    rtgui_progressbar_set_value @961
+    rtgui_pushbutton_create @962
+    rtgui_radiobox_create @963
+    rtgui_radiobox_event_handler @964
+    rtgui_radiobox_get_selection @965
+    rtgui_radiobox_set_orientation @966
+    rtgui_radiobox_set_selection @967
+    rtgui_realloc @968
+    rtgui_rect_contains_point @969
+    rtgui_rect_inflate @970
+    rtgui_rect_intersect @971
+    rtgui_rect_is_empty @972
+    rtgui_rect_is_equal @973
+    rtgui_rect_is_intersect @974
+    rtgui_rect_moveto @975
+    rtgui_rect_moveto_align @976
+    rtgui_rect_set @977
+    rtgui_recv @978
+    rtgui_recv_filter @979
+    rtgui_recv_nosuspend @980
+    rtgui_region_append @981
+    rtgui_region_contains_point @982
+    rtgui_region_contains_rectangle @983
+    rtgui_region_copy @984
+    rtgui_region_dump @985
+    rtgui_region_empty @986
+    rtgui_region_extents @987
+    rtgui_region_fini @988
+    rtgui_region_init @989
+    rtgui_region_init_rect @990
+    rtgui_region_init_with_extents @991
+    rtgui_region_intersect @992
+    rtgui_region_intersect_rect @993
+    rtgui_region_inverse @994
+    rtgui_region_is_flat @995
+    rtgui_region_not_empty @996
+    rtgui_region_num_rects @997
+    rtgui_region_rects @998
+    rtgui_region_reset @999
+    rtgui_region_subtract @1000
+    rtgui_region_subtract_rect @1001
+    rtgui_region_translate @1002
+    rtgui_region_union @1003
+    rtgui_region_union_rect @1004
+    rtgui_region_validate @1005
+    rtgui_screen_lock @1006
+    rtgui_screen_unlock @1007
+    rtgui_scrollbar_create @1008
+    rtgui_scrollbar_destroy @1009
+    rtgui_scrollbar_event_handler @1010
+    rtgui_scrollbar_get_thumb_rect @1011
+    rtgui_scrollbar_hide @1012
+    rtgui_scrollbar_ondraw @1013
+    rtgui_scrollbar_set_line_step @1014
+    rtgui_scrollbar_set_onscroll @1015
+    rtgui_scrollbar_set_orientation @1016
+    rtgui_scrollbar_set_page_step @1017
+    rtgui_scrollbar_set_range @1018
+    rtgui_scrollbar_set_thumbbar_len @1019
+    rtgui_scrollbar_set_value @1020
+    rtgui_send @1021
+    rtgui_send_sync @1022
+    rtgui_send_urgent @1023
+    rtgui_server_handle_kbd @1024
+    rtgui_server_handle_monitor_add @1025
+    rtgui_server_handle_monitor_remove @1026
+    rtgui_server_handle_mouse_btn @1027
+    rtgui_server_handle_mouse_motion @1028
+    rtgui_server_handle_update @1029
+    rtgui_server_init @1030
+    rtgui_server_post_event @1031
+    rtgui_server_post_event_sync @1032
+    rtgui_set_mainwin_rect @1033
+    rtgui_slider_create @1034
+    rtgui_slider_event_handler @1035
+    rtgui_slider_get_value @1036
+    rtgui_slider_set_orientation @1037
+    rtgui_slider_set_range @1038
+    rtgui_slider_set_value @1039
+    rtgui_staticline_create @1040
+    rtgui_staticline_destroy @1041
+    rtgui_staticline_event_handler @1042
+    rtgui_staticline_set_orientation @1043
+    rtgui_system_image_init @1044
+    rtgui_system_server_init @1045
+    rtgui_system_theme_init @1046
+    rtgui_textbox_create @1047
+    rtgui_textbox_destroy @1048
+    rtgui_textbox_event_handler @1049
+    rtgui_textbox_get_edit_rect @1050
+    rtgui_textbox_get_mask_char @1051
+    rtgui_textbox_get_value @1052
+    rtgui_textbox_ondraw @1053
+    rtgui_textbox_set_line_length @1054
+    rtgui_textbox_set_mask_char @1055
+    rtgui_textbox_set_value @1056
+    rtgui_textview_create @1057
+    rtgui_textview_destroy @1058
+    rtgui_textview_event_handler @1059
+    rtgui_textview_set_text @1060
+    rtgui_theme_default_bc @1061
+    rtgui_theme_default_fc @1062
+    rtgui_theme_draw_button @1063
+    rtgui_theme_draw_checkbox @1064
+    rtgui_theme_draw_iconbox @1065
+    rtgui_theme_draw_label @1066
+    rtgui_theme_draw_progressbar @1067
+    rtgui_theme_draw_radiobox @1068
+    rtgui_theme_draw_radiobutton @1069
+    rtgui_theme_draw_selected @1070
+    rtgui_theme_draw_slider @1071
+    rtgui_theme_draw_staticline @1072
+    rtgui_theme_draw_textbox @1073
+    rtgui_theme_draw_win @1074
+    rtgui_theme_get_selected_height @1075
+    rtgui_timer_create @1076
+    rtgui_timer_destory @1077
+    rtgui_timer_start @1078
+    rtgui_timer_stop @1079
+    rtgui_topwin_activate @1080
+    rtgui_topwin_activate_topwin @1081
+    rtgui_topwin_add @1082
+    rtgui_topwin_append_monitor_rect @1083
+    rtgui_topwin_dump_tree @1084
+    rtgui_topwin_get_focus @1085
+    rtgui_topwin_get_wnd @1086
+    rtgui_topwin_get_wnd_no_modaled @1087
+    rtgui_topwin_hide @1088
+    rtgui_topwin_init @1089
+    rtgui_topwin_modal_enter @1090
+    rtgui_topwin_move @1091
+    rtgui_topwin_remove @1092
+    rtgui_topwin_remove_monitor_rect @1093
+    rtgui_topwin_resize @1094
+    rtgui_topwin_show @1095
+    rtgui_topwin_title_onmouse @1096
+    rtgui_type_destructors_call @1097
+    rtgui_type_inherits_from @1098
+    rtgui_type_name_get @1099
+    rtgui_type_object_construct @1100
+    rtgui_type_parent_type_get @1101
+    rtgui_widget_create @1102
+    rtgui_widget_destroy @1103
+    rtgui_widget_event_handler @1104
+    rtgui_widget_focus @1105
+    rtgui_widget_get_extent @1106
+    rtgui_widget_get_next_sibling @1107
+    rtgui_widget_get_parent_background @1108
+    rtgui_widget_get_parent_foreground @1109
+    rtgui_widget_get_prev_sibling @1110
+    rtgui_widget_get_rect @1111
+    rtgui_widget_get_toplevel @1112
+    rtgui_widget_hide @1113
+    rtgui_widget_move_to_logic @1114
+    rtgui_widget_onhide @1115
+    rtgui_widget_onshow @1116
+    rtgui_widget_onupdate_toplvl @1117
+    rtgui_widget_point_to_device @1118
+    rtgui_widget_point_to_logic @1119
+    rtgui_widget_rect_to_device @1120
+    rtgui_widget_rect_to_logic @1121
+    rtgui_widget_set_border @1122
+    rtgui_widget_set_minheight @1123
+    rtgui_widget_set_minsize @1124
+    rtgui_widget_set_minwidth @1125
+    rtgui_widget_set_onfocus @1126
+    rtgui_widget_set_onunfocus @1127
+    rtgui_widget_set_parent @1128
+    rtgui_widget_set_rect @1129
+    rtgui_widget_set_rectangle @1130
+    rtgui_widget_show @1131
+    rtgui_widget_unfocus @1132
+    rtgui_widget_update @1133
+    rtgui_widget_update_clip @1134
+    rtgui_win_activate @1135
+    rtgui_win_close @1136
+    rtgui_win_create @1137
+    rtgui_win_destroy @1138
+    rtgui_win_end_modal @1139
+    rtgui_win_event_handler @1140
+    rtgui_win_get_title @1141
+    rtgui_win_hide @1142
+    rtgui_win_is_activated @1143
+    rtgui_win_move @1144
+    rtgui_win_set_onactivate @1145
+    rtgui_win_set_onclose @1146
+    rtgui_win_set_ondeactivate @1147
+    rtgui_win_set_onkey @1148
+    rtgui_win_set_rect @1149
+    rtgui_win_set_title @1150
+    rtgui_win_show @1151
+    rtgui_win_update_clip @1152
+    rtgui_wintitle_create @1153
+    rtgui_wintitle_destroy @1154
+    rtgui_wintitle_get_title @1155
+    rtgui_wintitle_set_title @1156
+    rtgui_xml_create @1157
+    rtgui_xml_destroy @1158
+    rtgui_xml_event_str @1159
+    rtgui_xml_parse @1160
+    rtthread_startup @1161
+    run_state @1162 DATA
+    screenshot @1163
+    sd_erase @1164
+    second_node @1165 DATA
+    seekdir @1166
+    seial_save_byte @1167
+    selected_color @1168 DATA
+    serial1 @1169 DATA
+    shell @1170 DATA
+    sin_ydata @1171 DATA
+    snake_deinit @1172
+    snake_head @1173 DATA
+    snake_init @1174
+    snake_len @1175 DATA
+    snake_main @1176
+    snake_restart @1177
+    snake_step @1178
+    stat @1179
+    statfs @1180
+    stop_image @1181 DATA
+    strcasecmp @1182
+    strcmp @1183
+    strdup @1184
+    telldir @1185
+    text_segment @1186 DATA
+    the_notebook @1187 DATA
+    timeout @1188
+    token_get_string @1189
+    uffs_BadBlockAdd @1190
+    uffs_BadBlockInit @1191
+    uffs_BadBlockProcess @1192
+    uffs_BadBlockProcessSuspend @1193
+    uffs_BadBlockRecover @1194
+    uffs_BlockInfoExpire @1195
+    uffs_BlockInfoExpireAll @1196
+    uffs_BlockInfoFindInCache @1197
+    uffs_BlockInfoGet @1198
+    uffs_BlockInfoInitCache @1199
+    uffs_BlockInfoIsAllFree @1200
+    uffs_BlockInfoLoad @1201
+    uffs_BlockInfoPut @1202
+    uffs_BlockInfoReleaseCache @1203
+    uffs_BreakFromEntry @1204
+    uffs_BufClone @1205
+    uffs_BufDecRef @1206
+    uffs_BufFind @1207
+    uffs_BufFindFreeGroupSlot @1208
+    uffs_BufFindFrom @1209
+    uffs_BufFindGroupSlot @1210
+    uffs_BufFlush @1211
+    uffs_BufFlushAll @1212
+    uffs_BufFlushEx @1213
+    uffs_BufFlushGroup @1214
+    uffs_BufFlushGroupEx @1215
+    uffs_BufFlushGroupMatchParent @1216
+    uffs_BufFlushMostDirtyGroup @1217
+    uffs_BufFreeClone @1218
+    uffs_BufGet @1219
+    uffs_BufGetEx @1220
+    uffs_BufIncRef @1221
+    uffs_BufInit @1222
+    uffs_BufInspect @1223
+    uffs_BufIsAllEmpty @1224
+    uffs_BufIsAllFree @1225
+    uffs_BufLoadPhyData @1226
+    uffs_BufLockGroup @1227
+    uffs_BufMarkEmpty @1228
+    uffs_BufNew @1229
+    uffs_BufPut @1230
+    uffs_BufRead @1231
+    uffs_BufReleaseAll @1232
+    uffs_BufSetAllEmpty @1233
+    uffs_BufUnLockGroup @1234
+    uffs_BufWrite @1235
+    uffs_BuildTree @1236
+    uffs_CloseObject @1237
+    uffs_CompareFileName @1238
+    uffs_CreateNewFile @1239
+    uffs_CreateObject @1240
+    uffs_CreateObjectEx @1241
+    uffs_DeleteObject @1242
+    uffs_DeviceInitLock @1243
+    uffs_DeviceLock @1244
+    uffs_DeviceReleaseLock @1245
+    uffs_DeviceUnLock @1246
+    uffs_DirEntryBufGetPool @1247
+    uffs_DirEntryBufInit @1248
+    uffs_DirEntryBufPutAll @1249
+    uffs_DirEntryBufRelease @1250
+    uffs_DumpDevice @1251
+    uffs_EccCorrect @1252
+    uffs_EccCorrect8 @1253
+    uffs_EccMake @1254
+    uffs_EccMake8 @1255
+    uffs_EndOfFile @1256
+    uffs_FdSignatureIncrease @1257
+    uffs_FindBestPageInBlock @1258
+    uffs_FindFirstFreePage @1259
+    uffs_FindFreeFsnSerial @1260
+    uffs_FindFromTree @1261
+    uffs_FindObjectClose @1262
+    uffs_FindObjectCount @1263
+    uffs_FindObjectFirst @1264
+    uffs_FindObjectNext @1265
+    uffs_FindObjectOpen @1266
+    uffs_FindObjectOpenEx @1267
+    uffs_FindObjectRewind @1268
+    uffs_FindObjectTell @1269
+    uffs_FindPageInBlockWithPageId @1270
+    uffs_FlashCheckErasedBlock @1271
+    uffs_FlashEraseBlock @1272
+    uffs_FlashInterfaceInit @1273
+    uffs_FlashInterfaceRelease @1274
+    uffs_FlashIsBadBlock @1275
+    uffs_FlashMakeSpare @1276
+    uffs_FlashMarkBadBlock @1277
+    uffs_FlashMarkDirtyPage @1278
+    uffs_FlashReadPage @1279
+    uffs_FlashReadPageTag @1280
+    uffs_FlashUnloadSpare @1281
+    uffs_FlashWritePageCombine @1282
+    uffs_FlushObject @1283
+    uffs_FormatDevice @1284
+    uffs_GetBlockFileDataLength @1285
+    uffs_GetBlockTimeStamp @1286
+    uffs_GetCurDateTime @1287
+    uffs_GetCurOffset @1288
+    uffs_GetDeviceFree @1289
+    uffs_GetDeviceFromMountPoint @1290
+    uffs_GetDeviceFromMountPointEx @1291
+    uffs_GetDeviceMountPoint @1292
+    uffs_GetDeviceTotal @1293
+    uffs_GetDeviceUsed @1294
+    uffs_GetFirstBlockTimeStamp @1295
+    uffs_GetFreeObjectHandlers @1296
+    uffs_GetFreePagesCount @1297
+    uffs_GetMainVersion @1298
+    uffs_GetMatchedMountPointSize @1299
+    uffs_GetMinorVersion @1300
+    uffs_GetNextBlockTimeStamp @1301
+    uffs_GetObject @1302
+    uffs_GetObjectByIndex @1303
+    uffs_GetObjectIndex @1304
+    uffs_GetObjectInfo @1305
+    uffs_GetObjectPool @1306
+    uffs_GetTrivialVersion @1307
+    uffs_GetVersion @1308
+    uffs_GlobalFsLockLock @1309
+    uffs_GlobalFsLockUnlock @1310
+    uffs_InitDevice @1311
+    uffs_InitFileSystemObjects @1312
+    uffs_InitGlobalFsLock @1313
+    uffs_InitObjectBuf @1314
+    uffs_InsertNodeToTree @1315
+    uffs_InsertToErasedListHead @1316
+    uffs_IsBlockPagesFullUsed @1317
+    uffs_IsPageErased @1318
+    uffs_IsSrcNewerThanObj @1319
+    uffs_IsThisBlockUsed @1320
+    uffs_LoadMiniHeader @1321
+    uffs_LoadPhyDataToBufEccUnCare @1322
+    uffs_MakeSum16 @1323
+    uffs_MakeSum8 @1324
+    uffs_MemSetupSystemAllocator @1325
+    uffs_Mount @1326
+    uffs_MoveObjectEx @1327
+    uffs_MtbGetMounted @1328
+    uffs_MtbGetUnMounted @1329
+    uffs_OSGetTaskId @1330
+    uffs_OpenObject @1331
+    uffs_OpenObjectEx @1332
+    uffs_ParseObject @1333
+    uffs_PoolCheckFreeList @1334
+    uffs_PoolFindNextAllocated @1335
+    uffs_PoolGet @1336
+    uffs_PoolGetBufByIndex @1337
+    uffs_PoolGetFreeCount @1338
+    uffs_PoolGetIndex @1339
+    uffs_PoolGetLocked @1340
+    uffs_PoolInit @1341
+    uffs_PoolPut @1342
+    uffs_PoolPutAll @1343
+    uffs_PoolPutLocked @1344
+    uffs_PoolRelease @1345
+    uffs_PoolVerify @1346
+    uffs_PutAllObjectBuf @1347
+    uffs_PutDevice @1348
+    uffs_PutObject @1349
+    uffs_ReInitObject @1350
+    uffs_ReadObject @1351
+    uffs_RegisterMountTable @1352
+    uffs_ReleaseDevice @1353
+    uffs_ReleaseFileSystemObjects @1354
+    uffs_ReleaseGlobalFsLock @1355
+    uffs_ReleaseObjectBuf @1356
+    uffs_RenameObject @1357
+    uffs_SeekObject @1358
+    uffs_SemCreate @1359
+    uffs_SemDelete @1360
+    uffs_SemSignal @1361
+    uffs_SemWait @1362
+    uffs_SetupDebugOutput @1363
+    uffs_TreeCompareFileName @1364
+    uffs_TreeFindBadNodeByBlock @1365
+    uffs_TreeFindDataNode @1366
+    uffs_TreeFindDataNodeByBlock @1367
+    uffs_TreeFindDirNode @1368
+    uffs_TreeFindDirNodeByBlock @1369
+    uffs_TreeFindDirNodeByName @1370
+    uffs_TreeFindDirNodeWithParent @1371
+    uffs_TreeFindErasedNodeByBlock @1372
+    uffs_TreeFindFileNode @1373
+    uffs_TreeFindFileNodeByBlock @1374
+    uffs_TreeFindFileNodeByName @1375
+    uffs_TreeFindFileNodeWithParent @1376
+    uffs_TreeFindNodeByBlock @1377
+    uffs_TreeFindSuspendNode @1378
+    uffs_TreeGetErasedNode @1379
+    uffs_TreeInit @1380
+    uffs_TreeInsertToBadBlockList @1381
+    uffs_TreeInsertToErasedListTail @1382
+    uffs_TreeInsertToErasedListTailEx @1383
+    uffs_TreeRelease @1384
+    uffs_TreeRemoveSuspendNode @1385
+    uffs_TreeSetNodeBlock @1386
+    uffs_TreeSuspendAdd @1387
+    uffs_TruncateObject @1388
+    uffs_UnMount @1389
+    uffs_UnRegisterMountTable @1390
+    uffs_Version2Str @1391
+    uffs_WriteObject @1392
+    uffs_close @1393
+    uffs_closedir @1394
+    uffs_crc16sum @1395
+    uffs_crc16update @1396
+    uffs_eof @1397
+    uffs_flush @1398
+    uffs_flush_all @1399
+    uffs_format @1400
+    uffs_fstat @1401
+    uffs_ftruncate @1402
+    uffs_get_error @1403
+    uffs_lstat @1404
+    uffs_mkdir @1405
+    uffs_open @1406
+    uffs_opendir @1407
+    uffs_read @1408
+    uffs_readdir @1409
+    uffs_remove @1410
+    uffs_rename @1411
+    uffs_rewinddir @1412
+    uffs_rmdir @1413
+    uffs_seek @1414
+    uffs_seekdir @1415
+    uffs_set_error @1416
+    uffs_setup_storage @1417
+    uffs_space_free @1418
+    uffs_space_total @1419
+    uffs_space_used @1420
+    uffs_stat @1421
+    uffs_tell @1422
+    uffs_version @1423
+    uffs_write @1424
+    unlink @1425
+    version @1426
+    white @1427 DATA
+    write @1428
+    xml_str @1429 DATA

+ 304 - 276
components/net/lwip/src/netif/ethernetif.c

@@ -12,15 +12,16 @@
  * 2010-07-07     Bernard      fix send mail to mailbox issue.
  * 2011-07-30     mbbill       port lwIP 1.4.0 to RT-Thread
  * 2012-04-10     Bernard      add more compatible with RT-Thread.
- * 2012-11-12     Bernard      The network interface can be initialized 
+ * 2012-11-12     Bernard      The network interface can be initialized
  *                             after lwIP initialization.
+ * 2013-02-28     aozima       fixed list_tcps bug: ipaddr_ntoa isn't reentrant.
  */
 
 /*
  * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved. 
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *
  * 1. Redistributions of source code must retain the above copyright notice,
@@ -29,21 +30,21 @@
  *    this list of conditions and the following disclaimer in the documentation
  *    and/or other materials provided with the distribution.
  * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission. 
+ *    derived from this software without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
  * OF SUCH DAMAGE.
  *
  * This file is part of the lwIP TCP/IP stack.
- * 
+ *
  * Author: Adam Dunkels <adam@sics.se>
  *
  */
@@ -71,8 +72,8 @@
  */
 struct eth_tx_msg
 {
-	struct netif 	*netif;
-	struct pbuf 	*buf;
+    struct netif 	*netif;
+    struct pbuf 	*buf;
 };
 
 static struct rt_mailbox eth_tx_thread_mb;
@@ -99,288 +100,288 @@ static char eth_rx_thread_stack[RT_LWIP_ETHTHREAD_STACKSIZE];
 
 static err_t ethernetif_linkoutput(struct netif *netif, struct pbuf *p)
 {
-	struct eth_tx_msg msg;
-	struct eth_device* enetif;
+    struct eth_tx_msg msg;
+    struct eth_device* enetif;
 
-	enetif = (struct eth_device*)netif->state;
+    enetif = (struct eth_device*)netif->state;
 
-	/* send a message to eth tx thread */
-	msg.netif = netif;
-	msg.buf   = p;
-	if (rt_mb_send(&eth_tx_thread_mb, (rt_uint32_t) &msg) == RT_EOK)
-	{
-		/* waiting for ack */
-		rt_sem_take(&(enetif->tx_ack), RT_WAITING_FOREVER);
-	}
+    /* send a message to eth tx thread */
+    msg.netif = netif;
+    msg.buf   = p;
+    if (rt_mb_send(&eth_tx_thread_mb, (rt_uint32_t) &msg) == RT_EOK)
+    {
+        /* waiting for ack */
+        rt_sem_take(&(enetif->tx_ack), RT_WAITING_FOREVER);
+    }
 
-	return ERR_OK;
+    return ERR_OK;
 }
 
 static err_t eth_netif_device_init(struct netif *netif)
 {
-	struct eth_device *ethif;
+    struct eth_device *ethif;
 
-	ethif = (struct eth_device*)netif->state;
-	if (ethif != RT_NULL)
-	{
-		rt_device_t device;
+    ethif = (struct eth_device*)netif->state;
+    if (ethif != RT_NULL)
+    {
+        rt_device_t device;
 
-		/* get device object */
-		device = (rt_device_t) ethif;
-		if (rt_device_init(device) != RT_EOK)
-		{
-			return ERR_IF;
-		}
+        /* get device object */
+        device = (rt_device_t) ethif;
+        if (rt_device_init(device) != RT_EOK)
+        {
+            return ERR_IF;
+        }
 
-		/* copy device flags to netif flags */
-		netif->flags = ethif->flags;
+        /* copy device flags to netif flags */
+        netif->flags = ethif->flags;
 
-		/* set default netif */
-		if (netif_default == RT_NULL)
-			netif_set_default(ethif->netif);
+        /* set default netif */
+        if (netif_default == RT_NULL)
+            netif_set_default(ethif->netif);
 
 #if LWIP_DHCP
-		if (ethif->flags & NETIF_FLAG_DHCP)
-		{
-			/* if this interface uses DHCP, start the DHCP client */
-			dhcp_start(ethif->netif);
-		}
-		else
+        if (ethif->flags & NETIF_FLAG_DHCP)
+        {
+            /* if this interface uses DHCP, start the DHCP client */
+            dhcp_start(ethif->netif);
+        }
+        else
 #endif
-		{
-			/* set interface up */
-			netif_set_up(ethif->netif);
-		}
+        {
+            /* set interface up */
+            netif_set_up(ethif->netif);
+        }
 
 #ifdef LWIP_NETIF_LINK_CALLBACK
-		netif_set_link_up(ethif->netif);
+        netif_set_link_up(ethif->netif);
 #endif
 
-		return ERR_OK;
-	}
+        return ERR_OK;
+    }
 
-	return ERR_IF;
+    return ERR_IF;
 }
 
 /* Keep old drivers compatible in RT-Thread */
 rt_err_t eth_device_init_with_flag(struct eth_device *dev, char *name, rt_uint8_t flags)
 {
-	struct netif* netif;
-
-	netif = (struct netif*) rt_malloc (sizeof(struct netif));
-	if (netif == RT_NULL)
-	{
-		rt_kprintf("malloc netif failed\n");
-		return -RT_ERROR;
-	}
-	rt_memset(netif, 0, sizeof(struct netif));
-
-	/* set netif */
-	dev->netif = netif;
-	/* device flags, which will be set to netif flags when initializing */
-	dev->flags = flags;
-	/* link changed status of device */
-	dev->link_changed = 0x00;
-	dev->parent.type = RT_Device_Class_NetIf;
-	/* register to RT-Thread device manager */
-	rt_device_register(&(dev->parent), name, RT_DEVICE_FLAG_RDWR);
-	rt_sem_init(&(dev->tx_ack), name, 0, RT_IPC_FLAG_FIFO);
-
-	/* set name */
-	netif->name[0] = name[0];
-	netif->name[1] = name[1];
-
-	/* set hw address to 6 */
-	netif->hwaddr_len 	= 6;
-	/* maximum transfer unit */
-	netif->mtu			= ETHERNET_MTU;
-
-	/* get hardware MAC address */
-	rt_device_control(&(dev->parent), NIOCTL_GADDR, netif->hwaddr);
-
-	/* set output */
-	netif->output		= etharp_output;
-	netif->linkoutput	= ethernetif_linkoutput;
-
-	/* if tcp thread has been started up, we add this netif to the system */
-	if (rt_thread_find("tcpip") != RT_NULL)
-	{
-		struct ip_addr ipaddr, netmask, gw;
+    struct netif* netif;
+
+    netif = (struct netif*) rt_malloc (sizeof(struct netif));
+    if (netif == RT_NULL)
+    {
+        rt_kprintf("malloc netif failed\n");
+        return -RT_ERROR;
+    }
+    rt_memset(netif, 0, sizeof(struct netif));
+
+    /* set netif */
+    dev->netif = netif;
+    /* device flags, which will be set to netif flags when initializing */
+    dev->flags = flags;
+    /* link changed status of device */
+    dev->link_changed = 0x00;
+    dev->parent.type = RT_Device_Class_NetIf;
+    /* register to RT-Thread device manager */
+    rt_device_register(&(dev->parent), name, RT_DEVICE_FLAG_RDWR);
+    rt_sem_init(&(dev->tx_ack), name, 0, RT_IPC_FLAG_FIFO);
+
+    /* set name */
+    netif->name[0] = name[0];
+    netif->name[1] = name[1];
+
+    /* set hw address to 6 */
+    netif->hwaddr_len 	= 6;
+    /* maximum transfer unit */
+    netif->mtu			= ETHERNET_MTU;
+
+    /* get hardware MAC address */
+    rt_device_control(&(dev->parent), NIOCTL_GADDR, netif->hwaddr);
+
+    /* set output */
+    netif->output		= etharp_output;
+    netif->linkoutput	= ethernetif_linkoutput;
+
+    /* if tcp thread has been started up, we add this netif to the system */
+    if (rt_thread_find("tcpip") != RT_NULL)
+    {
+        struct ip_addr ipaddr, netmask, gw;
 
 #if !LWIP_DHCP
-		IP4_ADDR(&ipaddr, RT_LWIP_IPADDR0, RT_LWIP_IPADDR1, RT_LWIP_IPADDR2, RT_LWIP_IPADDR3);
-		IP4_ADDR(&gw, RT_LWIP_GWADDR0, RT_LWIP_GWADDR1, RT_LWIP_GWADDR2, RT_LWIP_GWADDR3);
-		IP4_ADDR(&netmask, RT_LWIP_MSKADDR0, RT_LWIP_MSKADDR1, RT_LWIP_MSKADDR2, RT_LWIP_MSKADDR3);
+        IP4_ADDR(&ipaddr, RT_LWIP_IPADDR0, RT_LWIP_IPADDR1, RT_LWIP_IPADDR2, RT_LWIP_IPADDR3);
+        IP4_ADDR(&gw, RT_LWIP_GWADDR0, RT_LWIP_GWADDR1, RT_LWIP_GWADDR2, RT_LWIP_GWADDR3);
+        IP4_ADDR(&netmask, RT_LWIP_MSKADDR0, RT_LWIP_MSKADDR1, RT_LWIP_MSKADDR2, RT_LWIP_MSKADDR3);
 #else
-		IP4_ADDR(&ipaddr, 0, 0, 0, 0);
-		IP4_ADDR(&gw, 0, 0, 0, 0);
-		IP4_ADDR(&netmask, 0, 0, 0, 0);
+        IP4_ADDR(&ipaddr, 0, 0, 0, 0);
+        IP4_ADDR(&gw, 0, 0, 0, 0);
+        IP4_ADDR(&netmask, 0, 0, 0, 0);
 #endif
-	
-		netifapi_netif_add(netif, &ipaddr, &netmask, &gw, dev, eth_netif_device_init, tcpip_input);
-	}
 
-	return RT_EOK;
+        netifapi_netif_add(netif, &ipaddr, &netmask, &gw, dev, eth_netif_device_init, tcpip_input);
+    }
+
+    return RT_EOK;
 }
 
 rt_err_t eth_device_init(struct eth_device * dev, char *name)
 {
-	rt_uint8_t flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
+    rt_uint8_t flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
 
 #if LWIP_DHCP
-	/* DHCP support */
-	flags |= NETIF_FLAG_DHCP;
+    /* DHCP support */
+    flags |= NETIF_FLAG_DHCP;
 #endif
 
 #if LWIP_IGMP
-	/* IGMP support */
-	flags |= NETIF_FLAG_IGMP;
+    /* IGMP support */
+    flags |= NETIF_FLAG_IGMP;
 #endif
 
-	return eth_device_init_with_flag(dev, name, flags);
+    return eth_device_init_with_flag(dev, name, flags);
 }
 
 rt_err_t eth_device_ready(struct eth_device* dev)
 {
-	if (dev->netif)
-		/* post message to Ethernet thread */
-		return rt_mb_send(&eth_rx_thread_mb, (rt_uint32_t)dev);
-	else
-		return ERR_OK; /* netif is not initialized yet, just return. */
+    if (dev->netif)
+        /* post message to Ethernet thread */
+        return rt_mb_send(&eth_rx_thread_mb, (rt_uint32_t)dev);
+    else
+        return ERR_OK; /* netif is not initialized yet, just return. */
 }
 
 rt_err_t eth_device_linkchange(struct eth_device* dev, rt_bool_t up)
 {
-	rt_uint32_t level;
+    rt_uint32_t level;
 
-	RT_ASSERT(dev != RT_NULL);
+    RT_ASSERT(dev != RT_NULL);
 
-	level = rt_hw_interrupt_disable();
-	dev->link_changed = 0x01;
-	if (up == RT_TRUE)
-		dev->link_status = 0x01;
-	else
-		dev->link_status = 0x00;
-	rt_hw_interrupt_enable(level);
+    level = rt_hw_interrupt_disable();
+    dev->link_changed = 0x01;
+    if (up == RT_TRUE)
+        dev->link_status = 0x01;
+    else
+        dev->link_status = 0x00;
+    rt_hw_interrupt_enable(level);
 
-	/* post message to ethernet thread */
-	return rt_mb_send(&eth_rx_thread_mb, (rt_uint32_t)dev);
+    /* post message to ethernet thread */
+    return rt_mb_send(&eth_rx_thread_mb, (rt_uint32_t)dev);
 }
 
 /* Ethernet Tx Thread */
 static void eth_tx_thread_entry(void* parameter)
 {
-	struct eth_tx_msg* msg;
-
-	while (1)
-	{
-		if (rt_mb_recv(&eth_tx_thread_mb, (rt_uint32_t*)&msg, RT_WAITING_FOREVER) == RT_EOK)
- 		{
-			struct eth_device* enetif;
-
-			RT_ASSERT(msg->netif != RT_NULL);
-			RT_ASSERT(msg->buf   != RT_NULL);
-
-			enetif = (struct eth_device*)msg->netif->state;
-			if (enetif != RT_NULL)
-			{
-				/* call driver's interface */
-				if (enetif->eth_tx(&(enetif->parent), msg->buf) != RT_EOK)
-				{
-					rt_kprintf("transmit eth packet failed\n");
-				}
-			}
-
-			/* send ACK */
-			rt_sem_release(&(enetif->tx_ack));
-		}
-	}
+    struct eth_tx_msg* msg;
+
+    while (1)
+    {
+        if (rt_mb_recv(&eth_tx_thread_mb, (rt_uint32_t*)&msg, RT_WAITING_FOREVER) == RT_EOK)
+        {
+            struct eth_device* enetif;
+
+            RT_ASSERT(msg->netif != RT_NULL);
+            RT_ASSERT(msg->buf   != RT_NULL);
+
+            enetif = (struct eth_device*)msg->netif->state;
+            if (enetif != RT_NULL)
+            {
+                /* call driver's interface */
+                if (enetif->eth_tx(&(enetif->parent), msg->buf) != RT_EOK)
+                {
+                    rt_kprintf("transmit eth packet failed\n");
+                }
+            }
+
+            /* send ACK */
+            rt_sem_release(&(enetif->tx_ack));
+        }
+    }
 }
 
 /* Ethernet Rx Thread */
 static void eth_rx_thread_entry(void* parameter)
 {
-	struct eth_device* device;
-
-	while (1)
-	{
-		if (rt_mb_recv(&eth_rx_thread_mb, (rt_uint32_t*)&device, RT_WAITING_FOREVER) == RT_EOK)
- 		{
-			struct pbuf *p;
-
-			/* check link status */
-			if (device->link_changed)
-			{
-				int status;
-				rt_uint32_t level;
-
-				level = rt_hw_interrupt_disable();
-				status = device->link_status;
-				device->link_changed = 0x00;
-				rt_hw_interrupt_enable(level);
-
-				if (status)
-					netifapi_netif_set_link_up(device->netif);
-				else
-					netifapi_netif_set_link_down(device->netif);
-			}
-
-			/* receive all of buffer */
-			while (1)
-			{
-				p = device->eth_rx(&(device->parent));
-				if (p != RT_NULL)
-				{
-					/* notify to upper layer */
-					if( device->netif->input(p, device->netif) != ERR_OK )
-					{
-						LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: Input error\n"));
-       					pbuf_free(p);
-       					p = NULL;
-					}
-				}
-				else break;
-			}
-		}
-		else
-		{
-			LWIP_ASSERT("Should not happen!\n",0);
-		}
-	}
+    struct eth_device* device;
+
+    while (1)
+    {
+        if (rt_mb_recv(&eth_rx_thread_mb, (rt_uint32_t*)&device, RT_WAITING_FOREVER) == RT_EOK)
+        {
+            struct pbuf *p;
+
+            /* check link status */
+            if (device->link_changed)
+            {
+                int status;
+                rt_uint32_t level;
+
+                level = rt_hw_interrupt_disable();
+                status = device->link_status;
+                device->link_changed = 0x00;
+                rt_hw_interrupt_enable(level);
+
+                if (status)
+                    netifapi_netif_set_link_up(device->netif);
+                else
+                    netifapi_netif_set_link_down(device->netif);
+            }
+
+            /* receive all of buffer */
+            while (1)
+            {
+                p = device->eth_rx(&(device->parent));
+                if (p != RT_NULL)
+                {
+                    /* notify to upper layer */
+                    if( device->netif->input(p, device->netif) != ERR_OK )
+                    {
+                        LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: Input error\n"));
+                        pbuf_free(p);
+                        p = NULL;
+                    }
+                }
+                else break;
+            }
+        }
+        else
+        {
+            LWIP_ASSERT("Should not happen!\n",0);
+        }
+    }
 }
 
 void eth_system_device_init()
 {
-	rt_err_t result = RT_EOK;
-
-	/* initialize Rx thread.
-	 * initialize mailbox and create Ethernet Rx thread */
-	result = rt_mb_init(&eth_rx_thread_mb, "erxmb",
-		&eth_rx_thread_mb_pool[0], sizeof(eth_rx_thread_mb_pool)/4,
-		RT_IPC_FLAG_FIFO);
-	RT_ASSERT(result == RT_EOK);
-
-	result = rt_thread_init(&eth_rx_thread, "erx", eth_rx_thread_entry, RT_NULL,
-		&eth_rx_thread_stack[0], sizeof(eth_rx_thread_stack),
-		RT_LWIP_ETHTHREAD_PRIORITY, 16);
-	RT_ASSERT(result == RT_EOK);
-	result = rt_thread_startup(&eth_rx_thread);
-	RT_ASSERT(result == RT_EOK);
-
-	/* initialize Tx thread */
-	/* initialize mailbox and create Ethernet Tx thread */
-	result = rt_mb_init(&eth_tx_thread_mb, "etxmb",
-		&eth_tx_thread_mb_pool[0], sizeof(eth_tx_thread_mb_pool)/4,
-		RT_IPC_FLAG_FIFO);
-	RT_ASSERT(result == RT_EOK);
-
-	result = rt_thread_init(&eth_tx_thread, "etx", eth_tx_thread_entry, RT_NULL,
-		&eth_tx_thread_stack[0], sizeof(eth_tx_thread_stack),
-		RT_ETHERNETIF_THREAD_PREORITY, 16);
-	RT_ASSERT(result == RT_EOK);
-
-	result = rt_thread_startup(&eth_tx_thread);
-	RT_ASSERT(result == RT_EOK);
+    rt_err_t result = RT_EOK;
+
+    /* initialize Rx thread.
+     * initialize mailbox and create Ethernet Rx thread */
+    result = rt_mb_init(&eth_rx_thread_mb, "erxmb",
+                        &eth_rx_thread_mb_pool[0], sizeof(eth_rx_thread_mb_pool)/4,
+                        RT_IPC_FLAG_FIFO);
+    RT_ASSERT(result == RT_EOK);
+
+    result = rt_thread_init(&eth_rx_thread, "erx", eth_rx_thread_entry, RT_NULL,
+                            &eth_rx_thread_stack[0], sizeof(eth_rx_thread_stack),
+                            RT_LWIP_ETHTHREAD_PRIORITY, 16);
+    RT_ASSERT(result == RT_EOK);
+    result = rt_thread_startup(&eth_rx_thread);
+    RT_ASSERT(result == RT_EOK);
+
+    /* initialize Tx thread */
+    /* initialize mailbox and create Ethernet Tx thread */
+    result = rt_mb_init(&eth_tx_thread_mb, "etxmb",
+                        &eth_tx_thread_mb_pool[0], sizeof(eth_tx_thread_mb_pool)/4,
+                        RT_IPC_FLAG_FIFO);
+    RT_ASSERT(result == RT_EOK);
+
+    result = rt_thread_init(&eth_tx_thread, "etx", eth_tx_thread_entry, RT_NULL,
+                            &eth_tx_thread_stack[0], sizeof(eth_tx_thread_stack),
+                            RT_ETHERNETIF_THREAD_PREORITY, 16);
+    RT_ASSERT(result == RT_EOK);
+
+    result = rt_thread_startup(&eth_tx_thread);
+    RT_ASSERT(result == RT_EOK);
 }
 
 #ifdef RT_USING_FINSH
@@ -436,12 +437,12 @@ FINSH_FUNCTION_EXPORT(set_if, set network interface address);
 #include <lwip/dns.h>
 void set_dns(char* dns_server)
 {
-	struct ip_addr addr;
-	
-	if ((dns_server != RT_NULL) && ipaddr_aton(dns_server, &addr))
-	{
-		dns_setserver(0, &addr);
-	}
+    struct ip_addr addr;
+
+    if ((dns_server != RT_NULL) && ipaddr_aton(dns_server, &addr))
+    {
+        dns_setserver(0, &addr);
+    }
 }
 FINSH_FUNCTION_EXPORT(set_dns, set DNS server address);
 #endif
@@ -451,11 +452,16 @@ void list_if(void)
     rt_ubase_t index;
     struct netif * netif;
 
+    rt_enter_critical();
+
     netif = netif_list;
 
     while( netif != RT_NULL )
     {
-        rt_kprintf("network interface: %c%c%s\n", netif->name[0], netif->name[1], (netif == netif_default)?" (Default)":"");
+        rt_kprintf("network interface: %c%c%s\n",
+                   netif->name[0],
+                   netif->name[1],
+                   (netif == netif_default)?" (Default)":"");
         rt_kprintf("MTU: %d\n", netif->mtu);
         rt_kprintf("MAC: ");
         for (index = 0; index < netif->hwaddr_len; index ++)
@@ -489,6 +495,8 @@ void list_if(void)
         }
     }
 #endif /**< #if LWIP_DNS */
+
+    rt_exit_critical();
 }
 FINSH_FUNCTION_EXPORT(list_if, list network interface information);
 
@@ -496,42 +504,62 @@ FINSH_FUNCTION_EXPORT(list_if, list network interface information);
 #include <lwip/tcp.h>
 #include <lwip/tcp_impl.h>
 
-void list_tcps()
+void list_tcps(void)
 {
-  struct tcp_pcb *pcb;
-  extern struct tcp_pcb *tcp_active_pcbs;
-  extern union tcp_listen_pcbs_t tcp_listen_pcbs;
-  extern struct tcp_pcb *tcp_tw_pcbs;
-  extern const char *tcp_state_str[];
-
-  rt_enter_critical();
-  rt_kprintf("Active PCB states:\n");
-  for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next)
-  {
-    rt_kprintf("%s:%d <==> %s:%d snd_nxt %d rcv_nxt %d ",
-    		ipaddr_ntoa(&(pcb->local_ip)), pcb->local_port,
-    		ipaddr_ntoa(&(pcb->remote_ip)), pcb->remote_port,
-    		pcb->snd_nxt, pcb->rcv_nxt);
-    rt_kprintf("state: %s\n", tcp_state_str[pcb->state]);
-  }
-
-  rt_kprintf("Listen PCB states:\n");
-  for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next)
-  {
-    rt_kprintf("local port %d ", pcb->local_port);
-    rt_kprintf("state: %s\n", tcp_state_str[pcb->state]);
-  }
-
-  rt_kprintf("TIME-WAIT PCB states:\n");
-  for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next)
-  {
-    rt_kprintf("%s:%d <==> %s:%d snd_nxt %d rcv_nxt %d ",
-    		ipaddr_ntoa(&(pcb->local_ip)), pcb->local_port,
-    		ipaddr_ntoa(&(pcb->remote_ip)), pcb->remote_port,
-    		pcb->snd_nxt, pcb->rcv_nxt);
-    rt_kprintf("state: %s\n", tcp_state_str[pcb->state]);
-  }
-  rt_exit_critical();
+    rt_uint32_t num = 0;
+    struct tcp_pcb *pcb;
+    char local_ip_str[16];
+    char remote_ip_str[16];
+
+    extern struct tcp_pcb *tcp_active_pcbs;
+    extern union tcp_listen_pcbs_t tcp_listen_pcbs;
+    extern struct tcp_pcb *tcp_tw_pcbs;
+    extern const char *tcp_state_str[];
+
+    rt_enter_critical();
+    rt_kprintf("Active PCB states:\n");
+    for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next)
+    {
+        strcpy(local_ip_str, ipaddr_ntoa(&(pcb->local_ip)));
+        strcpy(remote_ip_str, ipaddr_ntoa(&(pcb->remote_ip)));
+
+        rt_kprintf("#%d %s:%d <==> %s:%d snd_nxt 0x%08X rcv_nxt 0x%08X ",
+                   num++,
+                   local_ip_str,
+                   pcb->local_port,
+                   remote_ip_str,
+                   pcb->remote_port,
+                   pcb->snd_nxt,
+                   pcb->rcv_nxt);
+        rt_kprintf("state: %s\n", tcp_state_str[pcb->state]);
+    }
+
+    rt_kprintf("Listen PCB states:\n");
+    num = 0;
+    for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next)
+    {
+        rt_kprintf("#%d local port %d ", num++, pcb->local_port);
+        rt_kprintf("state: %s\n", tcp_state_str[pcb->state]);
+    }
+
+    rt_kprintf("TIME-WAIT PCB states:\n");
+    num = 0;
+    for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next)
+    {
+        strcpy(local_ip_str, ipaddr_ntoa(&(pcb->local_ip)));
+        strcpy(remote_ip_str, ipaddr_ntoa(&(pcb->remote_ip)));
+
+        rt_kprintf("#%d %s:%d <==> %s:%d snd_nxt 0x%08X rcv_nxt 0x%08X ",
+                   num++,
+                   local_ip_str,
+                   pcb->local_port,
+                   remote_ip_str,
+                   pcb->remote_port,
+                   pcb->snd_nxt,
+                   pcb->rcv_nxt);
+        rt_kprintf("state: %s\n", tcp_state_str[pcb->state]);
+    }
+    rt_exit_critical();
 }
 FINSH_FUNCTION_EXPORT(list_tcps, list all of tcp connections);
 #endif