011119xx 0 10 декабря, 2012 Опубликовано 10 декабря, 2012 · Жалоба Использую 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 10 декабря, 2012 Опубликовано 10 декабря, 2012 · Жалоба Проц f4 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 10 декабря, 2012 Опубликовано 10 декабря, 2012 · Жалоба Настройки проекта неверные. Скорее всего у линкера. У STM насколько я помню адрес кода начинается с 0x0800_0000, а ваш файл пытается загрузиться с адреса 0x0000_0000. Эта область не разрешена по умолчанию для исполняемого кода. Если линкер собирает все правильно, и это глюк Keil, который думает что все процы стартуют с адреса 0, то можно в командной строке симулятора набрать PC=0x8000000; // Это загрузит в счетчик команд адрес вектора сброса STM (если я цифры конечно не перепутал) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
011119xx 0 10 декабря, 2012 Опубликовано 10 декабря, 2012 · Жалоба Все оказалось намного проще. Все настройки проекта верные. В железе все работает. Симулятор данной версии Keil 4.23 не поддерживает STM32F103VG. Поменял на STM32F103VE и симулятор начал работать не с 0-го адреса, а как положено. Думаю версия Keil 4.60 будет поддерживать и STM32F103VG. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 10 декабря, 2012 Опубликовано 10 декабря, 2012 · Жалоба Все оказалось намного проще. Все настройки проекта верные. В железе все работает. Симулятор данной версии Keil 4.23 не поддерживает STM32F103VG. Поменял на STM32F103VE и симулятор начал работать не с 0-го адреса, а как положено. Думаю версия Keil 4.60 будет поддерживать и STM32F103VG. LPC2929 он тоже поддерживает... Компилит, это да С симуляцией те же шаманства с адресом. В отладке периферии ARM9 нет как класса, почему-то вся от ARM7 :( Кейловцы сказали, что все описание периферии они сделали отдельным движком, а производители-бяки не дают им документацию, поэтому то и се. Короче говоря, они уже кроме кортексов ничего знать не хотят, как я понял... мэйн-стрим, итить его Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 10 декабря, 2012 Опубликовано 10 декабря, 2012 · Жалоба Все оказалось намного проще. Все настройки проекта верные. В железе все работает. Симулятор данной версии Keil 4.23 не поддерживает STM32F103VG. Я потому и спросил про F4 - у меня аналогичное поведение. С железом через SWD/JTAG рабтает, а симулятор - нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 10 декабря, 2012 Опубликовано 10 декабря, 2012 · Жалоба Редактируете Memory Map в отладчике, и всё запускается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
011119xx 0 10 декабря, 2012 Опубликовано 10 декабря, 2012 · Жалоба А нельзя ли поподробнее? А то я про это и на сайте Keil читал, но так и не понял как это сделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 10 декабря, 2012 Опубликовано 10 декабря, 2012 · Жалоба А нельзя ли поподробнее? А то я про это и на сайте 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, что-то вроде этого. Почему Шарага не ложится никогда? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 10 декабря, 2012 Опубликовано 10 декабря, 2012 · Жалоба ViKo, это оно да, но там проблема именно в том, что Keil стартует с адреса 0, а не с того, с которого проц стартует на самом деле Там в этом INI вообще можно много чего наворотить... Вот мой пример для LPC29xx FUNC void Setup (void) { // <o> Program Entry Point PC = 0x20000000; } Setup(); // Setup for Running //g, main Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
011119xx 0 11 декабря, 2012 Опубликовано 11 декабря, 2012 · Жалоба Viko это вот эта строка: MAP 0x00000000, 0x00040000 exec read отвечает за запуск симулятора с нулевого адреса? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 11 декабря, 2012 Опубликовано 11 декабря, 2012 · Жалоба это вот эта строка: MAP 0x00000000, 0x00040000 exec read отвечает за запуск симулятора с нулевого адреса? Нет эта строка только разрешает использовать диапазон памяти для чтения (read) и исполнения кода (exec) для перехода на нужный адрес надо в том же INI-файле присвоить счетчику команд нужное значение (или через командную строку отладчика) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 11 декабря, 2012 Опубликовано 11 декабря, 2012 · Жалоба Я понимаю так - процессор на самом деле начинает считать с нулевого адреса. Но на этот диапазон может отображаться память системная (загрузчик) или flash (пользовательская). Можно еще и с диапазона ОЗУ запустить (эта память не отображается на нулевые адреса). Определяется сигналами BOOT. MAP - разрешает отладчику использовать указанный диапазон. Нужно посмотреть, какие адреса создает компилятор. Я думаю, начинаются с 0x0000 0000, а не 0x0800 0000. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 11 декабря, 2012 Опубликовано 11 декабря, 2012 · Жалоба Нужно посмотреть, какие адреса создает компилятор. Я думаю, начинаются с 0x0000 0000, а не 0x0800 0000. как в скаттере указано, так и создает А компилятору нужно указать entry point явно, если почему-то не там размещает точку входа В принципе, можно компилятору сказать, чтобы все адреса делал относительными, получим перемещаемый код, запускаемый с любого адреса, но проц после старта сначала вычитывает PC, SP, вектора и т.д. по вполне себе определенным адресам Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
011119xx 0 11 декабря, 2012 Опубликовано 11 декабря, 2012 · Жалоба Создал ini-файл. Сделал в нем запись: PC = 0x08000000; Запускаю симуляцию, возникает та же ошибка, при этом PC = 0x00000000. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться