当前位置: 首页 > backend >正文

[MH22D3开发笔记]1. 变量地址对齐,宏__ALIGNED的使用

在移植某GUI到迅龙3号开发板的时候,gui内使用到了动态内存分配,第一次编译完成,运行,very good。运行良好!
在这里插入图片描述
为便于调试,修改了一下编译选项为-O0,再运行,oh,my god,跑飞了。。。
调试追踪。。。
发现到了这里,对内存对齐检查失败:

tlsf_t tlsf_create(void* mem)
{
#if _DEBUGif (test_ffs_fls()){return 0;}
#endifif (((tlsfptr_t)mem % ALIGN_SIZE) != 0){LLPRINT("tlsf_create: Memory must be aligned to %u bytes.\n",(unsigned int)ALIGN_SIZE);return 0;}control_construct(tlsf_cast(control_t*, mem));return tlsf_cast(tlsf_t, mem);
}

往前倒查,发现这个指针传入的是如下定义的数组:

static uint8_t tlsfMemBuf[MEM_SIZE]; 

真相大白,这个uint8_t 类型的定义,被编译器定义到一个非4字节对齐的地址了,所以后面代码对齐检测失败,导致后续内存分配失败。
既然知道原因了,那就好解决了,那就用宏__ALIGNED(4)让它4字节对齐呗:

static __ALIGNED(4) uint8_t tlsfMemBuf[MEM_SIZE];

好家伙,加进去编译,错误提示来了:
在这里插入图片描述这意思认不到这个宏__ALIGNED啊
查一下关于编译器语法扩展对对齐指令的支持情况,如下:
看起来也没有问题啊,很标准,用的__ALIGNED(4)来使这个数组4字节对齐,为什么编译报错呢?
在这里插入图片描述
既然是一个宏(不是编译器语法),搜索一下__ALIGNED的定义看看:
被定义在文件“cmsis_armclang.h”

#ifndef   __ALIGNED#define __ALIGNED(x)                           __attribute__((aligned(x)))
#endif

我用的编译器为AC6,在文件cmsis_compiler.h里面包含了文件“cmsis_armclang.h”

/** Arm Compiler above 6.10.1 (armclang)*/
#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100)#include "cmsis_armclang.h"

知道了这个关系,那就好解决了,在定义数组

static __ALIGNED(4) uint8_t tlsfMemBuf[MEM_SIZE];

的文件前面加入对文件cmsis_armclang.h的引用就可以了:

#include "cmsis_compiler.h"

再编译,运行,ok!
为了兼容编译器不同版本,代码建议使用宏__ALIGNED来对齐地址,尽量不要使用
attribute((aligned(4)))之类的与编译器相关的语法来定义。

原创文章,转载请注明出处,未经书面允许,不得用于商业用途

http://www.xdnf.cn/news/8163.html

相关文章:

  • MRI学习笔记-表征相似性分析(Representational Similarity Analysis, RSA)
  • Redis 中如何保证缓存与数据库的数据一致性?
  • 高性能算法RIME:基于物理的优化的霜冰优化算法
  • Golang——1、环境搭建与入门
  • 苍穹外卖06 HttpClient微信小程序开发 微信登录导入商品浏览功能代码
  • Vue3前后端分离用户信息显示方案
  • ModbusRTU转profibusDP网关接皖仪SFJ-16M 氦质谱检漏仪与PLC通讯
  • 虚拟小号查询技术解析
  • Redis进阶之高可用
  • 选新手机的参考:CPU型号、内存、外存、屏幕、摄像头以及电池等。
  • 详解受约束的强化学习(三、公式关系串联)
  • 【Linux 服务器磁盘映像备份与恢复实战指南】虚拟机备份,物理机上云都可以用这套方案!
  • 2025年气候持续大风,消纳减少,如何保收益?东润能源整体解决方案持续保收益保增长
  • C++:面试题汇总
  • 系统与账户安全
  • 一个纯粹基于jQuery和Django的SSE站内信通知的例子
  • 飞牛fnNAS远程映射盘符
  • PARSCALE:大语言模型的第三种扩展范式
  • CAD如何导出PDF?PDF如何转CAD?详细教程来了
  • Phantom 根据图片和文字描述,自动生成一段视频,并且动作、场景等内容会按照文字描述来呈现
  • 对Web界面进行简单自动化测试Selenium
  • vscode git push 记录
  • 现代生活健康养生新策略
  • Aqua Mail Pro 安卓邮件管理助手可备份和恢复的邮件客户端 v1.55.1专业版
  • (第94天)OGG 微服务搭建 Oracle 19C CDB 架构同步
  • 网络安全-等级保护(等保) 3-1-1 GB/T 28448-2019 附录A (资料性附录)测评力度附录C(规范性附录)测评单元编号说明
  • spring boot 实现resp视频推流
  • 觉醒三境:在敦煌的风沙中寻找生命的纹路
  • 基于deepseek 以及豆包工具+nodejs 搭建A I自动化客服系统
  • 角度回归——八参数检测四边形Gliding Vertex