皮质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]);
}

但是,当我尝试使用简单的print语句访问变量而没有任何循环

printf("p[0] = %d\t",p[0]);

,不生成DebugMon_interrupt。这种行为很奇怪。

如果我从数组中删除const关键字,那么它可以正常工作,即在访问数组元素时同时生成循环中断和无循环中断。

解决方法

我打赌@科林是正确的。发生这种情况是由于编译期间的代码优化。

不确定您的特定方案,但是您可以尝试通知编译器跳过对指定代码块的优化:

#pragma GCC push_options
#pragma GCC optimize ("O0")

printf("p[0] = %d\t",p[0]);

#pragma GCC pop_options

编辑:

我错过了数组为const的事实。显然,在这种情况下,编译器将使用硬编码值。根据下面的评论,解决方案是删除const(并且可能还会删除编译器优化)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...