硬汉嵌入式论坛

 找回密码
 立即注册
查看: 197|回复: 2
收起左侧

[辅助工具] xmake+vscode开发at32

[复制链接]

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 5 天前 | 显示全部楼层 |阅读模式
之前一直想学CMake,但感觉太难,也没找到什么好的教程,平时也用不到就放弃了。前段时间偶然发现国人写的Xmake,用的lua写的,今天花了一天世界研究下,感觉比CMake简单多了。使用VSCode配合Xmake构建了一个AT32F415的工程,分享一下
[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()

AT32F415CBT7_WorkBench.rar

573.14 KB, 下载次数: 5

回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 5 天前 | 显示全部楼层
XMAKE的介绍
QQ20250806-174401.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 4 天前 | 显示全部楼层
谢谢楼主分享,好东西
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-11 21:05 , Processed in 0.040946 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表