|
|
  |
uart+fopen не могу разобраться |
|
|
|
Oct 13 2010, 14:48
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 13 2010, 15:04
|
Участник

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

|
На моей отладочной плате есть SDRAM на 8Мб. Могу я задействовать их для программ ниоса? Если да, не могли бы вы направить меня в нужное для решения этой задачи русло ?
Сообщение отредактировал Evired - Oct 13 2010, 15:05
|
|
|
|
|
Oct 14 2010, 05:54
|
Участник

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

|
Плата Terasic DE0. У меня как раз 10 версия)
|
|
|
|
|
Oct 16 2010, 15:49
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|