реклама на сайте
подробности

 
 
> Microblaze, виснет при работы со SRAM, 8-битное чтение работает, на 16/32 повисает
AVR
сообщение Jun 11 2013, 11:36
Сообщение #1


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Имеется Microblaze из состава ISE 14.4.
К процессору подключена асинхронная SRAM 512 Кбайт, интерфейс - 8ми битный.

Когда я делаю test_sram_8bit - всё отлично. Когда попытка обратиться к 16-ти битам - сразу повисает и код разумеется тем более не работает.

В чем может быть хотя бы отдаленно проблема? Пробовал и с кэшами и без кэш-памяти - результат один: память вроде и работает, а по сути нет.

Память 10 нс (100 МГц), процессор тоже на этой частоте, шина AXI - тоже. Смотрю даташит - вроде контроллер целиком на логике, а значит реально частота еще меньше, ибо делится там у себя на циклы. Не должно быть такой проблемы.

Попробовал добавить xil_printf между записью и чтением - стало работать. Значит надо тайминги корректировать, ибо исполнение кода нужно...

Код
#include <stdio.h>
#include "xparameters.h"

void test_sram_8bit(int off)
{
    int max = 0;
    unsigned char *p = (unsigned char*) XPAR_AXI_EMC_0_S_AXI_MEM0_BASEADDR;
    for(int i = 0; i < 10E9; i++)
    {
//        xil_printf("8bit = %d\n\r", i);
        unsigned int v = (i + off) % 0xFF;
        p[i] = v;
        if(v != p[i])
        {
            max = i;
            break;
        }
    }
    xil_printf("SRAM %d Kbytes (%d bytes)\n\r", max / 1024, max);
}

void test_sram_16bit(int off)
{
    int max = 0;
    unsigned short *p = (unsigned short*) XPAR_AXI_EMC_0_S_AXI_MEM0_BASEADDR;
    for(int i = 0; i < 10E9; i++)
    {
        xil_printf("16bit= %d\n\r", i);
        unsigned short v = (i + off) % 0xFFFF;
        p[i] = v;
        if(v != p[i])
        {
            max = i;
            break;
        }
    }
    xil_printf("SRAM %d Kbytes (%d bytes)\n\r", max / 512, max * 2);
}

int main()
{
    int test = 0;
    while(true)
    {
        xil_printf("test %d\n\r", test++);
        test_sram_8bit(test);
        test_sram_16bit(test);
    }
    return 0;
}


Результат работы (вываливается в последовательный порт, вот что вижу):
Код
test 0
SRAM 512 Kbytes (524288 bytes)
16bit= 0


Тут видно что первый тест с 8-ми битным доступом проходит отлично, а 16-битным виснет намертво при первой же попытке. Соответственно я не могу исполнять свой код из SRAM - виснет на первой же инструкции.

З.Ы.
При подключении DDR2 как внешней памяти - всё было отлично, а ведь это сложнее...


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Jun 25 2013, 10:09
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Вот только что до меня дошло. Что дело не в СРАМе.

У меня тоже виснет или ресетиться микроблайз. Причем я не могу понять причин, один и тот же код, то работает, то не работает. Иногда один и тот же вечером не работает, а с утра работает.

Иногда влияют изменения. К примеру если я добавляют в функцию строку с выводом на порт данных, при это не вызываю эту функцию, проц виснет, комментирую эту строку, работает. Возвращаю эту строку, убираю следующую с выводом, опять работает. И это все при том что я не вызываю эту функцию. Проходит всю инициализацию, прекрасно пишет все на порт, доходит до главного цикла и падает...

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

Если кто скажет как можно понять что происходит, будет здорово.
Go to the top of the page
 
+Quote Post
Corvus
сообщение Jun 25 2013, 15:04
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 24-04-08
Из: Зеленоград
Пользователь №: 37 056



Цитата(Golikov A. @ Jun 25 2013, 14:09) *
Если кто скажет как можно понять что происходит, будет здорово.


Вот зависаний у меня никогда не было. Только программные.
А вот всё остальное - нормальная ситуация. Списываю это на глюки SDK и кривого режима дебага. Это нормально для Xilinx. wink.gif Где-то не скомпилилось после изменения. Рекомендую перед каждой компиляцией делать очистку проекта, а перед запуском дебага переконфигурировать ПЛИС. Несколько снижает процент багов.

Например, есть известная проблема - после ресета инициализация lwip проходит с ошибкой
http://forums.xilinx.com/t5/Embedded-Devel...lem/td-p/118770
на оф. форуме несколько веток и хитрый финт с увеличением стека, правда, помогает не всем. Вот уже месяц бодаюсь с техподдержкой, и пока без результата.

А плату у вас самодельная или готовый кит?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 20:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016