JohnKorsh 1 16 февраля, 2015 Опубликовано 16 февраля, 2015 · Жалоба Пишу для MSP430. Мне необходимо разместить во FLASH массив, который будет програмно переписываться. Как мне объяснить линковщику, что я хочу разместить этот массив в отдельном сегменте, и поместить этот сегмент после сегментов исполняемого кода? Совпадают ли границы сегментов с аппаратными границами FLASH сегментов микроконтроллера MSP430, то есть могу я стирать сегмент, пользуясь его адресом, полученным при компиляции или самому надо озаботиться, чтобы этот адрес совпадал с началом аппаратного FLASH сегмента? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 17 февраля, 2015 Опубликовано 17 февраля, 2015 · Жалоба Если вы используете предопределенные сегменты типа .infomem, то просто укажите это при объявлении ваших переменных (лучше структур) В GCC это __attribute__((section(".infomem"))), в IAR - #pragma section, #pragma location Если хочется определить собственную секцию, тогда придется лезть в скрипты линкера и лично следить за границами сегментов и разными другими нюансами Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
JohnKorsh 1 17 февраля, 2015 Опубликовано 17 февраля, 2015 · Жалоба Добрый день! Спасибо за ответ. Вот мой вариант решения, может кому пригодится. Посмотрел в 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 1 18 февраля, 2015 Опубликовано 18 февраля, 2015 · Жалоба Добрый день! Ещё два вопроса возникли по ходу дела. Использую MSP430F5528. Не поскажет ли кто, правильно ли я понял, что Information Memory как раз и предназначена для хранения коэффициентов, которые нужно помнить при отключени питания, в User Guide просто написано, что она есть, линковщик её не трогает? Железо пока не готово, поэтому, отлаживаю под Симулятором. Не сталкивался ли кто с тем, что блоки FLASH под Симулятором не стираются, как надо? Для инициализации процесса стирания использовал функцию, найденную в Example (void Flash_SegmentErase(uint16_t *Flash_ptr)). В попытках стереть сегмент переписал её не Ассемблере (пример из User Guide) - нет результата. При отладке выбранный сегмент не устанавливается в 0xFF, это результат неверной работы Симулятора, или моё недопонимание? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 19 февраля, 2015 Опубликовано 19 февраля, 2015 · Жалоба При отладке выбранный сегмент не устанавливается в 0xFF, это результат неверной работы Симулятора, или моё недопонимание? Разработку нужно начинать с работы на отладочной плате, а не в симуляторе. Тогда и не будет таких вопросов. Такой путь - "сперва разрабатываем железо, а потом - пробуем писать ПО под него", как правило приводит к увеличеснию кол-ва циклов переразводки платы. У меня к примеру InfoA- и InfoB-память стирается при каждой перепрошивке устройства (хотя туда не слинкованы никакие секции). При перезагрузке устройства она не стирается. Хотя у меня MSP430 из серии 'FR' (с FRAM). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 19 февраля, 2015 Опубликовано 19 февраля, 2015 · Жалоба Не поскажет ли кто, правильно ли я понял, что Information Memory как раз и предназначена для хранения коэффициентов, которые нужно помнить при отключени питания, в User Guide просто написано, что она есть, линковщик её не трогает? Это обычная флешь, просто сегменты другого размера (1/2, 1/4 от стандартного) Хотя.. На днях был случай забавный. Прошивал через BSL плату на f149, забыл включить питание. Но прошилась, на фантомном от программатора. Основная флешь прошилась, инфо - нет. Для линкера это тоже совершенно обычный участок флеш-памяти. Ещё в сегменте А иногда хранятся заводские калибровки внутреннего генератора У меня к примеру InfoA- и InfoB-память стирается при каждой перепрошивке устройства (хотя туда не слинкованы никакие секции). mass erase? можно защитить от стирания инфо сегменты, но это запароленная операция Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться