Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перенос EFSL на IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
e-tarasov
Вчера сел переносить efsl с gcc на iar
потребность возникла по следующим причинам:
1. Куплена отладочная плата с внутрисхемным эмулятором J-LINK под iar
2. Под IAR больше рабочих примеров
3. Лекарство под RDI так и не было найдено (не очень то и хотелось)
4. Кроме efsl планируется ввести в проект еще кучу всего разного
5. С UCFS разобраться как я понял гораздо сложнее
Скачал EFSL для AT91SAM7S64 http://www.siwawi.arubi.uni-kl.de/avr_proj...0404_public.zip
Ну так вот в принципе все файлы легли кроме
двух:

interrupt_utils.h
interrupt_utils.c

ну и как следствие:

systime.c

Как я понял причина в различной интерпретации ассемблерного
кода и макросов двумя компиляторами (если не прав поправьте меня)

Так в файле interrupt_utils.h присутствует следующая строка:

#define ISR_ENTRY() asm volatile(" sub lr, lr,#4\n" \
" stmfd sp!,{r0-r12,lr}\n" \
" mrs r1, spsr\n" \
" stmfd sp!,{r1}")

После которой компилятор затыкается
Исправление ее к виду :

#define ISR_ENTRY() asm (" sub lr, lr,#4\n" " stmfd sp!,{r0-r12,lr}\n" " mrs r1, spsr\n" " stmfd sp!,{r1}\n")

Изменяет вид ошибки но не исправляет ситуацию

Там же присутствует строка:

#define NACKEDFUNC __attribute__((naked))

Которая так же не проходит в systime.c

В interrupt_utils.c есть строка?

asm volatile (" mrs %0, cpsr" : "=r" (retval) : /* no inputs */ );

Может я чего то не понимаю Может перенести просто невозможно
В ассемблере я не специалист как впрочем и в С
Если не трудно помогите перевести в IAR
Спасибо!!!
Сергей Борщ
Цитата(e-tarasov @ Jun 21 2006, 09:12) *
Вчера сел переносить efsl с gcc на iar
Так в файле interrupt_utils.h присутствует следующая строка:

#define ISR_ENTRY() asm volatile(" sub lr, lr,#4\n" \
" stmfd sp!,{r0-r12,lr}\n" \
" mrs r1, spsr\n" \
" stmfd sp!,{r1}")

Там же присутствует строка:

#define NACKEDFUNC __attribute__((naked))

В interrupt_utils.c есть строка?

asm volatile (" mrs %0, cpsr" : "=r" (retval) : /* no inputs */ );
Если не трудно помогите перевести в IAR
Спасибо!!!

Просто в лоб это перевести не получится - у ИАРа нет возможности в С подавить сохранение контекста (нет аналога __naked__) Поэтому придется делать "обертку" в отдельном asm-файле.
Что-то типа такого:
Код
wrapper.s79:

        RSEG ICODE:CODE
        CODE32

        EXTERN Handler_body
        PUBLIC Handler

; Wrapper for the interrupt service routinewrapper.

Handler:
    sub   lr, lr,#4
    stmfd sp!,{r0-r12,lr}
    mrs   r1, spsr
    stmfd sp!,{r1}
    bl    Handler_body    ; Call the ISR routine.

         И здесь какой-то завершающий код,, обратный ISR_ENTRY()

    END

соответственно обработчик на с объявить как __arm void HandlerBody(void)

но что-то мне подсказывает, что все будет гораздо проще и достаточно будет объявить обработчик как __irq __arm Handler() или __nested __irq __arm Handler(). Если других советов не будет - постараюсь ближе к вечеру скачать исходники и глянуть.
beer_warrior
Цитата
но что-то мне подсказывает, что все будет гораздо проще и достаточно будет объявить обработчик как __irq __arm Handler() или __nested __irq __arm Handler()

Согласен.
Это ботва с nested нужна для того, что бы обходть проблему со входом в прерывания в gcc.
С 95% вероятностью __irq __arm Handler() и есть заменитель
sub lr, lr,#4
stmfd sp!,{r0-r12,lr}
mrs r1, spsr
stmfd sp!,{r1}
...
e-tarasov
__irq __arm Handler() вроде бы прокатило нет возможномти проверить а вот что делать вот с этим


static inline unsigned __get_cpsr(void)
{
unsigned long retval;
asm (" mrs %0, cpsr" : "=r" (retval): /* no inputs */ );
//volatile
return retval;
}

Я так понял результат функция возвращает через стек
IAR исходник не глотает не подскажите
Что означает :
и что делать с retval
Спасибо
beer_warrior
Я думаю что-то наподобие
Код
static inline unsigned __get_cpsr(void)
{
unsigned long retval;
asm ("mrs retval, cpsr");
return retval;
}

Уточните как там в асм передаются переменные.
Может нужен подчерк перед именем.
А впрочем зачем вам эта функция? Это же используется для сохранения контекста и скорее всего сгенериться само при вызове завершении функции.
e-tarasov
Не хочет передавать
В справке ничего не написано
Похоже что никак а в С его передать нельзя?
beer_warrior
Цитата
Не хочет передавать
В справке ничего не написано
Похоже что никак а в С его передать нельзя?

А как ругается? Какая ошибка?

ЗЫ Может не стоит уходить с gcc?
Там на каждый пук компилятора, объемная справка smile.gif
SlavaCh
Совершенно случайно передо мной поставили аналогичную задачу - к рабочему проекту на ИАРе подключить EFSL. На ГСС остаться не получиться...
2e-tarasov - может объединим усилия? а то я тоже не совсем копенгаген в гсс ....

пока стараюсь запустить в иаре исходники esfl

Вопрос(может глупый) - а в ИАРе файлы Startup нужно подключать из исходников библиотеки ESFL или можно воспользоваться тем что есть в примерах от атмела?
И вообще как ИАР находит место, откуда надо компилировать проект? Ведь явно нигде имя CStartup не указывается. А в этом модуле - начало программы, с 0го адреса.
SlavaCh
2 e-tarasov:
функции __set_cpsr(unsigned long)
и unsigned long __get_cpsr(void)
есть в иаре!!
надо подключить intrinsic.h
e-tarasov
Спасибо за функции честно говоря не догадался поискать.
Цитата
И вообще как ИАР находит место, откуда надо компилировать проект? Ведь явно нигде имя CStartup не указывается. А в этом модуле - начало программы, с 0го адреса.

Во вкладке Debugger сеавится галочка main
Это для того чтобы компиляция начиналась с main
Далее во вкладке плагины есть такой Ctack который указывает на
CStartup
SlavaCh
1 По моему галочка main говорит чтобы дебаггер при запуске выполнил весь код и остановился на main. Или не так?

2 Чего-то не нашел я Ctack в плагинах (если имеется ввиду планины вкладки дебаггера).

А у вас получилось исправить эти дефайны
#define ISR_ENTRY() asm (" sub lr, lr,#4\n"
" stmfd sp!,{r0-r12,lr}\n"
" mrs r1, spsr\n"
" stmfd sp!,{r1}");

а то ИАР ругается. (Error[Pe169]: expected a declaration - на второй строчке )

И вы писали "__irq __arm Handler() вроде бы прокатило"
это имеется ввиду вместо void NACKEDFUNC ATTR systime_isr(void) { ?
Я заменил NACKEDFUNC ATTR на __irq __arm но ошибка остается -
(Error[Pa002]: the type attribute "__arm" is not allowed on this declaration )

объясните плиз.
e-tarasov
Цитата
1 По моему галочка main говорит чтобы дебаггер при запуске выполнил весь код и остановился на main. Или не так?

Да извините напортачил.
Цитата
2 Чего-то не нашел я Ctack в плагинах (если имеется ввиду планины вкладки дебаггера).

У меня версия IAR 4.31 видимо у вас другая иплагин по другому обзавается

Насчет дефайнов
Вместо systime_isr(void)
я объявил функцию __irq __arm void irqHandler(void){
с тем же телом кроме ISR_ENTRY() и ISR_EXIT()
а дальше по тексту в одном месте
заменил systime_isr( на irqHandler(
я так понял это обработчик прерываний
Проверить не могу потому что:
1. пока проц почему то не прошивается
2. не собрана схема с карточкой
Честно говоря меня берут смутные сомнения по
поводу успеха этого мероприятия
Сергей Борщ
Цитата(e-tarasov @ Jun 22 2006, 11:13) *
Насчет дефайнов
Вместо systime_isr(void)
я объявил функцию __irq __arm void irqHandler(void){
с тем же телом кроме ISR_ENTRY() и ISR_EXIT()
Это правильно, только можно было имя не менять:
__arm __irq void systime_isr(void). Тогда бы не пришлось:
Цитата
а дальше по тексту в одном месте
заменил systime_isr( на irqHandler(


В общем я пришел к тому же результату. Прилагаю архив с файлами interrupt_utils.h и systime.c. с этим intrrupt_utils.h файл interrupt_utils.c из проекта надо выкинуть.
SlavaCh
Сергей, у вас заработала ESFL?

Я сделал примерно то же самое, но в целом понимаю, что надо как то приклеить к проекту файл startup_SAM7S.S(из исходников esfl) но не знаю как. Это к тому же вопросу о стандартных файлах Cstartup в примерах ИАРА.

И что-то типа файла линковки тоже ведь надо? (в примерах это .xls)
Или я чего-то не понимаю??? Объясните плиз..
e-tarasov
От отчаяния скачал ГЦЦ скомпилил
Все пошло без проблем
Может перейти на ГЦЦ
В IAR пока не идет программирование
из-за скорее всего тех самых Cstartup или xls
Буду пробовать дальше
Сергей Борщ
Цитата(SlavaCh @ Jun 22 2006, 13:10) *
Сергей, у вас заработала ESFL?

Нет,я не пытался ее собрать до конца.
Цитата
Я сделал примерно то же самое, но в целом понимаю, что надо как то приклеить к проекту файл startup_SAM7S.S(из исходников esfl) но не знаю как.
1) Просто добавить его в список файлов
2)Изменить расширение на принятое у IAR .s79.
3)Переписать его заново ибо ассемблеры совсем не похожи.
Цитата
Это к тому же вопросу о стандартных файлах Cstartup в примерах ИАРА.
Возможно в примерах они и нужны, но я без крайней необходимости cstartup не трогаю. Поэтому по умолчанию подлинковывается уже готовый из библиотеки.
Сейчас глянул этот .S: Я бы код начиная с метки Reset_Handler по комментарий // Setup Stack for each mode (инициализация периферии) перенес бы на С в начало main или в функцию __low_level_init(), а все остальное делает стандартный IARовский cstartup который подлинковывается из библиотеки.
Цитата
И что-то типа файла линковки тоже ведь надо? (в примерах это .xls)
Или я чего-то не понимаю??? Объясните плиз..
Да, надо. Так возьмите его из примера и подключите к проекту.
e-tarasov
Удалось все таки скомпилить EFSL под IAR
кому интересно могу выложить проект спасибо
Сергею Файлы cstartup и *.xls взял стандартные
Скомпилил проект под GCC.
Собрал схему с картой SD.
Есть возможность сравнить компиляторы GCC иIAR
Пишите может предложите какой-либо тест.
Gorby
Цитата(e-tarasov @ Jun 23 2006, 10:31) *
Удалось все таки скомпилить EFSL под IAR
кому интересно могу выложить проект спасибо
Сергею Файлы cstartup и *.xls взял стандартные
Скомпилил проект под GCC.
Собрал схему с картой SD.
Есть возможность сравнить компиляторы GCC иIAR
Пишите может предложите какой-либо тест.



Интересно. Выкладывайте. Как раз есть под рукой EB40A c AT91R40008 и слот для карточки.
А IAR вы какой пользовали? Я запустил последний, 4.40а. После рихтовки стартапа и линкерного файла работает на "ура".
SlavaCh
Выложите плиз. или пошлите на мыло slava()trace()ru
А у меня чего-то Jlink не шьет проц - выдает варнинги (there were warnings during download...) хотя файлы подключил рабочие sad.gif
Может там в настройках есть волшебная галка какая-нибудь???
SlavaCh
По поводу прошивки - разобрался, там просто надо было помимо вкл галки Use flashloader выбрать его как дефаулт. smile.gif
2 e-tarasov - А где проект-то??
e-tarasov
Прошу прощения запарился я конкретно
с ентим ГЦЦ и ИАР
проект запускается в режиме debug
после ресета не фурычит
а может и фурычило но что то изменил
не подумавши
может кто подскажет почему такое
происходит может быть из-за s79
Сергей Борщ
Цитата(e-tarasov @ Jun 23 2006, 14:19) *
может кто подскажет почему такое происходит может быть из-за s79
Да выкинь его вообще из проекта. Он подлинкуется из библиотеки.

P.S. у нас праздники, до понедельника на природу уезжаю, если до понедельника не разберешься - пиши мылом, постараюсь помочь.
e-tarasov
Ну наконец таки добил проект
Дело как говорится было не в бабине
s79 был абсолютно не причем
Удалось сравнить скорости чтения/записи
На одной и той же карте при
использовании бенчмарка из проекта
ГЦЦ и IAR в показали почти одинаковые
результаты
ГЦЦ 315/143
IAR 292/133
Спасибо всем за помощь в переводе!!!
SlavaCh
А ваши исходники рабочие, или что-то поменялось? Если есть изменения, выложите плиз.
sergvks
Почитал топик и понял, что не зря выбрал связку lpc2148 и кейл.
Для сборки efsl RV-шным компилятором потребовалось только
переопределить типы и всё. При форматировании на компе
размер кластера выбирайте - 512байт - иначе будут глюки.
SlavaCh
Ура! Заработало!
1. Нашел ошибку в исходниках - у меня на плате ММС карта подключена к CS1, а вот оригинал дефайнов в файле at91_spi.c
/* PCS_0 for NPCS0, PCS_1 for NPCS1 ... */
#define PCS_0 ((0<<0)|(1<<1)|(1<<2)|(1<<3))
#define PCS_1 ((1<<1)|(0<<1)|(1<<2)|(1<<3))
#define PCS_2 ((1<<1)|(1<<1)|(0<<2)|(1<<3))
#define PCS_3 ((1<<1)|(1<<1)|(1<<2)|(0<<3))
_________________^
_________________|
вот эти "1" надо заменить на 0 !! Иначе при попытке переделать проект на другие чипселекты не будет работать.


2. почему-то посоветованная Сергеем строка
__irq __arm void systime_isr(void) { /* System Interrupt Handler */
не работает!! то есть у меня после перезапуска платы все напрочь висло!
Я убрал __irq __arm и все заработало!!

Подскажите где тут собака зарыта, ведь по идее должно работать!

Следующим этапом борьбы будет попытка сделать на основании этих исходников библиотеку в ИАре, то есть чтобы можно было к другому проекту подключить 1-2 файла и файловая система стала доступна.
Если кто поделится рецептом как это сделать, буду благодарен (и думаю не только я).
Спасибо.

PS = и еще - у меня чего-то маленькая скорость по сравнению с данными e-tarasova - write - 69 read 316 KB\sec
карта ММС 32МБ из поставки с сотовым телефоном.
net
Нажмите для просмотра прикрепленного файла
вот тут сегодня поробовали собрать elfs на keil и 2148 ->demo board mcp2140 все собралось и заработало - детально не тестировали но файлы пишутся и читаются на ура - и при этом все на халяву !!
вот прилагаю архивчик под KEIL - может кому интресно будет
e-tarasov
Всем привет. Извините за отсутствие.
Пришлось смотаться в коммандировку.
Как пишет SlavaCh
строку __irq __arm void systime_isr(void
пришлось выкинуть и заменить на стандартное
прерывание от PIT
кроме того пришлось подправить
функцию systime_get(void)
путем вставки команд
AT91F_disable_interrupt();
AT91F_enable_interrupt();
которые прописаны в
ассемблерном файле *.s79.
Проект сырой много лишнего
надо чистить а лень
как нибудь займусь.
Карточки у меня все SD
и на всех разные скорости
самая маленькая у 16Мб 28/315
Пробую соединить UCOS и EFSL
Напишите может кто то пробовал
Спасибо!!!
net
Цитата(e-tarasov @ Jun 29 2006, 08:14) *
Всем привет. Извините за отсутствие.
Пришлось смотаться в коммандировку.
Как пишет SlavaCh
строку __irq __arm void systime_isr(void
пришлось выкинуть и заменить на стандартное
прерывание от PIT
кроме того пришлось подправить
функцию systime_get(void)
путем вставки команд
AT91F_disable_interrupt();
AT91F_enable_interrupt();
которые прописаны в
ассемблерном файле *.s79.
Проект сырой много лишнего
надо чистить а лень
как нибудь займусь.
Карточки у меня все SD
и на всех разные скорости
самая маленькая у 16Мб 28/315
Пробую соединить UCOS и EFSL
Напишите может кто то пробовал
Спасибо!!!


поскольку сидим на кейл то RTXARM+EFSL работает скорость (пока тренируемся) 133 запись 266 чтение
будем разбираться со скоростями так как запись во флеш идет на 15 мгц и скорость теряется гдето внутри файловой системы
net
я как всегда не по теме но в общем ключе
собрали RTXARM 3 + EFSL (все под кейл на демоборде MCP2140)
работает параллельно 2 потока ииз этих разных потоков пишем и читаем одновремнно в разные файлы и по ходу дела мигаем диодами( ну какой эмбеддер без мигания диода biggrin.gif ) исправили ошибку в дате времени которая была в архиве приведенном выше
вроде все работает системные издержки незаметны скорости пока остались прежние будем посмотреть потом
если интересно могу выложить архивчик проекта сборки под кейл или завести новую тему elfs+rtxarm под кейлом на LPC2148 ?
или не нужно это?
zltigo
Цитата(net @ Jul 6 2006, 09:08) *
или не нужно это?

Почему "или" - всегда пригодится!
net
Нажмите для просмотра прикрепленного файла
Keil MCP2140 . LPC2148 -> SD+ELFS+RTXARM на KEIL
два потока пишут и читают независимо файлы на SD карте и мигают диодами
e-tarasov
Выкладываю проект EFSL под IAR для AT91SAM7S64
Мне удалось присоединить его (с некоторыми изменениями , конечно)
к UCOS там же тусит USB masstorage+FS от атмела
в связи с чем прошу помощи.
У кого нибудь есть рабочие проги для
чтения файлов из МК для USB masstorage+FS
функция BFSA_read("FILE.TXT",&buffer,i,k)
работает некорректно, т. е. вообще
не работает.
Спасибо!!!
AntonPV
ESFL то под IARэом работает уже давно,кому надо - могу кинуть на мыло...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.