跳转至

使用GCC编译PY32C642工程

PY32_GCC_SDE使用手册

针对不同的编译器,keil工程下的startup_py32C642x5.s不能用在gcc编译,需要改为对应的语法,SDE工具里面可以找到对应的.s文件,同时需要增加一个ld文件

startup.s:启动文件,通常用汇编编写。作用:设置堆栈指针,调用SystemInit,跳转到main函数。还包含中断向量表。在GCC工具链中,startup.s是启动代码,负责C环境初始化。

.ld文件:链接脚本,指定内存布局(ROM/RAM地址和大小),定义输出段的放置位置,符号定义(如堆栈大小、入口点),指导链接器如何生成可执行文件。

在Makefile文件里面,对应添加源文件和头文件目录,修改.s,预设宏,.ld文件等,在终端里面输入make即可编译,make clean清理编译文件。

针对不同的编译器,代码有些地方需要针对不同的编译器宏进行处理,比如keil使用的armcc不能识别__asm,在gcc里面需要改为__asm__,并且语法需要对应修改。

比如keil里面原有的延时

__asm void SysCrrlDelay(uint32_t ui32Count)
{
    subs r0, #1;
    bne SysCtlDelay;
    bx lr;
}
在gcc里面需要改为
void SysCtlDelay(uint32_t ui32Count)
{
    __asm__ (
        ".syntax unified \n"
        "1: \n"
        "\tsubs r0, r0, #1 \n"
        "\tbne 1b \n"
        "\tbx lr \n"
        :
        : "r"(ui32Count)
        : "r0", "cc"
    );
}

支持多编译器的写法:

#if defined ( __GNUC__ )
    /* ✅ GNU GCC (arm-none-eabi-gcc, 等) */
    #define COMPILER_GCC
    #define ALIGN(n) __attribute__((aligned(n)))

#elif defined ( __CC_ARM )
    /* ✅ Keil ARM Compiler 5 (armcc) */
    #define COMPILER_KEIL_ARMCC
    #define ALIGN(n) __align(n)

#elif defined ( __clang__ ) && defined ( __ARMCOMPILER_VERSION )
    /* ✅ Keil ARM Compiler 6 (armclang) */
    #define COMPILER_KEIL_ARMCLANG
    #define ALIGN(n) __attribute__((aligned(n)))  // 支持 GNU 语法

#elif defined ( __ICCARM__ )
    /* ✅ IAR for ARM 编译器 */
    #define COMPILER_IAR
    #define ALIGN(n) _Pragma(#n)  // IAR 对齐语法示例

#else
    #error "Unsupported compiler!"
#endif