Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: malloc после сброса памяти не дает
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
alexPec
Всем доброго дня. Всречался ли кто с таким: загружаю ниос проц через debug as hardware или run as hardware - все работает. Нажимаю ресет (ресет процессора) - простая тестовая программа выполняется сначала, в jtаg uart шлет результаты, а на экране нет ничего. Начал разбираться - вот такая простая строчка

display = (alt_video_display*) malloc (sizeof(alt_video_display));

возвращает 0. Это первое динамическое выделение памяти в программе. sizeof(alt_video_display) при этом равно 0x38.

Программа на базе hello world small.

Heap располагается во внешней памяти, остальное - в он-чип рам. Думал память внешняя как-то после сброса отваливается - нет, до этой строчки тест памяти проходит нормально, о чем репортирует в jtag uart.

Ступор! Даже не знаю что подумать...
fars
ну значит памяти мало. Я Альтеру не знаю, но по аналогии с Микроблейзом:

1) проверь девствительно НИОС работает с внешней РАМой, попросту записав прочитав что нибудь из памяти и отправивши результаты в уарт.

2)можно попробывать выделить РАМ на ПЛИСЕ без внешней и посмотреть ли работает с ней
Maverick
Цитата(alexPec @ Oct 16 2010, 22:35) *
Всем доброго дня. Всречался ли кто с таким: загружаю ниос проц через debug as hardware или run as hardware - все работает. Нажимаю ресет (ресет процессора) - простая тестовая программа выполняется сначала, в jtаg uart шлет результаты, а на экране нет ничего. Начал разбираться - вот такая простая строчка

display = (alt_video_display*) malloc (sizeof(alt_video_display));

возвращает 0. Это первое динамическое выделение памяти в программе. sizeof(alt_video_display) при этом равно 0x38.

Программа на базе hello world small.

Heap располагается во внешней памяти, остальное - в он-чип рам. Думал память внешняя как-то после сброса отваливается - нет, до этой строчки тест памяти проходит нормально, о чем репортирует в jtag uart.

Ступор! Даже не знаю что подумать...

В окне Гипертерминала видели надпись "hello world", когда производили первый запуск процессора?
alexPec
Цитата(fars @ Oct 17 2010, 14:07) *
ну значит памяти мало. Я Альтеру не знаю, но по аналогии с Микроблейзом:

1) проверь девствительно НИОС работает с внешней РАМой, попросту записав прочитав что нибудь из памяти и отправивши результаты в уарт.

2)можно попробывать выделить РАМ на ПЛИСЕ без внешней и посмотреть ли работает с ней


А как мало-то? До сброса значит хватает, а после сброса мало? Да и не может ее мало быть - там 500 кбайт, а мне всего надо 156 кбайт, а он даже 0x38 байт не дает (повторюсь, это ПЕРВОЕ выделение памяти размером 0x38 байт).

Память точно работает, прямо перед этим тест провожу - пишу и читаю, все ОК. На плисе столько памяти нет сколько через хип выделяется из внешней.


Цитата
В окне Гипертерминала видели надпись "hello world", когда производили первый запуск процессора?


И когда первый запуск, и после ресета - сначала надпись в окне терминала Hello wworld small, затем - Test RAM ok - это о том что с внешней памятью все в порядке.
vadimuzzz
что-то вы еще не рассказали. вот пример, проверил: выделение памяти работает после сброса нормально.
Код
#include "sys/alt_stdio.h"
#include <stdlib.h>
#include "alt_types.h"
#include "io.h"

int main()
{  
    alt_putstr("Hello from Nios II!\n");
    alt_u32 *sram_ptr = malloc(256);
    if (!sram_ptr)
        alt_putstr("Couldn't allocate memory!\n");
    else
    {
        alt_putstr("Memory allocated successfully!\n");
        alt_printf("sram_ptr is 0x%x\n",sram_ptr);
        alt_printf("writing in sram 0x11223344\n");
        IOWR(sram_ptr,0,0x11223344);
        alt_printf("sram content is 0x%x\n",IORD(sram_ptr,0));
    }    
    if (sram_ptr)
        free(sram_ptr);
    /* Event loop never exits. */
    while (1);
    return 0;
}

проверял на стартер-ките. если надо, могу выложить проект целиком.
alexPec
Тогда еще раз, ОООчень внимательно посмотрю, тайм-аут. "Чапай думать будет" (С)
alexPec
Посмотрел, у меня был тест памяти до выделения, видимо что-то портилось там. Убрал тест. Щас память выделяет после сброса, но каждый раз новую, т.е. думает что старая выделенная память (до сброса!) нужна. В итоге после 3-х сбросов память кончается и он все равно ее не дает. Как это ему объяснить что после сброса надо забыть про все выделенные массивы heap'а??? Повторюсь, во внешней памяти располагается только heap, все остальное - в onchip. Подскажите люди добрые!
vadimuzzz
что-то у вас в железе неправильно. я так думаю как раз с сигналом ресета. в аттаче проект на котором работает код, приведенный выше. описанного вами эффекта не наблюдаю: после сброса адрес всегда одинаковый.
alexPec
Плюнул на это. Залил в EPCS прошивку и программу. Все запускается. Сбрасывай хоть мильён раз - проц работает (именно сброс ниоса, а не переконфигурация). В чем дело - непонятно 07.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.