使用GCC编译PY32C642工程
针对不同的编译器,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里面原有的延时
在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