问题标签 [cortex-m3]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arm - 在 ARM Cortex-M3 中使用 newlib 的 malloc
我正在为 ARM Cortex-M3(NXP 的 LCP17xx)创建代码。到目前为止,我一直在使用静态内存,一切运行良好。我试图添加动态内存支持,但是一旦我调用 malloc,系统就会卡住。
我正在用 gcc 编译 arm 裸机,并使用 newlib。版本:gcc-arm-none-eabi-4_6-2012q1
为了添加对 malloc 的支持,我实现了一个简单的 _sbrk 函数并修改了我的链接器脚本以为堆腾出一些空间(我已经阅读了许多关于这部分的不同教程,但没有一篇涵盖我接下来遇到的问题)。
在一些 LED 的帮助下,我可以确定代码一直运行到它调用的那一点malloc
,然后它就不会继续了。它甚至达不到我的_sbrk
功能。sizeof
此外,如果我malloc
稍后在代码中包含对 的调用,它将卡在对 的调用中。
malloc
那么,当调用代码时卡住而没有到达_sbrk
或返回时,我会做错什么?
在盯着包含调用和不包含调用时生成的内存映射一段时间后malloc
,我怀疑它与malloc
.
这是定义 ram 内存的 ld 脚本的一部分:
然后在中断向量表中设置_end_stack。
现在比较不同的地图。在代码中不使用 malloc :
在代码中使用 malloc 的内存映射:
embedded - 是否可以检测 Cortex M3 上的 DMA 通道何时空闲?
我刚刚接手了一个为 STM32 Cortex M3 微控制器开发 C 代码的项目。
我立即遇到的一个问题是我有一个自由运行的 DMA 通道,可以在 2 个 USART 之间传输数据,但有时需要将来自另一个源的数据发送到目标 USART。
有什么方法可以检测 DMA 何时忙于传输数据或空闲,或者传输完成时是否触发了任何中断。
非常感谢您的任何回复,
戴夫
c - 在 Cortex-M3 上使用带有预制地址的位带宏时出现问题
TL;博士:
- 为什么不
(unsigned long)(0x400253FC)
等于(unsigned long)((*((volatile unsigned long *)0x400253FC)))
? - 如何制作与前者一起使用的宏与后者一起使用?
背景资料
环境
我正在使用 ARM Cortex-M3 处理器,TI 的LM3S6965,以及他们的StellarisWare(免费下载,出口控制)定义。我正在使用 gcc 4.6.1 版(Sourcery CodeBench Lite 2011.09-69)。Stellaris 在“inc/lm3s6965.h”中提供了大约 5,000 个寄存器和内存地址的定义,我真的不想重做所有这些。但是,它们似乎与我要编写的宏不兼容。
位带
在 ARM Cortex-M3 上,一部分内存与外设和 RAM 内存空间的每位 32 位字混叠。将地址 0x42000000 的内存设置为 0x00000001 会将地址 0x40000000 的内存的第一位设置为 1,但不会影响字的其余部分。要更改第 2 位,请将 0x42000004 处的字更改为 1。这是一个简洁的功能,并且非常有用。根据 ARM 技术参考手册,计算地址的算法是:
在哪里:
bit_word_offset
是目标位在位带内存区域中的位置。bit_word_addr
是别名内存区域中映射到目标位的字的地址。bit_band_base
是别名区域的起始地址。byte_offset
是包含目标位的位带区域中的字节数。bit_number
是目标位的位位置,0 到 7
位带的实现
该"inc/hw_types.h"
文件包括以下实现此算法的宏。需要明确的是,它是为一个基于字的模型实现的,该模型接受 4 字节对齐的字和 0-31 位偏移量,但结果地址是等价的:
该算法采用 SRAM 中 0x20000000 或外设存储器空间 0x40000000 的基数,并将其与 0x02000000 进行或运算,加上位带基数偏移。然后,它将基数的偏移量乘以 32(相当于左移五位)并加上位数。
引用的 HWREG 仅执行必要的转换以写入内存中的给定位置:
这对于像这样的任务非常有效
其中 0x400253FC 是内存映射外设的幻数,我想将此外设的位 0 设置为 1。上面的代码计算(当然是在编译时)位偏移并将该字设置为 1。
什么不起作用
不幸的是,“inc/lm3s6965.h”中的上述定义已经执行了由 HWREG 完成的转换。我想避免使用幻数,而是使用提供的定义,例如
尝试将其粘贴到 HWREGBITW 会导致宏不再工作,因为强制转换会干扰:
预处理器生成以下混乱(添加了缩进):
注意两个实例
我相信这些额外的演员是导致我的过程失败的原因。以下预处理结果HWREGBITW(0x400253FC, 0) = 1;
确实有效,支持我的断言:
强制(type)
转换运算符具有从右到左的优先级,因此最后一个强制转换应该适用并unsigned long
用于按位算术(然后应该可以正常工作)。任何地方都没有隐含的东西,没有浮点到指针的转换,没有精度/范围的变化......最左边的演员应该简单地取消右边的演员。
我的问题(最后......)
- 为什么不
(unsigned long)(0x400253FC)
等于(unsigned long)((*((volatile unsigned long *)0x400253FC)))
? - 如何使现有的
HWREGBITW
宏工作?或者,如何编写宏来执行相同的任务,但在给定具有预先存在的演员表的参数时不会失败?
c - 检测堆栈覆盖错误
我正在使用 IAR EWARM IDE 和编译器为 Cortex-M3 嵌入式微控制器 (Atmel SAM3S) 开发软件。我怀疑由于某种原因,我有缓冲区溢出或内存泄漏,导致堆栈损坏,因为我突然发现自己卡在了代码空间之外。
我问这个问题的原因是,很难找出究竟是什么导致了这个混乱,我想知道当你想找出问题的原因时你使用了哪些技术。
您是否使用内存调试器、在线跟踪调试硬件等?
arm - STM32F103中的ADC可以采样到3Msps吗?
我是 stm32 微控制器的新手。我在 STM32F103 数据表中读到它有 3 个 ADC 转换器,每个转换器能够执行高达 1Msps。是否可以利用这 3 个转换器对高达 3 Msps 的 1 个通道进行采样?我猜如果我按顺序开始每个转换器的转换,一个转换器与另一个转换器之间的时间差为 0.333us,这是可能的。所以我每 1us 持续时间从 3 个转换器获得 3 个转换结果。
可行吗?请指教。谢谢。
cortex-m3 - 分析,如何在 VS pro 2008 或 2012RC 中避免 FPU(硬件)并使用模拟的 FPU 代码
我需要为没有 FP 单元的Cortex-M3处理器优化一些代码。我对优化领域完全陌生。无论如何,我使用VS 2012 Release Candidate在我的电脑(英特尔酷睿 i5,Windows 7作为操作系统)上本地编译代码,然后将它们移植到 Cortex_M3。我尝试将我的代码写在一种尽可能少地使用浮点运算的方法。但我仍然有一些。所以我知道当我将它嵌入到 Cortex_M3 中时,它将利用模拟的 FPU 代码(软件 FPU)。由于我无法对 cortex_m3 进行分析,我在我的电脑上使用 VS2012(仪器方法)来验证哪些功能需要更多时间并且必须进行更多优化。我认为如果我不使用我的 PC 的 FP 单元,我的 PC 上的分析结果可以与 COrtex_M3 的结果成正比。Visual Studio(2008 pro. 或 2012 RC)中是否有允许我跳过(硬件)FP 单元的关键字或方式?
非常感谢您的见解
c - 更改 LPC 1768 的波特率 UARTx 不起作用
我在更改 lpc1768 上的 uart 波特率的方式上遇到了一些问题。
要初始化和配置我的 uart,我使用以下代码,它适用于 9600 波特或 38400。
但是要将波特率从 9600 更改为 38400,我尝试将 DLM/DLL 和 FDR 寄存器更改为适当的值(与上面的代码相同)。但这不起作用......(波特率未定义)。
我的 pclk 是 18MHz
只改变这三个寄存器是不够的?我错了吗 ?
c - ARM cortex m3中的调用堆栈展开
我想创建一个调试工具来帮助我更好地调试我的应用程序。我正在做准系统(没有操作系统)。在 Atmel 的 SAM3 上使用 IAR 嵌入式工作台。
我有一个看门狗定时器,它在超时的情况下调用一个特定的 IRQ(这将在发布时用软件复位代替)。在 IRQ 处理程序中,我想打印(UART)堆栈跟踪,其中确切地发生了看门狗超时。
我查看了网络,但没有找到该功能的任何实现。
任何人都知道如何处理这种事情?
编辑:好的,我设法从堆栈中获取返回地址,所以我知道 WDT 超时发生的确切位置。展开整个堆栈并不像最初看起来那样简单,因为每个函数都会将不同数量的局部变量推入堆栈。
我最终得到的代码是这个(对于其他人,他们可能会觉得它有用)
c - ARM cortex-M3 uint_fast32_t 与 uint32_t
我正在为 STM32Fx cortex-M3 系列处理器开发程序。在 stdint.h 中定义了以下内容:
据我了解。
另外据我所知 sizeof(unsigned int) <= sizeof(unsigned long) 和 UINT_MAX <= ULONG_MAX - 总是。
因此,我希望 uint_fast32_t 是一种大小等于或大于 uint32_t 大小的数据类型。
在 cortex-M3 的情况下,sizeof(unsigned int) == sizeof(unsigned long) == 4。所以上述定义在大小方面是“正确的”。
但是为什么它们没有以与底层数据类型的名称和逻辑大小一致的方式定义,即
有人可以澄清基础类型的选择吗?
鉴于 'long' 和 'int' 的大小相同,为什么不对所有三个定义使用相同的数据类型呢?
arm - 中断挂起的 ARM Cortex-M3 示例
对于 ARM Cortex-M3,例如 NXP LPC1788,为什么有人会使用中断设置挂起寄存器或中断清除挂起寄存器?
有人可以提供一个使用这些寄存器的简单、规范的例子吗?