|
Самопрограммирование из FLASH, и все что с ним связано... |
|
|
|
Jul 3 2006, 15:03
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922

|
Доброго всем время суток. Я новичек в данных МК. Есть такая задача. Нужно написать прогу для самопрограммирования FLASH функцией которая находится там же. Т.е. по всей видимости мне следует написать функцию которая будет все время переписываться. Следовательно, необходимо задать ее расположение в определенном месте FLASH памяти. А как это сделать не ясно  С переменной то нет проблем "@" и все..... А как быть мне? Заранее спасибо за помощь....
|
|
|
|
|
Jul 3 2006, 15:57
|

Частый гость
 
Группа: Свой
Сообщений: 101
Регистрация: 7-09-05
Из: Riga, LV
Пользователь №: 8 333

|
А вы учли, что перед произвольным перепрограммированием ячейки flash-памяти необходимо стереть весь сектор? 512 байт для основного flash MSP430... Язык, я предполагаю, Ассемблер? @ есть не только в нем  Уточните задачу. Вы хотите сделать самомодифицирующийся код, обновлять firmware, или просто иметь кусок данных в ROM с возможностью его обновления? Гуру помогут  Да, и какой пакет используете для программирования? IAR? mspgcc? Самодельный  ? Цитата(DAndy_boy @ Jul 3 2006, 18:03)  Доброго всем время суток. Я новичек в данных МК. Есть такая задача. Нужно написать прогу для самопрограммирования FLASH функцией которая находится там же. Т.е. по всей видимости мне следует написать функцию которая будет все время переписываться. Следовательно, необходимо задать ее расположение в определенном месте FLASH памяти. А как это сделать не ясно  С переменной то нет проблем "@" и все..... А как быть мне? Заранее спасибо за помощь....
--------------------
|
|
|
|
|
Jul 3 2006, 16:11
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922

|
Цитата(dmivs @ Jul 3 2006, 19:57)  Уточните задачу. Вы хотите сделать самомодифицирующийся код, обновлять firmware, или просто иметь кусок данных в ROM с возможностью его обновления? Гуру помогут  Да, и какой пакет используете для программирования? IAR? mspgcc? Самодельный  ? Ой! прошу прощения.... я пишу на Си в IAR... Начальство так требует.... Ситуация там такая: необходимо написать код для уже существующего устройства, но с возможностью обновления части рабочего кода по UART. Т.е в main() есть некая функция которая при определенной команде по UART перезаписывает другую функцию... А на счет сегмента.. ну что же... значит придется очистить этот сегмент... Только как тогда сделать чтобы туда занести первоначальную функцию?...т.е. ту которую я в IAR напишу...
Сообщение отредактировал DAndy_boy - Jul 3 2006, 16:12
|
|
|
|
|
Jul 3 2006, 18:54
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Для того чтобы обновлять какую-то функцию, не затрагивая остальной код, для нее нужно выделить отдельный сегмент и поместить ее именно в этот сегмент. Сегмент выделяете в xcl-файле. Пускай он называется my_segment. Функцию объявляейте как Код void func_modifiable(void) @ my_segment { ... } Вроде ничего не напутал.
|
|
|
|
|
Jul 3 2006, 19:11
|
Частый гость
 
Группа: Свой
Сообщений: 94
Регистрация: 12-11-05
Из: Росиия, Нижний Новгород
Пользователь №: 10 750

|
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"
|
|
|
|
|
Jul 6 2006, 16:36
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922

|
Господа, а у меня появился еще вопросик: при стирании сегмента, какой адрес нужно указывать? Вот нашел примерчик: /***********************************************************************/ /* 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 это нельзя даже проверить.... поскольку он не эмулирует полностью настоящую железку
|
|
|
|
|
Jul 7 2006, 16:14
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922

|
хм.... что-то не получается  в настройках указал: Код -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 )(); } а он подлец, ошибку выдает.... Или я что неправильно делаю?
|
|
|
|
|
Jul 10 2006, 10:14
|
Частый гость
 
Группа: Свой
Сообщений: 94
Регистрация: 12-11-05
Из: Росиия, Нижний Новгород
Пользователь №: 10 750

|
Цитата(DAndy_boy @ Jul 10 2006, 11:35)  ...но когда я в компиляторе... Наверно все же в симуляторе? На Симулятор не надейся - фиговенький он... В железке эта область будет ибо ROM.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|