RISCV_PREFIX ?= riscv64-unknown-elf- CC := $(RISCV_PREFIX)gcc CXX := $(RISCV_PREFIX)g++ OBJCOPY := $(RISCV_PREFIX)objcopy OBJDUMP := $(RISCV_PREFIX)objdump SIZE := $(RISCV_PREFIX)size NM := $(RISCV_PREFIX)nm READELF := $(RISCV_PREFIX)readelf LOCAL_H3_PROVIDER := $(abspath ../lab-rv32i-freertos-c-scheduler) RV_ENV_ROOT ?= $(if $(wildcard /opt/rv-env/vendor/Hazard3),/opt/rv-env,$(LOCAL_H3_PROVIDER)) H3_COMMON := $(RV_ENV_ROOT)/vendor/Hazard3/test/sim/common H3_INIT := $(H3_COMMON)/init.S LDSCRIPT := $(H3_COMMON)/link_hazard3.ld TB ?= $(RV_ENV_ROOT)/vendor/Hazard3/test/sim/tb_verilator/tb FREERTOS := vendor/FreeRTOS-Kernel FREERTOS_PORT := $(FREERTOS)/portable/GCC/RISC-V BUILD := build TASK := task01_queue ARCH ?= rv32i_zicsr_zifencei ABI ?= ilp32 CPPFLAGS := -Iinclude -Isrc/common -I$(FREERTOS)/include -I$(FREERTOS_PORT) TARGET_FLAGS := -march=$(ARCH) -mabi=$(ABI) -Og -g3 -ffreestanding -fno-builtin -fno-stack-protector -ffunction-sections -fdata-sections -Wall -Wextra CFLAGS := -std=c11 $(TARGET_FLAGS) $(CPPFLAGS) CXXFLAGS := -std=c++17 $(TARGET_FLAGS) -fno-exceptions -fno-rtti -fno-threadsafe-statics -fno-use-cxa-atexit -fno-sized-deallocation -fno-unwind-tables -fno-asynchronous-unwind-tables $(CPPFLAGS) ASFLAGS := -march=$(ARCH) -mabi=$(ABI) -g3 $(CPPFLAGS) LDFLAGS := -march=$(ARCH) -mabi=$(ABI) -nostdlib -nostartfiles -T$(LDSCRIPT) -Wl,--no-relax -Wl,--gc-sections LIBS := -lgcc COMMON_OBJS := $(BUILD)/common/init.o $(BUILD)/common/crt0.o $(BUILD)/common/lab_io.o $(BUILD)/common/lab_freertos.o $(BUILD)/common/hazard3_freertos_traps.o $(BUILD)/common/memops.o KERNEL_OBJS := $(BUILD)/kernel/tasks.o $(BUILD)/kernel/list.o $(BUILD)/kernel/queue.o $(BUILD)/kernel/heap_4.o $(BUILD)/kernel/port.o $(BUILD)/kernel/portASM.o .PHONY: all check check-host check-abi sim pdf clean check-support all: $(BUILD)/$(TASK)/prog.bin check-support: @test -f "$(H3_INIT)" || { echo "missing $(H3_INIT); set RV_ENV_ROOT" >&2; exit 1; } @test -f "$(LDSCRIPT)" || { echo "missing $(LDSCRIPT); set RV_ENV_ROOT" >&2; exit 1; } $(BUILD)/common/init.o: $(H3_INIT) | check-support mkdir -p $(@D) $(CC) $(ASFLAGS) -c $< -o $@ $(BUILD)/common/crt0.o: src/common/crt0.S mkdir -p $(@D) $(CC) $(ASFLAGS) -c $< -o $@ $(BUILD)/common/hazard3_freertos_traps.o: src/common/hazard3_freertos_traps.S mkdir -p $(@D) $(CC) $(ASFLAGS) -c $< -o $@ $(BUILD)/common/lab_io.o: src/common/lab_io.c src/common/lab_io.h mkdir -p $(@D) $(CC) $(CFLAGS) -c $< -o $@ $(BUILD)/common/lab_freertos.o: src/common/lab_freertos.c src/common/lab_freertos.h mkdir -p $(@D) $(CC) $(CFLAGS) -c $< -o $@ $(BUILD)/common/memops.o: src/common/memops.c mkdir -p $(@D) $(CC) $(CFLAGS) -c $< -o $@ $(BUILD)/kernel/tasks.o: $(FREERTOS)/tasks.c mkdir -p $(@D) $(CC) $(CFLAGS) -c $< -o $@ $(BUILD)/kernel/list.o: $(FREERTOS)/list.c mkdir -p $(@D) $(CC) $(CFLAGS) -c $< -o $@ $(BUILD)/kernel/queue.o: $(FREERTOS)/queue.c mkdir -p $(@D) $(CC) $(CFLAGS) -c $< -o $@ $(BUILD)/kernel/heap_4.o: $(FREERTOS)/portable/MemMang/heap_4.c mkdir -p $(@D) $(CC) $(CFLAGS) -c $< -o $@ $(BUILD)/kernel/port.o: $(FREERTOS_PORT)/port.c mkdir -p $(@D) $(CC) $(CFLAGS) -c $< -o $@ $(BUILD)/kernel/portASM.o: $(FREERTOS_PORT)/portASM.S mkdir -p $(@D) $(CC) $(ASFLAGS) -c $< -o $@ $(BUILD)/$(TASK)/app.o: src/tasks/$(TASK).cpp include/freertos/queue.hpp mkdir -p $(@D) $(CXX) $(CXXFLAGS) -c $< -o $@ $(BUILD)/$(TASK)/$(TASK).s: src/tasks/$(TASK).cpp include/freertos/queue.hpp mkdir -p $(@D) $(CXX) $(CXXFLAGS) -S $< -o $@ $(BUILD)/$(TASK)/prog.elf: $(COMMON_OBJS) $(KERNEL_OBJS) $(BUILD)/$(TASK)/app.o $(CC) $(LDFLAGS) -Wl,-Map,$(BUILD)/$(TASK)/prog.map -o $@ $^ $(LIBS) $(SIZE) -A -x $@ $(BUILD)/$(TASK)/prog.bin: $(BUILD)/$(TASK)/prog.elf $(BUILD)/$(TASK)/$(TASK).s $(OBJCOPY) -O binary $< $@ $(OBJDUMP) -d -M no-aliases,numeric $< > $(BUILD)/$(TASK)/prog.lst check-host: ./scripts/test_host.sh check-abi: $(BUILD)/$(TASK)/prog.elf RISCV_NM=$(NM) RISCV_READELF=$(READELF) ./scripts/check_abi.sh sim: $(BUILD)/$(TASK)/prog.bin @test -x "$(TB)" || { echo "missing simulator $(TB); set TB" >&2; exit 1; } ./scripts/run_sim.sh "$(TB)" "$(BUILD)" check: check-host check-abi sim pdf: ./scripts/render_pdf.sh clean: rm -rf $(BUILD) host-build