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

 
 
> ASM для NIOS2, для начинающих
AndriAno
сообщение Feb 9 2009, 11:12
Сообщение #1


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

Группа: Свой
Сообщений: 103
Регистрация: 17-03-06
Из: Томск
Пользователь №: 15 319



Начинаю разбираться с NIOS2
Создал несколько простых проектов в Срр
поработал с таймерами, шинами, обработкой прерываний.
Возникло несколько вопросов к знатокам:
  • Cистема к моему довольно незначительному коду добавляет свой весьма внушительный стартап код, из-за которого прошивка не помещается в onchip memory(пришлось .rodata писать в EPCS). Есть ли возможность уменьшить или совсем убрать этот служебный код?
  • Для ускорения работы системы хочется писать программу на ASM. Нашел список инструкций, вроде бы разобрался с использованием прерываний(через custom instructions). Включил в проект файл с кодом, но получил следующее: alt_main.c:161: undefined reference to `main'

Что посоветуете??
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 18)
Methane
сообщение Feb 9 2009, 11:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(AndriAno @ Feb 9 2009, 13:12) *
Что посоветуете??

Отключить стартап. Как именно вы компилируете и собираете программу?
Go to the top of the page
 
+Quote Post
AndriAno
сообщение Feb 9 2009, 12:07
Сообщение #3


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

Группа: Свой
Сообщений: 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()
Go to the top of the page
 
+Quote Post
Methane
сообщение Feb 9 2009, 12:22
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



А ручную, из командной строки?
Посмотрите ключи для gcc --nostdlib --nostartfiles --nodefaultlib итд. Это для gcc

Сообщение отредактировал Omen_13 - Feb 15 2009, 19:21
Go to the top of the page
 
+Quote Post
AndriAno
сообщение Feb 9 2009, 12:40
Сообщение #5


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

Группа: Свой
Сообщений: 103
Регистрация: 17-03-06
Из: Томск
Пользователь №: 15 319



Цитата(Methane @ Feb 9 2009, 15:22) *
А ручную, из командной строки?


А если без командной строки??
Существует возможность???
gcc как я понимаю ниосовский??
Go to the top of the page
 
+Quote Post
Stewart Little
сообщение Feb 10 2009, 09:03
Сообщение #6


Лентяй
******

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



Цитата(AndriAno @ Feb 9 2009, 15:40) *
А если без командной строки??
Существует возможность???

Для начала - в свойствах библиотеки проекту установите следующие галки :
Program never exits
Lightweight device driver API
Reduced device drivers
Small 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
Прикрепленные файлы
Прикрепленный файл  gnu_assembler.zip ( 515.35 килобайт ) Кол-во скачиваний: 56
 


--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
Go to the top of the page
 
+Quote Post
AndriAno
сообщение Feb 10 2009, 10:20
Сообщение #7


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

Группа: Свой
Сообщений: 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).

А за остальное большое спасибо
Go to the top of the page
 
+Quote Post
Methane
сообщение Feb 10 2009, 10:33
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(AndriAno @ Feb 9 2009, 14:40) *
А если без командной строки??
Существует возможность???
gcc как я понимаю ниосовский??

Да. Ниосовский. Я говорю как сделать, с помощью GCC вообще, не конкретно для ниоса. Можно переписать скрипт линкера (.ld), и написать свой стартап. Так вы всегда точно будете знать что у вас в проекте происходит, и в случае чего как и что пофиксить/ изменить.
Go to the top of the page
 
+Quote Post
AndriAno
сообщение Feb 10 2009, 11:06
Сообщение #9


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

Группа: Свой
Сообщений: 103
Регистрация: 17-03-06
Из: Томск
Пользователь №: 15 319



Цитата(Methane @ Feb 10 2009, 14:33) *
Я говорю как сделать, с помощью GCC вообще, не конкретно для ниоса.

При работе под виндой пользовать gcc приходиться ОЧЕНЬ редко, поэтому навыков использования компилятора через командную строку порой нехватает.
Цитата
Можно переписать скрипт линкера (.ld), и написать свой стартап.

В такие дебри еще не лазил. всего несколько дней с ниосом работаю. пока просто закоментил всё лишнее на мой взгляд, в стандартом стартапе.
Go to the top of the page
 
+Quote Post
Methane
сообщение Feb 10 2009, 11:18
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(AndriAno @ Feb 10 2009, 13:06) *
В такие дебри еще не лазил. всего несколько дней с ниосом работаю. пока просто закоментил всё лишнее на мой взгляд, в стандартом стартапе.

Строго говоря, вы можете писать свою ассемблерную программу, прямо в стартапе. При необходимости прилинковывая Cишные функции. Какие ключики указать компилятору я уже указала. В настройках проекта должна быть возможность.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 10 2009, 12:30
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



в настройках линкера есть полезная опция "генерить objdump". находится через меню еклипса Preferences. сгенеренный файл будет содержать промежуточный ассемблер и массу др. полезной инфы
Go to the top of the page
 
+Quote Post
AndriAno
сообщение Feb 13 2009, 11:23
Сообщение #12


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

Группа: Свой
Сообщений: 103
Регистрация: 17-03-06
Из: Томск
Пользователь №: 15 319



Спасибо всем за померную помощь.
У меня теперь возникла еще проблема:
немогу написать обработчик прерывания, может ктонибудь выложить простенький обработчик.
А также использование custom_instruction.

Заранее спасибо
Go to the top of the page
 
+Quote Post
Stewart Little
сообщение Feb 13 2009, 12:19
Сообщение #13


Лентяй
******

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



Цитата(AndriAno @ Feb 13 2009, 14:23) *
немогу написать обработчик прерывания, может ктонибудь выложить простенький обработчик.
А также использование custom_instruction.

Изучайте первоисточники :
Exception Handling
Nios II Custom Instruction User Guide
Design Example


--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
Go to the top of the page
 
+Quote Post
AndriAno
сообщение Feb 16 2009, 04:12
Сообщение #14


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

Группа: Свой
Сообщений: 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:

{исполняемый код}


но вот както это код не исполняется

Поэтому БОЛЬШАЯ ПРОСЬБА может ктонибудь выложить рабочий код (хотябы рыба), потому как документация это очень хорошо, но она несколько не полная с точки зрения разработки на ассемблере.
Go to the top of the page
 
+Quote Post
id_gene
сообщение Feb 17 2009, 08:13
Сообщение #15


carpe manana
***

Группа: Свой
Сообщений: 321
Регистрация: 2-06-05
Пользователь №: 5 659



Цитата(AndriAno @ Feb 16 2009, 07:12) *
Ну вы отлаживали в железе? Какая часть не работает?
Контрольные регистры прописываются? Прерывание появляется? (попробуйте в 3м регистре убрать разрешение, и посмотрите, сработал ли таймер)
Go to the top of the page
 
+Quote Post
AndriAno
сообщение Mar 2 2009, 04:03
Сообщение #16


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

Группа: Свой
Сообщений: 103
Регистрация: 17-03-06
Из: Томск
Пользователь №: 15 319



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


Да отлаживаю в железе.
Регистры прописываются.

Цитата
Прерывание появляется?

После всего этого взводиться
ipending 0x02

Входа в обработчик прерывания не происходит
Go to the top of the page
 
+Quote Post
PeterD
сообщение Mar 18 2009, 08:48
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 26-10-07
Пользователь №: 31 743



Я вот собрал свой проект на ASM вот по этому примеру, думаю многим он поможет http://www.ict.kth.se/courses/IS1200/2008-.../idedetail.html. Но ксожелению пока не могу разобратся, когда начинаю отлаживать (на DE1) останавливаюсь на точке main дальше при пошаговой трасировке она улетает фаил ctr0.s чето там делает (видимо инициализация) короче не могу перейти к собственному коду((( А иногда в окне отладчика (NIOS II IDE) нажимаю любую кнопку (Step ....) а программа запускается на исполнение. И все помогает только терминайт программ (((.
Go to the top of the page
 
+Quote Post
PeterD
сообщение Mar 18 2009, 11:33
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 26-10-07
Пользователь №: 31 743



http://www.ict.kth.se/courses/IS1200/2008-...etup/debug.html
У меня на этом шаге The "Step Into" button (symbol: arrow pointing right and down) программа либо запускается на исполнение либо вобще ничего не делает. Я уже все все перерыл не могу понять почему не трасируется по шагово ядро у меня Nios II/f, jtag Level 3. Кто нить может сказать чтони буть по этому поводу?

Удалил самоцитирование. Модератор

Сообщение отредактировал Omen_13 - Mar 29 2009, 11:27
Go to the top of the page
 
+Quote Post
PeterD
сообщение Mar 24 2009, 11:47
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 26-10-07
Пользователь №: 31 743



crying.gif 1111493779.gif Господа подозреваю что Я один здесь такой тупой но уменя уже чесно сказать силы кончаются и мыслей нет. Все же может у кого будут мысли почему вот такая простая программа

.equ PIO_BASE, 0x00000000

.text
.global alt_main

alt_main:
movia r2,PIO_BASE
movi r3,0x00
loop: stw r3,0(r2)
addi r3,r3,1
br loop
.end
в режиме пошаговой отладки работает свето диоды моргают. А запустить ее на исполнение на могу мертвая тишина при запуске. Бьюсь который день как рыба об лед. Ни Run не Resume в режиме Debug не запускают программу на исполнение. Верней она грузится но ХЗ че делает и делает ли вообще.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 05:26
Рейтинг@Mail.ru


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