|
ASM для NIOS2, для начинающих |
|
|
|
Feb 9 2009, 11:12
|
Частый гость
 
Группа: Свой
Сообщений: 103
Регистрация: 17-03-06
Из: Томск
Пользователь №: 15 319

|
Начинаю разбираться с NIOS2 Создал несколько простых проектов в Срр поработал с таймерами, шинами, обработкой прерываний. Возникло несколько вопросов к знатокам: - Cистема к моему довольно незначительному коду добавляет свой весьма внушительный стартап код, из-за которого прошивка не помещается в onchip memory(пришлось .rodata писать в EPCS). Есть ли возможность уменьшить или совсем убрать этот служебный код?
- Для ускорения работы системы хочется писать программу на ASM. Нашел список инструкций, вроде бы разобрался с использованием прерываний(через custom instructions). Включил в проект файл с кодом, но получил следующее: alt_main.c:161: undefined reference to `main'
Что посоветуете??
|
|
|
|
|
Feb 9 2009, 12:07
|
Частый гость
 
Группа: Свой
Сообщений: 103
Регистрация: 17-03-06
Из: Томск
Пользователь №: 15 319

|
Цитата(Methane @ Feb 9 2009, 14:16)  Отключить стартап. Как именно вы компилируете и собираете программу? В SOPC Builder создаю систему, получаю .sopc файл В NIOS II создаю новый проект с указанием этого файла. Затем создается С/С++ application(пустую папку создать иначе не дает), создаю source folder , и в ней prject_asm.s в нем объявляю .global mainкак я понимаю main вызывается из alt_main()
|
|
|
|
|
Feb 9 2009, 12:40
|
Частый гость
 
Группа: Свой
Сообщений: 103
Регистрация: 17-03-06
Из: Томск
Пользователь №: 15 319

|
Цитата(Methane @ Feb 9 2009, 15:22)  А ручную, из командной строки? А если без командной строки?? Существует возможность??? gcc как я понимаю ниосовский??
|
|
|
|
|
Feb 10 2009, 09:03
|

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Цитата(AndriAno @ Feb 9 2009, 15:40)  А если без командной строки?? Существует возможность??? Для начала - в свойствах библиотеки проекту установите следующие галки : Program never exitsLightweight device driver APIReduced device driversSmall C librаryИспользуйте точку входа alt_main, примерно так : Код int main (void) __attribute__ ((weak, alias ("alt_main")));
//***** Use alt_main as entry point for this free-standing application *****
int alt_main (void) { bla-bla-bla.... Еще - не инициализируйте переменные при объявлении, делайте это сами в тексте программы. И ищите в документации ниоса главу про сокращение размера кода (что-то типа code footprint reduce) Цитата(AndriAno @ Feb 9 2009, 14:12)  Для ускорения работы системы хочется писать программу на ASM. В эклипсе живет обычный GNU'снтый ассемблер. Описание его прилагаю. Еще много чего по этому вопросу можно найти в тырнете. Пример ассемблерного проекта для NiosII можно посмотреть в ..\nios2eds\components\altera_nios2\boot_loader_sources
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Feb 10 2009, 10:20
|
Частый гость
 
Группа: Свой
Сообщений: 103
Регистрация: 17-03-06
Из: Томск
Пользователь №: 15 319

|
Цитата(Stewart Little @ Feb 10 2009, 13:03)  Для начала - в свойствах библиотеки проекту установите следующие галки : Program never exits Lightweight device driver API Reduced device drivers Small C librаry Эти галочки уже выставлял, помогли заметно уменьшить размер кода. кроме Program never exits, не совсем ясно что должна делать Цитата Используйте точку входа alt_main, примерно так : Код int main (void) __attribute__ ((weak, alias ("alt_main")));
//***** Use alt_main as entry point for this free-standing application *****
int alt_main (void) { bla-bla-bla.... Честно говоря значительных изменений на первый взгляд не заметил.... Попробовал более "глубокий" метод Код int main (void) __attribute__ ((weak, alias ("alt_main"))); void alt_main (void) { main(); } программа стала занимать 112 Bytes program size (code + initialized data). А за остальное большое спасибо
|
|
|
|
|
Feb 10 2009, 11:06
|
Частый гость
 
Группа: Свой
Сообщений: 103
Регистрация: 17-03-06
Из: Томск
Пользователь №: 15 319

|
Цитата(Methane @ Feb 10 2009, 14:33)  Я говорю как сделать, с помощью GCC вообще, не конкретно для ниоса. При работе под виндой пользовать gcc приходиться ОЧЕНЬ редко, поэтому навыков использования компилятора через командную строку порой нехватает. Цитата Можно переписать скрипт линкера (.ld), и написать свой стартап. В такие дебри еще не лазил. всего несколько дней с ниосом работаю. пока просто закоментил всё лишнее на мой взгляд, в стандартом стартапе.
|
|
|
|
|
Feb 16 2009, 04:12
|
Частый гость
 
Группа: Свой
Сообщений: 103
Регистрация: 17-03-06
Из: Томск
Пользователь №: 15 319

|
Цитата(Stewart Little @ Feb 13 2009, 15:19)  Изучайте первоисточники : Exception HandlingНенашел ни строчки упоминания, выполнения прерывания напрямую из ASM, обработчик из Срр у самого уже давно работает. А вот запись наподобие этой работать отказывается. Код movui r4,0 movui r5, 0xffff wrctl status, r5 wrctl ienable,r5 Затем инициализируем таймер Код movui r4,0 movui r5, 0x00 stwio r5, timer_base(r4)
movui r4,8 movui r5, 0x00ff stwio r5, timer_base(r4) movui r4,4 movui r5, 0x07 stwio r5, timer_base(r4) После всего этого взводиться ipending 0x02 По идее он должен входить в исключение. Описан следующий обработчик: Код globl alt_exception .globl alt_irq_entry alt_irq_entry:
{исполняемый код} но вот както это код не исполняется Поэтому БОЛЬШАЯ ПРОСЬБА может ктонибудь выложить рабочий код (хотябы рыба), потому как документация это очень хорошо, но она несколько не полная с точки зрения разработки на ассемблере.
|
|
|
|
|
Feb 17 2009, 08:13
|
carpe manana
  
Группа: Свой
Сообщений: 321
Регистрация: 2-06-05
Пользователь №: 5 659

|
Цитата(AndriAno @ Feb 16 2009, 07:12)  Ну вы отлаживали в железе? Какая часть не работает? Контрольные регистры прописываются? Прерывание появляется? (попробуйте в 3м регистре убрать разрешение, и посмотрите, сработал ли таймер)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|