GD32标准库使用AC6编译器

GD32标准库使用AC6编译器

官网下载的GD32标准库最新版(V3.3),使用Keil开发时发现不支持AC6编译器,查找资料后需要更改CMSIS和库文件。

更改CMSIS

可以从Keil的安装路径(C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.6.0\CMSIS\Core\Include)中获取新版CMSIS文件,复制下图中的选定的文件到项目的CMSIS中即可。
CMSIS文件

也可以只复制cmsis_armclang.h文件到项目中,更改项目中的core_cm4.h文件,在文件中(190行)插入下面的代码。

#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6000000) /* Arm Compiler 6 (AC6) uses GCC-compatible attributes */  
  #include "cmsis_armclang.h"    /* CMSIS compiler specific defines and functions */  
#endif

修改库文件

编译后发现库文件中的gd32f4xx_enet.c会报错,原因是rxdest_tab等变量定义需要确定编译器,但没有考虑到使用AC6的情况,可以参考GCC时的定义写AC6时的定义,修改后的代码如下:

#if defined   (__CC_ARM)                                    /*!< ARM compiler */
__align(4)
enet_descriptors_struct  rxdesc_tab[ENET_RXBUF_NUM];        /*!< ENET RxDMA descriptor */
__align(4)
enet_descriptors_struct  txdesc_tab[ENET_TXBUF_NUM];        /*!< ENET TxDMA descriptor */
__align(4)
uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE];           /*!< ENET receive buffer */
__align(4)
uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE];           /*!< ENET transmit buffer */

#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)        /* GNU Compiler */
enet_descriptors_struct  rxdesc_tab[ENET_RXBUF_NUM] __attribute__((aligned(4)));          /*!< ENET RxDMA descriptor */
enet_descriptors_struct  txdesc_tab[ENET_TXBUF_NUM] __attribute__((aligned(4)));          /*!< ENET TxDMA descriptor */
uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE] __attribute__((aligned(4)));             /*!< ENET receive buffer */
uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE] __attribute__((aligned(4)));             /*!< ENET transmit buffer */

#elif defined ( __ICCARM__ )                                /*!< IAR compiler */
#pragma data_alignment=4
enet_descriptors_struct  rxdesc_tab[ENET_RXBUF_NUM];        /*!< ENET RxDMA descriptor */
#pragma data_alignment=4
enet_descriptors_struct  txdesc_tab[ENET_TXBUF_NUM];        /*!< ENET TxDMA descriptor */
#pragma data_alignment=4
uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE];           /*!< ENET receive buffer */
#pragma data_alignment=4
uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE];           /*!< ENET transmit buffer */

#elif defined (__GNUC__)        /* GNU Compiler */
enet_descriptors_struct  rxdesc_tab[ENET_RXBUF_NUM] __attribute__((aligned(4)));          /*!< ENET RxDMA descriptor */
enet_descriptors_struct  txdesc_tab[ENET_TXBUF_NUM] __attribute__((aligned(4)));          /*!< ENET TxDMA descriptor */
uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE] __attribute__((aligned(4)));             /*!< ENET receive buffer */
uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE] __attribute__((aligned(4)));             /*!< ENET transmit buffer */

#endif /* __CC_ARM */
posted @ 2026-08-23 23:59  仇故  阅读(1)  评论(0)    收藏  举报