Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: vector table address
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
zhek
Может кто знает, никак не могу найти отгадку. Надо освободить нулевой сектор для записи данных, поэтому указываю линкеру, что flash начинается с первого сектора, соответственно меняю размер: в диалоге Target изначально было
IROM1: 0x8000000 (start) и 0x100000 (size)
делаю
IROM1: 0x8004000 (start) и 0xFC000 (size)
линкер вроде слушается, в map-е видно это, RESET находится по адресу 0x08004000, но после прошивки камень прыгает на адрес 0x8000000...
brag
vector table смотрели что там?
scifi
Цитата(zhek @ Jun 18 2012, 12:22) *
Надо освободить нулевой сектор для записи данных
...
линкер вроде слушается, в map-е видно это, RESET находится по адресу 0x08004000, но после прошивки камень прыгает на адрес 0x8000000...

Нельзя полностью освободить нулевой сектор. Первые 8 байт обязаны содержать начальный указатель стека и адрес точки входа в прошивку.
zhek
Цитата
vector table смотрели что там?

Эх, если бы знать, где смотреть)
zhek
Спасибо scifi за ответ, пока решил проблему извращённо: забрал последний сектор. Нездоровая ситуация - для хранения 40 байт резервировать 128 кБайт, зато всё работает wink.gif
А flash и наполовину ещё не потрачена. Со временем попытаюсь забрать первый сектор, но чувствую, это будет сложнее.
scifi
Цитата(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 байт всегда будут содержать то, что нужно для запуска программы. Если предусматривается стирание сектора, то гарантировать это сложно: если стирание будет прервано пропаданием питания, то устройство перестанет запускаться.
brag
Цитата
Эх, если бы знать, где смотреть)

в таком случаи документацию на камень не мешало бы почитать
kan35
zhek
А вы скажите, с какого перепугу он НЕ ДОЛЖЕН прыгать на 0x8000000? Контроллеру плевать в каких адресах вы разместили код.
В любом случае надо делать переход на ваш +0x100000 "вручную".
Могу только посоветовать писать в 1-2-3 сектора, а 0 - извините, только под код.
PS: не забудьте сконфигурировать NVIC чтобы он искал вектора по вашему смещению.
brag
kan35, он будет прыгать туда,куда указывает ресет вектор в таблице векторов.
Сергей Борщ
QUOTE (brag @ Jun 20 2012, 12:45) *
куда указывает ресет вектор в таблице векторов.
Для начала он должен этот вектор откуда-то взять. А берет он его из совершенно конкретного прибитого гвоздями адреса - 0x00000004. На который отражен адрес флеш 0x08000004. И это отражение тоже прибито гвоздями.
brag
Адрес таблицы конечно прибит при старте, а вот содержимое ее можно менять как угодно. А там в самом ресете ремапнуть таблицу в другое место. в итоге можно использовать весь нулевой сектор-8 первых байт. но это костыль, не используйте бут-сектор для чего попало. хотя в самого аж 3 таких таблицы sm.gif бут,лоадер,приложение sm.gif наличие отдельной бут связано с тем, что лоадер должен быть перезаписываемым, а в стм32 при read protect нулевой сектор стает одновременно и write protected.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.