standalone build for riscv ulp programs

This commit is contained in:
Jeff Epler 2022-10-22 18:00:54 -05:00
commit 01d8291a61
No known key found for this signature in database
GPG key ID: D5BF15AB975AB4DE
5 changed files with 114 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/link.ld
/a.out

32
Makefile Normal file
View file

@ -0,0 +1,32 @@
COPROC_RESERVE_MEM ?= 8176
SOC := esp32s3
CC := riscv32-esp-elf-gcc
CFLAGS := -Os -march=rv32imc -mdiv -fdata-sections -ffunction-sections
CFLAGS += -isystem $(IDF_PATH)/components/ulp/ulp_riscv/include/
CFLAGS += -isystem $(IDF_PATH)/components/soc/$(SOC)/include
CFLAGS += -isystem $(IDF_PATH)/components/esp_common/include
CFLAGS += -DCOPROC_RESERVE_MEM=$(COPROC_RESERVE_MEM)
ifeq ($(SOC),esp32s3)
CFLAGS += -DCONFIG_IDF_TARGET_ESP32S3
endif
ifeq ($(SOC),esp32s2)
CFLAGS += -DCONFIG_IDF_TARGET_ESP32S2
endif
LDFLAGS := -march=rv32imc --specs=nano.specs --specs=nosys.specs
SRCS ?= ulp.c
SRCS += $(IDF_PATH)/components/ulp/ulp_riscv/ulp_riscv_utils.c
LDFLAGS += link.ld
.PHONY: default
default: a.out
a.out: $(SRCS) link.ld
$(CC) -flto $(CFLAGS) $^ -o $@ $(LDFLAGS)
.PHONY: clean
clean:
rm -f a.out link.ld
link.ld: ulp.riscv.ld
$(CC) -E -P -xc $(CFLAGS) -o $@ $<

1
sdkconfig.h Normal file
View file

@ -0,0 +1 @@

31
ulp.c Normal file
View file

@ -0,0 +1,31 @@
// ULP-RISCV
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include "ulp_riscv/ulp_riscv.h"
#include "ulp_riscv/ulp_riscv_utils.h"
#include "ulp_riscv/ulp_riscv_gpio.h"
// global variables will be exported as public symbols, visible from main CPU
__attribute__((used)) uint8_t shared_mem[1024];
__attribute__((used)) uint16_t shared_mem_len = 1024;
int main (void) {
shared_mem[0] = 10;
shared_mem_len = 1024;
bool gpio_level = true;
ulp_riscv_gpio_init(GPIO_NUM_21);
ulp_riscv_gpio_output_enable(GPIO_NUM_21);
while(1) {
ulp_riscv_gpio_output_level(GPIO_NUM_21, gpio_level);
ulp_riscv_delay_cycles(shared_mem[0] * 10 * ULP_RISCV_CYCLES_PER_MS);
gpio_level = !gpio_level;
}
// ulp_riscv_shutdown() is called automatically when main exits
return 0;
}

48
ulp.riscv.ld Normal file
View file

@ -0,0 +1,48 @@
/*
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "sdkconfig.h"
ENTRY(reset_vector)
MEMORY
{
ram(RW) : ORIGIN = 0, LENGTH = COPROC_RESERVE_MEM
}
SECTIONS
{
. = ORIGIN(ram);
.text :
{
*start.S.obj(.text.vectors) /* Default reset vector must link to offset 0x0 */
*(.text)
*(.text*)
} >ram
.rodata ALIGN(4):
{
*(.rodata)
*(.rodata*)
} > ram
.data ALIGN(4):
{
*(.data)
*(.data*)
*(.sdata)
*(.sdata*)
} > ram
.bss ALIGN(4) :
{
*(.bss)
*(.bss*)
*(.sbss)
*(.sbss*)
} >ram
__stack_top = ORIGIN(ram) + LENGTH(ram);
}