问题标签 [cortex-a]
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:启动/唤醒/启动其他 CPU 内核/AP 并传递执行起始地址?
在过去的 3-4 天里,我一直在为此苦苦思索,但找不到合适的解释性文档(来自 ARM 或非官方)来帮助我。我有一个ODROID-XU 板(big.LITTLE 2 x Cortex-A15 + 2 x Cortex-A7)板,我正在尝试更多地了解 ARM 架构。在我的“实验”代码中,我现在已经到了想要从 WFI(等待中断)状态唤醒其他内核的阶段。
我仍在尝试查找的缺失信息是:
1.获取内存映射的GIC的基地址时明白需要读取CBAR;但是没有任何文档解释应该如何安排 CBAR 中的位(2 个 PERIPHBASE 值)以到达最终的 GIC 基地址
2、通过GICD_SGIR寄存器发送SGI时,0到15之间的中断ID应该选择什么?有关系吗?
3.通过 GICD_SGIR 寄存器发送 SGI 时,如何告诉其他内核从哪里开始执行?
4.我的代码由 U-BOOT 引导加载程序加载这一事实如何影响此上下文?
Cortex-A 系列程序员指南 v3.0(可在此处找到:链接)在第 22.5.2 节(Linux 中的 SMP 启动,第271页)中陈述了以下内容:
当主核心启动时,辅助核心将使用 WFI 指令保持在待机状态。它(主内核)将向辅助内核提供启动地址并使用处理器间中断(IPI)唤醒它们,这意味着通过 GIC 发出 SGI 信号
Linux 是如何做到这一点的?文档-S没有提供有关“它将为辅助内核提供启动地址”的任何其他详细信息。
我的挫败感越来越大,我将非常感谢您的回答。非常感谢您!
额外细节
我使用的文档:
- ARMv7-A&R 架构参考手册
- Cortex-A15 TRM(技术参考手册)
- Cortex-A15 MPCore TRM
- Cortex-A 系列程序员指南 v3.0
- GICv2 架构规范
我现在所做的:
- UBOOT 在 0x40008000 加载我;我已经设置了转换表 (TTB),相应地编写了 TTBR0 和 TTBCR,并将 0x40008000 映射到 0x8000_0000 (2GB),所以我还启用了 MMU
- 设置我自己的异常处理程序
- 我通过串口获得了 Printf 功能(ODROID-XU 上的 UART2)
以上所有似乎都可以正常工作。
我现在正在尝试做的事情:
- 获取 GIC 基地址 => 在我读取 CBAR 的那一刻,我只需将其值与 0xFFFF8000 与(&)它的值并将其用作 GIC 基地址,尽管我几乎可以肯定这不正确
- 通过写入值为 0x1 的 GICD_CTLR 来启用 GIC 分发器(从 GIC 基地址偏移 0x1000 处?)
- 使用以下参数构造一个 SGI:Group = 0, ID = 0, TargetListFilter = "All CPUs except Me" 并通过 GICD_SGIR GIC 寄存器发送(写入)
- 由于我没有传递其他内核的任何执行起始地址,所以在这一切之后什么都没有发生
....更新....
我已经开始查看 Linux 内核和 QEMU 源代码以寻找答案。这是我发现的(如果我错了,请纠正我):
- 当给电路板加电时,所有内核都从复位向量开始执行
- 软件(固件)组件在辅助核心上执行 WFI 和一些其他代码,这些代码将充当这些辅助核心和主核心之间的协议,当后者想要再次唤醒它们时
- 例如,EnergyCore ECX-1000 (Highbank)板上使用的协议如下:
**(1)** the secondary cores enter WFI and when
**(2)** the primary core sends an SGI to wake them up
**(3)** they check if the value at address (0x40 + 0x10 * coreid) is non-null;
**(4)** if it is non-null, they use it as an address to jump to (execute a BX)
**(5)** otherwise, they re-enter standby state, by re-executing WFI
**(6)** So, if I had an EnergyCore ECX-1000 board, I should write (0x40 + 0x10 * coreid) with the address I want each of the cores to jump to and send an SGI
问题:
- 1. 执行此操作的软件组件是什么?是我写在 SD 卡上的 BL1 二进制文件,还是 U-BOOT?
- 2. 据我了解,此软件协议因板而异。是这样,还是仅取决于底层处理器?
- 3. 我在哪里可以找到有关pick-one ARM 板的此协议的信息?- 我可以在 ARM 官方网站或开发板网页上找到它吗?
arm - 在 arm 虚拟化的情况下,多个来宾的 TTBR0/1 状态
TTBR0/1 是由 PL1 OS 编程的 CP15 寄存器。现在如果 PL1 OS1 编程 TTBR0,然后在同一个内核上调度 PL1 OS2,PL1 OS2 是否会看到 TTBR0/1 的值设置 OS1
我确信有某种方式可以保持理智,以下是真的吗?
在来宾之间切换时,管理程序将所有 cp15 regs 保存在来宾上下文中,然后在切换来宾之前恢复
如果是,那么管理程序不会很耗时,因为 cp15 regs 列表会很长
c - 如何使用 ARM Cortex A9 中的 SWI 来启用 IRQ 中断?
我正在尝试从头开始为中断程序编写自己的代码。我正在使用zynq7000,它由两个ARM cortex A9处理器组成。
我将使用 SDK 用 C 编写的程序FSBL
以及在 PlanAhead 中生成的位文件加载到闪存中。当我的程序开始运行时,处理器进入用户模式。在用户模式下IRQ
并被FIQ
禁用。我正在尝试使用SWI
启用IRQ
和FIQ
中断的指令进入主管模式。当我调试时,它表明它SIGTRAP
在我调用SWI
指令时遇到了。
那么,我怎样才能在 C 中编写自己的代码ISR
,即使在处理器已经 booted( FSBL
) 并启动之后,它也可以启用中断并运行我的程序?
谢谢
android - 在 Cortex-A9 PMU 计数器上取零
不确定这是否是正确的地方,但我真的需要帮助。
我正在尝试在 Galaxy Nexus i9250 Android v4.3 CPU ARMv7 上收集一些数据。我正在尝试使用 ARM Streamline 但它提供了以下错误:
已检测到 ARM 处理器 PMU 事件计数器,但事件计数器读数为零。事件计数器包括在内核名称下的计数器配置选项对话框中列出的那些计数器,但不包括周期计数器 (Clock:Cycles),因为它由专用计数器控制。PMU 配置位 DBGEN 可能尚未启用,随后计数器值将始终读取为零。要进行补救,请更新您的固件或 Linux 内核以启用 DBGEN。
经过一番搜索,我发现了类似的问题:https ://community.freescale.com/thread/302685
这建议对 SDER 安全调试启用寄存器、安全扩展进行一些修改。
我不知道该怎么做,所以我在内核源代码中找到了一个文件 perf_event,但不知道从哪里开始。
我在这里找到了我应该使用的 ARM11 的http://infocenter.arm.com/help/topic/com.arm.doc.dai0195b/DAI0195B_arm11_performance_monitor_unit.pdf
这是在 perf_event_v6.c 内核文件夹中,如下所示:
因为我使用的是 arm7 版本,所以我应该修改 perf_event_v7.c 并且我猜测我应该使用 c9 而不是 c15,因为这是那里使用的选项,并在 EX 的 Cortex 参考手册中提到:
c9 寄存器 表 4-10 显示了当 CRn 为 c9 时可以访问的 CP15 系统控制寄存器。表 4-10 c9 寄存器汇总 Op1 CRm Op2 名称 类型 复位描述 0 c12 0 PMCR RW 0x41093000 性能监视器控制寄存器 1 PMCNTENSET RW 0x00000000 计数使能设置寄存器 2 PMCNTENCLR RW 0x00000000 计数使能清除寄存器 3 PMOVSR RW - 溢出标志状态寄存器 4 PMSWINC WO - 软件递增寄存器 5 PMSELR RW 0x00000000 事件计数器选择寄存器
所以应该是:MRC p15, 0, , c9, c12, 0 ;读取性能监视器控制寄存器
和 MRC p15, 0, , c9, c12, 5 ; 读取 PMSELR 寄存器
并选择事件:
我应该遵循的步骤如下: 应该遵循以下程序:
但我仍然不知道该怎么做。
有什么帮助吗?
arm - arm中缓存维护操作中的PoU和PoC
阅读 ARM 拱门时。参考。手册 v7,我发现了两个概念;一致性点(PoC)和统一点(PoU)。
对于 PoC,看起来所有代理(即 CPU 内核)都可以看到相同的内存副本。
对于 PoU,看起来所有代理(在本例中为 CPU 内核和 MMU)都可以看到相同的内存副本。
我有几个后续问题:
我的理解正确吗?
如果是这样,如果我发出 DCCMVAC(数据缓存清理 MVA 到 PoC),将 MVA 赋予 0x40000000,(假设 PoC 恰好是 0x70000000),
0x40000000 和 0x70000000 的 VA 之间的所有缓存条目都被清除了吗?
那么,如果我发出带有 MVA 0x0 的 DCCMVAC,是否会清除所有数据缓存条目?
PoU 听起来 MMU 本身有自己的数据缓存(不是 TLB),用于在主内存中进行页表遍历。这个对吗?
cortex-a - Cortex-A5 未对齐访问异常
我对 Cortex-A5 未对齐访问异常有一些疑问
基本系统信息
- I 和 D 缓存已启用。
- 禁用 MMU。
- 固件基础
在开发 DMA 驱动程序代码时,我编写了以下 C 代码。
解散上面的代码以检查它们,如下所示
R3 值为 0x08040000 STR 指令执行时地址未对齐 发生异常(数据中止)。Cortex A5 不支持非对齐访问?
在 DDI0406C_b_arm_architecture_reference_manual.pdf(表 A3-1 加载/存储指令的对齐要求)LDM 中,STR 不支持非对齐访问。所以发生数据异常。
但我还有一些问题
此驱动程序代码在 Cortex-R4 内核中运行良好。它没有任何问题。Disassebly代码是一样的。这更令人困惑
许多 linux 驱动程序也使用上述代码。如果打开MMU,哪个会解决这个问题?
让我知道我穿了什么?
embedded - AM335x Sitara:如何更改 CPU 模式
我目前正在 TI Sitara AM 3359 上启动一个裸机项目。事实上,我在这个阶段使用 TI 的 ICE 板进行开发。
对于一些外围设备的初始化,我需要切换到特权模式。我想,系统模式就足够了。现在这就是麻烦开始的地方:我如何进入系统模式?
到目前为止我尝试过:
- 覆盖向量表中的指令:
我将_swihandler的地址存储在地址0x4030CE28。ldr r0, _swihandler mov r1, #0xCE28 ; Load global vector table base address, low movt r1, #0x4030 ; Load global vector table base address, high str r0, [r1]
根据 TI 的文档(spruh73h.pdf,技术参考手册),如果执行 0x4030CE08 处的 SWI 指令,则该词将加载到 PC 中。在调试器中,我可以看到存储的值是 0xE92D4001 而不是我的函数实际所在的 0x4030088C。因此,当执行 SWI 时,跳转不起作用。不知道为什么地址写不正确。 - 重定位向量基地址:
我尝试访问 CP15 的 VBAR 寄存器。每次我这样做时,我都会跳转到未定义的异常向量地址。似乎我不允许从用户模式这样做。我想我在这里遇到了某种先有后有的问题。 - 将自制向量表链接到 0x4030CE00:
我最后的努力是尝试将自己的向量表链接到正确的地址并覆盖默认值。不知何故,我找不到 Code Composer Studio v5 的汇编语法来重新定位我的向量表。我浏览了 spnu118l.pdf(TI 的汇编语言工具文档)中列出的汇编器指令,但找不到有用的东西。我是否必须编写分散文件或使用链接器命令行选项?
这篇文章似乎与我的问题有关。
arm - ARM Cortex-A9 软件产生的中断只触发一次
我在 Zynq7020 中使用 ARM Cortex-A9,并且遇到了软件生成的中断问题。
当我在核心 ARM1 中生成(写入 ICDSGIR 寄存器)一个 SGI 时,它只会触发一次,不会再次触发,更多写入 ICDSGIR 不会触发中断。
在发送到 ARM1 的核心 ARM0 中生成 SGI 工作正常,但不是 ARM1 到 ARM1。
ISR 中的 SGI 是否需要特殊处理?我在配置中可能错过了什么?
linux-kernel - 带有 GIC 的 SMP ARM 系统上的中断处理
我想知道从任何设备被中断的那一刻起中断处理是如何工作的。我知道零碎的中断处理,并希望有一个清晰的端到端的中断处理图片。让我谈谈我对中断处理知之甚少.
假设 FPGA 设备通过电线中断并获取一些数据。该 FPGA 设备的设备驱动程序已经使用 request_irq 函数注册了代码(中断处理程序)。
所以现在 FPGA 设备有一条 IRQ 线,它在调用 request_irq 后得到,使用这条 IRQ 线设备将数据发送到通用中断控制器,GIC 将对 IRQ 线进行多对一转换并将信号发送到 CPU 内核,然后在下面调用最少的代码
IRQ_handler_to_specific_device 不是我们使用 request_irq() 调用在设备驱动程序中注册的。
我仍然不知道 CPU 内核是如何知道中断源的?(来自哪个设备的中断)
还有像 do_irq 和共享中断这样的调用的作用是什么?
需要一些帮助来了解如何在 ARM 架构上处理中断的端到端图片?
arm - 启用 MMU/缓存的 ARM Cortex A9 序列的 SMP 启动
我正在尝试在启用了 MMU/Cache 的双核 ARM Cortex A9 系统上的 U-boot 中进行 SMP 启动。我需要初始化序列。以下事情发生的顺序应该是怎样的。以什么顺序?
- MMU页表设置
- 设置 SMP 位(内核 0 和内核 1)
- 无效缓存(内部缓存)
- 缓存的刷新(内部和外部呢)
- 何时必须启用 L2 缓存?
- 何时必须启用 SCU?在 SMP 位之前还是之后?
如果有人可以列出操作顺序,那将是一个很大的帮助。
提前致谢