皮质 M4 中的观察点
Watchpoint in cortex M4
我有一个全局常量数组const uint32_t p[5] = {1, 2, 3, 4, 5};
。我已将其设为读保护
DWT->COMP1 = (uint32_t)&p;
DWT->MASK1 = 6;
DWT->FUNCTION1 = (1 << 11)| (1 << 0) | (1 << 2);
当我使用 for 循环访问数组成员时,中断产生了 5 次,这正是我想要的。
for(int i= 0; i<5; i++){
printf("p[%d] = %d\t",i,p[i]);
}
但是,当我尝试使用没有任何循环的简单打印语句访问变量时
printf("p[0] = %d\t", p[0]);
、DebugMon_interrupt没有生成。这种行为很奇怪。
如果我从数组中删除 const 关键字,那么它可以正常工作,即在访问数组元素时无论有无循环都会生成中断。
我敢打赌@Colin 是对的。发生这种情况是因为编译期间的代码优化。
不确定您的具体情况,但您可以尝试通知编译器跳过对指定代码块的优化:
#pragma GCC push_options
#pragma GCC optimize ("O0")
printf("p[0] = %d\t", p[0]);
#pragma GCC pop_options
编辑:
我错过了数组是 const
的事实。显然,在这种情况下,编译器将使用 hard-coded 值。根据下面的评论,解决方案是删除 const
(也可能删除编译器优化)。
我有一个全局常量数组const uint32_t p[5] = {1, 2, 3, 4, 5};
。我已将其设为读保护
DWT->COMP1 = (uint32_t)&p;
DWT->MASK1 = 6;
DWT->FUNCTION1 = (1 << 11)| (1 << 0) | (1 << 2);
当我使用 for 循环访问数组成员时,中断产生了 5 次,这正是我想要的。
for(int i= 0; i<5; i++){
printf("p[%d] = %d\t",i,p[i]);
}
但是,当我尝试使用没有任何循环的简单打印语句访问变量时
printf("p[0] = %d\t", p[0]);
、DebugMon_interrupt没有生成。这种行为很奇怪。
如果我从数组中删除 const 关键字,那么它可以正常工作,即在访问数组元素时无论有无循环都会生成中断。
我敢打赌@Colin 是对的。发生这种情况是因为编译期间的代码优化。
不确定您的具体情况,但您可以尝试通知编译器跳过对指定代码块的优化:
#pragma GCC push_options
#pragma GCC optimize ("O0")
printf("p[0] = %d\t", p[0]);
#pragma GCC pop_options
编辑:
我错过了数组是 const
的事实。显然,在这种情况下,编译器将使用 hard-coded 值。根据下面的评论,解决方案是删除 const
(也可能删除编译器优化)。