Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: uart+fopen не могу разобраться
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Evired
#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
vadimuzzz
region onchip_mem is full - памяти маловато. если хотите использовать стандартные библиотеки C типа stdio, надо иметь памяти ~64к, лучше больше. можно использовать alt_stdio, она поэкономичнее, фич поменьше. fopen и т.п. не обязательны, если это стандартный вывод (можно выставить в настройках BSP uart, как вывод по умолчанию), пишете просто alt_printf("bla-bla-bla").
Evired
На моей отладочной плате есть SDRAM на 8Мб. Могу я задействовать их для программ ниоса? Если да, не могли бы вы направить меня в нужное для решения этой задачи русло ?
vadimuzzz
Цитата(Evired @ Oct 13 2010, 22:04) *
На моей отладочной плате есть SDRAM на 8Мб. Могу я задействовать их для программ ниоса?

разумеется, можете. добавляете контроллер памяти, PLL для клоков и вперед. документация (если у вас не 10 версия) есть в 5-м томе квартус-хендбука. если озвучите, какая у вас плата, есть большая вероятность найти готовый пример.
Evired
Плата Terasic DE0. У меня как раз 10 версия)
vadimuzzz
Цитата(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 глава
Evired
#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мс. Но в ком порт ничего не отправляется почему-то. Если выделенную строку закомментить и раскомментить аналогичную внутри мэйн, то строка в ком порт отправляется, то есть уарт настроен верно. При этом так же начнут мигать светодиоды, что подтверждает правильность настройки таймера. А вот в приведенном варианте ни уарт ни светодиоды не реагируют. С чем это может быть связано ?
vadimuzzz
чтобы таймер заработал, его надо запустить:
Код
    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)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.