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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Самопрограммирование из FLASH, и все что с ним связано...
DAndy_boy
сообщение Jul 3 2006, 15:03
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



Доброго всем время суток.
Я новичек в данных МК. Есть такая задача. Нужно написать прогу для самопрограммирования FLASH функцией которая находится там же. Т.е. по всей видимости мне следует написать функцию которая будет все время переписываться. Следовательно, необходимо задать ее расположение в определенном месте FLASH памяти. А как это сделать не ясно sad.gif С переменной то нет проблем "@" и все..... А как быть мне? Заранее спасибо за помощь....
Go to the top of the page
 
+Quote Post
dmivs
сообщение Jul 3 2006, 15:57
Сообщение #2


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

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



А вы учли, что перед произвольным перепрограммированием ячейки 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 С переменной то нет проблем "@" и все..... А как быть мне? Заранее спасибо за помощь....


--------------------
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Jul 3 2006, 16:11
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



Цитата(dmivs @ Jul 3 2006, 19:57) *
Уточните задачу. Вы хотите сделать самомодифицирующийся код, обновлять firmware, или просто иметь кусок данных в ROM с возможностью его обновления? Гуру помогут smile.gif

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

Ой! прошу прощения.... я пишу на Си в IAR... Начальство так требует.... Ситуация там такая: необходимо написать код для уже существующего устройства, но с возможностью обновления части рабочего кода по UART. Т.е в main() есть некая функция которая при определенной команде по UART перезаписывает другую функцию... А на счет сегмента.. ну что же... значит придется очистить этот сегмент... Только как тогда сделать чтобы туда занести первоначальную функцию?...т.е. ту которую я в IAR напишу...

Сообщение отредактировал DAndy_boy - Jul 3 2006, 16:12
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 3 2006, 18:54
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Для того чтобы обновлять какую-то функцию, не затрагивая остальной код, для нее нужно выделить отдельный сегмент и поместить ее именно в этот сегмент.
Сегмент выделяете в xcl-файле. Пускай он называется my_segment.
Функцию объявляейте как
Код
void func_modifiable(void) @ my_segment
{
...
}

Вроде ничего не напутал.
Go to the top of the page
 
+Quote Post
diper
сообщение Jul 3 2006, 19:11
Сообщение #5


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

Группа: Свой
Сообщений: 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"
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Jul 3 2006, 20:49
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



diper и rezident, большое СПАСИБО! w00t.gif biggrin.gif пошел бороться с прогой дальше! дааа.... это не светодиоды вам по очереди зажигать))))

Сообщение отредактировал DAndy_boy - Jul 3 2006, 20:49
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Jul 6 2006, 16:36
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 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 это нельзя даже проверить.... поскольку он не эмулирует полностью настоящую железку sad.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 6 2006, 16:39
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Любой адрес байта/слова, попадающий в адресное пространство стираемого сегмента. Лучше адрес слова указывать.
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Jul 6 2006, 17:07
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



Отлично.... большое опять таки СПАСибо smile.gif
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Jul 7 2006, 15:43
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



граждане.. а вот еще вопрос, как можно вызвать функцию зная только ее адрес в FLASH? Вот например, программа записала по определенному адресу FLASH функцию.... сохранила адрес начала этой функции, а как теперь мне ее вызвать?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 7 2006, 15:51
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(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
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Jul 7 2006, 16:14
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



хм.... что-то не получается 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 )();
}


а он подлец, ошибку выдает.... Или я что неправильно делаю?
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Jul 7 2006, 16:54
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



Ой! виноват!
Доперло до меня))) в команде (*( void(**)()) ADRESS)(); надо указывать не адрес функции, а адрес ячейки с адресом функции.... Вот ведь как)))
Go to the top of the page
 
+Quote Post
VAI
сообщение Jul 8 2006, 05:24
Сообщение #14


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Код
Вызов функции по прямому адресу
  (*( void( * )()) 0x1000 )();
По вектору (адресу, содержащему адрес по которому надо перейти)

  ( *( void( ** )()) 0xfffe )();
или
  ( *(func_ptr *) 0xfffe )();


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Jul 9 2006, 20:57
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



smile.gif спасибо!
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Jul 10 2006, 07:35
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



Господа, а у меня еще вопрос. Как программа может узнать в каком МК он находится? В описании к MSP430 написано, что идентификатор чипа лежит по адресу 0FF0-0FFF - но когда я в компиляторе смотрю содержимое по этому адресу, то там ничего нет.... Или это только в компиляторе так, а в реальной железке все будет ок?
Go to the top of the page
 
+Quote Post
diper
сообщение Jul 10 2006, 10:14
Сообщение #17


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

Группа: Свой
Сообщений: 94
Регистрация: 12-11-05
Из: Росиия, Нижний Новгород
Пользователь №: 10 750



Цитата(DAndy_boy @ Jul 10 2006, 11:35) *
...но когда я в компиляторе...
Наверно все же в симуляторе? На Симулятор не надейся - фиговенький он...
В железке эта область будет ибо ROM.
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Jul 10 2006, 10:32
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



smile.gif благодарю!
Go to the top of the page
 
+Quote Post

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

 


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


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