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

 
 
 
Reply to this topicStart new topic
> vector table address, не могу изменить в STM32F405 + Keil
zhek
сообщение Jun 18 2012, 08:22
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 29-12-05
Из: Екатеринбург
Пользователь №: 12 692



Может кто знает, никак не могу найти отгадку. Надо освободить нулевой сектор для записи данных, поэтому указываю линкеру, что flash начинается с первого сектора, соответственно меняю размер: в диалоге Target изначально было
IROM1: 0x8000000 (start) и 0x100000 (size)
делаю
IROM1: 0x8004000 (start) и 0xFC000 (size)
линкер вроде слушается, в map-е видно это, RESET находится по адресу 0x08004000, но после прошивки камень прыгает на адрес 0x8000000...

Сообщение отредактировал zhek - Jun 18 2012, 08:22
Go to the top of the page
 
+Quote Post
brag
сообщение Jun 18 2012, 08:44
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



vector table смотрели что там?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 18 2012, 09:00
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(zhek @ Jun 18 2012, 12:22) *
Надо освободить нулевой сектор для записи данных
...
линкер вроде слушается, в map-е видно это, RESET находится по адресу 0x08004000, но после прошивки камень прыгает на адрес 0x8000000...

Нельзя полностью освободить нулевой сектор. Первые 8 байт обязаны содержать начальный указатель стека и адрес точки входа в прошивку.
Go to the top of the page
 
+Quote Post
zhek
сообщение Jun 18 2012, 09:04
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 29-12-05
Из: Екатеринбург
Пользователь №: 12 692



Цитата
vector table смотрели что там?

Эх, если бы знать, где смотреть)
Go to the top of the page
 
+Quote Post
zhek
сообщение Jun 18 2012, 10:51
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 29-12-05
Из: Екатеринбург
Пользователь №: 12 692



Спасибо scifi за ответ, пока решил проблему извращённо: забрал последний сектор. Нездоровая ситуация - для хранения 40 байт резервировать 128 кБайт, зато всё работает wink.gif
А flash и наполовину ещё не потрачена. Со временем попытаюсь забрать первый сектор, но чувствую, это будет сложнее.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 18 2012, 11:05
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(zhek @ Jun 18 2012, 14:51) *
Спасибо scifi за ответ, пока решил проблему извращённо: забрал последний сектор. Нездоровая ситуация - для хранения 40 байт резервировать 128 кБайт, зато всё работает wink.gif

Вместо сектора 0 можно использовать секторы 1, 2, 3: они тоже имеют размер 16 кБайт (кстати, стираются быстрее, чем 128 кБайт). Написав свой scatter-файл, можно заставить линкер размещать код в секторах 0, 2, 3 и т.д.

Цитата(zhek @ Jun 18 2012, 14:51) *
А flash и наполовину ещё не потрачена. Со временем попытаюсь забрать первый сектор, но чувствую, это будет сложнее.

Почти нереально. Если только сможете гарантировать, что первые 8 байт всегда будут содержать то, что нужно для запуска программы. Если предусматривается стирание сектора, то гарантировать это сложно: если стирание будет прервано пропаданием питания, то устройство перестанет запускаться.
Go to the top of the page
 
+Quote Post
brag
сообщение Jun 18 2012, 11:08
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Цитата
Эх, если бы знать, где смотреть)

в таком случаи документацию на камень не мешало бы почитать
Go to the top of the page
 
+Quote Post
kan35
сообщение Jun 18 2012, 17:57
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



zhek
А вы скажите, с какого перепугу он НЕ ДОЛЖЕН прыгать на 0x8000000? Контроллеру плевать в каких адресах вы разместили код.
В любом случае надо делать переход на ваш +0x100000 "вручную".
Могу только посоветовать писать в 1-2-3 сектора, а 0 - извините, только под код.
PS: не забудьте сконфигурировать NVIC чтобы он искал вектора по вашему смещению.
Go to the top of the page
 
+Quote Post
brag
сообщение Jun 20 2012, 09:45
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



kan35, он будет прыгать туда,куда указывает ресет вектор в таблице векторов.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2012, 09:57
Сообщение #10


Гуру
******

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



QUOTE (brag @ Jun 20 2012, 12:45) *
куда указывает ресет вектор в таблице векторов.
Для начала он должен этот вектор откуда-то взять. А берет он его из совершенно конкретного прибитого гвоздями адреса - 0x00000004. На который отражен адрес флеш 0x08000004. И это отражение тоже прибито гвоздями.


--------------------
На любой вопрос даю любой ответ
"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
brag
сообщение Jun 21 2012, 10:08
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Адрес таблицы конечно прибит при старте, а вот содержимое ее можно менять как угодно. А там в самом ресете ремапнуть таблицу в другое место. в итоге можно использовать весь нулевой сектор-8 первых байт. но это костыль, не используйте бут-сектор для чего попало. хотя в самого аж 3 таких таблицы sm.gif бут,лоадер,приложение sm.gif наличие отдельной бут связано с тем, что лоадер должен быть перезаписываемым, а в стм32 при read protect нулевой сектор стает одновременно и write protected.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 15th July 2025 - 14:52
Рейтинг@Mail.ru


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