在arm-eabi-gcc下使用__align报expected declaration specifiers or '...' before numeric constant

本文探讨了在从Keil迁移到ARM-EABI-GCC编译器时遇到的内存对齐问题。通过调整代码中数据类型的对齐属性,使用__attribute__((aligned(4)))成功解决了编译错误,确保了数据在内存中的正确对齐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不知道为什么在keil下面运行好好的代码跑到arm-eabi-gcc下面就会出问题,找了一圈大部分都是在讲重定义和include先后的问题。但是实际上只需要换成__attribute__ ((aligned (4)));

比如

'''

__align(4) uint8_t Tx_Buff[ETH_TX_BUF_SIZE*ETH_TXBUFNB];

'''

换成

'''

uint8_t Tx_Buff[ETH_TX_BUF_SIZE*ETH_TXBUFNB] __attribute__ ((aligned (4)));;

'''

### 验证 `arm-none-eabi-gcc` 是否支持 `__forceinline` 关键字 为了验证当前使用的 `arm-none-eabi-gcc` 是否支持 `__forceinline` 关键字,可以通过以下方法进行测试: 1. **检查编译器版本**: 使用命令行工具检查 `arm-none-eabi-gcc` 的版本号。确保其版本足够新以支持所需的特性。例如,版本 5.4.1 或更高版本通常对内联关键字的支持更好[^3]。 ```bash arm-none-eabi-gcc --version ``` 2. **编写测试代码**: 创建一个简单的 C 文件来测试 `__forceinline` 的支持情况。如果编译器不支持该关键字,则会错。 ```c // test_forceinline.c #include <stdint.h> static __forceinline void test_function(void) { // 空函数体 } int main(void) { test_function(); return 0; } ``` 3. **尝试编译**: 使用 `arm-none-eabi-gcc` 编译上述代码。如果编译成功,则说明该编译器支持 `__forceinline` 关键字;否则需要考虑替代方案或升级编译器。 ```bash arm-none-eabi-gcc -c test_forceinline.c -o test_forceinline.o ``` 4. **替代方案**: 如果发现编译器不支持 `__forceinline`,可以使用标准的 `inline` 关键字或通过宏定义适配不同编译器的行为。 ```c #if defined(__GNUC__) #define FORCE_INLINE static inline __attribute__((always_inline)) #elif defined(__ICCARM__) #define FORCE_INLINE static __forceinline #else #define FORCE_INLINE static inline #endif FORCE_INLINE void test_function(void) { // 空函数体 } ``` 5. **禁用优化选项**: 在某些情况下,空循环可能会被 GCC 优化掉。为防止这种情况发生,可以在代码中插入汇编指令以阻止优化[^4]。 ```c static inline void PIN_DELAY_SLOW(uint32_t delay) { uint32_t count = delay; while (--count) { __ASM("nop"); // 插入无操作指令以防止优化 } } ``` 6. **升级编译器**: 如果确认当前使用的 `arm-none-eabi-gcc` 版本较低且不支持所需特性,建议升级到更高版本(如 9.x 或 10.x)。较新的版本通常提供更好的兼容性和功能支持。 ```bash # 下载并安装最新版本的 arm-none-eabi 工具链 wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 tar xjf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 export PATH=$PATH:/path/to/gcc-arm-none-eabi-10-2020-q4-major/bin ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值