feat: rebuild heap4 card around upstream FreeRTOS allocator
This commit is contained in:
@@ -6,11 +6,18 @@ OBJDUMP := $(RISCV_PREFIX)objdump
|
||||
SIZE := $(RISCV_PREFIX)size
|
||||
HOST_CC ?= cc
|
||||
|
||||
DEBUG ?= 1
|
||||
ifeq ($(DEBUG),1)
|
||||
PROFILE ?= observe
|
||||
ifeq ($(PROFILE),observe)
|
||||
OPTFLAGS := -O0 -fno-omit-frame-pointer -fno-inline -fno-optimize-sibling-calls
|
||||
DBGFLAGS := -g3 -ggdb
|
||||
else
|
||||
else ifeq ($(PROFILE),debug)
|
||||
OPTFLAGS := -Og -fno-omit-frame-pointer -fno-optimize-sibling-calls
|
||||
DBGFLAGS := -g3 -ggdb
|
||||
else ifeq ($(PROFILE),release)
|
||||
OPTFLAGS := -O2
|
||||
DBGFLAGS :=
|
||||
else
|
||||
$(error PROFILE must be observe, debug or release)
|
||||
endif
|
||||
|
||||
RV_ENV_ROOT ?= /opt/rv-env
|
||||
@@ -21,36 +28,35 @@ LDSCRIPT ?= $(H3_COMMON)/link_hazard3.ld
|
||||
LAB_RUNTIME_DIR ?= $(RV_ENV_ROOT)/vendor/lab-runtime
|
||||
MEMOPS ?= $(LAB_RUNTIME_DIR)/memops.c
|
||||
|
||||
LOCAL_FREERTOS := $(abspath ../lab-rv32i-freertos-task-stack-vector/vendor/FreeRTOS-Kernel)
|
||||
FREERTOS_KERNEL_PATH ?= $(if $(wildcard /opt/FreeRTOS-Kernel/include/FreeRTOS.h),/opt/FreeRTOS-Kernel,$(LOCAL_FREERTOS))
|
||||
FREERTOS_PORT := $(FREERTOS_KERNEL_PATH)/portable/GCC/RISC-V
|
||||
HEAP4_SOURCE := $(FREERTOS_KERNEL_PATH)/portable/MemMang/heap_4.c
|
||||
|
||||
BUILD_ROOT ?= build
|
||||
HOST_BUILD_ROOT ?= host-build
|
||||
TASKS := \
|
||||
task01_heap_map \
|
||||
task02_free_list \
|
||||
task03_heap_init \
|
||||
task04_alignment \
|
||||
task05_malloc_first_fit \
|
||||
task06_split_block \
|
||||
task07_free_insert \
|
||||
task08_coalescing \
|
||||
task09_config_macros \
|
||||
task10_heap4_demo
|
||||
task01_first_fit_split \
|
||||
task02_address_order_coalesce \
|
||||
task03_freertos_heap4
|
||||
|
||||
ARCH ?= rv32i_zicsr_zifencei
|
||||
ABI ?= ilp32
|
||||
|
||||
COMMON_FLAGS := -std=c99 -march=$(ARCH) -mabi=$(ABI) -nostdlib -nostartfiles -ffreestanding -fno-builtin -fno-stack-protector $(DBGFLAGS) -Wall -Wextra -Isrc/tasks
|
||||
LINK_FLAGS := -Wl,--no-relax -Wl,-T,$(LDSCRIPT)
|
||||
COMMON_FLAGS := -std=c11 -march=$(ARCH) -mabi=$(ABI) -nostdlib -nostartfiles \
|
||||
-ffreestanding -fno-builtin -fno-stack-protector -ffunction-sections \
|
||||
-fdata-sections $(OPTFLAGS) $(DBGFLAGS) -Wall -Wextra -Wpedantic
|
||||
MODEL_CPPFLAGS := -Isrc/tasks
|
||||
KERNEL_CPPFLAGS := -Iinclude/freestanding -Iinclude -Isrc/tasks \
|
||||
-I$(FREERTOS_KERNEL_PATH)/include -I$(FREERTOS_PORT)
|
||||
LINK_FLAGS := -Wl,--no-relax -Wl,--gc-sections -T $(LDSCRIPT)
|
||||
LIBS := -lgcc
|
||||
EMIT_FLAGS := -std=c99 -march=$(ARCH) -mabi=$(ABI) -O -ffreestanding -fno-builtin -fno-stack-protector -nostdlib -nostartfiles -Wall -Wextra -Isrc/tasks
|
||||
CFLAGS_STEP := $(COMMON_FLAGS) -O
|
||||
HOST_CFLAGS := -std=c99 -O0 -g -Wall -Wextra -DHOST_PRINTF=1 -Isrc/tasks
|
||||
HOST_FLAGS := -std=c11 $(OPTFLAGS) $(DBGFLAGS) -Wall -Wextra -Wpedantic \
|
||||
-DHOST_PRINTF=1 -Isrc/tasks
|
||||
HOST_HEAP4_FLAGS := $(HOST_FLAGS) -DHEAP4_HOST_ADAPTER=1 -Iinclude/host-shim
|
||||
|
||||
.PHONY: all tasks host \
|
||||
task1 task2 task3 task4 task5 task6 task7 task8 task9 task10 \
|
||||
t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 \
|
||||
host-task1 host-task2 host-task3 host-task4 host-task5 host-task6 host-task7 host-task8 host-task9 host-task10 \
|
||||
ht1 ht2 ht3 ht4 ht5 ht6 ht7 ht8 ht9 ht10 \
|
||||
clean check-support $(TASKS)
|
||||
.PHONY: all tasks host task1 task2 task3 t1 t2 t3 \
|
||||
host-task1 host-task2 host-task3 ht1 ht2 ht3 clean check-support check-kernel \
|
||||
$(TASKS)
|
||||
|
||||
all: tasks
|
||||
tasks: $(TASKS)
|
||||
@@ -59,54 +65,66 @@ host: $(addprefix $(HOST_BUILD_ROOT)/,$(addsuffix /prog,$(TASKS)))
|
||||
task1 t1: $(word 1,$(TASKS))
|
||||
task2 t2: $(word 2,$(TASKS))
|
||||
task3 t3: $(word 3,$(TASKS))
|
||||
task4 t4: $(word 4,$(TASKS))
|
||||
task5 t5: $(word 5,$(TASKS))
|
||||
task6 t6: $(word 6,$(TASKS))
|
||||
task7 t7: $(word 7,$(TASKS))
|
||||
task8 t8: $(word 8,$(TASKS))
|
||||
task9 t9: $(word 9,$(TASKS))
|
||||
task10 t10: $(word 10,$(TASKS))
|
||||
|
||||
host-task1 ht1: $(HOST_BUILD_ROOT)/$(word 1,$(TASKS))/prog
|
||||
host-task2 ht2: $(HOST_BUILD_ROOT)/$(word 2,$(TASKS))/prog
|
||||
host-task3 ht3: $(HOST_BUILD_ROOT)/$(word 3,$(TASKS))/prog
|
||||
host-task4 ht4: $(HOST_BUILD_ROOT)/$(word 4,$(TASKS))/prog
|
||||
host-task5 ht5: $(HOST_BUILD_ROOT)/$(word 5,$(TASKS))/prog
|
||||
host-task6 ht6: $(HOST_BUILD_ROOT)/$(word 6,$(TASKS))/prog
|
||||
host-task7 ht7: $(HOST_BUILD_ROOT)/$(word 7,$(TASKS))/prog
|
||||
host-task8 ht8: $(HOST_BUILD_ROOT)/$(word 8,$(TASKS))/prog
|
||||
host-task9 ht9: $(HOST_BUILD_ROOT)/$(word 9,$(TASKS))/prog
|
||||
host-task10 ht10: $(HOST_BUILD_ROOT)/$(word 10,$(TASKS))/prog
|
||||
|
||||
check-support:
|
||||
@test -f "$(H3_INIT)" || { echo "Missing $(H3_INIT). Run inside rv-env or set RV_ENV_ROOT=/path/to/rv32i-hazard3-env" >&2; exit 1; }
|
||||
@test -f "$(H3_INIT)" || { echo "Missing $(H3_INIT). Run inside hazard3-sim." >&2; exit 1; }
|
||||
@test -f "$(LDSCRIPT)" || { echo "Missing $(LDSCRIPT)." >&2; exit 1; }
|
||||
@test -f "$(MEMOPS)" || { echo "Missing $(MEMOPS)." >&2; exit 1; }
|
||||
|
||||
define task_rules
|
||||
$(1): $(BUILD_ROOT)/$(1)/prog.bin $(BUILD_ROOT)/$(1)/prog.elf $(BUILD_ROOT)/$(1)/prog.lst $(BUILD_ROOT)/$(1)/$(1).s
|
||||
check-kernel:
|
||||
@test -f "$(HEAP4_SOURCE)" || { echo "Missing pinned FreeRTOS heap_4.c at $(HEAP4_SOURCE)." >&2; exit 1; }
|
||||
@grep -F 'FreeRTOS Kernel V11.3.0' "$(FREERTOS_KERNEL_PATH)/include/FreeRTOS.h" >/dev/null || { echo "Expected FreeRTOS Kernel V11.3.0." >&2; exit 1; }
|
||||
|
||||
$(BUILD_ROOT)/$(1)/prog.elf: crt0.S src/tasks/$(1).c src/tasks/heap4_common.h $(H3_INIT) $(LDSCRIPT) $(MEMOPS) | check-support
|
||||
define model_task_rules
|
||||
$(1): $(BUILD_ROOT)/$(1)/prog.bin $(BUILD_ROOT)/$(1)/prog.elf $(BUILD_ROOT)/$(1)/prog.lst
|
||||
|
||||
$(BUILD_ROOT)/$(1)/prog.elf: crt0.S src/tasks/$(1).c src/tasks/heap4_model.h $(H3_INIT) $(LDSCRIPT) $(MEMOPS) | check-support
|
||||
mkdir -p $$(@D)
|
||||
$(CC) $(CFLAGS_STEP) $(LINK_FLAGS) -Wl,-Map,$(BUILD_ROOT)/$(1)/prog.map -o $$@ $(H3_INIT) crt0.S $(MEMOPS) src/tasks/$(1).c $(LIBS)
|
||||
$(CC) $(COMMON_FLAGS) $(MODEL_CPPFLAGS) $(LINK_FLAGS) -Wl,-Map,$(BUILD_ROOT)/$(1)/prog.map -o $$@ $(H3_INIT) crt0.S $(MEMOPS) src/tasks/$(1).c $(LIBS)
|
||||
$(SIZE) -A -x $$@
|
||||
|
||||
$(BUILD_ROOT)/$(1)/prog.bin: $(BUILD_ROOT)/$(1)/prog.elf
|
||||
$(OBJCOPY) -O binary $$< $$@
|
||||
|
||||
$(BUILD_ROOT)/$(1)/prog.lst: $(BUILD_ROOT)/$(1)/prog.elf
|
||||
$(OBJDUMP) -d -M no-aliases,numeric $$< > $$@
|
||||
$(OBJDUMP) -d -S -M no-aliases,numeric $$< > $$@
|
||||
|
||||
$(BUILD_ROOT)/$(1)/$(1).s: src/tasks/$(1).c src/tasks/heap4_common.h | check-support
|
||||
$(HOST_BUILD_ROOT)/$(1)/prog: src/tasks/$(1).c src/tasks/heap4_model.h
|
||||
mkdir -p $$(@D)
|
||||
$(CC) $(EMIT_FLAGS) -S -o $$@ $$<
|
||||
|
||||
$(HOST_BUILD_ROOT)/$(1)/prog: src/tasks/$(1).c src/tasks/heap4_common.h
|
||||
mkdir -p $$(@D)
|
||||
$(HOST_CC) $(HOST_CFLAGS) -o $$@ $$<
|
||||
$(HOST_CC) $(HOST_FLAGS) -o $$@ $$<
|
||||
endef
|
||||
|
||||
$(foreach task,$(TASKS),$(eval $(call task_rules,$(task))))
|
||||
$(eval $(call model_task_rules,$(word 1,$(TASKS))))
|
||||
$(eval $(call model_task_rules,$(word 2,$(TASKS))))
|
||||
|
||||
TASK03 := $(word 3,$(TASKS))
|
||||
TASK03_KERNEL_SOURCES := \
|
||||
$(FREERTOS_KERNEL_PATH)/tasks.c \
|
||||
$(FREERTOS_KERNEL_PATH)/list.c \
|
||||
$(HEAP4_SOURCE) \
|
||||
$(FREERTOS_PORT)/port.c \
|
||||
$(FREERTOS_PORT)/portASM.S
|
||||
|
||||
$(TASK03): $(BUILD_ROOT)/$(TASK03)/prog.bin $(BUILD_ROOT)/$(TASK03)/prog.elf $(BUILD_ROOT)/$(TASK03)/prog.lst
|
||||
|
||||
$(BUILD_ROOT)/$(TASK03)/prog.elf: crt0.S src/tasks/$(TASK03).c include/FreeRTOSConfig.h $(TASK03_KERNEL_SOURCES) $(H3_INIT) $(LDSCRIPT) $(MEMOPS) | check-support check-kernel
|
||||
mkdir -p $(@D)
|
||||
$(CC) $(COMMON_FLAGS) $(KERNEL_CPPFLAGS) $(LINK_FLAGS) -Wl,-Map,$(BUILD_ROOT)/$(TASK03)/prog.map -o $@ $(H3_INIT) crt0.S $(MEMOPS) $(TASK03_KERNEL_SOURCES) src/tasks/$(TASK03).c $(LIBS)
|
||||
$(SIZE) -A -x $@
|
||||
|
||||
$(BUILD_ROOT)/$(TASK03)/prog.bin: $(BUILD_ROOT)/$(TASK03)/prog.elf
|
||||
$(OBJCOPY) -O binary $< $@
|
||||
|
||||
$(BUILD_ROOT)/$(TASK03)/prog.lst: $(BUILD_ROOT)/$(TASK03)/prog.elf
|
||||
$(OBJDUMP) -d -S -M no-aliases,numeric $< > $@
|
||||
|
||||
$(HOST_BUILD_ROOT)/$(TASK03)/prog: src/tasks/$(TASK03).c include/host-shim/FreeRTOS.h include/host-shim/task.h $(HEAP4_SOURCE) | check-kernel
|
||||
mkdir -p $(@D)
|
||||
$(HOST_CC) $(HOST_HEAP4_FLAGS) -o $@ src/tasks/$(TASK03).c $(HEAP4_SOURCE)
|
||||
|
||||
clean:
|
||||
rm -rf $(BUILD_ROOT) $(HOST_BUILD_ROOT)
|
||||
|
||||
Reference in New Issue
Block a user