Jump to content

    

Что означает сия ошибка в 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

Share this post


Link to post
Share on other sites

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

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

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

PC=0x8000000; //

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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites
Все оказалось намного проще. Все настройки проекта верные. В железе все работает. Симулятор данной версии Keil 4.23 не поддерживает STM32F103VG.

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
А нельзя ли поподробнее? А то я про это и на сайте 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, что-то вроде этого. Почему Шарага не ложится никогда? :)

Share this post


Link to post
Share on other sites

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

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

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

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

Setup();                             // Setup for Running

//g, main

 

 

 

Share this post


Link to post
Share on other sites
Viko это вот эта строка: MAP 0x00000000, 0x00040000 exec read отвечает за запуск симулятора с нулевого адреса?

Share this post


Link to post
Share on other sites
это вот эта строка: MAP 0x00000000, 0x00040000 exec read отвечает за запуск симулятора с нулевого адреса?

 

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this