Jump to content

    

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?

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

#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;
}

 

Share this post


Link to post
Share on other sites
#include "altera_avalon_jtag_uart_regs.h"
#include "system.h"
int UartRead(char * data, int num)
int UartWrite(char * data, int num){

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
Настройки BSP - в студию, пожалуйста.

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

 

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

Share this post


Link to post
Share on other sites
В каком файле они содержатся?

 

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

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

Share this post


Link to post
Share on other sites
C++ отключили?

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

Share this post


Link to post
Share on other sites
Надо попробовать, не отключал. Сильно кушает?

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

post-18832-1462969722.png

Share this post


Link to post
Share on other sites

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

Share this post


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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Конечно. Ещё это помогает.

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

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites
Чем все закончилось-то?

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this