问题标签 [cortex-m]
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.
assembly - 在 Cortex-M0 中模拟 LDREX/STREX(加载/存储独占)
在 Cortex-M3 指令集中,存在一系列 LDREX/STREX 指令,因此如果使用 LDREX 指令读取某个位置,则只有在已知该地址未被触及的情况下,后续的 STREX 指令才能写入该地址。通常,如果自 LDREX 以来没有发生中断(ARM 术语中的“异常”),则 STREX 将成功,否则将失败。
在 Cortex M0 中模拟这种行为的最实用方法是什么?我想为 M3 编写 C 代码并将其移植到 M0。在 M3 上,可以这样说:
执行原子增量。我能想到的在 Cortex-M0 上实现类似功能的唯一方法是:
- 让“ldrex”禁用异常并让“strex”和“clrex”重新启用它们,要求每个“ldrex”之后必须紧跟“strex”或“clrex”。
- 让“ldrex”、“strex”和“clrex”成为 RAM 中的一个非常小的例程,其中一条“ldrex”指令被修补到“str r1,[r2]”或“mov r0,#1”。让“ldrex”例程将“str”指令插入“strex”例程,并让“clrex”例程在那里插入“mov r0,#1”。让所有可能使“ldrex”序列无效的异常调用“clrex”。
根据 ldrex/strex 函数的使用方式,禁用中断可能会合理地工作,但更改“load-exclusive”的语义似乎很棘手,以便在放弃时造成不良的副作用。代码修补的想法似乎可以实现所需的语义,但看起来很笨拙。
(顺便说一句,附带问题:我想知道为什么 M3 上的 STREX 将成功/失败指示存储到寄存器而不是简单地设置一个标志?它的实际操作需要操作码中的四个额外位,需要一个寄存器来保存成功/failure 指示,并要求使用“cmp r0,#0”来确定它是否成功。如果编译器没有在寄存器中获得结果,是否可以合理地处理 STREX 内在函数? ? 进入寄存器需要两个简短的指令。)
arm - OPENOCD,闪存程序到 ARM Cortex M0 (JTAG)
我是 OpenOCD 的新手,有没有人尝试使用 Olimex OpenOCD 将程序 hex 文件(来自 Kiel 说)实际闪存到 ARM CORTEX M0(通用)中。
我需要设置脚本文件以获取 hex 文件的每个字以在 MCU 闪存中执行 mww(内存写入字)吗?任何人都可以提供一个示例。我用蟒蛇。
我打开建议。
我使用 Windows PC。
integer-division - 在 RVDS 下使用 Cortex-M0 进行整数除法
我正在尝试将 64 位整数类型划分为 32 位整数类型,并且我使用 RVDS 4.1 作为工具链。
Cortex-M0没有硬件除数,可以进行下面的操作吗?如果有怎么办?
embedded - 用于嵌入式编程的微控制器
我生活在一个不容易获得流行微控制器的国家。我能找到的唯一基于 arm 的是 STM32F4 Discovery 和 STM32VL Discovery。后者更便宜,因此更可取。
所以问题是,我在寻找正确的方向吗?这些微控制器是专门用于嵌入式编程的吗?(我是初学者)如果有人能让我朝着正确的方向前进,那将非常有帮助。
谢谢!
architecture - 如何知道总线上的数据是 ARM Cortex-M0 的数据还是指令?
我正在尝试实现缓存算法。但我只想缓存指令,而不是从内存中获取的数据(显然)。那么如何知道总线上的数据是Data data还是Instruction data呢?我尝试查看 HPROT 和 HTRANS 信号,但看不清楚
c - Cortex M3 的引导加载程序
我正在使用 mbed 的 LPC 1768 板(使用 cortex M3 cpu),我想在这里实现一些目标,主要是从 SD 卡升级用户应用程序,我正在编写两个程序,首先是引导加载程序/纳米内核,然后一个用户应用程序(helloworld 将作为开始):
- Bootloader/nano-kernel 在 0x00 地址运行,它会做一些检查并最终抓取 SD 卡上的二进制文件
- Bootloader/nano-kernel 将在地址 0x9000 复制此二进制文件(稍后可能需要更改,但 bootloader/nano-kernel 不使用此空间,所以应该没问题)
- 引导加载程序在 0x9000 + 4 处跳转到用户应用程序
SD卡很容易解决,我在跳跃部分有问题。下面是跳转函数的代码。
}
所以我编译了(我使用的是 Keil uvision4)用户应用程序将起始地址更改为 0x9000。如果我对我的板子进行编程(使用 flashmagictool),然后手动跳转(仍然使用 flashmagictool)到 0x9004(0x9000 + 4),用户应用程序将运行,所以我相信编译工作正常,因此用户应用程序可以在 0x9000 运行。
但是如果我运行引导加载程序/纳米内核,这个不会跳转到用户应用程序,不幸的是我无法调试,我不确定发生了什么......我也试过不使用 SD 副本部分,所以我首先对引导加载程序进行编程,基本上只是跳转到 0x9004。然后我对位于 0x9000 的用户应用程序进行编程。如果我重新启动开发板,引导加载程序会运行但不会跳转到用户应用程序。我检查了内存,似乎两个程序(引导加载程序 + 用户应用程序)都是正确的并且在正确的位置。
我确定我在这里遗漏了一些东西,我应该查看任何低级代码吗?我已经阅读了在线文档的音调,并且从我找到的示例中,他们以与我相同的方式跳转到用户代码......非常感谢您的帮助。
c - RTOS 数据记录器示例
我正在尝试在 Cortex M0 (LPC11U14) 上开发数据记录器,我正在考虑使用像 FreeRTOS 这样的实时操作系统,这样我就可以有一个将数据写入 SD 的低优先级任务,以及多个更高优先级的任务- 获取传感器数据的优先级计时器。
有谁知道任何可以作为参考设计的代码示例?我知道如何创建任务/计时器,但我对将数据从计时器传递到写入任务的有效方法感兴趣。如果已经存在一个可以用作代码库的好的数据记录器项目,我对重新发明轮子犹豫不决?
embedded - 当我的 CPU 不支持未对齐的内存访问时,这意味着什么?
我刚刚发现我在 (Cortex M0) 上编写代码的 ARM 不支持未对齐的内存访问。
现在在我的代码中,我使用了很多打包结构,而且我从来没有收到任何警告或硬故障,那么当 Cortex 不允许未对齐访问时,它如何访问这些结构的成员呢?
embedded - 关于微控制器编程开发工具的入门问题
我最近被分配了一个微控制器编程任务。我需要在MKL05Z32VFM4设备上编程。
我正在阅读一些关于 Microchip Technology 的 MPLAB IDE X 的编程教程,因为这似乎包含最多的信息,但看起来 IDE 仅适用于 Microchip 产品。
我应该为 MKL05Z32VFM4 选择哪些开发工具?是否有通用的 IDE 和模拟器环境?有一些教程让我开始看吗?
我为一个基本问题道歉。我是一个体面的普通软件开发人员,但我对这个领域很陌生。
c - GCC 下与 Cortex-M0 的变量对齐
我正在尝试找到一种使用 GCC 将 32 位或 16 位键上的变量对齐的好方法。
我正在研究不支持未对齐数据访问的 Cortex-M0。我在使用时遇到了这个问题-Os
。我使用 arm-none-eabi 版本 4.6.2。我有这个小测试用例:
当我编译这个时,我得到一个非对齐的变量测试。
这是地图文件中的结果:
所以现在我遇到了硬故障。如果我将其添加到变量中:
由于test
现在已对齐,因此按预期工作。
我不能在结构上使用 align 属性,因为这个结构也可能是另一个包装的一部分。
有没有办法告诉 GCC 或 LD 在 32 位边界上对齐打包变量?
问候