]> code.bitgloo.com Git - clyne/stmdsp.git/commitdiff
keep target as L476; minimize RAM usage
authorClyne Sullivan <clyne@bitgloo.com>
Fri, 30 Oct 2020 15:16:52 +0000 (11:16 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Fri, 30 Oct 2020 15:16:52 +0000 (11:16 -0400)
Makefile
STM32L432xC_stmdsp.ld [new file with mode: 0644]
cfg/chconf.h
cfg/halconf.h
cfg/mcuconf.h
source/main.cpp

index f35692adda42350ee58888ff858a6386d799715f..95a3b7ba3587699aad3f2bcd2fe7862e0b4745bf 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -6,6 +6,7 @@
 # Compiler options here.\r
 ifeq ($(USE_OPT),)\r
   USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -mtune=cortex-m4\r
+#  USE_OPT = -Os -fomit-frame-pointer -falign-functions=16 -mtune=cortex-m4\r
 endif\r
 \r
 # C specific options here (added to USE_OPT).\r
@@ -55,7 +56,7 @@ endif
 # Stack size to be allocated to the Cortex-M process stack. This stack is\r
 # the stack used by the main() thread.\r
 ifeq ($(USE_PROCESS_STACKSIZE),)\r
-  USE_PROCESS_STACKSIZE = 4096\r
+  USE_PROCESS_STACKSIZE = 2048\r
 endif\r
 \r
 # Stack size to the allocated to the Cortex-M main/exceptions stack. This\r
@@ -100,10 +101,10 @@ include $(CHIBIOS)/os/license/license.mk
 include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32l4xx.mk\r
 # HAL-OSAL files (optional).\r
 include $(CHIBIOS)/os/hal/hal.mk\r
-#include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform.mk\r
-#include $(CHIBIOS)/os/hal/boards/ST_STM32L476_DISCOVERY/board.mk\r
-include $(CHIBIOS)/os/hal/boards/ST_NUCLEO32_L432KC/board.mk\r
-include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform_l432.mk\r
+include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform.mk\r
+include $(CHIBIOS)/os/hal/boards/ST_STM32L476_DISCOVERY/board.mk\r
+#include $(CHIBIOS)/os/hal/boards/ST_NUCLEO32_L432KC/board.mk\r
+#include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform_l432.mk\r
 include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk\r
 # RTOS files (optional).\r
 include $(CHIBIOS)/os/rt/rt.mk\r
@@ -117,7 +118,7 @@ include $(CHIBIOS)/tools/mk/autobuild.mk
 \r
 # Define linker script file here.\r
 #LDSCRIPT= $(STARTUPLD)/STM32L476xG.ld\r
-LDSCRIPT= $(STARTUPLD)/STM32L432xC.ld\r
+LDSCRIPT= STM32L432xC_stmdsp.ld\r
 \r
 # C sources that can be compiled in ARM or THUMB mode depending on the global\r
 # setting.\r
diff --git a/STM32L432xC_stmdsp.ld b/STM32L432xC_stmdsp.ld
new file mode 100644 (file)
index 0000000..0226659
--- /dev/null
@@ -0,0 +1,85 @@
+/*\r
+    ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio\r
+\r
+    Licensed under the Apache License, Version 2.0 (the "License");\r
+    you may not use this file except in compliance with the License.\r
+    You may obtain a copy of the License at\r
+\r
+        http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+    Unless required by applicable law or agreed to in writing, software\r
+    distributed under the License is distributed on an "AS IS" BASIS,\r
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+    See the License for the specific language governing permissions and\r
+    limitations under the License.\r
+*/\r
+\r
+/*\r
+ * STM32L432xC memory setup.\r
+ */\r
+MEMORY\r
+{\r
+    flash0 (rx) : org = 0x08000000, len = 256k\r
+    flash1 (rx) : org = 0x00000000, len = 0\r
+    flash2 (rx) : org = 0x00000000, len = 0\r
+    flash3 (rx) : org = 0x00000000, len = 0\r
+    flash4 (rx) : org = 0x00000000, len = 0\r
+    flash5 (rx) : org = 0x00000000, len = 0\r
+    flash6 (rx) : org = 0x00000000, len = 0\r
+    flash7 (rx) : org = 0x00000000, len = 0\r
+    ram0   (wx) : org = 0x20000000, len = 48k /* Save 16k of SRAM2 for loaded ELF */\r
+    ram1   (wx) : org = 0x00000000, len = 0\r
+    ram2   (wx) : org = 0x00000000, len = 0\r
+    ram3   (wx) : org = 0x00000000, len = 0\r
+    ram4   (wx) : org = 0x00000000, len = 0\r
+    ram5   (wx) : org = 0x00000000, len = 0\r
+    ram6   (wx) : org = 0x00000000, len = 0\r
+    ram7   (wx) : org = 0x00000000, len = 0\r
+}\r
+\r
+/* For each data/text section two region are defined, a virtual region\r
+   and a load region (_LMA suffix).*/\r
+\r
+/* Flash region to be used for exception vectors.*/\r
+REGION_ALIAS("VECTORS_FLASH", flash0);\r
+REGION_ALIAS("VECTORS_FLASH_LMA", flash0);\r
+\r
+/* Flash region to be used for constructors and destructors.*/\r
+REGION_ALIAS("XTORS_FLASH", flash0);\r
+REGION_ALIAS("XTORS_FLASH_LMA", flash0);\r
+\r
+/* Flash region to be used for code text.*/\r
+REGION_ALIAS("TEXT_FLASH", flash0);\r
+REGION_ALIAS("TEXT_FLASH_LMA", flash0);\r
+\r
+/* Flash region to be used for read only data.*/\r
+REGION_ALIAS("RODATA_FLASH", flash0);\r
+REGION_ALIAS("RODATA_FLASH_LMA", flash0);\r
+\r
+/* Flash region to be used for various.*/\r
+REGION_ALIAS("VARIOUS_FLASH", flash0);\r
+REGION_ALIAS("VARIOUS_FLASH_LMA", flash0);\r
+\r
+/* Flash region to be used for RAM(n) initialization data.*/\r
+REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0);\r
+\r
+/* RAM region to be used for Main stack. This stack accommodates the processing\r
+   of all exceptions and interrupts.*/\r
+REGION_ALIAS("MAIN_STACK_RAM", ram0);\r
+\r
+/* RAM region to be used for the process stack. This is the stack used by\r
+   the main() function.*/\r
+REGION_ALIAS("PROCESS_STACK_RAM", ram0);\r
+\r
+/* RAM region to be used for data segment.*/\r
+REGION_ALIAS("DATA_RAM", ram0);\r
+REGION_ALIAS("DATA_RAM_LMA", flash0);\r
+\r
+/* RAM region to be used for BSS segment.*/\r
+REGION_ALIAS("BSS_RAM", ram0);\r
+\r
+/* RAM region to be used for the default heap.*/\r
+REGION_ALIAS("HEAP_RAM", ram0);\r
+\r
+/* Generic rules inclusion.*/\r
+INCLUDE rules.ld\r
index 7e11588132af785b2eb526068f20c3988fbe6355..04570c1a13261fa948c8a0e1fe81e12a17042ef4 100644 (file)
  * @note    The default is @p TRUE.\r
  */\r
 #if !defined(CH_CFG_USE_REGISTRY)\r
-#define CH_CFG_USE_REGISTRY                 TRUE\r
+#define CH_CFG_USE_REGISTRY                 FALSE\r
 #endif\r
 \r
 /**\r
  * @note    The default is @p TRUE.\r
  */\r
 #if !defined(CH_CFG_USE_WAITEXIT)\r
-#define CH_CFG_USE_WAITEXIT                 TRUE\r
+#define CH_CFG_USE_WAITEXIT                 FALSE\r
 #endif\r
 \r
 /**\r
  * @note    Requires @p CH_CFG_USE_MUTEXES.\r
  */\r
 #if !defined(CH_CFG_USE_CONDVARS)\r
-#define CH_CFG_USE_CONDVARS                 TRUE\r
+#define CH_CFG_USE_CONDVARS                 FALSE\r
 #endif\r
 \r
 /**\r
  * @note    Requires @p CH_CFG_USE_CONDVARS.\r
  */\r
 #if !defined(CH_CFG_USE_CONDVARS_TIMEOUT)\r
-#define CH_CFG_USE_CONDVARS_TIMEOUT         TRUE\r
+#define CH_CFG_USE_CONDVARS_TIMEOUT         FALSE\r
 #endif\r
 \r
 /**\r
  * @note    Requires @p CH_CFG_USE_EVENTS.\r
  */\r
 #if !defined(CH_CFG_USE_EVENTS_TIMEOUT)\r
-#define CH_CFG_USE_EVENTS_TIMEOUT           TRUE\r
+#define CH_CFG_USE_EVENTS_TIMEOUT           FALSE\r
 #endif\r
 \r
 /**\r
  * @note    The default is @p TRUE.\r
  */\r
 #if !defined(CH_CFG_USE_MESSAGES)\r
-#define CH_CFG_USE_MESSAGES                 TRUE\r
+#define CH_CFG_USE_MESSAGES                 FALSE\r
 #endif\r
 \r
 /**\r
  * @note    Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.\r
  */\r
 #if !defined(CH_CFG_USE_DYNAMIC)\r
-#define CH_CFG_USE_DYNAMIC                  TRUE\r
+#define CH_CFG_USE_DYNAMIC                  FALSE\r
 #endif\r
 \r
 /** @} */\r
  * @note    Requires @p CH_CFG_USE_MEMCORE.\r
  */\r
 #if !defined(CH_CFG_MEMCORE_SIZE)\r
-#define CH_CFG_MEMCORE_SIZE                 0\r
+#define CH_CFG_MEMCORE_SIZE                 (3 * 1024)\r
 #endif\r
 \r
 /**\r
  * @note    The default is @p TRUE.\r
  */\r
 #if !defined(CH_CFG_USE_OBJ_FIFOS)\r
-#define CH_CFG_USE_OBJ_FIFOS                TRUE\r
+#define CH_CFG_USE_OBJ_FIFOS                FALSE\r
 #endif\r
 \r
 /**\r
  * @note    The default is @p TRUE.\r
  */\r
 #if !defined(CH_CFG_USE_PIPES)\r
-#define CH_CFG_USE_PIPES                    TRUE\r
+#define CH_CFG_USE_PIPES                    FALSE\r
 #endif\r
 \r
 /**\r
  * @note    The default is @p TRUE.\r
  */\r
 #if !defined(CH_CFG_USE_OBJ_CACHES)\r
-#define CH_CFG_USE_OBJ_CACHES               TRUE\r
+#define CH_CFG_USE_OBJ_CACHES               FALSE\r
 #endif\r
 \r
 /**\r
  * @note    The default is @p TRUE.\r
  */\r
 #if !defined(CH_CFG_USE_DELEGATES)\r
-#define CH_CFG_USE_DELEGATES                TRUE\r
+#define CH_CFG_USE_DELEGATES                FALSE\r
 #endif\r
 \r
 /**\r
  * @note    The default is @p TRUE.\r
  */\r
 #if !defined(CH_CFG_USE_JOBS)\r
-#define CH_CFG_USE_JOBS                     TRUE\r
+#define CH_CFG_USE_JOBS                     FALSE\r
 #endif\r
 \r
 /** @} */\r
  * @note    The default is @p FALSE.\r
  */\r
 #if !defined(CH_CFG_USE_FACTORY)\r
-#define CH_CFG_USE_FACTORY                  TRUE\r
+#define CH_CFG_USE_FACTORY                  FALSE\r
 #endif\r
 \r
 /**\r
  * @brief   Enables the registry of generic objects.\r
  */\r
 #if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY)\r
-#define CH_CFG_FACTORY_OBJECTS_REGISTRY     TRUE\r
+#define CH_CFG_FACTORY_OBJECTS_REGISTRY     FALSE\r
 #endif\r
 \r
 /**\r
  * @brief   Enables factory for generic buffers.\r
  */\r
 #if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)\r
-#define CH_CFG_FACTORY_GENERIC_BUFFERS      TRUE\r
+#define CH_CFG_FACTORY_GENERIC_BUFFERS      FALSE\r
 #endif\r
 \r
 /**\r
  * @brief   Enables factory for semaphores.\r
  */\r
 #if !defined(CH_CFG_FACTORY_SEMAPHORES)\r
-#define CH_CFG_FACTORY_SEMAPHORES           TRUE\r
+#define CH_CFG_FACTORY_SEMAPHORES           FALSE\r
 #endif\r
 \r
 /**\r
  * @brief   Enables factory for mailboxes.\r
  */\r
 #if !defined(CH_CFG_FACTORY_MAILBOXES)\r
-#define CH_CFG_FACTORY_MAILBOXES            TRUE\r
+#define CH_CFG_FACTORY_MAILBOXES            FALSE\r
 #endif\r
 \r
 /**\r
  * @brief   Enables factory for objects FIFOs.\r
  */\r
 #if !defined(CH_CFG_FACTORY_OBJ_FIFOS)\r
-#define CH_CFG_FACTORY_OBJ_FIFOS            TRUE\r
+#define CH_CFG_FACTORY_OBJ_FIFOS            FALSE\r
 #endif\r
 \r
 /**\r
  * @brief   Enables factory for Pipes.\r
  */\r
 #if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)\r
-#define CH_CFG_FACTORY_PIPES                TRUE\r
+#define CH_CFG_FACTORY_PIPES                FALSE\r
 #endif\r
 \r
 /** @} */\r
  * @note    The default is @p FALSE.\r
  */\r
 #if !defined(CH_DBG_ENABLE_ASSERTS)\r
-#define CH_DBG_ENABLE_ASSERTS               TRUE\r
+#define CH_DBG_ENABLE_ASSERTS               FALSE\r
 #endif\r
 \r
 /**\r
 /*===========================================================================*/\r
 \r
 // Enable syscall support\r
-#define PORT_USE_SYSCALL                    TRUE\r
+#define PORT_USE_SYSCALL                    FALSE\r
 \r
 #endif  /* CHCONF_H */\r
 \r
index bb6dd3a910ad978645aecca4b1fd21f20e817f40..24c6fded8f4f5236724735df14ef87daa10dd107 100644 (file)
  * @brief   Enables the SERIAL subsystem.\r
  */\r
 #if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)\r
-#define HAL_USE_SERIAL                      TRUE\r
+#define HAL_USE_SERIAL                      FALSE\r
 #endif\r
 \r
 /**\r
  * @note    Disabling this option saves both code and data space.\r
  */\r
 #if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)\r
-#define ADC_USE_WAIT                        TRUE\r
+#define ADC_USE_WAIT                        FALSE\r
 #endif\r
 \r
 /**\r
  * @note    Disabling this option saves both code and data space.\r
  */\r
 #if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)\r
-#define ADC_USE_MUTUAL_EXCLUSION            TRUE\r
+#define ADC_USE_MUTUAL_EXCLUSION            FALSE\r
 #endif\r
 \r
 /*===========================================================================*/\r
  * @note    Disabling this option saves both code and data space.\r
  */\r
 #if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__)\r
-#define DAC_USE_WAIT                        TRUE\r
+#define DAC_USE_WAIT                        FALSE\r
 #endif\r
 \r
 /**\r
  * @note    Disabling this option saves both code and data space.\r
  */\r
 #if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)\r
-#define DAC_USE_MUTUAL_EXCLUSION            TRUE\r
+#define DAC_USE_MUTUAL_EXCLUSION            FALSE\r
 #endif\r
 \r
 /*===========================================================================*/\r
index 3a246fa0085e1bdbb4b7a8206f5076b3a3eb5c45..929e04990be018aae86a5ab0931d4dc9060eebd1 100644 (file)
@@ -32,9 +32,8 @@
 #define MCUCONF_H\r
 \r
 #define STM32L4xx_MCUCONF\r
-//#define STM32L476_MCUCONF\r
-#define STM32L432_MCUCONF\r
-//#define STM32L433_MCUCONF\r
+#define STM32L476_MCUCONF\r
+//#define STM32L432_MCUCONF\r
 \r
 /*\r
  * HAL driver system settings.\r
index 43abc22381cfb525101bc6c55ae0fc634e0c42bf..414d2f74372d610edc42e82c68fdb80c35a8a41c 100644 (file)
@@ -21,7 +21,8 @@
 
 constexpr unsigned int MAX_ELF_FILE_SIZE = 8 * 1024;
 constexpr unsigned int MAX_ERROR_QUEUE_SIZE = 8;
-constexpr unsigned int MAX_SAMPLE_BUFFER_SIZE = 8000;
+constexpr unsigned int MAX_SAMPLE_BUFFER_SIZE = 6000;
+constexpr unsigned int MAX_SIGGEN_BUFFER_SIZE = 3000;
 
 enum class RunStatus : char
 {
@@ -61,7 +62,7 @@ static Error error_queue_pop()
 static msg_t conversionMBBuffer[4];
 static MAILBOX_DECL(conversionMB, conversionMBBuffer, 4);
 
-static THD_WORKING_AREA(conversionThreadWA, 1024);
+static THD_WORKING_AREA(conversionThreadWA, 2048);
 static THD_FUNCTION(conversionThread, arg);
 
 static time_measurement_t conversion_time_measurement;
@@ -80,7 +81,7 @@ static std::array<dacsample_t, CACHE_SIZE_ALIGN(dacsample_t, MAX_SAMPLE_BUFFER_S
 #if CACHE_LINE_SIZE > 0
 CC_ALIGN(CACHE_LINE_SIZE)
 #endif
-static std::array<dacsample_t, CACHE_SIZE_ALIGN(dacsample_t, MAX_SAMPLE_BUFFER_SIZE)> dac2_samples;
+static std::array<dacsample_t, CACHE_SIZE_ALIGN(dacsample_t, MAX_SIGGEN_BUFFER_SIZE)> dac2_samples;
 
 static uint8_t elf_file_store[MAX_ELF_FILE_SIZE];
 static elf::entry_t elf_entry = nullptr;
@@ -116,7 +117,7 @@ int main()
 }
 
 static unsigned int dac_sample_count = MAX_SAMPLE_BUFFER_SIZE;
-static unsigned int dac2_sample_count = MAX_SAMPLE_BUFFER_SIZE;
+static unsigned int dac2_sample_count = MAX_SIGGEN_BUFFER_SIZE;
 static unsigned int adc_sample_count = MAX_SAMPLE_BUFFER_SIZE;
 
 void main_loop()
@@ -160,7 +161,7 @@ void main_loop()
                 case 'D':
                     if (usbserial::read(&cmd[1], 2) == 2) {
                         unsigned int count = cmd[1] | (cmd[2] << 8);
-                        if (count <= MAX_SAMPLE_BUFFER_SIZE / 2) {
+                        if (count <= MAX_SIGGEN_BUFFER_SIZE) {
                             dac2_sample_count = count;
                             usbserial::read(&dac2_samples[0], dac2_sample_count * sizeof(dacsample_t));
                         } else {