Перейти к содержанию
    

Включение RDP на ST32F746VG нарушает работу программы

Всем привет!

Столкнулся с такой странностью - при переключении RDP из уровня 0 в уровень 1 программа перестает работать. Переключал с помощью кода в программе и с помощью ST Visual Programmer. Результат одинаковый

Код следующий

	FLASH->OPTKEYR = FLASH_OPTKEY1;
	FLASH->OPTKEYR = FLASH_OPTKEY2;

	while (FLASH->SR & FLASH_SR_BSY);
	*(((__IO uint8_t*)&FLASH->OPTCR)+1) = uint8_t 0x55U;
	FLASH->OPTCR |= FLASH_OPTCR_OPTSTRT;
	__DSB();
	while (FLASH->SR & FLASH_SR_BSY);
	FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK;

Код писал по руководству на процессор. Посмотрел как сделано в X-CUBE-PCROP, вроде как все тоже самое за исключением того, что там снимают дополнительно блокировку flash. Снятие блокировки flash не помогает, проверял.

Может в каком системном регистре флаг надо поставить, или еще какие настройки сделать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 hours ago, _lexa_ said:

при переключении RDP из уровня 0 в уровень 1 программа перестает работат

Обращение по адресу кратному двойке - это всегда чтение данных. Выполнение кода всегда в фоновом режиме прибавляет 1 к адресу. По этому нельзя запрещать чтение всей флешь памяти. Её нужно явно поделить на секции: только для кода, и только для данных. 

Ну и ещё один прикол, код немного разбухает - потому как данные теперь находятся чуть дальше обычного. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, AVI-crak сказал:

Обращение по адресу кратному двойке - это всегда чтение данных.

Это еще с чего бы?

 

6 часов назад, AVI-crak сказал:

Выполнение кода всегда в фоновом режиме прибавляет 1 к адресу. По этому нельзя запрещать чтение всей флешь памяти. Её нужно явно поделить на секции: только для кода, и только для данных.

Ну и ещё один прикол, код немного разбухает - потому как данные теперь находятся чуть дальше обычного.

А вот тут можно подробнее?:wacko2:

 

23 часа назад, _lexa_ сказал:

Столкнулся с такой странностью - при переключении RDP из уровня 0 в уровень 1 программа перестает работать. Переключал с помощью кода в программе и с помощью ST Visual Programmer. Результат одинаковый.

Отладчик подключен в момент исполнения кода, переводящего RDP из уровня 0 в уровень 1? Потому как, не стоит забывать, что

Цитата

Level 1: read protection enabled

 

It is the default read protection level after option byte erase. The read protection Level 1 is activated by writing any value (except for 0xAA and 0xCC used to set Level 0 and Level 2, respectively) into the RDP option byte. When the read protection Level 1 is set:

– No access (read, erase, program) to Flash memory or backup SRAM can be performed while the debug feature is connected or while booting from RAM or system memory bootloader. A bus error is generated in case of read request.

– When booting from Flash memory, accesses (read, erase, program) to Flash memory and backup SRAM from user code are allowed.

(RM на STM32F74x, стр. 88).

 

P.S. Смысловая нагрузка в научно-популярной терминологии "программа перестала работать" стремится к 0, не забывайте об этом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, Arlleex said:

Это еще с чего бы?

Ну дык это основная фишка защиты ARM процессоров, они таким образом программный код от данных отличают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, AVI-crak сказал:

Ну дык это основная фишка защиты ARM процессоров, они таким образом программный код от данных отличают.

То есть Вы хотите сказать, что обращение, скажем, по адресу 0x08000004 всегда является доступом на чтение? Точно нет.

ARM процессору на ядре Cortex-Mx абсолютно безразлично на содержимое памяти. При попытке исполнить неопределенную команду или команду, адрес которой загружается в PC со сброшенным битом [0], будет сформировано системное исключение UsageFault с возможной эскалацией до HardFault. Процессор профиля A, при попытке исполнить неопределенную команду, перейдет в состояние Undefined.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, AVI-crak said:

Обращение по адресу кратному двойке - это всегда чтение данных.

Да это бред... Ядру вообще пофигу откуда выбирать инструкции, главное чтобы он мог это делать физически, ничего он не распознает. Да и писать во флеш можно хоть байты, хоть полуслова, хоть слова. К адресу прибавляеться единица когда инструкции перехода меняют режим процессора с Thumb на ARM и все. Интересно как можно поделить код на только данные и только инструкции если сразу после кода идет блок констант. И кто вам сказал что при защите ядро не имеет доступа к чтению. Да и по формулировке что не работает у ТС совсем непонятно.

Изменено пользователем MasterElectric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, MasterElectric said:

Интересно как можно поделить код на только данные и только инструкции если сразу после кода идет блок констант

А вот это правильный вопрос.

В линкере физическая память может иметь атрибуты: "x" - выполнение кода, "r" - чтение, "w" - запись. Разная память - разные сочетания атрибутов. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, AVI-crak сказал:

А вот это правильный вопрос.

В линкере физическая память может иметь атрибуты: "x" - выполнение кода, "r" - чтение, "w" - запись. Разная память - разные сочетания атрибутов. 

Это к первоначальному вопросу имеет посредственное отношение.

Как пример, константы, адресуемые относительно PC, будут располагаться в области исполняемого кода недалеко от места использования в той же секции (секции "execute"), несмотря на то, что они, казалось бы, должны располагаться в секции "read only" (якобы какой-то отдельно памяти. Flash, она же и read only, и execute - строго разделения на приведенные Вами секции нет). И опять же, это не отменяет того факта, что считать данные я могу с любого места адресного пространства МК, если это не запрещено структурой и логической организацией памяти/MMIO-периферии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё верно, ARM ядру пофиг откуда читать код и данные, и под каким соусом. А вот системе защиты - нет. Не важно где располагаются ссылки и данные, важно чтобы код был только во флешь. Ну или как минимум - не выполнялся из рам, когда его не просят об этом. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/23/2019 at 11:59 AM, Arlleex said:

Отладчик подключен в момент исполнения кода, переводящего RDP из уровня 0 в уровень 1? Потому как, не стоит забывать, что

Спасибо за совет. Отключил отладчик все заработало. Получается, что отладчик пытается получить доступ к ресурсам процессора, даже если мы ничего не отлаживаем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/23/2019 at 5:24 PM, AVI-crak said:

В линкере физическая память может иметь атрибуты: "x" - выполнение кода, "r" - чтение, "w" - запись. Разная память - разные сочетания атрибутов. 

Настройки линкера здесь не имеют отношения к доступу в памяти. Работу с памятью и, в частности, доступ к ней определяет MPU, регистры которого линкер не меняет. В область flash, отмеченную как readonly в файле конфигурации линкера, выполнять запись можно и байтами и словами, проверял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, _lexa_ said:

Получается, что отладчик пытается получить доступ к ресурсам процессора

Нет. Проверял следующее: подключаемся отладчиком, отключаемся, выдёргиваем разъем отладчика (физически), без сброса устройства ставим RDP. Всё виснет.

Достаточно ли дёрнуть ногу резет, или надо делать сброс питания, не проверял - мне проще было щёлкнуть кнопкой на источнике питания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...