aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2023-11-12 11:13:20 -0500
committerClyne Sullivan <clyne@bitgloo.com>2023-11-12 11:13:20 -0500
commit69152efdad181c70fd794ecba5f5f48f23bc67bd (patch)
treebebf4f6429c086b9b99336f5064aa3274a072302
parentf8f73362a8d1df18bcc48eb8fb1945ad74f30163 (diff)
msp430: reduce excess memory usage; trim linker script
-rw-r--r--libalee/dictionary.hpp5
-rw-r--r--msp430/alee-msp430.cpp15
-rw-r--r--msp430/msp430fr2476.ld54
3 files changed, 13 insertions, 61 deletions
diff --git a/libalee/dictionary.hpp b/libalee/dictionary.hpp
index 2b7afdf..96db2ea 100644
--- a/libalee/dictionary.hpp
+++ b/libalee/dictionary.hpp
@@ -37,9 +37,8 @@
* - 0+ bytes of entry's data...
*/
-class Dictionary
+struct Dictionary
{
-public:
/**
* The beginning of the dictionary is used for "internal" variables.
*/
@@ -129,7 +128,7 @@ public:
return std::equal(b1, e1, b2, eqchars);
}
- virtual ~Dictionary() = default;
+ virtual ~Dictionary() {};
private:
// Case-insensitive comparison.
diff --git a/msp430/alee-msp430.cpp b/msp430/alee-msp430.cpp
index 48a806e..c270612 100644
--- a/msp430/alee-msp430.cpp
+++ b/msp430/alee-msp430.cpp
@@ -42,13 +42,18 @@ static void initUART();
static void Software_Trim();
#define MCLK_FREQ_MHZ (8) // MCLK = 8MHz
-#define ALEE_RODICTSIZE (7000)
+#define ALEE_RODICTSIZE (9200)
__attribute__((section(".lodict")))
#include "core.fth.h"
static bool exitLpm;
static Addr isr_list[24] = {};
-static SplitMemDictRW<ALEE_RODICTSIZE, 32767> dict (alee_dat, 0x10000);
+
+using DictType = SplitMemDictRW<ALEE_RODICTSIZE, 32767>;
+
+alignas(DictType)
+static unsigned char dictbuf[sizeof(DictType)];
+static auto dict = reinterpret_cast<DictType *>(dictbuf);
int main()
{
@@ -59,7 +64,9 @@ int main()
SYSCFG0 = FRWPPW;
(void)alee_dat_len;
- State state (dict, readchar);
+ dict->lodict = alee_dat;
+ dict->hidict = 0x10000;
+ State state (*dict, readchar);
Parser::customParse = findword;
serputs("alee forth\n\r");
@@ -371,7 +378,7 @@ bool alee_isr_handle(unsigned index)
const Addr isr = isr_list[index];
if (isr != 0) {
- State isrstate (dict, readchar);
+ State isrstate (*dict, readchar);
exitLpm = false;
isrstate.execute(isr);
return exitLpm;
diff --git a/msp430/msp430fr2476.ld b/msp430/msp430fr2476.ld
index 9a2b089..08b0299 100644
--- a/msp430/msp430fr2476.ld
+++ b/msp430/msp430fr2476.ld
@@ -166,10 +166,8 @@ SECTIONS
.rodata :
{
. = ALIGN(2);
- *(.plt)
*(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*)
*(.rodata1)
- KEEP (*(.gcc_except_table)) *(.gcc_except_table.*)
} > FRAM
/* Note: This is a separate .rodata section for sections which are
@@ -193,8 +191,6 @@ SECTIONS
KEEP (*(SORT(.fini_array.*)))
PROVIDE (__fini_array_end = .);
. = ALIGN(2);
- *(.eh_frame_hdr)
- KEEP (*(.eh_frame))
/* gcc uses crtbegin.o to find the start of the constructors, so
we make sure it is first. Because this is a wildcard, it
@@ -218,17 +214,6 @@ SECTIONS
KEEP (*(.dtors))
} > FRAM
- /* This section contains data that is initialised during load
- but not on application reset. */
- .persistent :
- {
- . = ALIGN(2);
- PROVIDE (__persistent_start = .);
- *(.persistent)
- . = ALIGN(2);
- PROVIDE (__persistent_end = .);
- } > FRAM
-
.tinyram : {} > TINYRAM
.data :
@@ -236,15 +221,10 @@ SECTIONS
. = ALIGN(2);
PROVIDE (__datastart = .);
- KEEP (*(.jcr))
- *(.data.rel.ro.local) *(.data.rel.ro*)
- *(.dynamic)
-
*(.data .data.* .gnu.linkonce.d.*)
KEEP (*(.gnu.linkonce.d.*personality*))
SORT(CONSTRUCTORS)
*(.data1)
- *(.got.plt) *(.got)
/* We want the small data sections together, so single-instruction offsets
can access them all, and initialized data all before uninitialized, so
@@ -268,7 +248,6 @@ SECTIONS
{
. = ALIGN(2);
PROVIDE (__bssstart = .);
- *(.dynbss)
*(.sbss .sbss.*)
*(.bss .bss.* .gnu.linkonce.b.*)
. = ALIGN(2);
@@ -288,29 +267,6 @@ SECTIONS
PROVIDE (__noinit_end = .);
} > RAM
- /* We create this section so that "end" will always be in the
- RAM region (matching .stack below), even if the .bss
- section is empty. */
- .heap (NOLOAD) :
- {
- . = ALIGN(2);
- __heap_start__ = .;
- _end = __heap_start__;
- PROVIDE (end = .);
- KEEP (*(.heap))
- _end = .;
- PROVIDE (end = .);
- /* This word is here so that the section is not empty, and thus
- not discarded by the linker. The actual value does not matter
- and is ignored. */
- LONG(0);
- __heap_end__ = .;
- __HeapLimit = __heap_end__;
- } > RAM
- /* WARNING: Do not place anything in RAM here.
- The heap section must be the last section in RAM and the stack
- section must be placed at the very end of the RAM region. */
-
.stack (ORIGIN (RAM) + LENGTH(RAM)) :
{
PROVIDE (__stack = .);
@@ -331,18 +287,8 @@ SECTIONS
KEEP (*(SORT(.crt_*)))
. = ALIGN(2);
- KEEP (*(.lowtext))
-
- . = ALIGN(2);
*(.text .stub .text.* .gnu.linkonce.t.* .text:*)
- KEEP (*(.text.*personality*))
- /* .gnu.warning sections are handled specially by elf32.em. */
- *(.gnu.warning)
- *(.interp .hash .dynsym .dynstr .gnu.version*)
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
. = ALIGN(2);
KEEP (*(.init))
KEEP (*(.fini))