Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Самопрограммирование из FLASH
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
DAndy_boy
Доброго всем время суток.
Я новичек в данных МК. Есть такая задача. Нужно написать прогу для самопрограммирования FLASH функцией которая находится там же. Т.е. по всей видимости мне следует написать функцию которая будет все время переписываться. Следовательно, необходимо задать ее расположение в определенном месте FLASH памяти. А как это сделать не ясно sad.gif С переменной то нет проблем "@" и все..... А как быть мне? Заранее спасибо за помощь....
dmivs
А вы учли, что перед произвольным перепрограммированием ячейки flash-памяти необходимо стереть весь сектор? 512 байт для основного flash MSP430...
Язык, я предполагаю, Ассемблер? @ есть не только в нем smile.gif

Уточните задачу. Вы хотите сделать самомодифицирующийся код, обновлять firmware, или просто иметь кусок данных в ROM с возможностью его обновления? Гуру помогут smile.gif

Да, и какой пакет используете для программирования? IAR? mspgcc? Самодельный wink.gif ?

Цитата(DAndy_boy @ Jul 3 2006, 18:03) *
Доброго всем время суток.
Я новичек в данных МК. Есть такая задача. Нужно написать прогу для самопрограммирования FLASH функцией которая находится там же. Т.е. по всей видимости мне следует написать функцию которая будет все время переписываться. Следовательно, необходимо задать ее расположение в определенном месте FLASH памяти. А как это сделать не ясно sad.gif С переменной то нет проблем "@" и все..... А как быть мне? Заранее спасибо за помощь....
DAndy_boy
Цитата(dmivs @ Jul 3 2006, 19:57) *
Уточните задачу. Вы хотите сделать самомодифицирующийся код, обновлять firmware, или просто иметь кусок данных в ROM с возможностью его обновления? Гуру помогут smile.gif

Да, и какой пакет используете для программирования? IAR? mspgcc? Самодельный wink.gif ?

Ой! прошу прощения.... я пишу на Си в IAR... Начальство так требует.... Ситуация там такая: необходимо написать код для уже существующего устройства, но с возможностью обновления части рабочего кода по UART. Т.е в main() есть некая функция которая при определенной команде по UART перезаписывает другую функцию... А на счет сегмента.. ну что же... значит придется очистить этот сегмент... Только как тогда сделать чтобы туда занести первоначальную функцию?...т.е. ту которую я в IAR напишу...
rezident
Для того чтобы обновлять какую-то функцию, не затрагивая остальной код, для нее нужно выделить отдельный сегмент и поместить ее именно в этот сегмент.
Сегмент выделяете в xcl-файле. Пускай он называется my_segment.
Функцию объявляейте как
Код
void func_modifiable(void) @ my_segment
{
...
}

Вроде ничего не напутал.
diper
my_segment в кавычки
Код
void func_modifiable(void) @ "my_segment"
Начало и размер сегмента должны быть кратны страницам флешь.
Не забыть выкусить из сегмента CODE занятый диапазон, чтобы линкер не засунул туда чтонить , что нельзя затирать.
Код
-Z(CODE)CSTART=1100-FFDF
-Z(CODE)CODE=1100-4FFF,6000-FFDF
-Z(CODE)my_segment=5000-5FFF

Манул рулит 430\doc\EW430_CompilerReference.pdf
раздел "Controlling data and function placement in memory"
DAndy_boy
diper и rezident, большое СПАСИБО! w00t.gif biggrin.gif пошел бороться с прогой дальше! дааа.... это не светодиоды вам по очереди зажигать))))
DAndy_boy
Господа, а у меня появился еще вопросик:
при стирании сегмента, какой адрес нужно указывать?
Вот нашел примерчик:
/***********************************************************************/
/* Flash_clr */
/* Стирание 1 сегмента Flash памяти */
/***********************************************************************/
void Flash_clr( int *Data_ptr )
{
FCTL3 = 0x0A500; /* Lock = 0 */
FCTL1 = 0x0A502; /* ERASE = 1 */
*Data_ptr=0; /* стирание сегмента Flash памяти */
FCTL1 = 0x0A500; /* ERASE = 0 */
FCTL3 = 0x0A510; /* Lock = 1 */
}

что за адрес нужно туда подавать? Адрес начала сегмента или достаточно того что бы он попадал в этот сегмент? К сожалению, в IAR это нельзя даже проверить.... поскольку он не эмулирует полностью настоящую железку sad.gif
rezident
Цитата(DAndy_boy @ Jul 6 2006, 22:36) *
что за адрес нужно туда подавать? Адрес начала сегмента или достаточно того что бы он попадал в этот сегмент? К сожалению, в IAR это нельзя даже проверить.... поскольку он не эмулирует полностью настоящую железку sad.gif

Любой адрес байта/слова, попадающий в адресное пространство стираемого сегмента. Лучше адрес слова указывать.
DAndy_boy
Отлично.... большое опять таки СПАСибо smile.gif
DAndy_boy
граждане.. а вот еще вопрос, как можно вызвать функцию зная только ее адрес в FLASH? Вот например, программа записала по определенному адресу FLASH функцию.... сохранила адрес начала этой функции, а как теперь мне ее вызвать?
rezident
Цитата(DAndy_boy @ Jul 7 2006, 21:43) *
граждане.. а вот еще вопрос, как можно вызвать функцию зная только ее адрес в FLASH? Вот например, программа записала по определенному адресу FLASH функцию.... сохранила адрес начала этой функции, а как теперь мне ее вызвать?

Аналогично как для программного сброса.
Цитата
Я в MSP делаю не так, резетаюсь напрямую

( *( void( ** )()) 0xfffe )(); // "мягкая" перезагрузка


Переход по вектору, указывающему на начало кода Отправлено VAI (12.05.2006 07:27)

http://www.caxapa.ru/mcu/wwwboard.html?id=58487
DAndy_boy
хм.... что-то не получается sad.gif
в настройках указал:
Код
-Z(CODE)application_segment=F400-F6ff // Segment 4


функцию написал:

Код
void StartApplic(void)@ "application_segment"
{
    int t=0,d;
d=t+1;
t=d*10;
return;
}

и вызов

Код
void main()
{
...
   (*( void(**)()) 0xf400 )();
}


а он подлец, ошибку выдает.... Или я что неправильно делаю?
DAndy_boy
Ой! виноват!
Доперло до меня))) в команде (*( void(**)()) ADRESS)(); надо указывать не адрес функции, а адрес ячейки с адресом функции.... Вот ведь как)))
VAI
Код
Вызов функции по прямому адресу
  (*( void( * )()) 0x1000 )();
По вектору (адресу, содержащему адрес по которому надо перейти)

  ( *( void( ** )()) 0xfffe )();
или
  ( *(func_ptr *) 0xfffe )();
DAndy_boy
smile.gif спасибо!
DAndy_boy
Господа, а у меня еще вопрос. Как программа может узнать в каком МК он находится? В описании к MSP430 написано, что идентификатор чипа лежит по адресу 0FF0-0FFF - но когда я в компиляторе смотрю содержимое по этому адресу, то там ничего нет.... Или это только в компиляторе так, а в реальной железке все будет ок?
diper
Цитата(DAndy_boy @ Jul 10 2006, 11:35) *
...но когда я в компиляторе...
Наверно все же в симуляторе? На Симулятор не надейся - фиговенький он...
В железке эта область будет ибо ROM.
DAndy_boy
smile.gif благодарю!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.