e-tarasov 0 21 июня, 2006 Опубликовано 21 июня, 2006 · Жалоба Вчера сел переносить 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 Спасибо!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 63 21 июня, 2006 Опубликовано 21 июня, 2006 (изменено) · Жалоба Вчера сел переносить 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(). Если других советов не будет - постараюсь ближе к вечеру скачать исходники и глянуть. Изменено 21 июня, 2006 пользователем Сергей Борщ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 21 июня, 2006 Опубликовано 21 июня, 2006 · Жалоба но что-то мне подсказывает, что все будет гораздо проще и достаточно будет объявить обработчик как __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 0 21 июня, 2006 Опубликовано 21 июня, 2006 (изменено) · Жалоба __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 Спасибо Изменено 21 июня, 2006 пользователем e-tarasov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 21 июня, 2006 Опубликовано 21 июня, 2006 · Жалоба Я думаю что-то наподобие static inline unsigned __get_cpsr(void) { unsigned long retval; asm ("mrs retval, cpsr"); return retval; } Уточните как там в асм передаются переменные. Может нужен подчерк перед именем. А впрочем зачем вам эта функция? Это же используется для сохранения контекста и скорее всего сгенериться само при вызове завершении функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
e-tarasov 0 21 июня, 2006 Опубликовано 21 июня, 2006 · Жалоба Не хочет передавать В справке ничего не написано Похоже что никак а в С его передать нельзя? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 21 июня, 2006 Опубликовано 21 июня, 2006 · Жалоба Не хочет передавать В справке ничего не написано Похоже что никак а в С его передать нельзя? А как ругается? Какая ошибка? ЗЫ Может не стоит уходить с gcc? Там на каждый пук компилятора, объемная справка :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SlavaCh 0 21 июня, 2006 Опубликовано 21 июня, 2006 · Жалоба Совершенно случайно передо мной поставили аналогичную задачу - к рабочему проекту на ИАРе подключить EFSL. На ГСС остаться не получиться... 2e-tarasov - может объединим усилия? а то я тоже не совсем копенгаген в гсс .... пока стараюсь запустить в иаре исходники esfl Вопрос(может глупый) - а в ИАРе файлы Startup нужно подключать из исходников библиотеки ESFL или можно воспользоваться тем что есть в примерах от атмела? И вообще как ИАР находит место, откуда надо компилировать проект? Ведь явно нигде имя CStartup не указывается. А в этом модуле - начало программы, с 0го адреса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SlavaCh 0 21 июня, 2006 Опубликовано 21 июня, 2006 · Жалоба 2 e-tarasov: функции __set_cpsr(unsigned long) и unsigned long __get_cpsr(void) есть в иаре!! надо подключить intrinsic.h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
e-tarasov 0 22 июня, 2006 Опубликовано 22 июня, 2006 · Жалоба Спасибо за функции честно говоря не догадался поискать. И вообще как ИАР находит место, откуда надо компилировать проект? Ведь явно нигде имя CStartup не указывается. А в этом модуле - начало программы, с 0го адреса. Во вкладке Debugger сеавится галочка main Это для того чтобы компиляция начиналась с main Далее во вкладке плагины есть такой Ctack который указывает на CStartup Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SlavaCh 0 22 июня, 2006 Опубликовано 22 июня, 2006 · Жалоба 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 0 22 июня, 2006 Опубликовано 22 июня, 2006 · Жалоба 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. не собрана схема с карточкой Честно говоря меня берут смутные сомнения по поводу успеха этого мероприятия Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 63 22 июня, 2006 Опубликовано 22 июня, 2006 · Жалоба Насчет дефайнов Вместо 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SlavaCh 0 22 июня, 2006 Опубликовано 22 июня, 2006 · Жалоба Сергей, у вас заработала ESFL? Я сделал примерно то же самое, но в целом понимаю, что надо как то приклеить к проекту файл startup_SAM7S.S(из исходников esfl) но не знаю как. Это к тому же вопросу о стандартных файлах Cstartup в примерах ИАРА. И что-то типа файла линковки тоже ведь надо? (в примерах это .xls) Или я чего-то не понимаю??? Объясните плиз.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
e-tarasov 0 22 июня, 2006 Опубликовано 22 июня, 2006 · Жалоба От отчаяния скачал ГЦЦ скомпилил Все пошло без проблем Может перейти на ГЦЦ В IAR пока не идет программирование из-за скорее всего тех самых Cstartup или xls Буду пробовать дальше Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться