#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, теперь я понял причину.