Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Nios + STDIN Jtag-Uart
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
torik
Из хела:
Цитата
Program output can appear in the Console view of the Nios II IDE. The Console view maintains a terminal I/O connection with a communication device, such as a JTAG UART, connected to the Nios II processor in the SOPC Builder system. When the Nios II program writes to stdout or stderr, the Console view displays the text. The Console view can also accept character input from the host keyboard, which is sent to the processor and read as stdin.

Т.е. вроде бы можно в консоли набрать данные и получить их в программе ниос через STDIN.

пишем
Код
char sss[5];
fgets (sss, 1, stdin);
if (sss != NULL)
   fprintf (stdout, "sss = %s", sss);


Пишу чё-нибудь в консоли, при этом sss всегда NULL. В bsp STDIN/STDOUT настроены на jtag-uart. fprintf работает без проблем.
ЧТо-то не так делаю?
torik
Странно, изменил строчку:
Код
fgets ([b]&sss[0][/b], 5, stdin);

Заработал ввод данных с консоли.
Чего это оно, имя массива нельзя в качестве указателя использовать?
vadimuzzz
Цитата(torik @ Feb 9 2011, 14:57) *
Странно, изменил строчку:
Код
fgets ([b]&sss[0][/b], 5, stdin);

Заработал ввод данных с консоли.
Чего это оно, имя массива нельзя в качестве указателя использовать?

можно, почему нельзя
Код
    char sss[5];
    while(1)
    {
        if(fgets (sss, 5, stdin)!=NULL)
            {
                fprintf (stdout, "sss = %s", sss);
                break;
            }
    }

скорее, тут из-за второго параметра, надо ведь еще место под нуль-символ
torik
Да, Вы оказались правы. Место под NULL надо...
torik
fscanf еще удобнее.

Но, ё-моё, опять проблемы.

Код
while (1) {
..........
fscanf (....);

}


И пока строку не введешь, цикл не завершится.
А у меня в цикле другие действия должны выполняться, а через консоль хочу менять некоторый параметр.
Как быть?
vadimuzzz
Цитата(torik @ Feb 11 2011, 15:40) *
Как быть?

написать нормально, по пунктам: что хотите сделать sm.gif
torik
По каким-таким пунктам?

Есть бесконечный цикл, где выполняется некая функция (типичная ситуация). Надо чтобы тело цикла выполнялось каждые, к примеру, 10 мс.
Надо влиять на параметры функции через консоль.Проблема в том, что функция fscanf ожидает ввода чего-либо в консоль бесконечно долго, пока не придут данные.

Так яснее?

Т.е. надо чтобы fscanf завершалась если данные не приходят, а не ожидала их.

Может можно по прерыванию JTAG-UART читать данные с него посредством fscanf?
vadimuzzz
для таких штук есть select

#include <sys/select.h>

в поставке ниоса он есть, но что-то не могу найти "родных" мануалов

вот линуксовая версия, можно попробовать:

http://linux.die.net/man/2/select
vadimuzzz
хотя я погорячился. select - это системный вызов, без наличия оного в ОС указанный выше финт не прокатит. так что в вашем случае проще отключить jtag-uart от стандартного ввода/вывода и сделать свой обработчик прерывания (и обломаться с stdio.h, да). или сделать аналог системного вызова select. может проще ОС готовую воткнуть?

на всякий случай, в линуксе это выглядит примерно так:
CODE

#include <stdio.h>
#include <sys/select.h>
#include <sys/time.h>
#include <unistd.h>

int main()
{
//IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,0);
fd_set rfds;
struct timeval tv;
int retval;
printf("Hello from Nios II!\n");
FD_ZERO(&rfds);
FD_SET(0, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
char sss[256];
while(1)
{
retval = select(1, &rfds, NULL, NULL, &tv);
if (retval == -1)
perror("select()");
else if (retval){
printf("Data is available now.\n");
tv.tv_sec = 5;
tv.tv_usec = 0;
FD_ZERO(&rfds);
scanf("%s",sss);
FD_SET(0, &rfds);
}
/* FD_ISSET(0, &rfds) will be true. */
else{
printf("No data within 5 seconds.\n");
tv.tv_sec = 5;
tv.tv_usec = 0;
FD_SET(0, &rfds);
}
}
return 0;
}
torik
Сейчас мне с ОС некогда разбираться, хотя в дальнейшем было бы интересно.
А прерывание от Jtag-uart происходит когда что-то передали из консольки? Интересно, надо почитать...
Тогда основной цикл себе вертится спокойно, а по вводу данных в консоль в прерывании меняем что надо и все дела...
vadimuzzz
Цитата(torik @ Feb 13 2011, 19:51) *
А прерывание от Jtag-uart происходит когда что-то передали из консольки?

да, там можно настроить и на байты, и на пакеты. правда, про stdio придется забыть
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.