[Lua] 纯文本查看 复制代码
local colors = {
red = "\27[31m",
green = "\27[32m",
yellow = "\27[33m",
blue = "\27[34m",
magenta = "\27[35m",
cyan = "\27[36m",
white = "\27[37m",
reset = "\27[0m"
}
toolchain("gcc-arm-none-eabi-10.3")
set_kind("standalone")
set_sdkdir("E:/gcc-arm-none-eabi-10.3")
set_bindir("E:/gcc-arm-none-eabi-10.3/bin")
toolchain_end()
target("at32f425_demo")
set_kind("binary")
set_toolchains("gcc-arm-none-eabi-10.3")
add_rules("mode.debug","mode.release")
add_files("app/src/*.c")
add_files("bsp/src/*.c")
add_files("drivers/src/*.c")
add_files("project/src/*.c")
add_files("cmsis/device_support/*.c")
add_files("cmsis/device_support/startup/gcc/startup_at32f415.s")
add_includedirs("cmsis/core_support","cmsis/device_support","drivers/inc","project/inc","bsp/inc","app/inc")
add_defines("AT32F415CBT7","USE_STDPERIPH_DRIVER")
-- 根据不同模式设置不同的编译选项
if is_mode("debug") then
add_defines("DEBUG")
add_cflags(
"-Og", -- 调试友好的优化
"-mcpu=cortex-m4",
"-mthumb",
"-Wall -fdata-sections -ffunction-sections",
"-mfloat-abi=soft",
"-g -gdwarf-2", -- 包含调试信息
{force = true}
)
else
add_defines("NDEBUG")
add_cflags(
"-Os", -- 优化代码大小
"-mcpu=cortex-m4",
"-mthumb",
"-Wall -fdata-sections -ffunction-sections",
"-mfloat-abi=soft",
{force = true}
)
end
add_ldflags(
"-mcpu=cortex-m4",
"-L./",
"-T cmsis/device_support/startup/gcc/linker/AT32F415xB_FLASH.ld",
"-Wl,--gc-sections",
"-Wl,--print-memory-usage",
"--specs=nosys.specs",
"--specs=nano.specs",
"-lc -lm -lnosys",
"-Wl,--print-memory-usage", -- 打印内存使用情况
{force = true}
)
add_asflags(
"-Og",
"-mcpu=cortex-m4",
"-mthumb",
"-x assembler-with-cpp",
"-Wall -fdata-sections -ffunction-sections",
"-g -gdwarf-2",{force = true}
)
set_targetdir("build")
set_filename("output.elf")
after_build(function (target)
print(">>> Entered after_build()")
local toolchain_bindir = "E:/gcc-arm-none-eabi-10.3/bin"
local objcopy = path.join(toolchain_bindir, "arm-none-eabi-objcopy")
local build_dir = "build"
local elf_file = path.join(build_dir, "output.elf")
local hex_file = path.join(build_dir, "output.hex")
local bin_file = path.join(build_dir, "output.bin")
if not os.isfile(elf_file) then
print("Error: ELF file not found: " .. elf_file)
return
end
-- 生成 HEX 文件
print("Generating HEX file...")
local result_hex = os.execv(objcopy, {"-O", "ihex", elf_file, hex_file})
if result_hex ~= 0 then
print(colors.yellow.."Warning: Failed to generate HEX file"..colors.reset)
else
print(colors.green.."HEX file generated successfully"..colors.reset)
end
-- 生成 BIN 文件
print("Generating BIN file...")
local result_bin = os.execv(objcopy, {"-O", "binary", elf_file, bin_file})
if result_bin ~= 0 then
print(colors.yellow.."Warning: Failed to generate BIN file"..colors.reset)
else
print(colors.green.."BIN file generated successfully"..colors.reset)
end
-- 显示内存使用情况
-- 显示内存使用情况
print("Memory usage:")
local size_cmd = path.join(toolchain_bindir, "arm-none-eabi-size")
local size_result = os.iorunv(size_cmd, {"-B", elf_file})
-- print(size_result)
-- 解析size输出并计算内存使用率
local text_size, data_size, bss_size = 0, 0, 0
for line in string.gmatch(size_result, "[^\r\n]+") do
if not string.find(line, "text") then -- 跳过标题行
local _, _, text, data, bss = string.find(line, "(%d+)%s+(%d+)%s+(%d+)")
if text and data and bss then
text_size = tonumber(text)
data_size = tonumber(data)
bss_size = tonumber(bss)
break
end
end
end
-- 计算并显示内存使用率
local flash_total = 128 * 1024 -- 128KB
local ram_total = 32 * 1024 -- 32KB
local flash_used = text_size + data_size
local ram_used = data_size + bss_size
local flash_percent = (flash_used / flash_total) * 100
local ram_percent = (ram_used / ram_total) * 100
print(colors.blue..string.format("Flash: %d/%d bytes (%.2f%%%%)", flash_used, flash_total, flash_percent)..colors.reset)
print(colors.blue..string.format("RAM: %d/%d bytes (%.2f%%%%)", ram_used, ram_total, ram_percent)..colors.reset)
import("core.project.task")
-- 运行下载任务任务
task.run("flash")
end)
target_end()
task("flash")
-- set_menu({usage = "xmake flash", description = "Download and reset via J-Link"})
on_run(function ()
local jlink = [[E:\JLink_V854\JLink.exe]]
local script_path = "build/jlink_script.jlink"
local hex_file = "build/output.hex"
if not os.isfile(hex_file) then
print("Error: HEX file not found: " .. hex_file)
return
end
-- 创建J-Link脚本文件
local script_content = [[
Device AT32F415CBT7
SelectInterface SWD
Speed 12000
Connect
Halt CPU
loadfile build/output.hex
RX 1000
Go
Exit
]]
-- 写入脚本文件
local file = io.open(script_path, "w")
if file then
file:write(script_content)
file:close()
-- 执行J-Link命令
os.exec(jlink .. " -CommandFile " .. script_path)
print("Download completed!")
-- 可选:删除临时脚本文件
os.rm(script_path)
else
print("Error: Failed to create J-Link script file")
end
end)
task_end()