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

    

Что означает сия ошибка в Keil

Использую Keil 4.23. Создал проект для STM32F103VG, настроил, подключил CMSIS, StdPerihp_Driver. Основная функция выглядит так:

int main(void)
{     
    while(1)
    {
    
    }        
}

Теперь хочу запустить симулятор, запускаю и получаю сообщение следующего вида:

Load "D:\\Keil Projects\\ProjectFirst\\ProjectFirst.AXF"

*** error 65: access violation at 0x0000000C : no 'read' permission

Что это означает и как с этим бороться?

Архив с проектом прилагаю.

ProjectFirst.7z

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


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

Настройки проекта неверные. Скорее всего у линкера.

У STM насколько я помню адрес кода начинается с 0x0800_0000, а ваш файл пытается загрузиться с адреса 0x0000_0000. Эта область не разрешена по умолчанию для исполняемого кода.

Если линкер собирает все правильно, и это глюк Keil, который думает что все процы стартуют с адреса 0, то можно в командной строке симулятора набрать

PC=0x8000000; //

Это загрузит в счетчик команд адрес вектора сброса STM (если я цифры конечно не перепутал)

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


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

Все оказалось намного проще. Все настройки проекта верные. В железе все работает. Симулятор данной версии Keil 4.23 не поддерживает STM32F103VG. Поменял на STM32F103VE и симулятор начал работать не с 0-го адреса, а как положено. Думаю версия Keil 4.60 будет поддерживать и STM32F103VG.

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


Ссылка на сообщение
Поделиться на другие сайты
Все оказалось намного проще. Все настройки проекта верные. В железе все работает. Симулятор данной версии Keil 4.23 не поддерживает STM32F103VG. Поменял на STM32F103VE и симулятор начал работать не с 0-го адреса, а как положено. Думаю версия Keil 4.60 будет поддерживать и STM32F103VG.

LPC2929 он тоже поддерживает... Компилит, это да

С симуляцией те же шаманства с адресом. В отладке периферии ARM9 нет как класса, почему-то вся от ARM7 :(

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

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


Ссылка на сообщение
Поделиться на другие сайты
Все оказалось намного проще. Все настройки проекта верные. В железе все работает. Симулятор данной версии Keil 4.23 не поддерживает STM32F103VG.

 

Я потому и спросил про F4 - у меня аналогичное поведение. С железом через SWD/JTAG рабтает, а симулятор - нет.

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


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

Редактируете Memory Map в отладчике, и всё запускается.

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


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

А нельзя ли поподробнее? А то я про это и на сайте Keil читал, но так и не понял как это сделать.

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


Ссылка на сообщение
Поделиться на другие сайты
А нельзя ли поподробнее? А то я про это и на сайте Keil читал, но так и не понял как это сделать.

Вообще-то, я это прописываю в ini файле, который подключается при симуляции, в опциях проекта на вкладке Debug. Типа такого:

MAP 0x00000000, 0x00040000 exec read

MAP 0x08000000, 0x08040000 exec read

MAP 0x40000000, 0x40040000 read write

MAP 0x20000000, 0x20020000 read write

MAP

То же можно ввести вручную, когда запускаете отладчик, без старта. Debug->Memory Map.

 

 

А нельзя ли поподробнее? А то я про это и на сайте Keil читал, но так и не понял как это сделать.

Вообще-то, я это прописываю в ini файле, который подключается при симуляции, в опциях проекта на вкладке Debug. Типа такого:

MAP 0x00000000, 0x00040000 exec read

MAP 0x08000000, 0x08040000 exec read

MAP 0x40000000, 0x40040000 read write

MAP 0x20000000, 0x20020000 read write

MAP

То же можно ввести вручную, когда запускаете отладчик, без старта. Debug->Memory Map.

 

P.S. Сколько можно терпеть безобразие? Постоянно Электроникс ложится! Bad Gateway 502, что-то вроде этого. Почему Шарага не ложится никогда? :)

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


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

ViKo, это оно да, но там проблема именно в том, что Keil стартует с адреса 0, а не с того, с которого проц стартует на самом деле

Там в этом INI вообще можно много чего наворотить...

Вот мой пример для LPC29xx

FUNC void Setup (void) {
// <o> Program Entry Point
  PC = 0x20000000;
}

Setup();                             // Setup for Running

//g, main

 

 

 

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


Ссылка на сообщение
Поделиться на другие сайты
Viko это вот эта строка: MAP 0x00000000, 0x00040000 exec read отвечает за запуск симулятора с нулевого адреса?

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


Ссылка на сообщение
Поделиться на другие сайты
это вот эта строка: MAP 0x00000000, 0x00040000 exec read отвечает за запуск симулятора с нулевого адреса?

 

Нет эта строка только разрешает использовать диапазон памяти для чтения (read) и исполнения кода (exec)

для перехода на нужный адрес надо в том же INI-файле присвоить счетчику команд нужное значение (или через командную строку отладчика)

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


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

Я понимаю так - процессор на самом деле начинает считать с нулевого адреса. Но на этот диапазон может отображаться память системная (загрузчик) или flash (пользовательская). Можно еще и с диапазона ОЗУ запустить (эта память не отображается на нулевые адреса). Определяется сигналами BOOT.

MAP - разрешает отладчику использовать указанный диапазон.

 

Нужно посмотреть, какие адреса создает компилятор. Я думаю, начинаются с 0x0000 0000, а не 0x0800 0000.

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


Ссылка на сообщение
Поделиться на другие сайты
Нужно посмотреть, какие адреса создает компилятор. Я думаю, начинаются с 0x0000 0000, а не 0x0800 0000.

как в скаттере указано, так и создает

А компилятору нужно указать entry point явно, если почему-то не там размещает точку входа

В принципе, можно компилятору сказать, чтобы все адреса делал относительными, получим перемещаемый код, запускаемый с любого адреса, но проц после старта сначала вычитывает PC, SP, вектора и т.д. по вполне себе определенным адресам

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


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

Создал ini-файл. Сделал в нем запись: PC = 0x08000000; Запускаю симуляцию, возникает та же ошибка, при этом PC = 0x00000000.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация