- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在拇指模式下使用 STM32L486ZG 开发板。我正在运行一个没有任何 RTOS 的简单裸机应用程序。我使用 FSM 将外部 SRAM 连接到电路板。外部 SRAM 位于地址 0x60000000。系统已初始化并以 72MHz 的频率运行(我已经在 18-80 MHz 的频率上尝试过这个问题)现在在我的主要功能中我有以下代码:
int main(){
asm volatile (
"push {r0}\n"
"mov r0, #0x60000000\n"
"add r0, #0x400\n"
"stmdb r0!, {r1-r12}\n"
"ldmia r0!, {r1-r12}\n"
"pop {r0}\n"
);
}
根据此代码,在执行此主函数后不应更改任何寄存器,但在执行以下指令后情况并非如此
ldmia r0!, {r1-r12}
即r9
执行后不正确。 stmdb
指令工作正常,但 ldmia
没有正确加载数据。我已经通过查看内存中的内容验证了这一点。
此问题对于 ldmia
中的任何参数都存在说明:始终影响第9个寄存器。
解释:假设我正在调试这段代码,下一条要执行的指令是:
stmdb r0!, {r1-r12}
在加紧之后所有这些寄存器都被保存在内存中并且值r0
是0x600003d0
内存内容:
0x600003D0 00000000 40021008 0000000C .......@....
0x600003DC 40000000 00000000 00000000 ...@........
0x600003E8 20017FEC 00000000 00000000 ì.. ........
0x600003F4 00000000 00000000 00000000 ............
寄存器内容:
r0 0x600003d0
r1 0x00000000
r2 0x40021008
r3 0x0000000c
r4 0x40000000
r5 0x00000000
r6 0x00000000
r7 0x20017fec
r8 0x00000000
r9 0x00000000
r10 0x00000000
r11 0x00000000
r12 0x00000000
这说明所有的寄存器都成功保存到内存中了。现在我执行下一条指令
ldmia r0!, {r1-r12}
之后这些是寄存器的内容:
r0 0x60000400
r1 0x00000000
r2 0x40021008
r3 0x0000000c
r4 0x40000000
r5 0x00000000
r6 0x00000000
r7 0x20017fec
r8 0x00000000
r9 0x555555d5
r10 0x00000000
r11 0x00000000
r12 0x00000000
如您所见,除r9
外,所有寄存器都已恢复奇怪的是它的值从 0x60000000
中“弹出”而不是 0x600003F0
.
知道是什么导致了这个问题。我正在使用 Jlink 写入闪存。
附言当寄存器保存到片上 SRAM 而不是外部 SRAM 时,不会发生此问题;
编辑如果指令
ldmia r0!, {r1-r12}
分为两部分:
ldmia r0!, {r1-r6}
ldmia r0!, {r7-r12}
那么所有的寄存器都恢复成功
最佳答案
您需要阅读 STM32L4xx6xx 芯片限制。 FMC 不支持第 2.2.4 节读取九个字或更多字的突发访问。 ( DocID026121 Rev 4 ) 可从 ST 获得。
“对 FMC 的 CPU 读取突发访问等于或超过 9 个寄存器返回损坏的数据从读到的第 9 个字开始。这些突发只能由 Cortex®-M4 CPU 生成而不是其他大师(即不是 DMA)。当堆栈重新映射到 FMC 上的外部存储器并且POP 操作使用 9 个或更多寄存器执行。当 LDM/VLDM 操作与 9 个或更多寄存器一起使用时,也会发生这种情况。”
关于gcc - LDMIA 指令在皮质 M4 的外部 SRAM 上无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41265112/
1、准备材料 开发板(正点原子stm32f407探索者开发板V2.4) 。 STM32CubeMX软件(Version 6.10.0) 。 野火DAP仿真器 。 keil µVis
我有一个带有 48kb SRAM 的 STM32F103VCT6 微 Controller ,最近我遇到了内存冲突: 我有一些静态变量(我们称它为 A)位于堆中,大小为 0x7000,我编写了一些简单
我正在对 ARM 芯片 (STM32F2)“裸机”进行编程。具体来说,我想读取保存在外部 SRAM 中的值。阅读reference manual我了解此类内存事务是通过 FSMC(灵活静态内存 Con
目前正在为 atmel tiny45 微 Controller 编码,我使用了几个查找表。存放它们的最佳地点在哪里?您能大致了解一下 sram-flash-eeprom 之间的内存速度差异吗? 最佳答
代码中声明的变量(静态或全局)首先与整个应用程序代码一起复制到片上闪存 (ROM)。然后它们依次复制到 SRAM 中。静态和全局变量在 SRAM(不是堆栈)中分配地址,而函数中的局部变量则在堆栈(SR
我正在为我的 STM32f207zg 编写一个(更好的)硬故障处理程序,并希望执行以下操作: 发生了可怕的车祸 跳转到我的 (C) 故障处理程序 在备份 SRAM 中保存各种寄存器(CFSR、HFSR
我想在 LPC1768 上的 SRAM 中有一个中断例程。 我正在使用类似于 Yagarto 的 GCC 工具链。 目前我可以从 C 执行以下操作: NVIC_SetVector(TIMER0_IRQ
我有一个带有外部 ram 的 8051 微 Controller ,我想测试 ram 以查看它是否可以正确存储和加载数据(我认为它目前不能)。 在我的程序中,我将值 80h 写入内存的第一个字节,并且
有没有办法在 Linux 中读取 SRAM 信息?我需要读取一些未初始化或已初始化字节的状态? 谢谢! 最佳答案 如果您知道您的 SRAM 起始地址,而不是像往常一样通过指针算法访问映射内存,您可以只
我在 AVR 微 Controller (ATMega328P) 上运行的 C 程序中遇到了问题。我相信这是由于堆栈/堆冲突,但我希望能够确认这一点。 有什么方法可以可视化堆栈和堆的 SRAM 使用情
细化问题 如何从删除 block 大小为零的 MTD SRAM 设备读取和写入文本信息? 笔记: 我正在使用 23K256司机 尝试使用 MTD-Util 工具失败,因为 libmtd无法处理大小为零
我在拇指模式下使用 STM32L486ZG 开发板。我正在运行一个没有任何 RTOS 的简单裸机应用程序。我使用 FSM 将外部 SRAM 连接到电路板。外部 SRAM 位于地址 0x60000000
我正在尝试保留一些地址必须在加载时知道的 sram 字节,以便它可以装入 PROGSPACE。直到现在,我通过将地址设置为 (0x1F6) 并在我执行的程序中设置地址,在 arduino nano 板
我在 android studio 中使用 NDK 工具为 android 设备编写 C 程序。我想知道如何获取 SRAM 或 DRAM samsung galaxy S7 的起始地址。 最佳答案 听
没有细节的问题: 是否可以从 Linux 复制裸机可执行文件,从 DDR 运行到处理器内部 SRAM 中并运行它?此应用程序将暂停 DDR 并禁用电源轨以修复硬件问题。 详细信息: 我正在开发一款使用
我有一个相当大的 Arduino 项目(在 eclipse 中)使用 Serial.print("some string text") 命令进行大量调试消息,以便我可以一路调试。 我注意到的一件事是我
在具有 ARM A9 处理器、L2CACHE、SRAM 的系统上。是否有可能有一个C程序来获取以下性能数据: 平均。 SRAM 数据获取延迟。 平均。指令获取延迟。 最佳答案 如果您有要运行和测量的硬
首先介绍一下背景。在 avr tiny 中,数据可以存储在寄存器、sram、eeprom 或程序空间中。寄存器和 sram 是 volatile 存储,而 eeprom 和程序空间不是。 (即:未通电
我是一名优秀的程序员,十分优秀!