diff --git a/.gitignore b/.gitignore index 586568e..eaf4362 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store build/ .xmake/ +.vscode/ \ No newline at end of file diff --git a/arm-gcc.lua b/arm-gcc.lua new file mode 100644 index 0000000..4847ea1 --- /dev/null +++ b/arm-gcc.lua @@ -0,0 +1,76 @@ +toolchain("arm-gcc") + + set_description("ARM Compiler of GCC") + set_kind("cross") + + on_load(function(toolchain) + if toolchain:is_plat("windows") then + toolchain:set("toolset", "cc", "arm-none-eabi-gcc.exe") + toolchain:set("toolset", "ld", "arm-none-eabi-gcc.exe") + toolchain:set("toolset", "ar", "arm-none-eabi-ar.exe") + toolchain:set("toolset", "as", "arm-none-eabi-gcc.exe") + else + toolchain:set("toolset", "cc", "arm-none-eabi-gcc") + toolchain:set("toolset", "ld", "arm-none-eabi-gcc") + toolchain:set("toolset", "ar", "arm-none-eabi-ar") + toolchain:set("toolset", "as", "arm-none-eabi-gcc") + end + end) + +toolchain_end() + +rule("generate-hex") + after_build(function(target) + local out = target:targetfile() or "" + local gen_fi = "build/" .. target:name() + + -- https://github.com/xmake-io/xmake/discussions/2125 + -- os.exec("arm-none-eabi-objdump -S "..out.." > "..gen_fi..".asm") + -- local asm = os.iorun("arm-none-eabi-objdump -S build/cross/cortex-m4/release/minimal-proj") + -- io.writefile(gen_fi..".asm", asm) + + if target:is_plat("windows") then + os.execv("arm-none-eabi-objcopy.exe", {"-Obinary", out, gen_fi .. ".bin"}) + os.execv("arm-none-eabi-objdump.exe", {"-S", out}, {stdout = gen_fi .. ".asm"}) + os.execv("arm-none-eabi-objcopy.exe", {"-O", "ihex", out, gen_fi .. ".hex"}) + else + os.execv("arm-none-eabi-objcopy", {"-Obinary", out, gen_fi .. ".bin"}) + os.execv("arm-none-eabi-objdump", {"-S", out}, {stdout = gen_fi .. ".asm"}) + os.execv("arm-none-eabi-objcopy", {"-O", "ihex", out, gen_fi .. ".hex"}) + end + + os.mv(out, gen_fi .. ".elf") -- add .elf file + -- -I binary + -- $(Q) $(OBJ_COPY) -O ihex $@ $(BUILD_DIR)/$(TARGET).hex + -- $(Q) $(OBJ_COPY) -O binary $@ $(BUILD_DIR)/$(TARGET).bin + -- os.exec("qemu-system-arm -M stm32-p103 -nographic -kernel"..bin_out) + end) + + after_clean(function(target) + local gen_fi = "build/" .. target:name() + os.rm(gen_fi .. ".*") + end) + +rule_end() + +task("qemu") + + on_run(function() + print("Run binary in Qemu!") + local bin_out = os.files("$(buildir)/*.bin")[1] + if bin_out then + os.exec("qemu-system-arm -M stm32-p103 -nographic -kernel " .. bin_out) + else + print("Do not find bin file in $(buildir)/") + end + end) + + set_menu { + -- Settings menu usage + usage = "xmake qemu", + + -- Setup menu description + description = "Run binary in Qemu!" + } + +task_end() diff --git a/armgcc.lua b/armgcc.lua deleted file mode 100644 index c5957f2..0000000 --- a/armgcc.lua +++ /dev/null @@ -1,84 +0,0 @@ - -local cflags = { - "-mcpu=cortex-m4", - " -mthumb", - "-mfloat-abi=hard -mfpu=fpv4-sp-d16", - "-fdata-sections -ffunction-sections", - "-nostartfiles", - "-Os", -} - -local ldflags = { - "-specs=nano.specs", - "-lc", - "-lm", - "-lnosys", - "-Wl,--gc-sections", -} - -function use_toolchain(sdk_path) - toolchain("arm-gcc") - set_kind("cross") - set_description("Stm32 Arm Embedded Compiler") - set_sdkdir(sdk_path) - set_toolset("cc", "arm-none-eabi-gcc") - set_toolset("ld", "arm-none-eabi-gcc") - set_toolset("ar", "arm-none-eabi-ar") - set_toolset("as", "arm-none-eabi-gcc") - toolchain_end() - set_toolchains("arm-gcc") -end - -rule("arm-gcc") - on_load(function (target) - -- force add ld flags, ldflags {force = true} - target:set("policy", "check.auto_ignore_flags", false) - target:add("cxflags", cflags) - target:add("asflags", cflags) - -- use gcc to link - target:add("ldflags", cflags) - target:add("ldflags", ldflags) - end) - - after_build(function (target) - print("$(env ARM_TOOL)") - print("after_build: generate hex files") - local out = target:targetfile() or "" - local gen_fi = "build/"..target:name() - print(string.format("%s => %s", out, gen_fi)) - os.exec("arm-none-eabi-objcopy -Obinary "..out.." "..gen_fi..".bin") - -- https://github.com/xmake-io/xmake/discussions/2125 - -- os.exec("arm-none-eabi-objdump -S "..out.." > "..gen_fi..".asm") - -- local asm = os.iorun("arm-none-eabi-objdump -S build/cross/cortex-m4/release/minimal-proj") - -- io.writefile(gen_fi..".asm", asm) - os.execv("arm-none-eabi-objdump", {"-S", out}, {stdout=gen_fi..".asm"}) - os.exec("arm-none-eabi-objcopy -O ihex "..out.." "..gen_fi..".hex") - -- -I binary - -- $(Q) $(OBJ_COPY) -O ihex $@ $(BUILD_DIR)/$(TARGET).hex - -- $(Q) $(OBJ_COPY) -O binary $@ $(BUILD_DIR)/$(TARGET).bin - -- os.exec("qemu-system-arm -M stm32-p103 -nographic -kernel"..bin_out) - end) - after_clean(function (target) - local gen_fi = "build/"..target:name() - os.rm(gen_fi..".*") - end) -rule_end() - -task("qemu") - on_run(function () - print("Run binary in Qemu!") - local bin_out = os.files("$(buildir)/*.bin")[1] - if bin_out then - os.exec("qemu-system-arm -M stm32-p103 -nographic -kernel "..bin_out) - else - print("Do not find bin file in $(buildir)/") - end - end) - set_menu { - -- Settings menu usage - usage = "xmake qemu", - - -- Setup menu description - description = "Run binary in Qemu!" - } -task_end() diff --git a/xmake.lua b/xmake.lua index 2b484ca..5481909 100644 --- a/xmake.lua +++ b/xmake.lua @@ -5,15 +5,31 @@ set_project("stm32-demo") set_plat("cross") set_arch("cortex-m4") -includes("armgcc.lua") -local arm_gcc_installing_path = os.getenv("ARM_GCC_TOOL") or "/Applications/ARM/" -use_toolchain(arm_gcc_installing_path) +includes("arm-gcc.lua") target("minimal-proj") set_kind("binary") add_files("src/*.c") - add_rules("arm-gcc") - add_ldflags("-Tsrc/main.ld") + + add_cflags( + "-specs=nano.specs", "-mcpu=cortex-m4", "-mthumb", + "-mfloat-abi=hard -mfpu=fpv4-sp-d16", + "-fdata-sections -ffunction-sections", + "-nostartfiles","-Os" + ) + + add_ldflags( + "-specs=nano.specs", "-mcpu=cortex-m4", "-mthumb", + "-mfloat-abi=hard -mfpu=fpv4-sp-d16", + "-fdata-sections -ffunction-sections", + "-nostartfiles","-Os", + "-Wl,--gc-sections", + "-Tsrc/main.ld", {force = true} + ) + + add_links("m", "c", "nosys") + add_rules("generate-hex") + -- If you want to known more usage about xmake, please see https://xmake.io -- Reference Project: