реклама на сайте
подробности

 
 
> Опять про загрузчик..., Не получается передать управление.
EXeGLuMATOR
сообщение Apr 9 2008, 07:05
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Перечитал все что нашел, по этой теме - так и не дошло в чем проблема.
Итак. Написан загрузчик - все пишется, все обновляется, но не получается передать управление на основную программу. Ремаплю-передаю вот так:
Код
    MEMMAP = 2;                    //Map vector table from RAM
        // Copy vectors table
    src = (unsigned long *)START_ADDR;
    dst = (unsigned long *)0x00000000;
        size = 0x40 / sizeof(*dst);
        do  { *dst++ = *src++; } while (--size);

    //Reset controller
    ((void(*)(void))(0x00000000))();


Смотрю в симуляторе, все ремапится, но после перехода на 0 получаю вот это:
*** error 65: access violation at 0x00000000 : no 'execute/read' permission

Загрузчик линкуется вот так:
Код
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00000000 0x00020000  {   ; load region size_region
  ER_IROM1 0x00000000 0x00020000  { ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x40000040 0x0000FFC0  { ; RW data
   .ANY (+RW +ZI)
  }
}


Основной модуль вот так:
Код
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00006000 0x0001A000  {   ; load region size_region
  ER_IROM1 0x00006000 0x0001A000  { ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x40000000 0x00010000  { ; RW data
   .ANY (+RW +ZI)
  }
}


В связи с этим вопросы:
1. Что не так делаю?
2. Как надо компилить-линковать основной модуль и загрузчик по расположению в памяти?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Altemir
сообщение May 24 2008, 11:50
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686



Здравствуйте, уважаемые. Понимаю, что этот вопрос уже поднимался, но хотелось бы получить ответы конкретно по своей задаче.
Итак, был мною написан загрузчик для LPC2132, работающий по следующей схеме:
1. Проекты загрузчика и основной программы независимы
2. Для загрузчика определено адресное пространство во флэш:
-DROMSTART=01000
-DROMEND=05FFF
Жирность загрузчика определяется необходимостью поддержки части периферии, возможностью связи с внешним устройством и компом для получения прошивки основной программы и работы с AT45.

Для основной программы (ОП): [200-FFF],[6000-FFFF]
3. При получении прошивки ОП загрузчик проверяет её на валидность, делает подмену стартового адреса своим, сохраняет стартовый адрес ОП в резервной области LPC, корректирует CRC-векторов, записывает нулевую страницу, обходит "свою" область, записывает оставшуюся область ОП.
4. По окончании записи проверяет ОП во flash LPC на валидность, переходит на исполнение ОП.

Всё работает, работает замечательно, но, как можно заметить, необходимо стирать нулевой сектор, что приводит к возможному "слёту" прошивки при выключении питания/сбросе, если не успела записаться область 0x00-0x3F. Хотелось бы узнать пути решения этой проблемы: как вообще не трогать нулевой сектор? Т.е. адреса 0x0000-0x5FFF должны быть неприкосновенными.
Из форума видел пока только одно решение - ремапить в ОЗУ по адресам 0x00-0x3F область INTVEC основной программы. Но, судя опять же по форуму, это ненадёжно, т.к. существует риск затирания этой области некорректным исполнением кода основной программы. Есть ли возможность использования для основной программы векторов из flash, жертвуя использованием прерываний в загрузчике?

Сообщение отредактировал Altemir - May 24 2008, 12:31
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 24 2008, 13:45
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Altemir @ May 24 2008, 14:50) *
Но, судя опять же по форуму, это ненадёжно, т.к. существует риск затирания этой области некорректным исполнением кода основной программы.
А если основная программа затрет не эту область, а, скажем 0x400000F0 - 0x40000100, то это будет способствовать повышению надежности? Включайте собаку, при слете она будет перезапускать проц, загрузчик будет восстанавливать вектора и так пока не найдете ошибку.

Давно использую вариант с ремапом на LPC2214 и AT91SAM7 - никаких нареканий. Нестирание нулевого сектора дает гарантию сохранение жизнеспособности при пропадании питания, сбросе, при обрыве связи в процессе перепрошивки, но никак не при ошибках в программе.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Altemir
сообщение May 24 2008, 14:01
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686



Всё это понятно. Вы с Argon-ом на: Сахаре
обсуждали реализацию ремапа в ОЗУ, я это тоже изучил. Там же указывалось на возможность "задать фиксированное значение векторов" (с переходом на таблицу векторов ОП, к примеру 0x6000-0x603F) в бутлодыре для ОП, так, что прерывания будут исполняться на один переход больше. Такой вопрос не изучали?

Собака у меня всегда включена, а насчёт размещения векторов в ОЗУ здесь на форуме имеются как минимум два противника: zltigo и Kirill Frolov. Очень интересно и их выслушать.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- EXeGLuMATOR   Опять про загрузчик...   Apr 9 2008, 07:05
- - aaarrr   Не знаю, как оформлены вектора в основной программ...   Apr 9 2008, 07:24
|- - EXeGLuMATOR   Цитата(aaarrr @ Apr 9 2008, 11:24) Не зна...   Apr 9 2008, 07:28
|- - aaarrr   Цитата(EXeGLuMATOR @ Apr 9 2008, 11:28) С...   Apr 9 2008, 07:41
|- - EXeGLuMATOR   Цитата(aaarrr @ Apr 9 2008, 11:41) После ...   Apr 9 2008, 07:51
|- - aaarrr   Цитата(EXeGLuMATOR @ Apr 9 2008, 11:51) С...   Apr 9 2008, 08:00
- - EXeGLuMATOR   То что лежит в 64 байтах от адреса 0х6000 переноси...   Apr 9 2008, 08:26
|- - aaarrr   Цитата(EXeGLuMATOR @ Apr 9 2008, 12:26) п...   Apr 9 2008, 08:32
- - EXeGLuMATOR   Может что не так скомпилировано? Не по тем адресам...   Apr 9 2008, 09:21
|- - aaarrr   Цитата(EXeGLuMATOR @ Apr 9 2008, 13:21) М...   Apr 9 2008, 09:28
- - EXeGLuMATOR   Тогда не понятно в чем проблема. Ладно-бы симуля...   Apr 9 2008, 10:01
- - EXeGLuMATOR   Глас вопиющего в пустыне. Все делают подобные про...   Apr 11 2008, 07:51
|- - Сергей Борщ   Цитата(EXeGLuMATOR @ Apr 11 2008, 10:51) ...   Apr 11 2008, 09:56
|- - amw   Цитата(EXeGLuMATOR @ Apr 11 2008, 10:51) ...   Apr 11 2008, 10:50
- - EXeGLuMATOR   да, сорри забыл сказать. камень LPC2106. Память и...   Apr 11 2008, 19:10
|- - amw   Цитата(EXeGLuMATOR @ Apr 11 2008, 22:10) ...   Apr 11 2008, 19:51
|- - EXeGLuMATOR   Цитата(amw @ Apr 11 2008, 23:51) Блин ско...   Apr 11 2008, 20:54
|- - amw   Цитата(EXeGLuMATOR @ Apr 11 2008, 23:54) ...   Apr 12 2008, 08:29
|- - eml   Цитата(amw @ Apr 12 2008, 11:29) Возмите ...   Apr 17 2008, 09:44
|- - amw   Цитата(eml @ Apr 17 2008, 12:44) У вас со...   Apr 17 2008, 16:54
|- - Vitaliy_ARM   Цитата(eml @ Apr 17 2008, 13:44) У вас со...   May 2 2008, 12:33
|- - user234   Цитата(Vitaliy_ARM @ May 2 2008, 15:33) Т...   May 12 2008, 08:58
|- - amw   Цитата(user234 @ May 12 2008, 11:58) Здра...   May 12 2008, 09:24
|- - user234   Цитата(amw @ May 12 2008, 12:24) Вопрос с...   May 12 2008, 09:52
|- - amw   Цитата(user234 @ May 12 2008, 12:52) Спас...   May 12 2008, 09:57
|- - user234   Цитата(amw @ May 12 2008, 12:57) Возможно...   May 12 2008, 11:08
|- - amw   Цитата(user234 @ May 12 2008, 14:08) 1. ...   May 12 2008, 11:29
|- - user234   Цитата(amw @ May 12 2008, 14:29) А перед ...   May 12 2008, 12:48
- - aaarrr   Цитата(user234 @ May 12 2008, 16:48) Когд...   May 12 2008, 13:00
|- - user234   Спасибо.   May 12 2008, 13:39
|- - amw   Цитата(user234 @ May 12 2008, 16:39) Спас...   May 12 2008, 16:56
|- - zltigo   Цитата(Altemir @ May 24 2008, 13:50) Есть...   May 24 2008, 14:10
|- - Altemir   Цитата(zltigo @ May 24 2008, 18:10) Ну за...   May 24 2008, 15:21
|- - zltigo   Цитата(Altemir @ May 24 2008, 17:21) 3. П...   May 24 2008, 16:21
|- - Altemir   ЦитатаНет. Читаем комментарий: IRQ "Jump dir...   May 24 2008, 17:01
|- - zltigo   Цитата(Altemir @ May 24 2008, 19:01) Везд...   May 24 2008, 17:51
|- - Altemir   Цитата(zltigo @ May 24 2008, 21:51) Что т...   May 24 2008, 18:06
|- - Сергей Борщ   Цитата(Altemir @ May 24 2008, 21:06) 3. О...   May 24 2008, 19:38
|- - Altemir   Цитата(Сергей Борщ @ May 24 2008, 23:38) ...   May 24 2008, 19:53
|- - Altemir   Кстати, порывшись в опциях XLINK, обнаружил возмож...   May 24 2008, 21:15
- - Altemir   Всё сделал. Всё работает. Никакой правки и копания...   May 26 2008, 19:06
|- - zltigo   Цитата(Altemir @ May 26 2008, 21:06) Всё ...   May 26 2008, 19:31
|- - Altemir   Цитата(zltigo @ May 26 2008, 23:31) Сдела...   May 26 2008, 19:36
- - vesago   Хочу разобраться с ремапом основного приложения в ...   Mar 23 2009, 12:03


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 06:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01484 секунд с 7
ELECTRONIX ©2004-2016