|
|
  |
nios2 на ките Cyclone II для чайников, простейший проект |
|
|
|
Feb 17 2008, 15:06
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(vetal @ Feb 17 2008, 17:25)  переписывать не надо - там есть быстрые аналоги этой функции(alt_printf и пр). Стандартный printf на всех платформах медленный, т.к. там заложен заведомо большой функционал  Вся основа для программирования в sdk nios уже сделана - надо только подобрать из всего что имеется то, что вам нужно. если не использовать буфер на передачу (программный или аппаратный), то вопрос быстродействия почти не стоит - все равно почти все время на ожидание завершения передачи предыдущего символа тратится. написание своего минимального по объему кода для кома может сильно пригодиться, если пытаться запихнуть его в накристальную память, без внешнешней памяти.
|
|
|
|
|
Feb 17 2008, 15:52
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 12-10-07
Пользователь №: 31 308

|
Цитата переписывать не надо - там есть быстрые аналоги этой функции(alt_printf и пр). Стандартный printf на всех платформах медленный, т.к. там заложен заведомо большой функционал Изначально начал делать программу на основе small версии программы без этих всех принтов. В прошлых программах записав IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, 0x06); все передавалось без проблем и тут подумал что так будет. Но записав IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, 0xb74003); получил на выходе число 03. Так как пока еще не умею общаться с отладчиком, то решил использовать alt_putstr, printf не помогло. Это все проделывал со своим процессором. С подачи Vasily_A обратно перешел на демо процессор, все равно болячки остались. И вывод с использованием putchar тоже не помог. Тут torik подсказал поменять тип данных с int перешел на float. У Кернигана написано, что float - 32битное число, десять (плюс минус) 38 степени. Тоже не вышло. Даже, если использовать printf для вывода состояния status регистра, всегда получаю число 96. Это 1100000, т.е биты trdy и tmt установлены в 1. Это значит, что txdata регистр пуст и готов для передачи нового знака, так же сдвиговой регистр все что нужно передал, а не находится в процесе передачи. Т.е исходное состояние установлено. Ну и в чем дело у меня? Нашел на форуме альтеры сообщение "Need help for my RS232 in NIOS II" Hey, This is a function thats send one byte to the UART void UART1_T(unsigned char ch) { while((IORD_ALTERA_AVALON_UART_STATUS(UART1_BASE) & 0x040) != 0x040){ ;} IOWR_ALTERA_AVALON_UART_TXDATA(UART1_BASE,ch); } You only have to change UART1_BASE address to your UART address that you can find back in your system.h file Good luck Regards Karel Он честно написал, что это код для передачи одного байта. И этот код у меня работает и передает 0x03 вместо 0xb74003, т.е так же как и мой код. ""если пытаться запихнуть его в накристальную память, без внешнешней памяти. С alt_putchar, alt_printf и rediced device drivers это легко реализуется.И ничего писать не надо Как я уже и говорил - все уже есть, надо только найти и использовать!"" Так прога изначально использует on-chip memory, без внешней памяти. Все запихивается туда куда нужно :-) Передача хромает только.
Сообщение отредактировал prog_sun - Feb 17 2008, 16:09
|
|
|
|
|
Feb 17 2008, 16:16
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
ком-порт работает с 8-ми битными посылками, и передать 32 бита сам не может.
просто для иллюстрации (вариант не оптимальный)
int i; //my var 32bit IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, (i & 0x000000FF)); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, ((i>>8) & 0x000000FF)); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, ((i>>16) & 0x000000FF)); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, ((i>>24) & 0x000000FF));
передаст 32 бита побайтно...
|
|
|
|
|
Feb 17 2008, 16:33
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 12-10-07
Пользователь №: 31 308

|
Цитата Попробуйте найти 2 отличия между char и int, тогда поймете почему у вас передается 0x03. Уважаемый Vetal ставил и char в самом начале :-) передается 03. char 8 битная, а int -16 битная. Цитата(Vasily_A @ Feb 17 2008, 19:16)  ком-порт работает с 8-ми битными посылками, и передать 32 бита сам не может.
просто для иллюстрации (вариант не оптимальный)
int i; //my var 32bit IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, (i & 0x000000FF)); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, ((i>>8) & 0x000000FF)); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, ((i>>16) & 0x000000FF)); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, ((i>>24) & 0x000000FF));
передаст 32 бита побайтно... Это ясно что com порт работает с 8 битами достаточно посмотреть на регистр txdata что в Uart core.pdf Весь вопрос в том как передать число. А код не понял, поймет ли ниос что i -длина разрядности числа?
|
|
|
|
|
Feb 17 2008, 17:00
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(prog_sun @ Feb 17 2008, 19:33)  Уважаемый Vetal ставил и char в самом начале :-) передается 03. char 8 битная, а int -16 битная. Это ясно что com порт работает с 8 битами достаточно посмотреть на регистр txdata что в Uart core.pdf Весь вопрос в том как передать число. А код не понял, поймет ли ниос что i -длина разрядности числа? int - в общем случае, не 16бит. конкретно для ниос2 в нашей реализации - 32бит. i это просто перменная типа "int" мы о азыке "С" говорим? разве возможны разночтения для строки int i; //my var 32bit в "С"? единственно, что "//" это символ комментария, но я посчитал это очевидным что можно не понять? берем, например 0х12345678, сдвигаем (например) на 16 бит - получаем 0х00001234, отгрызаем 8бит (& 0x000000FF) получаем 0х34
|
|
|
|
|
Feb 17 2008, 17:03
|

Гуру
     
Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553

|
Цитата Уважаемый Vetal ставил и char в самом начале :-) передается 03. char 8 битная, а int -16 битная. int 32 Бита для nios2. Cейчас практически везде принято брать int равным 4м байтам, хотя иногда встречается что int равен разрядности процессора. из файла nios2.h : Код /********************** * Layout of Source Language Data Types **********************/ #define INT_TYPE_SIZE 32 #define SHORT_TYPE_SIZE 16 #define LONG_TYPE_SIZE 32 #define LONG_LONG_TYPE_SIZE 64 #define FLOAT_TYPE_SIZE 32 #define DOUBLE_TYPE_SIZE 64 #define LONG_DOUBLE_TYPE_SIZE DOUBLE_TYPE_SIZE Цитата А код не понял, поймет ли ниос что i -длина разрядности числа nios сделает ровно то, что вы ему скажете. в примере последовательно передаются 4 байта 32разрядного числа. В какой последовательности их передавать - решает программист.
|
|
|
|
|
Feb 17 2008, 17:17
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 12-10-07
Пользователь №: 31 308

|
error: parse error before "__builtin_stwio" выдает такую ошибку на IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, (i & 0x000000FF)); Each Load and Store instruction has a version intended for accessing locations in I/O device interfaces. These instructions are: • ldwio (LoadWord I/O) • ldbio (Load Byte I/O) • ldbuio (Load Byte Unsigned I/O) • ldhio (Load Halfword I/O) • ldhuio (Load Halfword Unsigned I/O) • stwio (StoreWord I/O)• stbio (Store Byte I/O) • sthio (Store Halfword I/O) "например, тип INT соответствует 16-битовому числу со знаком, т.е. числу, лежащему между -32768 и +32767. Число типа FLOAT — это 32-битовое число, имеющее около семи значащих цифр и лежащее в диапазоне от 10е-38 до 10е+38. В главе 2 приводится список размеров для других машин." - это цитата из Кернигана Цитата #define INT_TYPE_SIZE 32 спасибо, но то что int 32 разрядный не решает моей проблемы, поверьте и int и все что угодно ставил :-)
|
|
|
|
|
Feb 17 2008, 19:00
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
вот это выводит в джитаг-варт "Hello from Nios II! (jtag UART)", а в rs232 4-ре символа "4321" (их хекс-коды 0х34 0х33 0х32 0х31) проверил только что  ================================================================= #include <stdio.h> #include "system.h" #include "altera_avalon_uart_regs.h" void UART0_TX(unsigned char ch) { while((IORD_ALTERA_AVALON_UART_STATUS(UART_0_BASE) & 0x40) != 0x40); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE,ch); } int main() { printf("Hello from Nios II! (jtag UART) \n"); int i=0x31323334; UART0_TX(i & 0xFF); UART0_TX((i>>8) & 0xFF); UART0_TX((i>>16) & 0xFF); UART0_TX((i>>24) & 0xFF); return 0; } ================================================================= P.S. задолбал меня квартус и ниос сложностью копирования\модификации проектов...
|
|
|
|
|
Feb 18 2008, 06:25
|

МедвеД Инженер I
   
Группа: Свой
Сообщений: 816
Регистрация: 21-10-04
Пользователь №: 951

|
Цитата(Vasily_A @ Feb 18 2008, 04:00)  .....
P.S. задолбал меня квартус и ниос сложностью копирования\модификации проектов... Да нет никаких сложностей как раз сложность только в 3-х вещах Лень читать доку, лень искать в доке ключевые слова и фразы, лень просто гуглить тут на форуме такое часто бывает...болезнь...имхо
--------------------
Cogito ergo sum
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|