gpt4 book ai didi

arm - 如果在启用 GDB 之前连接了 GDB,则不会触发 SysTick 中断

转载 作者:行者123 更新时间:2023-12-01 01:42:56 28 4
gpt4 key购买 nike

我有一个用于半托管的 ATSAMD21E18A 微型。为了使半托管工作,GDB 需要在第一条 bkpt 指令之前“附加”。另一方面,我莫名其妙地发现,如果在我配置 GDB 时已经附加了 GDB,则 SysTick 中断不会触发。如果我想触发 SysTick 中断,我必须执行重置(通过按钮关闭电源)并告诉 GDB 在它还没有配置微时继续(也就是说,它没有发送断点或其他任何东西),然后按 Ctrl-C 以在 SysTick 配置之后但在我们到达 initialise_monitor_handles 之前初始化 Debug模式。 .

我已经验证 start 函数只是复制可重定位的数据段,将零段归零,并设置正确的初始堆栈指针值。我们正在编写没有像 CMSIS 这样的库的代码。

此外,除了需要删除半托管内容之外,我还可以确认在未连接调试器(通过 Atmel SAM-ICE 连接 JLinkGDBServer)时我没有任何问题。

此外,即使中断本身没有触发,SysTick COUNT 仍然正确计数。 ICSR 中的 SysTick 挂起中断位 PENDSTSET 实际上在发生这种情况时已设置。

我的代码如下:

int main()
{
// enable system timer interrupt
SYS_TICK->STATUS = 0; // (CSR)
SYS_TICK->PERIOD = 48000; // (RVR) fire at 1khz for 48mhz clock
SYS_TICK->STATUS = 0b111; // use processor clock, w/ interrupt, and enabled
SYS_TICK->COUNT = 1; // (CVR) avoid high unknown value

// dumb busy loop
util_idle_ms(2000); // <<< I hit Ctrl-C to break here!

initialise_monitor_handles();

// ... more system initialization and everything else
}

我在 StackOverflow 上看到了一些类似的问题,但它们似乎太模糊了,无法得到好的答案。

编辑:
以下是在忙循环期间为不调用 SysTick 处理程序的运行获取的可能相关寄存器值(无硬重置,在配置 SysTick 之前附加 GDB):
SYS_TICK_CSR/STATUS: 0x10007
SYS_TICK_RVR/PERIOD: 48000
SYS_TICK_CVR/COUNT: 5245 (varies of course)
NVC_ISER: 0 (and we expect this since SysTick is considered an exception, and not an interrupt)
DHCSR: 0x30003/0x1030003 (C_MASKINTS is not set; I've seen both values show up)
ICSR: 0x400f00f (it really wants to run the SysTick handler)
PRIMASK: 0
xPSR: 0x2100000f (IPSR is 0x0f/SysTick)

对于调用 SysTick 处理程序的运行就好了(在 SysTick 配置后使用 GDB 进行硬重置):
SYS_TICK_CSR/STATUS: 0x10007
SYS_TICK_RVR/PERIOD: 48000
SYS_TICK_CVR/COUNT: 16892 (varies of course)
NVC_ISER: 0
DHCSR: 0x10003/0x1030003 (I've seen both values show up)
ICSR: 0 (SysTick handler already run)
PRIMASK: 0
xPSR: 0x2100000f

所以这里的寄存器值似乎还没有向我揭示任何新的东西......请帮助告诉我其他可能相关的寄存器来检查!

只是出于兴趣,这对我很重要的原因是因为我已经让 gprof 在这个芯片上工作,基于 https://mcuoneclipse.com/2015/08/23/tutorial-using-gnu-profiling-gprof-with-arm-cortex-m/
虽然在硬重置后我必须在正确的时间按下 Ctrl-C,但它确实是这样工作的!

编辑
我发现我对运行的地方有误解 load在 GDB 中执行了软复位。我后来发现,虽然它返回执行复位向量,但实际上并没有复位各种外设和其他寄存器。如果我使用 monitor reset 在 GDB 中执行软重置那么我不需要在延迟期间按 Ctrl-C 来附加 GDB,SysTick 和 SemiHosting 都可以工作。

问题出现在配置SysTick然后 load在 GDB 中运行,没有明确的硬复位或软复位。在这种情况下,SysTick 不会触发中断。我的大部分调试都是这样进行的,加载新代码并立即期望它可以工作,以便我可以对其进行评估。刚跑 monitor reset是比以前更好的解决方法,但我仍然更想知道 SysTick 行为不当的原因!

最佳答案

我会访问 ARM® v6-M 体系结构引用手册,看看您是否可以从中获得一些指导。 https://static.docs.arm.com/ddi0419/d/DDI0419D_armv6m_arm.pdf
观察您未包含在问题中的与 Systick 相关的寄存器状态。如果您无法根据这些寄存器找出问题,请编辑您的问题并在此处发布寄存器值(NVIC ISER、与 systick 配置相关的所有寄存器、DHCSR 以及您认为相关的任何其他寄存器)。他们将是获得更多反馈的关键。
调试停止控制和状态寄存器 (DHCSR) 能够屏蔽包括 systick 在内的中断。也许这是由调试器设置的?
bit 3 of the DHCSR looks relevant
我还将检查 SYST_RVR(系统重载值寄存器)是否设置为正常。
我没有代表对您的问题发表评论,但我希望这能让您朝着富有成效的方向前进:)

关于arm - 如果在启用 GDB 之前连接了 GDB,则不会触发 SysTick 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54433886/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com