From a7cd3086587499bed1fbdaf1e9963f831c0422c5 Mon Sep 17 00:00:00 2001 From: "Paul A. Patience" Date: Wed, 30 Sep 2015 12:06:28 -0400 Subject: [PATCH] UAVCAN: Add platform-specific code --- Application.mk | 28 ++++++-- canutils/uavcan/Kconfig | 27 ++++++- canutils/uavcan/Makefile | 2 +- canutils/uavcan/platform_stm32.cpp | 106 +++++++++++++++++++++++++++ examples/cxxtest/Kconfig | 2 +- examples/cxxtest/Makefile | 99 +------------------------ examples/helloxx/Kconfig | 3 +- examples/helloxx/Makefile | 112 +++-------------------------- 8 files changed, 167 insertions(+), 212 deletions(-) create mode 100644 canutils/uavcan/platform_stm32.cpp diff --git a/Application.mk b/Application.mk index ef0a3d615..cd9d247c2 100644 --- a/Application.mk +++ b/Application.mk @@ -35,8 +35,6 @@ # ############################################################################ --include $(TOPDIR)/.config --include $(TOPDIR)/Make.defs include $(APPDIR)/Make.defs CXXEXT ?= .cxx @@ -44,9 +42,14 @@ CXXEXT ?= .cxx AOBJS = $(ASRCS:.S=$(OBJEXT)) COBJS = $(CSRCS:.c=$(OBJEXT)) CXXOBJS = $(CXXSRCS:$(CXXEXT)=$(OBJEXT)) -MAINOBJ = $(MAINSRC:.c=$(OBJEXT)) -SRCS = $(ASRCS) $(CSRCS) $(MAINSRC) +ifeq ($(suffix $(MAINSRC)),$(CXXEXT)) + MAINOBJ = $(MAINSRC:$(CXXEXT)=$(OBJEXT)) +else + MAINOBJ = $(MAINSRC:.c=$(OBJEXT)) +endif + +SRCS = $(ASRCS) $(CSRCS) $(CXXSRCS) $(MAINSRC) OBJS = $(AOBJS) $(COBJS) $(CXXOBJS) ifneq ($(CONFIG_BUILD_KERNEL),y) @@ -71,12 +74,20 @@ all: .built $(AOBJS): %$(OBJEXT): %.S $(call ASSEMBLE, $<, $@) -$(COBJS) $(MAINOBJ): %$(OBJEXT): %.c +$(COBJS): %$(OBJEXT): %.c $(call COMPILE, $<, $@) $(CXXOBJS): %$(OBJEXT): %$(CXXEXT) $(call COMPILEXX, $<, $@) +ifeq ($(suffix $(MAINSRC)),$(CXXEXT)) +$(MAINOBJ): %$(OBJEXT): %$(CXXEXT) + $(call COMPILEXX, $<, $@) +else +$(MAINOBJ): %$(OBJEXT): %.c + $(call COMPILE, $<, $@) +endif + .built: $(OBJS) $(call ARCHIVE, $(BIN), $(OBJS)) $(Q) touch .built @@ -113,9 +124,12 @@ else context: endif -.depend: Makefile $(SRCS) $(CXXSRCS) +.depend: Makefile $(SRCS) +ifeq ($(filter %$(CXXEXT),$(SRCS)),) $(Q) $(MKDEP) $(ROOTDEPPATH) "$(CC)" -- $(CFLAGS) -- $(SRCS) >Make.dep - $(Q) $(MKDEP) $(ROOTDEPPATH) "$(CXX)" -- $(CXXFLAGS) -- $(CXXSRCS) >Make.dep +else + $(Q) $(MKDEP) $(ROOTDEPPATH) "$(CXX)" -- $(CXXFLAGS) -- $(SRCS) >Make.dep +endif $(Q) touch $@ depend: .depend diff --git a/canutils/uavcan/Kconfig b/canutils/uavcan/Kconfig index 4a66485f8..8b9c4cc02 100644 --- a/canutils/uavcan/Kconfig +++ b/canutils/uavcan/Kconfig @@ -147,7 +147,30 @@ config UAVCAN_MEM_POOL_BLOCK_SIZE int "Memory Pool Block Size" default 0 ---help--- - Specifies the memory pool block size. A value of 0 will - use the library default. + Specifies the memory pool block size. If the value is 0, the + library will use a default value. + +config UAVCAN_RX_QUEUE_CAPACITY + int "Rx Queue Capacity" + default 0 + ---help--- + Specifies the rx queue capacity. If the value is 0, the + library will use a default value. + +config UAVCAN_BIT_RATE + int "Bit Rate" + default 0 + range 0 1000000 + ---help--- + Specifies the CAN bit rate. If the value is 0, the library + will automatically detect the bit rate. + +config UAVCAN_INIT_RETRIES + int "Initialization Retries" + default 0 + ---help--- + Specifies the number of times to try initializing the CAN + peripherals before panicking. A value of 0 means to try + forever. endif diff --git a/canutils/uavcan/Makefile b/canutils/uavcan/Makefile index 7cd43033d..590cef404 100644 --- a/canutils/uavcan/Makefile +++ b/canutils/uavcan/Makefile @@ -61,7 +61,7 @@ PYUAVCAN_PACKNAME = $(PYUAVCAN_UNPACKNAME)$(PACKEXT) -include libuavcan/libuavcan/include.mk -include libuavcan/libuavcan_drivers/stm32/driver/include.mk -CXXSRCS = $(LIBUAVCAN_SRC) $(LIBUAVCAN_STM32_SRC) +CXXSRCS = platform_stm32.cpp $(LIBUAVCAN_SRC) $(LIBUAVCAN_STM32_SRC) CXXFLAGS += -I$(LIBUAVCAN_INC) -I$(LIBUAVCAN_STM32_INC) -Idsdlc_generated CXXFLAGS += -I$(TOPDIR)/arch/arm/src/common -I$(TOPDIR)/arch/arm/src/stm32 diff --git a/canutils/uavcan/platform_stm32.cpp b/canutils/uavcan/platform_stm32.cpp new file mode 100644 index 000000000..27cd72155 --- /dev/null +++ b/canutils/uavcan/platform_stm32.cpp @@ -0,0 +1,106 @@ +/**************************************************************************** + * canutils/uavcan/uavcan_platform.cpp + * + * Copyright (C) 2015 Omni Hoverboards Inc. All rights reserved. + * Author: Paul Alexander Patience + * + * 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 + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +#if CONFIG_UAVCAN_RX_QUEUE_CAPACITY > 0 +static uavcan_stm32::CanInitHelper can; +#else +static uavcan_stm32::CanInitHelper<> can; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static void delay_callable() +{ + std::usleep(can.getRecommendedListeningDelay().toUSec()); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +uavcan::ISystemClock& getSystemClock() +{ + return uavcan_stm32::SystemClock::instance(); +} + +uavcan::ICanDriver& getCanDriver() +{ + static bool initialized = false; + + if (!initialized) + { + uavcan::uint32_t bitrate = CONFIG_UAVCAN_BIT_RATE; + +#if CONFIG_UAVCAN_INIT_RETRIES > 0 + int retries = 0; +#endif + + for (;;) + { + if (can.init(delay_callable, bitrate) >= 0) + { + break; + } + +#if CONFIG_UAVCAN_INIT_RETRIES > 0 + retries++; + if (retries >= CONFIG_UAVCAN_INIT_RETRIES) + { + PANIC(); + } +#endif + } + + initialized = true; + } + + return can.driver; +} diff --git a/examples/cxxtest/Kconfig b/examples/cxxtest/Kconfig index 55d2cf762..6c9c4c51a 100644 --- a/examples/cxxtest/Kconfig +++ b/examples/cxxtest/Kconfig @@ -20,6 +20,6 @@ config EXAMPLES_CXXTEST_CXXINITIALIZE By default, if CONFIG_HAVE_CXX and CONFIG_HAVE_CXXINITIALIZE are defined, then this example will call the NuttX function to initialize static C++ constructors. This option may be disabled, - however, if that static initialization was preformed elsewhere. + however, if that static initialization was performed elsewhere. endif diff --git a/examples/cxxtest/Makefile b/examples/cxxtest/Makefile index 2e75f5bf9..0f5638ef0 100644 --- a/examples/cxxtest/Makefile +++ b/examples/cxxtest/Makefile @@ -33,117 +33,22 @@ # ############################################################################ --include $(TOPDIR)/.config -include $(TOPDIR)/Make.defs -include $(APPDIR)/Make.defs # CXX test program ASRCS = CSRCS = -CXXSRCS = +CXXSRCS = MAINSRC = cxxtest_main.cxx -AOBJS = $(ASRCS:.S=$(OBJEXT)) -COBJS = $(CSRCS:.c=$(OBJEXT)) -CXXOBJS = $(CXXSRCS:.cxx=$(OBJEXT)) -MAINOBJ = $(MAINSRC:.cxx=$(OBJEXT)) - -SRCS = $(ASRCS) $(CSRCS) $(CXXSRCS) -OBJS = $(AOBJS) $(COBJS) $(CXXOBJS) - -ifneq ($(CONFIG_BUILD_KERNEL),y) - OBJS += $(MAINOBJ) -endif - -ifeq ($(CONFIG_WINDOWS_NATIVE),y) - BIN = ..\..\libapps$(LIBEXT) -else -ifeq ($(WINTOOL),y) - BIN = ..\\..\\libapps$(LIBEXT) -else - BIN = ../../libapps$(LIBEXT) -endif -endif - CONFIG_XYZ_PROGNAME ?= cxxtest$(EXEEXT) PROGNAME = $(CONFIG_XYZ_PROGNAME) -ROOTDEPPATH = --dep-path . - -ROOTDEPPATH = --dep-path . - # cxxtest built-in application info APPNAME = cxxtest PRIORITY = SCHED_PRIORITY_DEFAULT STACKSIZE = 4096 -# Common build - -VPATH = - -all: .built -.PHONY: clean depend distclean chkcxx - -chkcxx: -ifneq ($(CONFIG_HAVE_CXX),y) - @echo "" - @echo "In order to use this example, you toolchain must support must" - @echo "" - @echo " (1) Explicitly select CONFIG_HAVE_CXX to build in C++ support" - @echo " (2) Define CXX, CXXFLAGS, and COMPILEXX in the Make.defs file" - @echo " of the configuration that you are using." - @echo "" - @exit 1 -endif - -$(AOBJS): %$(OBJEXT): %.S - $(call ASSEMBLE, $<, $@) - -$(COBJS): %$(OBJEXT): %.c - $(call COMPILE, $<, $@) - -$(CXXOBJS) $(MAINOBJ): %$(OBJEXT): %.cxx - $(call COMPILEXX, $<, $@) - -.built: chkcxx $(OBJS) - $(call ARCHIVE, $(BIN), $(OBJS)) - @touch .built - -ifeq ($(CONFIG_BUILD_KERNEL),y) -$(BIN_DIR)$(DELIM)$(PROGNAME): $(OBJS) $(MAINOBJ) - @echo "LD: $(PROGNAME)" - $(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $(INSTALL_DIR)$(DELIM)$(PROGNAME) $(ARCHCRT0OBJ) $(MAINOBJ) $(LDLIBS) - $(Q) $(NM) -u $(INSTALL_DIR)$(DELIM)$(PROGNAME) - -install: $(BIN_DIR)$(DELIM)$(PROGNAME) - -else -install: - -endif -ifeq ($(CONFIG_NSH_BUILTIN_APPS),y) -$(BUILTIN_REGISTRY)$(DELIM)$(APPNAME)_main.bdat: $(DEPCONFIG) Makefile - $(call REGISTER,$(APPNAME),$(PRIORITY),$(STACKSIZE),$(APPNAME)_main) - -context: $(BUILTIN_REGISTRY)$(DELIM)$(APPNAME)_main.bdat -else -context: -endif - -.depend: Makefile $(SRCS) - @$(MKDEP) $(ROOTDEPPATH) "$(CXX)" -- $(CXXFLAGS) -- $(SRCS) >Make.dep - @touch $@ - -depend: .depend - -clean: - $(call DELFILE, .built) - $(call CLEAN) - -distclean: clean - $(call DELFILE, Make.dep) - $(call DELFILE, .depend) - --include Make.dep +include $(APPDIR)/Application.mk diff --git a/examples/helloxx/Kconfig b/examples/helloxx/Kconfig index f585578ce..1a8bcd738 100644 --- a/examples/helloxx/Kconfig +++ b/examples/helloxx/Kconfig @@ -6,6 +6,7 @@ config EXAMPLES_HELLOXX bool "\"Hello, World!\" C++ example" default n + depends on HAVE_CXX ---help--- Enable the \"Hello, World!\" C++ example @@ -19,6 +20,6 @@ config EXAMPLES_HELLOXX_CXXINITIALIZE By default, if CONFIG_HAVE_CXX and CONFIG_HAVE_CXXINITIALIZE are defined, then this example will call the NuttX function to initialize static C++ constructors. This option may be disabled, - however, if that static initialization was preformed elsewhere. + however, if that static initialization was performed elsewhere. endif diff --git a/examples/helloxx/Makefile b/examples/helloxx/Makefile index 285dd1d88..64b9b32d7 100644 --- a/examples/helloxx/Makefile +++ b/examples/helloxx/Makefile @@ -33,116 +33,22 @@ # ############################################################################ --include $(TOPDIR)/.config -include $(TOPDIR)/Make.defs -include $(APPDIR)/Make.defs # Hello, World! C++ Example -ASRCS = -CSRCS = -CXXSRCS = -MAINSRC = helloxx_main.cxx - -AOBJS = $(ASRCS:.S=$(OBJEXT)) -COBJS = $(CSRCS:.c=$(OBJEXT)) -CXXOBJS = $(CXXSRCS:.cxx=$(OBJEXT)) -MAINOBJ = $(MAINSRC:.cxx=$(OBJEXT)) - -SRCS = $(ASRCS) $(CSRCS) $(CXXSRCS) $(MAINSRC) -OBJS = $(AOBJS) $(COBJS) $(CXXOBJS) - -ifneq ($(CONFIG_BUILD_KERNEL),y) - OBJS += $(MAINOBJ) -endif - -ifeq ($(CONFIG_WINDOWS_NATIVE),y) - BIN = ..\..\libapps$(LIBEXT) -else -ifeq ($(WINTOOL),y) - BIN = ..\\..\\libapps$(LIBEXT) -else - BIN = ../../libapps$(LIBEXT) -endif -endif +ASRCS = +CSRCS = +CXXSRCS = +MAINSRC = helloxx_main.cxx CONFIG_EXAMPLES_HELLOXX_PROGNAME ?= helloxx$(EXEEXT) -PROGNAME = $(CONFIG_EXAMPLES_HELLOXX_PROGNAME) - -ROOTDEPPATH = --dep-path . +PROGNAME = $(CONFIG_EXAMPLES_HELLOXX_PROGNAME) # helloxx built-in application info -APPNAME = helloxx -PRIORITY = SCHED_PRIORITY_DEFAULT -STACKSIZE = 2048 +APPNAME = helloxx +PRIORITY = SCHED_PRIORITY_DEFAULT +STACKSIZE = 2048 -# Common build - -VPATH = - -all: .built -.PHONY: clean depend distclean chkcxx - -chkcxx: -ifneq ($(CONFIG_HAVE_CXX),y) - @echo "" - @echo "In order to use this example, you toolchain must support must" - @echo "" - @echo " (1) Explicitly select CONFIG_HAVE_CXX to build in C++ support" - @echo " (2) Define CXX, CXXFLAGS, and COMPILEXX in the Make.defs file" - @echo " of the configuration that you are using." - @echo "" - @exit 1 -endif - -$(AOBJS): %$(OBJEXT): %.S - $(call ASSEMBLE, $<, $@) - -$(COBJS): %$(OBJEXT): %.c - $(call COMPILE, $<, $@) - -$(CXXOBJS) $(MAINOBJ): %$(OBJEXT): %.cxx - $(call COMPILEXX, $<, $@) - -.built: chkcxx $(OBJS) - $(call ARCHIVE, $(BIN), $(OBJS)) - @touch .built - -ifeq ($(CONFIG_BUILD_KERNEL),y) -$(BIN_DIR)$(DELIM)$(PROGNAME): $(OBJS) $(MAINOBJ) - @echo "LD: $(PROGNAME)" - $(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $(INSTALL_DIR)$(DELIM)$(PROGNAME) $(ARCHCRT0OBJ) $(MAINOBJ) $(LDLIBS) - $(Q) $(NM) -u $(INSTALL_DIR)$(DELIM)$(PROGNAME) - -install: $(BIN_DIR)$(DELIM)$(PROGNAME) - -else -install: - -endif - -ifeq ($(CONFIG_NSH_BUILTIN_APPS),y) -$(BUILTIN_REGISTRY)$(DELIM)$(APPNAME)_main.bdat: $(DEPCONFIG) Makefile - $(call REGISTER,$(APPNAME),$(PRIORITY),$(STACKSIZE),$(APPNAME)_main) - -context: $(BUILTIN_REGISTRY)$(DELIM)$(APPNAME)_main.bdat -else -context: -endif - -.depend: Makefile $(SRCS) - @$(MKDEP) $(ROOTDEPPATH) "$(CC)" -- $(CFLAGS) -- $(SRCS) >Make.dep - @touch $@ - -depend: .depend - -clean: - $(call DELFILE, .built) - $(call CLEAN) - -distclean: clean - $(call DELFILE, Make.dep) - $(call DELFILE, .depend) - --include Make.dep +include $(APPDIR)/Application.mk