Commit 6e43e8e9 authored by Daniel Friesel's avatar Daniel Friesel
Browse files

MSP430: save & restore entire SRAM to/from FRAM

parent 50d32b10
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ COMMON_FLAGS = -g -Os -Wall -Wextra
CFLAGS = -std=c99
CXXFLAGS = -std=c++14 -fno-rtti -fno-threadsafe-statics

ASM_TARGETS =
C_TARGETS =
CXX_TARGETS = src/app/${app}/main.cc src/os/object/cpp_helpers.cc src/os/object/outputstream.cc

+5 −0
Original line number Diff line number Diff line
timer_cycles ?= 1
timer_s ?= 1
loop ?= 1

ASM_TARGETS += src/app/transactiontest/util.S
 No newline at end of file
+64 −0
Original line number Diff line number Diff line
#include "arch.h"
#include "driver/gpio.h"
#include "driver/stdout.h"
#include "driver/uptime.h"

#ifndef TIMER_CYCLES
#error makeflag timer_cycles=1 required
#endif

extern "C" {
	void asm_save_toc();
	void asm_load_toc();
}

volatile bool __attribute__((section(".text"))) have_state = false;
uint16_t i = 0;

void restore_state()
{
	if (!have_state) {
		return;
	}
	asm_load_toc();
}

void save_state()
{
	asm_save_toc();
	have_state = true;
}

void loop(void)
{
	gpio.led_toggle(1);
	kout << dec << i << endl;
	i++;
	if (i == 5) {
		save_state();
	}
	if (i == 10) {
		restore_state();
	}
}

int main(void)
{
	arch.setup();
	gpio.setup();
	kout.setup();

	restore_state();

	gpio.led_on(0);
	kout << "Hello, World!" << endl;
	kout << "Test, World!" << endl;
	kout << dec << uptime.get_cycles() << endl;
	kout << dec << uptime.get_cycles() << endl;
	kout << dec << uptime.get_cycles() << endl;
	kout << dec << uptime.get_cycles() << endl;

	arch.idle_loop();

	return 0;
}
+46 −0
Original line number Diff line number Diff line
.global asm_save_toc
.global asm_load_toc

stack_backup:
    .space 2048

sp_backup:
    .space 2

asm_save_toc:
    .irp reg,4,5,6,7,8,9,10,11
    push r\reg
    .endr

    mov r1, &sp_backup

    mov #1c00h, r10
    mov #stack_backup, r11

save_sram_word:
    mov @r10+, 0(r11)
    add #2, r11
    cmp #1c00h+2048, r10
    jlo save_sram_word

    pop r11
    pop r10
    add #12, r1
    ret

asm_load_toc:
    mov #stack_backup, r10
    mov #1c00h, r11

load_sram_word:
    mov @r10+, 0(r11)
    add #2, r11
    cmp #1c00h+2048, r11
    jlo load_sram_word

    mov &sp_backup, r1
    .irp reg,11,10,9,8,7,6,5,4
    pop r\reg
    .endr

    ret
 No newline at end of file
+4 −1
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ else
endif


OBJECTS = ${CXX_TARGETS:.cc=.o} ${C_TARGETS:.c=.o}
OBJECTS = ${CXX_TARGETS:.cc=.o} ${C_TARGETS:.c=.o} ${ASM_TARGETS:.S=.o}

.cc.o:
	${QUIET}${CXX} ${INCLUDES} ${COMMON_FLAGS} ${CXXFLAGS} -c -o $@ ${@:.o=.cc}
@@ -75,6 +75,9 @@ OBJECTS = ${CXX_TARGETS:.cc=.o} ${C_TARGETS:.c=.o}
.c.o:
	${QUIET}${CC} ${INCLUDES} ${COMMON_FLAGS} ${CFLAGS} -c -o $@ ${@:.o=.c}

.S.o:
	${QUIET}${CC} ${INCLUDES} ${COMMON_FLAGS} -Wa,-gstabs,-ggdb -x assembler-with-cpp -c -o $@ ${@:.o=.S}

build/system.elf: ${OBJECTS}
	${QUIET}${CXX} ${INCLUDES} ${COMMON_FLAGS} ${CXXFLAGS} \
		-Wl,--library-path=/opt/msp430/ti/gcc/include/ \
Loading