Перейти к содержанию
    

Nios 2, вывод символа в JTAG UART

Есть самый младший Altera Cyclone IV EP4CE6E22C8, в нем сидит Nios 2 и один общий контроллер памяти 16 Килобайт для всего: ПЗУ и ОЗУ. Есть там и JTAG UART, в настройках указано что вывод должен осуществляться в JTAG UART.

 

И есть простая программа:

#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "sys/alt_stdio.h"

int main()
{
    char leds = 0x01;
    int i = 0, n = 0;
    while(true)
    {
        IOWR_ALTERA_AVALON_PIO_DATA(GPIO_BASE, leds);
        for(i = 0; i < (ALT_CPU_CPU_FREQ / 25); i++);
        //alt_putchar('*');
        //alt_putchar('\n');
        //alt_putchar('\r');
        leds++;
        n++;
    }
    return 0;
}

 

Пока я не раскомментировал alt_putchar (а это самый легковесный вариант для печати символа, вроде) - всё запускается и работает, светодиоды мигают. Но с alt_putchar уже не хватает памяти.

 

Я попробую урезать кэши и еще что-нибудь, но есть ли возможность как-то низкоуровнево записать в регистр чтобы символ ASCII вывелся в JTAG UART, не задействуя alt_putchar?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стоит посмотреть в настройки проекта - могут быть подключены все подряд драйвера.

Там есть галочка reduced drivers или что-то такое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#include "altera_avalon_jtag_uart_regs.h"
#include "system.h"

int UartRead(char * data, int num){
  int n = 0;
  while (n < num){
    unsigned int d = IORD_ALTERA_AVALON_JTAG_UART_DATA(JTAG_UART_BASE);
    if (d & ALTERA_AVALON_JTAG_UART_DATA_RVALID_MSK) data[n++] = d;
    else break;
  }
  return n;
}

int UartWrite(char * data, int num){
  int n = 0;
  while (n < num){
    unsigned int d = IORD_ALTERA_AVALON_JTAG_UART_CONTROL(JTAG_UART_BASE);
    if (d & ALTERA_AVALON_JTAG_UART_CONTROL_WSPACE_MSK) IOWR_ALTERA_AVALON_JTAG_UART_DATA(JTAG_UART_BASE, data[n++]);
    else break;
  }
  return n;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#include "altera_avalon_jtag_uart_regs.h"
#include "system.h"
int UartRead(char * data, int num)
int UartWrite(char * data, int num){

Спасибо! Всё работает, всё поместилось! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Настройки BSP - в студию, пожалуйста.

"Hellp, World!" с выводом в UART прекрасно помещается в 4-6 kB (если не меньше, указанный объем - это уже с парой процедурок тестирования памяти).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Настройки BSP - в студию, пожалуйста.

В каком файле они содержатся?

 

Я рано радовался - оказалось что кроме той простейшей функции вывода в JTAG-UART - больше ничего и не помещается, а ведь мне надо еще несколько килобайт кода туда засовывать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В каком файле они содержатся?

 

Я рано радовался - оказалось что кроме той простейшей функции вывода в JTAG-UART - больше ничего и не помещается, а ведь мне надо еще несколько килобайт кода туда засовывать...

C++ отключили?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо попробовать, не отключал. Сильно кушает?

Конечно. Ещё это помогает.

post-18832-1462969722.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давайте сверим карты. Вы свой пример делаете на базе готового примера "Hello, World" Small ? Такое впечатление, что нет, поскольку все нужные настройки в нем уже сделаны, и размер для него получается маленький.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давайте сверим карты. Вы свой пример делаете на базе готового примера "Hello, World" Small ? Такое впечатление, что нет, поскольку все нужные настройки в нем уже сделаны, и размер для него получается маленький.

Не на базе него... Сделаю новый проект на базе этого small.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поисследуйте строение малых сих - будет очень полезно. Они вполне обозримы для новичка в Alter'овской NIOS-экосистеме. Я, например, довольно быстро прикрутил к Hello-Small копи-паст вариант упрощенного uart_printf (на базе alt_printf) - чтобы выводить HEX-ы с удобством. А в варианте MemoryTest-Small почему-то и полноценный printf() работал (хотя, вроде бы, не должен). Попробуйте, может он и в Hello-Small заведется. А нет - так можно помаленьку контролируемо что-то добавлять в проект.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечно. Ещё это помогает.

Вот это помогло!

Info: (test_led.elf) 2492 Bytes program size (code + initialized data).
Info:                13 KBytes free for stack + heap.

 

А еще, что меня удивило - BSP было скомпилено по дефлоту в режиме debug без оптимизаций, это не могло не сожрать всю память.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да вроде бы, Debug-вариант не настолько сильно толстеет. Я, когда экспериментировал с вышеописанным, только в Debug'е все и собирал - и размеры были те, что упоминались.

 

Чем все закончилось-то?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чем все закончилось-то?

Всё закончилось успешно, проект с лихвой влезает, я даже использую обычный printf и могу получать текст в среде Eclipse или отдельной программе nios2-terminal - для этого воспользовался BSP Editor для настройки stdout.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...