Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MSP430. Размещение массива в FLASH.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
JohnKorsh
Пишу для MSP430. Мне необходимо разместить во FLASH массив, который будет програмно переписываться.
Как мне объяснить линковщику, что я хочу разместить этот массив в отдельном сегменте, и поместить этот
сегмент после сегментов исполняемого кода? Совпадают ли границы сегментов с аппаратными границами FLASH
сегментов микроконтроллера MSP430, то есть могу я стирать сегмент, пользуясь его адресом,
полученным при компиляции или самому надо озаботиться, чтобы этот адрес совпадал с началом аппаратного
FLASH сегмента?
MrYuran
Если вы используете предопределенные сегменты типа .infomem, то просто укажите это при объявлении ваших переменных (лучше структур)

В GCC это __attribute__((section(".infomem"))), в IAR - #pragma section, #pragma location

Если хочется определить собственную секцию, тогда придется лезть в скрипты линкера и лично следить за границами сегментов и разными другими нюансами
JohnKorsh
Добрый день!
Спасибо за ответ.
Вот мой вариант решения, может кому пригодится.

Посмотрел в MAP файле раскладку, нашёл последний сегмент
во Flash, (0xC200 в банке A), жёстко привязал массив к этому адресу
#pragma location = 0xC200
const unsigned char SX1276_Init_Data [128] =
{...};
Убедился по MAP файлу, что массив лёг куда надо, не "задев" никого,
затем воспользовался модулем
\IAR\430\FET_examples\MSP-EXP430F5529\F5xx_F6xx_Core_Lib\HAL_FLASH.C,
поставляемым с IAR, там всё есть для работы с FLASH.

Думаю, есть более изящный способ.
Чего хочется - получить в IDE конечный адрес кода после линковки (псть будет End_Code).
Размер стираемого сегмента в MSP430F5528 512 байт -
автоматически разместить мой массив в конце кода ((End_Code mod 512) + 1) * 512.
Не знаю, как получить конечный адрес кода.

Может есть лучшие решения?
JohnKorsh
Добрый день!
Ещё два вопроса возникли по ходу дела.
Использую MSP430F5528.
Не поскажет ли кто, правильно ли я понял, что
Information Memory как раз и предназначена для
хранения коэффициентов, которые нужно
помнить при отключени питания, в User Guide просто
написано, что она есть, линковщик её не трогает?
Железо пока не готово, поэтому, отлаживаю под
Симулятором. Не сталкивался ли кто с тем,
что блоки FLASH под Симулятором не стираются, как надо?
Для инициализации процесса стирания использовал функцию,
найденную в Example (void Flash_SegmentErase(uint16_t *Flash_ptr)).
В попытках стереть сегмент переписал её не Ассемблере
(пример из User Guide) - нет результата.
При отладке выбранный сегмент не устанавливается в 0xFF,
это результат неверной работы Симулятора, или моё недопонимание?
jcxz
Цитата(JohnKorsh @ Feb 18 2015, 11:50) *
При отладке выбранный сегмент не устанавливается в 0xFF,
это результат неверной работы Симулятора, или моё недопонимание?

Разработку нужно начинать с работы на отладочной плате, а не в симуляторе. Тогда и не будет таких вопросов.
Такой путь - "сперва разрабатываем железо, а потом - пробуем писать ПО под него", как правило приводит к увеличеснию кол-ва циклов переразводки платы.

У меня к примеру InfoA- и InfoB-память стирается при каждой перепрошивке устройства (хотя туда не слинкованы никакие секции). При перезагрузке устройства она не стирается.
Хотя у меня MSP430 из серии 'FR' (с FRAM).
MrYuran
Цитата(JohnKorsh @ Feb 18 2015, 09:50) *
Не поскажет ли кто, правильно ли я понял, что
Information Memory как раз и предназначена для
хранения коэффициентов, которые нужно
помнить при отключени питания, в User Guide просто
написано, что она есть, линковщик её не трогает?

Это обычная флешь, просто сегменты другого размера (1/2, 1/4 от стандартного)
Хотя.. На днях был случай забавный.
Прошивал через BSL плату на f149, забыл включить питание. Но прошилась, на фантомном от программатора.
Основная флешь прошилась, инфо - нет.

Для линкера это тоже совершенно обычный участок флеш-памяти.
Ещё в сегменте А иногда хранятся заводские калибровки внутреннего генератора

Цитата(jcxz @ Feb 19 2015, 07:54) *
У меня к примеру InfoA- и InfoB-память стирается при каждой перепрошивке устройства (хотя туда не слинкованы никакие секции).

mass erase?
можно защитить от стирания инфо сегменты, но это запароленная операция
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.