Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Тест памяти
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Alexashka
Добрый день!
Подскажите какой-нибудь несложный тест для SDRAM (DDR, 16 бит).
Гдето тут на форуме попадался довольно простой тест из нескольких этапов с различными паттернами, но к сожалению, найти его не могу.
Программа работает нормально на одной плате и зависает (вылетает в аборт) на другой. Контроллер и память там и там одинаковая. Есть подозрение, что виснет при доступе к DDR. Пробовал записывать чтото типа счетчика и после этого сверять -результата не дало. Нужно чтото более "агрессивное".
hd44780
Видел такое в старые добрые времена в книжках про К580. Автор был Григорьев, инициалы кажется В.Г.
Только книжки за давностью лет все давно в макулатуре sad.gif .
Ещё один автор был - Майоров. Инициалов не помню. Книжки тоже про аспекты построения систем на K580.
AHTOXA
memtest? sm.gif
haker_fox
QUOTE (AHTOXA @ Oct 10 2012, 02:25) *

Вот только там, как я понял, нужно знать структуру памяти: как там ячейки расположены... Другими словами, то, что идет для SRAM, не пойдет для SDRAM...
Alexashka
Скачал простенький тест с сайта bipom.com
Код
/*******************************************************************************
;
;    This module is presented here only to serve as a sample for
;    AT91SAM9260 program development.
;    BiPOM Electronics provides this module as is and
;    does not guarantee its functionality or suitability for a particular purpose.
;    Please e-mail any questions and suggestions to tech@bipom.com
;
;    Module: mmarm9_sdram.c
;
;    Revision: 1.01
;
;    Description:    The example allows to check all 64-MByte SDRAM on Mini-Max/ARM9
;                    Target processor: AT91SAM9260    
;
;    This program is written using GNU ARM Compiler (www.gnuarm.org)
;
********************************************************************************
*/
#include "Bootstrap/include/part.h"
#include "Bootstrap/include/main.h"
#include "Bootstrap/include/debug.h"
#include "Bootstrap/include/dataflash.h"
#include "mmarm9_hw_init.h"
//
#include "mmarm9_sdram.h"
//
void TestValue_SDRAM(unsigned long value,unsigned long test)
{
    unsigned long *ptSDRAM;
    unsigned long ndx;
    unsigned char flag=0;
    unsigned long memStart = 0x20000000;    /* SDRAM starts here */    
    unsigned long memSize = (16*1024*1024); /* 16x4=64-MByte SDRAM */
    char testStr[3];
    //
    testStr[0]=test+'0';
    testStr[1]=' ';
    testStr[2]=0;
    dbg_print("\n\rTEST");
    dbg_print(testStr);
    //
    ptSDRAM=(unsigned long*)memStart;
    for(ndx=memStart;ndx<memStart+memSize;ndx++)
    {
        // Special tests 5,6
        if(test == 5) value = ndx;
        if(test == 6) value = ((ndx & 0xFFFF)<<16)|(ndx & 0xFFFF);
        if(test == 7) value = ((ndx & 0xFFFF)<<16);
        if(test == 8) value = (ndx & 0xFFFF);
        //
        *ptSDRAM++=value;
    }
    //
    ptSDRAM=(unsigned long*)memStart;
    for (ndx=memStart;ndx<memStart+memSize;ndx++)
    {
        // Special tests 5,6
        if(test == 5) value = ndx;
        if(test == 6) value = ((ndx & 0xFFFF)<<16)|(ndx & 0xFFFF);
        if(test == 7) value = ((ndx & 0xFFFF)<<16);
        if(test == 8) value = (ndx & 0xFFFF);
        //
         if((*ptSDRAM++)!=value)    flag= 1;
    }
    //
    if( flag)    dbg_print("FAILED");
    else        dbg_print("PASSED");
}
//
int main(void)
{
    /* Hardware Initialization */
    hw_init();
    /* Download some code to process DF recovery feature */
    load_df(AT91C_SPI_PCS_DATAFLASH, IMG_ADDRESS, IMG_SIZE, JUMP_ADDR);
    /* Loop forever */
    while(1)
    {
        dbg_print("\n\rStart Mini-Max/ARM9 SAM9260 SDRAM test...");
        TestValue_SDRAM(0x00000000,1);
        TestValue_SDRAM(0xFFFFFFFF,2);
        TestValue_SDRAM(0xAAAAAAAA,3);
        TestValue_SDRAM(0x55555555,4);
        TestValue_SDRAM(0x00000000,5);
        TestValue_SDRAM(0x00000000,6);
        TestValue_SDRAM(0x00000000,7);
        TestValue_SDRAM(0x00000000,8);
        dbg_print("\n\rStop SDRAM test");
    }
}
/*EOF*/

Буду тестить...
Sergey_Aleksandrovi4
С год-назад была подобная проблема. Остановился на маршевом тестировании по алгоритму March C-. Всякие memtest, как удалось выяснить, используют подобные алгоритмы. Вот страница с телесистем http://telesys-ru.1gb.ru/wwwboards/mcontro...ges/11468.shtml.
Ещё вот такой труд "BIST Algorithm for Embedded-DRAM Cores" (в pdf) советую почитать.
Alexashka
Тесты ничего не выявили. Получается так, что зависание происходит если передаю в функцию данные, находящиеся в DDR памяти, если предварительно копирую их в СРАМ то все работает нормально. Похоже сбой происходи при работе DMA контроллера, когда программа и данные находятся в DDR, когда они в разных местах, то все Ок. Но почему это так - не могу понять.
Пробовал увеличивать тайминги настройки контроллера памяти -не помогает.
aaarrr
Тест вроде приведенного выше ничего и не выявит: одиночными записями и чтениями затруднительно создать должную нагрузку на подсистему памяти. Нужно работать через STM/LDM при включенном кэше данных. В особо тяжелых случаях привлечь на помощь DMA.
toweroff
Объясните, пожалуйста, такой момент.
В примере обращение к памяти происходит через этот указатель:
Код
    unsigned long *ptSDRAM;


почему? даже обращения к регистрам объявлены через volatile
Alexashka
Цитата(aaarrr @ Oct 16 2012, 12:50) *
Тест вроде приведенного выше ничего и не выявит: одиночными записями и чтениями затруднительно создать должную нагрузку на подсистему памяти. Нужно работать через STM/LDM при включенном кэше данных. В особо тяжелых случаях привлечь на помощь DMA.

Я как думал, ДМА может читать быстро, без простоев, значит проблема с таймингами, но почему тогда их увеличение ничего не дает. Кстати гдето был документик software DMA implementation, в нем вроде как раз SIMD инструкции использовались. Будет время попробую такой вариант.
И вот объясните, пожалуйста, как ведут себя контроллер ДМА и ядро когда первому нужно брать данные из памяти, а второму в этоже время - читать код из этой же памяти sm.gif
Помню както попадалась заметка про зависание (LPC2478? не помню уже подробности), когда видеобуфер, который выводится через ДМА и код находятся в одной памяти. С чем в такой ситуации связано зависание? Может быть у меня чтото похожее происходит?
aaarrr
Цитата(Alexashka @ Oct 16 2012, 18:06) *
И вот объясните, пожалуйста, как ведут себя контроллер ДМА и ядро когда первому нужно брать данные из памяти, а второму в этоже время - читать код из этой же памяти sm.gif

Ведут в соответствии с приоритетами. У кого ниже, тот и будет ждать.

Цитата(Alexashka @ Oct 16 2012, 18:06) *
Помню както попадалась заметка про зависание (LPC2478? не помню уже подробности), когда видеобуфер, который выводится через ДМА и код находятся в одной памяти. С чем в такой ситуации связано зависание? Может быть у меня чтото похожее происходит?

Не помню тем, где обсуждались бы проблемы с зависанием LPC2478 при работе с видеобуфером. Вот "картинка ломается" - это сколько угодно.
Alexashka
Не померещилось значит rolleyes.gif
Цитата
Поменял приоритеты, теперь виснет произвольно процессор. Ставил приоритет дисплея равным приоритету процессора, чуть ниже процессора, на дисплее мусор...

А тема-то свежая совсем sm.gif
Непонятно только вывод то какой...У ТС случилось чудо и все заработало, а мне че делать? К фее обратиться?
ЗЫ. А у меня она (программа) сегодня тоже заработала когда я пытался глюк этот отловить. Как я ее не гонял, глюк так и не появился. И JTAGa нет, грустно((
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.