From 089bca3599c2ce8db144f8cb2b0cea521e67b5aa Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Sat, 29 Jun 2013 09:39:01 -0600 Subject: [PATCH] Changes to get a clean compile of configs/sam3u-ek/nxwm --- configs/sam3u-ek/README.txt | 63 ++++++---- configs/sam3u-ek/knsh/Make.defs | 2 +- configs/sam3u-ek/nsh/Make.defs | 2 +- configs/sam3u-ek/nx/Make.defs | 2 +- configs/sam3u-ek/nxwm/Make.defs | 2 +- configs/sam3u-ek/ostest/Make.defs | 2 +- configs/sam3u-ek/scripts/ld.script | 33 +++--- configs/sam3u-ek/src/Makefile | 4 + configs/sam3u-ek/src/up_cxxinitialize.c | 149 ++++++++++++++++++++++++ 9 files changed, 219 insertions(+), 40 deletions(-) create mode 100644 configs/sam3u-ek/src/up_cxxinitialize.c diff --git a/configs/sam3u-ek/README.txt b/configs/sam3u-ek/README.txt index d49b2a6450..55f269d0f5 100644 --- a/configs/sam3u-ek/README.txt +++ b/configs/sam3u-ek/README.txt @@ -400,6 +400,8 @@ SAM3U-EK-specific Configuration Options Configurations ^^^^^^^^^^^^^^ + Information Common to All Configurations + ---------------------------------------- Each SAM3U-EK configuration is maintained in a sub-directory and can be selected as follow: @@ -457,6 +459,9 @@ Configurations System Type -> Toolchain: CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIW=y : General GCC EABI toolchain under windows + Library Routines -> + CONFIG_CXX_NEWLONG=n : size_t is an unsigned int, not long + This re-configuration should be done before making NuttX or else the subsequent 'make' will fail. If you have already attempted building NuttX then you will have to 1) 'make distclean' to remove the old @@ -473,8 +478,8 @@ Configurations See also the "NOTE about Windows native toolchains" in the section call "GNU Toolchain Options" above. -Configuration sub-directories ------------------------------ + Configuration sub-directories + ----------------------------- knsh: This is identical to the nsh configuration below except that NuttX @@ -613,33 +618,37 @@ Configuration sub-directories STATUS: 2013-6-28: The touchscreen is functional. + 2013-6-29: Hmmm... but there appear to be conditions when the + touchscreen driver locks up. Looks like some issue with + managing the interrupts. nx: Configures to use examples/nx using the HX834x LCD hardware on the SAM3U-EK development board. - nxwm - ---- + nxwm: This is a special configuration setup for the NxWM window manager UnitTest. The NxWM window manager can be found here: - nuttx-code/NxWidgets/nxwm + nuttx-git/NxWidgets/nxwm The NxWM unit test can be found at: - nuttx-code/NxWidgets/UnitTests/nxwm + nuttx-git/NxWidgets/UnitTests/nxwm Documentation for installing the NxWM unit test can be found here: - nuttx-code/NxWidgets/UnitTests/README.txt + nuttx-git/NxWidgets/UnitTests/README.txt - Here is the quick summary of the build steps (Assuming that all of - the required packages are available in a directory ~/nuttx-code): + Here is the quick summary of the build steps. These steps assume that + you have the entire NuttX GIT in some directory ~/nuttx-git. You may + have these components installed elsewhere. In that case, you will need + to adjust all of the paths in the following accordingly: 1. Intall the nxwm configuration - $ cd ~/nuttx-code/nuttx/tools - $ ./configure.sh stm3240g-eval/nxwm + $ cd ~/nuttx-git/nuttx/tools + $ ./configure.sh sam3u-ek/nxwm 2. Make the build context (only) @@ -648,34 +657,44 @@ Configuration sub-directories $ make context ... + NOTE: the use of the setenv.sh file is optional. All that it will + do is to adjust your PATH variable so that the build system can find + your tools. If you use it, you will most likely need to modify the + script so that it has the correct path to your tool binaries + directory. + 3. Install the nxwm unit test - $ cd ~/nuttx-code/NxWidgets - $ tools/install.sh ~/nuttx-code/apps nxwm + $ cd ~/nuttx-git/NxWidgets + $ tools/install.sh ~/nuttx-git/apps nxwm Creating symbolic link - - To ~/nuttx-code/NxWidgets/UnitTests/nxwm - - At ~/nuttx-code/apps/external + - To ~/nuttx-git/NxWidgets/UnitTests/nxwm + - At ~/nuttx-git/apps/external 4. Build the NxWidgets library - $ cd ~/nuttx-code/NxWidgets/libnxwidgets - $ make TOPDIR=~/nuttx-code/nuttx + $ cd ~/nuttx-git/NxWidgets/libnxwidgets + $ make TOPDIR=~/nuttx-git/nuttx ... 5. Build the NxWM library - $ cd ~/nuttx-code/NxWidgets/nxwm - $ make TOPDIR=~/nuttx-code/nuttx + $ cd ~/nuttx-git/NxWidgets/nxwm + $ make TOPDIR=~/nuttx-git/nuttx ... 6. Built NuttX with the installed unit test as the application - $ cd ~/nuttx-code/nuttx + $ cd ~/nuttx-git/nuttx $ make STATUS: - 2013-6-28: Created the configuration but have not yet done - anything with it. + + 1. 2013-6-28: Created the configuration but have not yet done + anything with it. + + 2. 2013-6-29: Various changes to get a clean build of this + configuration. Still untested. ostest: This configuration directory, performs a simple OS test using diff --git a/configs/sam3u-ek/knsh/Make.defs b/configs/sam3u-ek/knsh/Make.defs index 9b06e7ec69..0961902930 100644 --- a/configs/sam3u-ek/knsh/Make.defs +++ b/configs/sam3u-ek/knsh/Make.defs @@ -75,7 +75,7 @@ else endif ARCHCFLAGS = -fno-builtin -ARCHCXXFLAGS = -fno-builtin -fno-exceptions +ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fno-rtti ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow ARCHWARNINGSXX = -Wall -Wshadow ARCHDEFINES = diff --git a/configs/sam3u-ek/nsh/Make.defs b/configs/sam3u-ek/nsh/Make.defs index 24f57c2012..ddb70242ed 100644 --- a/configs/sam3u-ek/nsh/Make.defs +++ b/configs/sam3u-ek/nsh/Make.defs @@ -73,7 +73,7 @@ else endif ARCHCFLAGS = -fno-builtin -ARCHCXXFLAGS = -fno-builtin -fno-exceptions +ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fno-rtti ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow ARCHWARNINGSXX = -Wall -Wshadow ARCHDEFINES = diff --git a/configs/sam3u-ek/nx/Make.defs b/configs/sam3u-ek/nx/Make.defs index 71f8506aea..5496c69e88 100644 --- a/configs/sam3u-ek/nx/Make.defs +++ b/configs/sam3u-ek/nx/Make.defs @@ -73,7 +73,7 @@ else endif ARCHCFLAGS = -fno-builtin -ARCHCXXFLAGS = -fno-builtin -fno-exceptions +ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fno-rtti ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow ARCHWARNINGSXX = -Wall -Wshadow ARCHDEFINES = diff --git a/configs/sam3u-ek/nxwm/Make.defs b/configs/sam3u-ek/nxwm/Make.defs index 7f471fd598..d7c5371437 100644 --- a/configs/sam3u-ek/nxwm/Make.defs +++ b/configs/sam3u-ek/nxwm/Make.defs @@ -73,7 +73,7 @@ else endif ARCHCFLAGS = -fno-builtin -ARCHCXXFLAGS = -fno-builtin -fno-exceptions +ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fno-rtti ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow ARCHWARNINGSXX = -Wall -Wshadow ARCHDEFINES = diff --git a/configs/sam3u-ek/ostest/Make.defs b/configs/sam3u-ek/ostest/Make.defs index cc61f116d6..128b1c4743 100644 --- a/configs/sam3u-ek/ostest/Make.defs +++ b/configs/sam3u-ek/ostest/Make.defs @@ -73,7 +73,7 @@ else endif ARCHCFLAGS = -fno-builtin -ARCHCXXFLAGS = -fno-builtin -fno-exceptions +ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fno-rtti ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow ARCHWARNINGSXX = -Wall -Wshadow ARCHDEFINES = diff --git a/configs/sam3u-ek/scripts/ld.script b/configs/sam3u-ek/scripts/ld.script index 0deb1b15e3..55915357dc 100755 --- a/configs/sam3u-ek/scripts/ld.script +++ b/configs/sam3u-ek/scripts/ld.script @@ -68,7 +68,23 @@ SECTIONS _etext = ABSOLUTE(.); } > flash - _eronly = ABSOLUTE(.); /* See below */ + .init_section : { + _sinit = ABSOLUTE(.); + *(.init_array .init_array.*) + _einit = ABSOLUTE(.); + } > flash + + .ARM.extab : { + *(.ARM.extab*) + } > flash + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : { + *(.ARM.exidx*) + } > flash + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); .data : { _sdata = ABSOLUTE(.); @@ -78,24 +94,15 @@ SECTIONS _edata = ABSOLUTE(.); } > sram1 AT > flash - .ARM.extab : { - *(.ARM.extab*) - } >sram1 - - .ARM.exidx : { - __exidx_start = ABSOLUTE(.); - *(.ARM.exidx*) - __exidx_end = ABSOLUTE(.); - } >sram1 - - .bss : { /* BSS */ + .bss : { _sbss = ABSOLUTE(.); *(.bss .bss.*) *(.gnu.linkonce.b.*) *(COMMON) _ebss = ABSOLUTE(.); } > sram1 - /* Stabs debugging sections. */ + + /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } diff --git a/configs/sam3u-ek/src/Makefile b/configs/sam3u-ek/src/Makefile index 788a506204..9cd708d7de 100644 --- a/configs/sam3u-ek/src/Makefile +++ b/configs/sam3u-ek/src/Makefile @@ -42,6 +42,10 @@ AOBJS = $(ASRCS:.S=$(OBJEXT)) CSRCS = up_boot.c up_leds.c up_buttons.c up_spi.c up_usbdev.c +ifeq ($(CONFIG_HAVE_CXXINITIALIZE),y) +CSRCS += up_cxxinitialize.c +endif + ifeq ($(CONFIG_LCD),y) CSRCS += up_lcd.c endif diff --git a/configs/sam3u-ek/src/up_cxxinitialize.c b/configs/sam3u-ek/src/up_cxxinitialize.c new file mode 100644 index 0000000000..6b4e255f2a --- /dev/null +++ b/configs/sam3u-ek/src/up_cxxinitialize.c @@ -0,0 +1,149 @@ +/************************************************************************************ + * configs/sam3u-ek/src/up_cxxinitialize.c + * + * Copyright (C) 2013 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 + * COPYRIGHT OWNER OR CONTRIBUTORS 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. + * + ************************************************************************************/ + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include + +#include +#include + +#if defined(CONFIG_HAVE_CXX) && defined(CONFIG_HAVE_CXXINITIALIZE) + +/************************************************************************************ + * Definitions + ************************************************************************************/ +/* Debug ****************************************************************************/ +/* Non-standard debug that may be enabled just for testing the static constructors */ + +#ifndef CONFIG_DEBUG +# undef CONFIG_DEBUG_CXX +#endif + +#ifdef CONFIG_DEBUG_CXX +# define cxxdbg dbg +# define cxxlldbg lldbg +# ifdef CONFIG_DEBUG_VERBOSE +# define cxxvdbg vdbg +# define cxxllvdbg llvdbg +# else +# define cxxvdbg(x...) +# define cxxllvdbg(x...) +# endif +#else +# define cxxdbg(x...) +# define cxxlldbg(x...) +# define cxxvdbg(x...) +# define cxxllvdbg(x...) +#endif + +/************************************************************************************ + * Private Types + ************************************************************************************/ +/* This type defines one entry in initialization array */ + +typedef void (*initializer_t)(void); + +/************************************************************************************ + * External references + ************************************************************************************/ +/* _sinit and _einit are symbols exported by the linker script that mark the + * beginning and the end of the C++ initialization section. + */ + +extern initializer_t _sinit; +extern initializer_t _einit; + +/* _stext and _etext are symbols exported by the linker script that mark the + * beginning and the end of text. + */ + +extern uint32_t _stext; +extern uint32_t _etext; + +/************************************************************************************ + * Private Functions + ************************************************************************************/ + +/************************************************************************************ + * Public Functions + ************************************************************************************/ + +/**************************************************************************** + * Name: up_cxxinitialize + * + * Description: + * If C++ and C++ static constructors are supported, then this function + * must be provided by board-specific logic in order to perform + * initialization of the static C++ class instances. + * + * This function should then be called in the application-specific + * user_start logic in order to perform the C++ initialization. NOTE + * that no component of the core NuttX RTOS logic is involved; This + * function defintion only provides the 'contract' between application + * specific C++ code and platform-specific toolchain support + * + ***************************************************************************/ + +void up_cxxinitialize(void) +{ + initializer_t *initp; + + cxxdbg("_sinit: %p _einit: %p _stext: %p _etext: %p\n", + &_sinit, &_einit, &_stext, &_etext); + + /* Visit each entry in the initialzation table */ + + for (initp = &_sinit; initp != &_einit; initp++) + { + initializer_t initializer = *initp; + cxxdbg("initp: %p initializer: %p\n", initp, initializer); + + /* Make sure that the address is non-NULL and lies in the text region + * defined by the linker script. Some toolchains may put NULL values + * or counts in the initialization table + */ + + if ((void*)initializer > (void*)&_stext && (void*)initializer < (void*)&_etext) + { + cxxdbg("Calling %p\n", initializer); + initializer(); + } + } +} + +#endif /* CONFIG_HAVE_CXX && CONFIG_HAVE_CXXINITIALIZE */