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

 
 
 
Reply to this topicStart new topic
> настройка проекта в ИАР 5.20, размещение функции во флеш секторе
buba
сообщение Oct 9 2009, 09:00
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 24-07-07
Из: Ташкент
Пользователь №: 29 326



Привет всем!

Работаю с LPC2468. Есть проблемка. Студия не хочет определять функцию main в неперезаписываемую область памяти (сектор) BOOTSEG, которую я определяю в файле .icf. Размещение в BOOTSEG связано с поддержкой IAP, которое не могу запустить. Так сделано, что IAP обработчик и основная программа запускаются из ф-ции main.
Код прилагается:

- <main.c>
//---------------------------------------------------------------------
__thumb __interwork main() @ "BOOTSEG";

//---------------------------------------------------------------------
// Non-rewritable Main function
//---------------------------------------------------------------------
__thumb __interwork main() @ "BOOTSEG"
{
if ( /* Program in LPC flash is correct */)
{ //start rewritable part of program
RW_main();
}
else
{ //start iap routines
IAP_ReLoad();
IAP_Restart();
}
}
//---------------------------------------------------------------------

- <lpc2468.icf>
//---------------------------------------------------------------------
...
define region ROM1_region = mem: [from __ICFEDIT_region_ROM_start__ to 0x00003FFF];
define region ROM2_region = mem: [from 0x00004000 to __ICFEDIT_region_ROM_end__];
...
place in ROM1_region { readonly section .difunct, section .cstart, section BOOTSEG };
place in ROM2_region { readonly };
//---------------------------------------------------------------------

- <lpc2468_project.map>
//---------------------------------------------------------------------
...
**************************************************
*** ENTRY LIST
***

Entry Address Size Type Object
----- ------- ---- ---- ------
?main 0x00011610 Code Gb cmain.o [4]
...
__iar_via_R0 0x00012045 Code Wk boot_segment.o [1]
__iar_via_R2 0x0001204d Code Wk boot_segment.o [1]
__iar_via_R3 0x00012051 Code Wk boot_segment.o [1]
__iar_via_R5 0x00012049 Code Wk boot_segment.o [1]
//---------------------------------------------------------------------


Необходимо, чтобы ф-ия main вставала между адресами 0x00001000 и 0x00004000.
Ф-ии __iar_via_Rn определяют iap-процедуры при вызове iap_entry( iap_command, iap_result );. Они тоже попадают в перезаписываемую часть памяти, хотя процедуры IAP_ReLoad() и другие определены в памяти BOOTSEG.

Подскажите, в чём дело?
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Oct 9 2009, 09:52
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



c 5.xx версий @ "BOOTSEG" помоему не катит

используйте
Код
#pragma section="NAME" [align]
Go to the top of the page
 
+Quote Post
buba
сообщение Oct 9 2009, 12:29
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 24-07-07
Из: Ташкент
Пользователь №: 29 326



Цитата(MALLOY2 @ Oct 9 2009, 14:52) *
c 5.xx версий @ "BOOTSEG" помоему не катит


Дело не в этом. Это про константы:

There are major changes in the EWARM between version 4.x and version 5.x.
Absolute placement of constants are no longer allowed:
int const a @ 102030;

По хорошему мне нужен пример кода, где используется IAP.
Дело в том, что я перешел с ИАР 4.10 на 5.20. В студии 4.10 всё было ок, IAP работал.
Перешёл на 5.20, подправил проект, заработало. Стал проверять IAP, и вот застрял!

При стирании областей во флеш, стираются нужные процедуры, которые я хочу разместить в BOOTSEG. Как это сделать - пока не знаю.
Go to the top of the page
 
+Quote Post
KRS
сообщение Oct 9 2009, 13:18
Сообщение #4


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



из этой строчки
place in ROM1_region { readonly section .difunct, section .cstart, section BOOTSEG };
надо readonly убрать!
Go to the top of the page
 
+Quote Post
buba
сообщение Oct 11 2009, 17:16
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 24-07-07
Из: Ташкент
Пользователь №: 29 326



Цитата(KRS @ Oct 9 2009, 18:18) *
из этой строчки
place in ROM1_region { readonly section .difunct, section .cstart, section BOOTSEG };
надо readonly убрать!


Попробовал smile.gif Не помогло. Но решение найдено!
Во-первых ошибся со строчкой в .map файле:

> Entry Address Size Type Object
> ----- ------- ---- ---- ------
> ?main 0x00011610 Code Gb cmain.o [4]

думал, что "?main" и была моя функция. Однако, была ещё одна строчка:

> main 0x00001e39 0xd8 Code Gb main.o [1]. wacko.gif

Во-вторых, что касается строчек:
> __iar_via_R0 0x00012045 Code Wk boot_segment.o [1]
> __iar_via_R2 0x0001204d Code Wk boot_segment.o [1]
> __iar_via_R3 0x00012051 Code Wk boot_segment.o [1]
> __iar_via_R5 0x00012049 Code Wk boot_segment.o [1]

То эти вектора или функции, не знаю как их назвать, действительно располагались в перезаписываемой флеш. Они относятся к функции iap_entry (command, result);. Вызов iap_entry происходил из тех процедур, которые я определил в BOOTSEG(неперезаписываемая область). Несмотря на это после стирания флеш, я уже не мог осуществить проверку стирания или запись (см. Chapter 30: LPC24XX Flash memory programming firmware), так как __iar_via_Rn были уже затёрты! Проблема была в размещении
__iar_via_Rn.
Что сделал? Попробовал определять не функции в конкретный сектор, а целый файл в нужную область (см. http://supp.iar.com/Support/?note=27498&am...=search+result). В итоге:
> __iar_via_R0 0x00001fa9 Code Wk boot_segment.o [1]
> __iar_via_R2 0x00001fb1 Code Wk boot_segment.o [1]
> __iar_via_R3 0x00001fb5 Code Wk boot_segment.o [1]
> __iar_via_R5 0x00001fad Code Wk boot_segment.o [1]

Thks to KRS & to MALLOY2.
Go to the top of the page
 
+Quote Post

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

 


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


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