Перейти к содержанию
    

MSP430. Размещение массива в FLASH.

Пишу для MSP430. Мне необходимо разместить во FLASH массив, который будет програмно переписываться.

Как мне объяснить линковщику, что я хочу разместить этот массив в отдельном сегменте, и поместить этот

сегмент после сегментов исполняемого кода? Совпадают ли границы сегментов с аппаратными границами FLASH

сегментов микроконтроллера MSP430, то есть могу я стирать сегмент, пользуясь его адресом,

полученным при компиляции или самому надо озаботиться, чтобы этот адрес совпадал с началом аппаратного

FLASH сегмента?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вы используете предопределенные сегменты типа .infomem, то просто укажите это при объявлении ваших переменных (лучше структур)

 

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

 

Если хочется определить собственную секцию, тогда придется лезть в скрипты линкера и лично следить за границами сегментов и разными другими нюансами

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день!

Спасибо за ответ.

Вот мой вариант решения, может кому пригодится.

 

Посмотрел в 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.

Не знаю, как получить конечный адрес кода.

 

Может есть лучшие решения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день!

Ещё два вопроса возникли по ходу дела.

Использую MSP430F5528.

Не поскажет ли кто, правильно ли я понял, что

Information Memory как раз и предназначена для

хранения коэффициентов, которые нужно

помнить при отключени питания, в User Guide просто

написано, что она есть, линковщик её не трогает?

Железо пока не готово, поэтому, отлаживаю под

Симулятором. Не сталкивался ли кто с тем,

что блоки FLASH под Симулятором не стираются, как надо?

Для инициализации процесса стирания использовал функцию,

найденную в Example (void Flash_SegmentErase(uint16_t *Flash_ptr)).

В попытках стереть сегмент переписал её не Ассемблере

(пример из User Guide) - нет результата.

При отладке выбранный сегмент не устанавливается в 0xFF,

это результат неверной работы Симулятора, или моё недопонимание?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При отладке выбранный сегмент не устанавливается в 0xFF,

это результат неверной работы Симулятора, или моё недопонимание?

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

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

 

У меня к примеру InfoA- и InfoB-память стирается при каждой перепрошивке устройства (хотя туда не слинкованы никакие секции). При перезагрузке устройства она не стирается.

Хотя у меня MSP430 из серии 'FR' (с FRAM).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не поскажет ли кто, правильно ли я понял, что

Information Memory как раз и предназначена для

хранения коэффициентов, которые нужно

помнить при отключени питания, в User Guide просто

написано, что она есть, линковщик её не трогает?

Это обычная флешь, просто сегменты другого размера (1/2, 1/4 от стандартного)

Хотя.. На днях был случай забавный.

Прошивал через BSL плату на f149, забыл включить питание. Но прошилась, на фантомном от программатора.

Основная флешь прошилась, инфо - нет.

 

Для линкера это тоже совершенно обычный участок флеш-памяти.

Ещё в сегменте А иногда хранятся заводские калибровки внутреннего генератора

 

У меня к примеру InfoA- и InfoB-память стирается при каждой перепрошивке устройства (хотя туда не слинкованы никакие секции).

mass erase?

можно защитить от стирания инфо сегменты, но это запароленная операция

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...