From fbd620a7f4053f68cea82c67a0c7f515f1d02355 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Wed, 25 Feb 2015 10:50:21 +0800 Subject: [PATCH] [Kernel] Move the components initailzation to the kernel --- .../dfs/filesystems/skeleton/skeleton.c | 3 +- components/init/SConscript | 14 -- components/init/components.c | 177 ---------------- .../components.h => include/rtcomponents.h | 38 +--- src/init.c | 199 ++++++++++++++++++ 5 files changed, 207 insertions(+), 224 deletions(-) delete mode 100644 components/init/SConscript delete mode 100644 components/init/components.c rename components/init/components.h => include/rtcomponents.h (74%) create mode 100644 src/init.c diff --git a/components/dfs/filesystems/skeleton/skeleton.c b/components/dfs/filesystems/skeleton/skeleton.c index 74b0150140..6abcec12ff 100644 --- a/components/dfs/filesystems/skeleton/skeleton.c +++ b/components/dfs/filesystems/skeleton/skeleton.c @@ -1,7 +1,7 @@ /* * File : skeleton.c * This file is part of Device File System in RT-Thread RTOS - * COPYRIGHT (C) 2004-2011, RT-Thread Development Team + * COPYRIGHT (C) 2004-2015, 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 @@ -100,3 +100,4 @@ int dfs_skt_init(void) dfs_register(&_skt_fs); return 0; } +INIT_FS_EXPORT(dfs_skt_init); diff --git a/components/init/SConscript b/components/init/SConscript deleted file mode 100644 index 97e1535240..0000000000 --- a/components/init/SConscript +++ /dev/null @@ -1,14 +0,0 @@ -Import('rtconfig') -from building import * - -cwd = GetCurrentDir() -src = Glob('*.c') -CPPPATH = [cwd] -if rtconfig.CROSS_TOOL == 'keil': - LINKFLAGS = ' --keep __rt_init* ' -else: - LINKFLAGS = '' - -group = DefineGroup('Components', src, depend = ['RT_USING_COMPONENTS_INIT'], CPPPATH = CPPPATH, LINKFLAGS = LINKFLAGS) - -Return('group') diff --git a/components/init/components.c b/components/init/components.c deleted file mode 100644 index 2c507e12f8..0000000000 --- a/components/init/components.c +++ /dev/null @@ -1,177 +0,0 @@ -/* - * File : components.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2012 - 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 - * 2012-09-20 Bernard Change the name to components.c - * And all components related header files. - * 2012-12-23 Bernard fix the pthread initialization issue. - * 2013-06-23 Bernard Add the init_call for components initialization. - * 2013-07-05 Bernard Remove initialization feature for MS VC++ compiler - */ - -#include "components.h" - -static int rti_start(void) -{ - return 0; -} -INIT_EXPORT(rti_start, "0"); - -static int rti_board_end(void) -{ - return 0; -} -INIT_EXPORT(rti_board_end, "1.post"); - -static int rti_end(void) -{ - return 0; -} -INIT_EXPORT(rti_end,"7"); - -/** - * RT-Thread Components Initialization for board - */ -void rt_components_board_init(void) -{ -#ifndef _MSC_VER -#if RT_DEBUG_INIT - int result; - const struct rt_init_desc *desc; - for (desc = &__rt_init_desc_rti_start; desc < &__rt_init_desc_rti_board_end; desc ++) - { - rt_kprintf("initialize %s", desc->fn_name); - result = desc->fn(); - rt_kprintf(":%d done\n", result); - } -#else - const init_fn_t *fn_ptr; - - for (fn_ptr = &__rt_init_rti_start; fn_ptr < &__rt_init_rti_board_end; fn_ptr++) - { - (*fn_ptr)(); - } -#endif -#endif -} - -/** - * RT-Thread Components Initialization - */ -void rt_components_init(void) -{ -#ifndef _MSC_VER -#if RT_DEBUG_INIT - int result; - const struct rt_init_desc *desc; - - rt_kprintf("do components intialization.\n"); - for (desc = &__rt_init_desc_rti_board_end; desc < &__rt_init_desc_rti_end; desc ++) - { - rt_kprintf("initialize %s", desc->fn_name); - result = desc->fn(); - rt_kprintf(":%d done\n", result); - } -#else - const init_fn_t *fn_ptr; - - for (fn_ptr = &__rt_init_rti_board_end; fn_ptr < &__rt_init_rti_end; fn_ptr ++) - { - (*fn_ptr)(); - } -#endif -#else -#ifdef RT_USING_MODULE - rt_system_module_init(); -#endif - -#ifdef RT_USING_FINSH - /* initialize finsh */ - finsh_system_init(); - finsh_set_device(RT_CONSOLE_DEVICE_NAME); -#endif - -#ifdef RT_USING_LWIP - /* initialize lwip stack */ - /* register ethernetif device */ - eth_system_device_init(); - - /* initialize lwip system */ - lwip_system_init(); - rt_kprintf("TCP/IP initialized!\n"); -#endif - -#ifdef RT_USING_DFS - /* initialize the device file system */ - dfs_init(); - -#ifdef RT_USING_DFS_ELMFAT - /* initialize the elm chan FatFS file system*/ - elm_init(); -#endif - -#if defined(RT_USING_DFS_NFS) && defined(RT_USING_LWIP) - /* initialize NFSv3 client file system */ - nfs_init(); -#endif - -#ifdef RT_USING_DFS_YAFFS2 - dfs_yaffs2_init(); -#endif - -#ifdef RT_USING_DFS_UFFS - dfs_uffs_init(); -#endif - -#ifdef RT_USING_DFS_JFFS2 - dfs_jffs2_init(); -#endif - -#ifdef RT_USING_DFS_ROMFS - dfs_romfs_init(); -#endif - -#ifdef RT_USING_DFS_RAMFS - dfs_ramfs_init(); -#endif - -#ifdef RT_USING_DFS_DEVFS - devfs_init(); -#endif -#endif /* end of RT_USING_DFS */ - -#ifdef RT_USING_NEWLIB - libc_system_init(RT_CONSOLE_DEVICE_NAME); -#else - /* the pthread system initialization will be initiallized in libc */ -#ifdef RT_USING_PTHREADS - pthread_system_init(); -#endif -#endif - -#ifdef RT_USING_RTGUI - rtgui_system_server_init(); -#endif - -#ifdef RT_USING_USB_HOST - rt_usb_host_init(); -#endif -#endif -} diff --git a/components/init/components.h b/include/rtcomponents.h similarity index 74% rename from components/init/components.h rename to include/rtcomponents.h index 11d3c81788..70accb99d1 100644 --- a/components/init/components.h +++ b/include/rtcomponents.h @@ -1,7 +1,8 @@ /* - * File : components_init.h + * File : rtcomponents.h + * header for RT-Thread components * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2012, RT-Thread Development Team + * COPYRIGHT (C) 2012-2015, 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 @@ -21,12 +22,11 @@ * Date Author Notes * 2012-09-20 Bernard Change the name to components.h * And all components related header files. + * 2015-02-06 Bernard Rename the components.h to rtcom.h */ -#ifndef __COMPONENTS_INIT_H__ -#define __COMPONENTS_INIT_H__ - -#include +#ifndef RTCOM_H__ +#define RTCOM_H__ #ifdef RT_USING_FINSH #include @@ -36,7 +36,6 @@ #ifdef RT_USING_LWIP #include #include -extern void lwip_system_init(void); #endif #ifdef RT_USING_DFS @@ -68,9 +67,6 @@ extern void lwip_system_init(void); #endif #endif -#ifdef RT_USING_NEWLIB -#include -#endif #ifdef RT_USING_PTHREADS #include #endif @@ -79,27 +75,5 @@ extern void lwip_system_init(void); #include #endif -#ifdef RT_USING_RTGUI -#include #endif -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Initializes board routine in RT-Thread. - */ -void rt_components_board_init(void); - -/** - * Initializes components in RT-Thread - * notes: this function must be invoked in Init Thread - */ -void rt_components_init(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/init.c b/src/init.c new file mode 100644 index 0000000000..3b95ea3a57 --- /dev/null +++ b/src/init.c @@ -0,0 +1,199 @@ +/* + * File : init.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2012 - 2015, 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 + * 2012-09-20 Bernard Change the name to components.c + * And all components related header files. + * 2012-12-23 Bernard fix the pthread initialization issue. + * 2013-06-23 Bernard Add the init_call for components initialization. + * 2013-07-05 Bernard Remove initialization feature for MS VC++ compiler + * 2015-02-06 Bernard Remove the MS VC++ support and move to the kernel + */ + +#include + +#ifdef RT_USING_COMPONENTS_INIT +/* + * Components Initialization will initialize some driver and components as following + * order: + * rti_start --> 0 + * BOARD_EXPORT --> 1 + * rti_board_end --> 1.end + * + * DEVICE_EXPORT --> 2 + * COMPONENT_EXPORT --> 3 + * FS_EXPORT --> 4 + * ENV_EXPORT --> 5 + * APP_EXPORT --> 6 + * + * rti_end --> 6.end + * + * These automatically initializaiton, the driver or component initial function must + * be defined with: + * INIT_BOARD_EXPORT(fn); + * INIT_DEVICE_EXPORT(fn); + * ... + * INIT_APP_EXPORT(fn); + * etc. + */ +static int rti_start(void) +{ + return 0; +} +INIT_EXPORT(rti_start, "0"); + +static int rti_board_end(void) +{ + return 0; +} +INIT_EXPORT(rti_board_end, "1.end"); + +static int rti_end(void) +{ + return 0; +} +INIT_EXPORT(rti_end, "6.end"); + +/** + * RT-Thread Components Initialization for board + */ +void rt_components_board_init(void) +{ +#if RT_DEBUG_INIT + int result; + const struct rt_init_desc *desc; + for (desc = &__rt_init_desc_rti_start; desc < &__rt_init_desc_rti_board_end; desc ++) + { + rt_kprintf("initialize %s", desc->fn_name); + result = desc->fn(); + rt_kprintf(":%d done\n", result); + } +#else + const init_fn_t *fn_ptr; + + for (fn_ptr = &__rt_init_rti_start; fn_ptr < &__rt_init_rti_board_end; fn_ptr++) + { + (*fn_ptr)(); + } +#endif +} + +/** + * RT-Thread Components Initialization + */ +void rt_components_init(void) +{ +#if RT_DEBUG_INIT + int result; + const struct rt_init_desc *desc; + + rt_kprintf("do components intialization.\n"); + for (desc = &__rt_init_desc_rti_board_end; desc < &__rt_init_desc_rti_end; desc ++) + { + rt_kprintf("initialize %s", desc->fn_name); + result = desc->fn(); + rt_kprintf(":%d done\n", result); + } +#else + const init_fn_t *fn_ptr; + + for (fn_ptr = &__rt_init_rti_board_end; fn_ptr < &__rt_init_rti_end; fn_ptr ++) + { + (*fn_ptr)(); + } +#endif +} + +#ifdef RT_USING_USER_MAIN +void rt_application_init(void); +void rt_hw_board_init(void); + +#ifndef RT_USING_HEAP +/* if there is not enble heap, we should use static thread and stack. */ +ALIGN(8) +static rt_uint8_t main_stack[2048]; +struct rt_thread main_thread; +#endif + +/* the system main thread */ +void main_thread_entry(void *parameter) +{ + extern int main(void); + + /* RT-Thread components initialization */ + rt_components_init(); + + /* invoke system main function */ + main(); +} + +void rt_application_init(void) +{ + rt_thread_t tid; + +#ifdef RT_USING_HEAP + tid = rt_thread_create("main", main_thread_entry, RT_NULL, + 2048, RT_THREAD_PRIORITY_MAX / 3, 20); + RT_ASSERT(tid != RT_NULL); +#else + rt_err_t result; + + tid = &main_thread; + result = rt_thread_init(tid, "main", main_thread_entry, RT_NULL, + 2048, RT_THREAD_PRIORITY_MAX / 3, 20); + RT_ASSERT(result != RT_EOK); +#endif + + rt_thread_startup(tid); +} + +int rtthread_startup(void) +{ + /* board level initalization + * NOTE: please initialize heap inside board initialization. + */ + rt_hw_board_init(); + + /* show RT-Thread version */ + rt_show_version(); + + /* timer system initialization */ + rt_system_timer_init(); + + /* scheduler system initialization */ + rt_system_scheduler_init(); + + /* create init_thread */ + rt_application_init(); + + /* timer thread initialization */ + rt_system_timer_thread_init(); + + /* idle thread initialization */ + rt_thread_idle_init(); + + /* start scheduler */ + rt_system_scheduler_start(); + + /* never reach here */ + return ; +} +#endif +#endif