【发布时间】:2017-04-12 13:23:18
【问题描述】:
好的,伙计们。我在 Atmel Studio 中设置了一个数据断点(使用 ICEmk2-JTag 调试器),尽管地址处的值已更改,但它不会受到影响。 (我用以下断点检查了它) 这是为什么呢?
数据断点的全部目的是检测地址值的变化,还是我误解了什么?
更具体地说:我有一个指向一个值的指针 A。但是指针 A 被我试图寻找的错误所改变(而不是它指向的值!)。 因此,我创建了一个指向存储指针 A 的地址的指针 B,并在指针 B 上设置了一个数据断点。 这是初始化:
#define lastCMDRingBufferSIZE 255
volatile uint8_t lastCMDRingbuffer[lastCMDRingBufferSIZE]; //
volatile uint8_t*lastCMDRingstartPtr = lastCMDRingbuffer; // This is PtrA
volatile uint32_t*ptrToPtr = &lastCMDRingstartPtr; // PtrB
或者换一种说法;在以下情况下是否触发数据断点:
- 地址内容被数组溢出写入?
- 地址的内容被解释为一个更大的数据结构的一部分,该结构以某种方式被一个流氓指针写入? (解释:一个 64 位指针被取消引用并被写入,结果一个 32 位整数被覆盖)
非常感谢您的怀疑和建议 :)
【问题讨论】:
-
逻辑必须设计为在地址匹配中断/监视时触发某些东西。因此,在 windows/linux 类型的 cpu 上,您可以只使用 mmu 将地址空间标记为受保护,然后在保护处理程序中决定它是监视地址还是让它通过。如果在微控制器上,您要么需要让调试器进行大量轮询,这并不好,要么有片上逻辑支持。也许您没有进行这些操作,或者调试器没有正确设置手表。
-
这是 avr 还是 arm 还是其他?我不认为 AVR 可以进行多字写入,arm 当然可以,但如果被监视的地址不是传递的地址而是在多字写入中,那么它会假设那里的逻辑足够聪明,可以在 stm 或 std 上触发。
-
这不太取决于 Atmel studio 甚至 ICD,而是取决于特定 MCU 支持哪些硬件断点。请说明使用的是哪个 MCU。
标签: embedded atmelstudio atmel-uc3