Перейти к содержанию
    

Вчера сел переносить 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

Спасибо!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Сергей Борщ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я думаю что-то наподобие

static inline unsigned __get_cpsr(void)
{
unsigned long retval;
asm ("mrs retval, cpsr");
return retval;
}

Уточните как там в асм передаются переменные.

Может нужен подчерк перед именем.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не хочет передавать

В справке ничего не написано

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не хочет передавать

В справке ничего не написано

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

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

 

ЗЫ Может не стоит уходить с gcc?

Там на каждый пук компилятора, объемная справка :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

2e-tarasov - может объединим усилия? а то я тоже не совсем копенгаген в гсс ....

 

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

 

Вопрос(может глупый) - а в ИАРе файлы Startup нужно подключать из исходников библиотеки ESFL или можно воспользоваться тем что есть в примерах от атмела?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 e-tarasov:

функции __set_cpsr(unsigned long)

и unsigned long __get_cpsr(void)

есть в иаре!!

надо подключить intrinsic.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за функции честно говоря не догадался поискать.

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

Во вкладке Debugger сеавится галочка main

Это для того чтобы компиляция начиналась с main

Далее во вкладке плагины есть такой Ctack который указывает на

CStartup

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 )

 

объясните плиз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. не собрана схема с карточкой

Честно говоря меня берут смутные сомнения по

поводу успеха этого мероприятия

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчет дефайнов

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

efsl_sam7_iar.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

И что-то типа файла линковки тоже ведь надо? (в примерах это .xls)

Или я чего-то не понимаю??? Объясните плиз..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

От отчаяния скачал ГЦЦ скомпилил

Все пошло без проблем

Может перейти на ГЦЦ

В IAR пока не идет программирование

из-за скорее всего тех самых Cstartup или xls

Буду пробовать дальше

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...