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

 
 
 
Reply to this topicStart new topic
> MSP430. Размещение массива в FLASH., ВОпросы по размещению данных в FLASH.
JohnKorsh
сообщение Feb 16 2015, 12:14
Сообщение #1


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

Группа: Свой
Сообщений: 182
Регистрация: 6-01-05
Из: Россия, Москва
Пользователь №: 1 820



Пишу для MSP430. Мне необходимо разместить во FLASH массив, который будет програмно переписываться.
Как мне объяснить линковщику, что я хочу разместить этот массив в отдельном сегменте, и поместить этот
сегмент после сегментов исполняемого кода? Совпадают ли границы сегментов с аппаратными границами FLASH
сегментов микроконтроллера MSP430, то есть могу я стирать сегмент, пользуясь его адресом,
полученным при компиляции или самому надо озаботиться, чтобы этот адрес совпадал с началом аппаратного
FLASH сегмента?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 17 2015, 07:12
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

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

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
JohnKorsh
сообщение Feb 17 2015, 10:18
Сообщение #3


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

Группа: Свой
Сообщений: 182
Регистрация: 6-01-05
Из: Россия, Москва
Пользователь №: 1 820



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

Посмотрел в 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.
Не знаю, как получить конечный адрес кода.

Может есть лучшие решения?
Go to the top of the page
 
+Quote Post
JohnKorsh
сообщение Feb 18 2015, 05:50
Сообщение #4


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

Группа: Свой
Сообщений: 182
Регистрация: 6-01-05
Из: Россия, Москва
Пользователь №: 1 820



Добрый день!
Ещё два вопроса возникли по ходу дела.
Использую MSP430F5528.
Не поскажет ли кто, правильно ли я понял, что
Information Memory как раз и предназначена для
хранения коэффициентов, которые нужно
помнить при отключени питания, в User Guide просто
написано, что она есть, линковщик её не трогает?
Железо пока не готово, поэтому, отлаживаю под
Симулятором. Не сталкивался ли кто с тем,
что блоки FLASH под Симулятором не стираются, как надо?
Для инициализации процесса стирания использовал функцию,
найденную в Example (void Flash_SegmentErase(uint16_t *Flash_ptr)).
В попытках стереть сегмент переписал её не Ассемблере
(пример из User Guide) - нет результата.
При отладке выбранный сегмент не устанавливается в 0xFF,
это результат неверной работы Симулятора, или моё недопонимание?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 19 2015, 03:54
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(JohnKorsh @ Feb 18 2015, 11:50) *
При отладке выбранный сегмент не устанавливается в 0xFF,
это результат неверной работы Симулятора, или моё недопонимание?

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

У меня к примеру InfoA- и InfoB-память стирается при каждой перепрошивке устройства (хотя туда не слинкованы никакие секции). При перезагрузке устройства она не стирается.
Хотя у меня MSP430 из серии 'FR' (с FRAM).
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 19 2015, 08:10
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(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?
можно защитить от стирания инфо сегменты, но это запароленная операция


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

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

 


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


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