Контрольная точка в cortex M4

#c #arm #breakpoints #cortex-m #watchpoint

#c #arm #контрольные точки #cortex-m #контрольная точка

Вопрос:

У меня есть глобальный массив констант const uint32_t p[5] = {1, 2, 3, 4, 5}; . Я сделал ее защищенной от чтения с помощью

      DWT->COMP1 = (uint32_t)amp;p;
     DWT->MASK1 = 6;
     DWT->FUNCTION1 = (1 << 11)| (1 << 0) | (1 << 2);
   
   
  

Когда я обращаюсь к элементам массива с помощью цикла for, прерывание генерируется 5 раз, и это именно то, что я хочу.

 for(int i= 0; i<5; i  ){
    printf("p[%d] = %dt",i,p[i]);
}
  

Однако, когда я пытаюсь получить доступ к переменным с помощью простого оператора печати без какого-либо цикла

 printf("p[0] = %dt", p[0]);
  

DebugMon_interrupt не генерируется. Такое поведение довольно странное.

Если я удалю ключевое слово const из массива, то оно будет работать нормально, т. е. прерывание генерируется как с циклом, так и без него при доступе к элементам массива.

Комментарии:

1. Вы просмотрели скомпилированный код? Я бы предположил, что в сингле printf компилятор заменил p[0] на значение 1

2. Да, проверьте сборку или скомпилируйте без оптимизаций -O0 в gcc.

3. Вы можете принудительно выполнять чтение (по крайней мере, с помощью gcc), объявив массив const volatile .

Ответ №1:

Бьюсь об заклад, @Colin прав. Это происходит из-за оптимизации кода во время компиляции.

Не уверен в вашем конкретном сценарии, но вы можете попытаться сообщить компилятору пропустить оптимизацию для указанного блока кода:

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

printf("p[0] = %dt", p[0]);

#pragma GCC pop_options
  

Редактировать:

Я пропустил тот факт, что массив является const . Очевидно, что в этом случае компилятор будет использовать жестко запрограммированные значения. Согласно комментариям ниже, решение состоит в том, чтобы удалить const (и, возможно, также удалить оптимизацию компилятора).

Комментарии:

1. Изменение оптимизации на -O0 не помогло. Я думаю, что с ключевым словом const что-то есть, потому что, когда я делаю массив неконстантным, он работает нормально.

2. Когда вы удаляете квалификатор const , компилятор должен предположить, что значение может измениться, и поэтому его необходимо прочитать, а не заменить значением во время компиляции.

3. Ах, const … Конечно. В этом случае компилятор будет просто использовать жестко заданное значение.

4. Спасибо @Colin, теперь я понял причину.