STM32MP135裸机编程:支持内存非对齐访问

0 前言

使用stm32官方可视化初始化代码生成工具STM32CubeMX生成的工程GCC编译选项默认不支持非对齐访问,在我们进行非对齐的访问时就会进入数据异常中断DAbt中。为了解决这一问题,我们需要在GCC编译选项中加上一处配置。

1 操作方法

右键STM32CubeIDE工程,依次点击Properties->Setting->MCU GCC Compiler->Miscellaneous,添加-mno-unaligned-access编译选项。

添加后点击"Apply and Close"退出。

2 原理介绍

当我们在GCC编译时添加-mno-unaligned-access(不支持非对齐访问)选项,将告诉编译器生成读、写未对齐数据指令时需要一个字节一个字节进行读、写操作,最终实现我们对数据的读、写,避免了非对齐访问问题。虽然这样能够避免非对齐访问造成的异常,但也影响了数据操作的效率。

注:该方法是官方工程的提供的方法。

3 其它方法

STM32MP135基于ARMv7架构,是支持非对齐地址访问的。但支持非对齐地址访问需要满足一些条件:

c 复制代码
CP15 的系统控制寄存器(SCTLR), bit.A = 0, (bit.U = 1, 对于ARMv7已经默认置1了,不可改).
访问的地址空间必须为Normal memory, 访问Device memory或Strongly memory都会引发alignment fault的Data Abort。而如果MMU disable的话,所有的memory都被当作Strongly memory处理(这句话没找到出处,来自ARM support回复的mail)。

上述方法笔者还没实操过,希望有操作成功的读者分享下经验。

相关推荐
云中双月6 天前
如何使用Ida Pro和Core Dump文件定位崩溃位置(Linux下无调试符号的进程专享)
linux·嵌入式·gdb·调试·gcc·崩溃·ida pro·ulimit·core dump·cross compile
witton12 天前
C语言实现Go的defer功能
c语言·clang·gcc·defer·attribute·cleanup·block type
码匠许师傅14 天前
【开源鸿蒙】OpenHarmony 5.0轻量系统最小开发环境搭建
python·pip·risc-v·openharmony·gcc·1024程序员节·hi3861
程序猿(攻城狮)16 天前
CentOS 7 安装gcc编译环境
linux·centos·gcc
CodingCos23 天前
【ARM 嵌入式 编译系列 2.9 -- GCC 编译如何避免赋值判断 if ( x = 0)】
arm开发·gcc·arm gcc·gcc 编译
shylyly_1 个月前
编译链接的过程发生了什么?
linux·gcc·底层·编译链接
时差freebright1 个月前
【Linux 报错】“make: ‘xxxx‘ is up to date.” 解决办法
linux·开发语言·gcc
时光飞逝的日子1 个月前
GNU链接器(LD):什么是符号?符号定义及实例解析
符号·gcc·链接脚本·gnu链接器·符号定义
DogDaoDao2 个月前
Windows 环境下 vscode 配置 C/C++ 环境
c语言·c++·windows·vscode·gcc·mingw-w64
时光飞逝的日子2 个月前
ThreadX源码:Cortex-A7的tx_thread_irq_nesting_start(嵌套中断开始动作).s汇编代码分析
threadx·armv7·cortex-a7·arm内核·嵌套中断