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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Перенос EFSL на IAR, помогите ламеру
e-tarasov
сообщение Jun 21 2006, 06:12
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 30-05-06
Пользователь №: 17 578



Вчера сел переносить 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
Спасибо!!!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 21 2006, 06:54
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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(). Если других советов не будет - постараюсь ближе к вечеру скачать исходники и глянуть.

Сообщение отредактировал Сергей Борщ - Jun 21 2006, 06:55


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jun 21 2006, 07:26
Сообщение #3


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
но что-то мне подсказывает, что все будет гораздо проще и достаточно будет объявить обработчик как __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}
...


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
e-tarasov
сообщение Jun 21 2006, 09:16
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 30-05-06
Пользователь №: 17 578



__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
Спасибо

Сообщение отредактировал e-tarasov - Jun 21 2006, 09:24
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jun 21 2006, 09:51
Сообщение #5


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Я думаю что-то наподобие
Код
static inline unsigned __get_cpsr(void)
{
unsigned long retval;
asm ("mrs retval, cpsr");
return retval;
}

Уточните как там в асм передаются переменные.
Может нужен подчерк перед именем.
А впрочем зачем вам эта функция? Это же используется для сохранения контекста и скорее всего сгенериться само при вызове завершении функции.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
e-tarasov
сообщение Jun 21 2006, 10:19
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 30-05-06
Пользователь №: 17 578



Не хочет передавать
В справке ничего не написано
Похоже что никак а в С его передать нельзя?
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jun 21 2006, 11:23
Сообщение #7


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
Не хочет передавать
В справке ничего не написано
Похоже что никак а в С его передать нельзя?

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

ЗЫ Может не стоит уходить с gcc?
Там на каждый пук компилятора, объемная справка smile.gif


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
SlavaCh
сообщение Jun 21 2006, 13:07
Сообщение #8


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

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



Совершенно случайно передо мной поставили аналогичную задачу - к рабочему проекту на ИАРе подключить EFSL. На ГСС остаться не получиться...
2e-tarasov - может объединим усилия? а то я тоже не совсем копенгаген в гсс ....

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

Вопрос(может глупый) - а в ИАРе файлы Startup нужно подключать из исходников библиотеки ESFL или можно воспользоваться тем что есть в примерах от атмела?
И вообще как ИАР находит место, откуда надо компилировать проект? Ведь явно нигде имя CStartup не указывается. А в этом модуле - начало программы, с 0го адреса.
Go to the top of the page
 
+Quote Post
SlavaCh
сообщение Jun 21 2006, 14:17
Сообщение #9


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

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



2 e-tarasov:
функции __set_cpsr(unsigned long)
и unsigned long __get_cpsr(void)
есть в иаре!!
надо подключить intrinsic.h
Go to the top of the page
 
+Quote Post
e-tarasov
сообщение Jun 22 2006, 05:25
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 30-05-06
Пользователь №: 17 578



Спасибо за функции честно говоря не догадался поискать.
Цитата
И вообще как ИАР находит место, откуда надо компилировать проект? Ведь явно нигде имя CStartup не указывается. А в этом модуле - начало программы, с 0го адреса.

Во вкладке Debugger сеавится галочка main
Это для того чтобы компиляция начиналась с main
Далее во вкладке плагины есть такой Ctack который указывает на
CStartup
Go to the top of the page
 
+Quote Post
SlavaCh
сообщение Jun 22 2006, 07:46
Сообщение #11


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

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



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 )

объясните плиз.
Go to the top of the page
 
+Quote Post
e-tarasov
сообщение Jun 22 2006, 08:13
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 30-05-06
Пользователь №: 17 578



Цитата
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. не собрана схема с карточкой
Честно говоря меня берут смутные сомнения по
поводу успеха этого мероприятия
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 22 2006, 09:04
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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 из проекта надо выкинуть.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SlavaCh
сообщение Jun 22 2006, 10:10
Сообщение #14


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

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



Сергей, у вас заработала ESFL?

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

И что-то типа файла линковки тоже ведь надо? (в примерах это .xls)
Или я чего-то не понимаю??? Объясните плиз..
Go to the top of the page
 
+Quote Post
e-tarasov
сообщение Jun 22 2006, 10:45
Сообщение #15


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 30-05-06
Пользователь №: 17 578



От отчаяния скачал ГЦЦ скомпилил
Все пошло без проблем
Может перейти на ГЦЦ
В IAR пока не идет программирование
из-за скорее всего тех самых Cstartup или xls
Буду пробовать дальше
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 14:20
Рейтинг@Mail.ru


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