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

 
 
 
Reply to this topicStart new topic
> uart+fopen не могу разобраться
Evired
сообщение Oct 13 2010, 14:48
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 13-10-10
Пользователь №: 60 132



#include "alt_types.h"
#include "altera_avalon_pio_regs.h"
#include "altera_avalon_uart_regs.h"
#include "sys/alt_irq.h"
#include "system.h"
#include <stdio.h>
#include <string.h>

int main()
{
printf("Hello from Nios II!\n");
char* msg = "hello world";
FILE* fp;
fp = fopen ("/dev/uart_0", "w");
if (fp!=NULL)
{
fprintf(fp, "%s",msg);
fclose (fp);
}
return 0;
}

Компилю, получаю ошибки:

**** Build of configuration Nios II for project NIOSUART ****

make all
Info: Building ../NIOSUART_bsp
make --no-print-directory -C ../NIOSUART_bsp
[BSP build complete]
Info: Linking NIOSUART.elf
nios2-elf-g++ -T'../NIOSUART_bsp/linker.x' -msys-crt0='../NIOSUART_bsp/obj/HAL/src/crt0.o' -msys-lib=hal_bsp -L../NIOSUART_bsp -L/usr/include -Wl,-Map=NIOSUART.map -O0 -g -Wall -EL -mno-hw-div -mno-hw-mul -mno-hw-mulx -o NIOSUART.elf obj/hello_world.o -lm
/media/MEDIA/Altera10Linux/nios2eds/bin/gnu/H-i686-pc-linux-gnu/bin/../lib/gcc/nios2-elf/4.1.2/../../../../nios2-elf/bin/ld: region onchip_mem is full (NIOSUART.elf section .text)
/media/MEDIA/Altera10Linux/nios2eds/bin/gnu/H-i686-pc-linux-gnu/bin/../lib/gcc/nios2-elf/4.1.2/../../../../nios2-elf/bin/ld: region onchip_mem is full (NIOSUART.elf section .text)
/media/MEDIA/Altera10Linux/nios2eds/bin/gnu/H-i686-pc-linux-gnu/bin/../lib/gcc/nios2-elf/4.1.2/../../../../nios2-elf/bin/ld: section .rodata [00008020 -> 00008097] overlaps section .exceptions [00008020 -> 000081b3]
/media/MEDIA/Altera10Linux/nios2eds/bin/gnu/H-i686-pc-linux-gnu/bin/../lib/gcc/nios2-elf/4.1.2/../../../../nios2-elf/bin/ld: section .rwdata [00009ba4 -> 0000b6af] overlaps section .text [000081b4 -> 0000e7bf]
/media/MEDIA/Altera10Linux/nios2eds/bin/gnu/H-i686-pc-linux-gnu/bin/../lib/gcc/nios2-elf/4.1.2/../../../../nios2-elf/bin/ld: NIOSUART.elf: section .exceptions lma 0x8020 overlaps previous sections
/media/MEDIA/Altera10Linux/nios2eds/bin/gnu/H-i686-pc-linux-gnu/bin/../lib/gcc/nios2-elf/4.1.2/../../../../nios2-elf/bin/ld: NIOSUART.elf: section .text lma 0x81b4 overlaps previous sections
collect2: ld returned 1 exit status
make: *** [NIOSUART.elf] Ошибка 1

В чем может быть проблема? Я новичок, с ниосом только начинаю работать, объясните где я ошибся? Я так понимаю проблема с переполнением памяти на кристалле. Если я прав, как ее рассчитать под конкретный код?

Данная ошибка появляется при отключенной опции Small C Library. Когда данная опция включена, я получаю другую ошибку - undefined reference to 'fopen'. Думаю стоит так же уточнить что я работаю под линухом.

Как работать с макросами типа IOWR_ALTERA_AVALON_UART_TXDATA я разобрался, хочется теперь решить проблему с fopen

Сообщение отредактировал Evired - Oct 13 2010, 14:52
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Oct 13 2010, 14:55
Сообщение #2


Гуру
******

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



region onchip_mem is full - памяти маловато. если хотите использовать стандартные библиотеки C типа stdio, надо иметь памяти ~64к, лучше больше. можно использовать alt_stdio, она поэкономичнее, фич поменьше. fopen и т.п. не обязательны, если это стандартный вывод (можно выставить в настройках BSP uart, как вывод по умолчанию), пишете просто alt_printf("bla-bla-bla").
Go to the top of the page
 
+Quote Post
Evired
сообщение Oct 13 2010, 15:04
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 13-10-10
Пользователь №: 60 132



На моей отладочной плате есть SDRAM на 8Мб. Могу я задействовать их для программ ниоса? Если да, не могли бы вы направить меня в нужное для решения этой задачи русло ?

Сообщение отредактировал Evired - Oct 13 2010, 15:05
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Oct 13 2010, 22:46
Сообщение #4


Гуру
******

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



Цитата(Evired @ Oct 13 2010, 22:04) *
На моей отладочной плате есть SDRAM на 8Мб. Могу я задействовать их для программ ниоса?

разумеется, можете. добавляете контроллер памяти, PLL для клоков и вперед. документация (если у вас не 10 версия) есть в 5-м томе квартус-хендбука. если озвучите, какая у вас плата, есть большая вероятность найти готовый пример.
Go to the top of the page
 
+Quote Post
Evired
сообщение Oct 14 2010, 05:54
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 13-10-10
Пользователь №: 60 132



Плата Terasic DE0. У меня как раз 10 версия)
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Oct 14 2010, 07:28
Сообщение #6


Гуру
******

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



Цитата(Evired @ Oct 14 2010, 12:54) *
Плата Terasic DE0. У меня как раз 10 версия)

скачайте доки от 9.1 ftp://ftp.altera.com/outgoing/download/su...II_docs_9_1.zip
5-й том хендбука, 1 глава
Go to the top of the page
 
+Quote Post
Evired
сообщение Oct 16 2010, 15:49
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 13-10-10
Пользователь №: 60 132



#include <unistd.h>
#include <fcntl.h>
#include "alt_types.h"
#include "altera_avalon_pio_regs.h"
#include "altera_avalon_uart_regs.h"
#include "altera_avalon_timer_regs.h"
#include "sys/alt_irq.h"
#include "system.h"

unsigned char text_buffer;

int send_char_buffer_to_uart(unsigned char *buf, int size){

int comport,status;
comport=open("/dev/uart",O_WRONLY);
status=(write(comport, buf, size));
close(comport);
return status;
}

int get_char_buffer_from_uart(unsigned char *buf, int size){

int comport,received_bytes_num;
comport=open("/dev/uart",O_RDONLY);
received_bytes_num=(read(comport, buf, size));
close(comport);
return received_bytes_num;

}

void handle_timer_interrupt (void* context, alt_u32 id)
{
static alt_u8 value = 0x00;

value = value + 1;
IOWR_ALTERA_AVALON_PIO_DATA(LEDS_BASE, ~value);
send_char_buffer_to_uart("Hello",5);
IOWR_ALTERA_AVALON_TIMER_STATUS(SYSTEM_TIMER_BASE, 0);


}


int main(void){

//send_char_buffer_to_uart("Hello",5);
alt_irq_register(SYSTEM_TIMER_IRQ, 0, handle_timer_interrupt);
while(1);

}

Вот такой вот код. Таймер срабатывает каждые 100мс. Но в ком порт ничего не отправляется почему-то. Если выделенную строку закомментить и раскомментить аналогичную внутри мэйн, то строка в ком порт отправляется, то есть уарт настроен верно. При этом так же начнут мигать светодиоды, что подтверждает правильность настройки таймера. А вот в приведенном варианте ни уарт ни светодиоды не реагируют. С чем это может быть связано ?

Сообщение отредактировал Evired - Oct 16 2010, 15:50
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Oct 18 2010, 09:25
Сообщение #8


Гуру
******

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



чтобы таймер заработал, его надо запустить:
Код
    alt_irq_register(TIMER_0_IRQ, 0, handle_timer_interrupt);
    IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK|ALTERA_AVALON_TIMER_CONTROL_CONT_MSK|ALTERA_
AVALON_TIMER_CONTROL_START_MSK);

совершенно непонятно, что вы там наворотили с записью/чтением в UART. чем вас не устраивает доступ через HAL? (Embedded Peripherals IP User Guide 6 глава + Nios II Software Developer's Handbook 6 глава, Using Character-Mode Devices)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:59
Рейтинг@Mail.ru


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