|
|
  |
Тест памяти, Подскажите простенький |
|
|
|
Oct 10 2012, 06:27
|

Практикующий маг
     
Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576

|
Скачал простенький тест с сайта 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*/ Буду тестить...
|
|
|
|
|
Oct 11 2012, 10:31
|
Частый гость
 
Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764

|
С год-назад была подобная проблема. Остановился на маршевом тестировании по алгоритму March C-. Всякие memtest, как удалось выяснить, используют подобные алгоритмы. Вот страница с телесистем http://telesys-ru.1gb.ru/wwwboards/mcontro...ges/11468.shtml. Ещё вот такой труд "BIST Algorithm for Embedded-DRAM Cores" (в pdf) советую почитать.
|
|
|
|
|
Oct 16 2012, 14:06
|

Практикующий маг
     
Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576

|
Цитата(aaarrr @ Oct 16 2012, 12:50)  Тест вроде приведенного выше ничего и не выявит: одиночными записями и чтениями затруднительно создать должную нагрузку на подсистему памяти. Нужно работать через STM/LDM при включенном кэше данных. В особо тяжелых случаях привлечь на помощь DMA. Я как думал, ДМА может читать быстро, без простоев, значит проблема с таймингами, но почему тогда их увеличение ничего не дает. Кстати гдето был документик software DMA implementation, в нем вроде как раз SIMD инструкции использовались. Будет время попробую такой вариант. И вот объясните, пожалуйста, как ведут себя контроллер ДМА и ядро когда первому нужно брать данные из памяти, а второму в этоже время - читать код из этой же памяти  Помню както попадалась заметка про зависание (LPC2478? не помню уже подробности), когда видеобуфер, который выводится через ДМА и код находятся в одной памяти. С чем в такой ситуации связано зависание? Может быть у меня чтото похожее происходит?
|
|
|
|
|
Oct 16 2012, 14:11
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

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

Практикующий маг
     
Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576

|
Не померещилось значит Цитата Поменял приоритеты, теперь виснет произвольно процессор. Ставил приоритет дисплея равным приоритету процессора, чуть ниже процессора, на дисплее мусор... А тема-то свежая совсем  Непонятно только вывод то какой...У ТС случилось чудо и все заработало, а мне че делать? К фее обратиться? ЗЫ. А у меня она (программа) сегодня тоже заработала когда я пытался глюк этот отловить. Как я ее не гонял, глюк так и не появился. И JTAGa нет, грустно((
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|