Как мне написать в память? - PullRequest
3 голосов
/ 26 марта 2012

Я пытаюсь написать простой тест для оперативной памяти, чтобы проверить основную целостность памяти на борту встроенного устройства.Вот что я хочу сделать:

По существу запишите определенные шаблоны: «10101010101010» в блок памяти, затем напишите «01010101010», затем переписайте первый и проверьте, чтобы проверить, является ли шаблонбыло написано правильно.

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

Могу ли я просто выделить блок памяти, а затем написать что-то вроде

uint32 pattern = 0xaaaaaaaa;
uint32 * mem_loc = malloc some memory;
int i = 0;
int offset = 1; 
uint32 * location = &mem_loc;

while ((&mem_loc)++ && (!i))  {
   &mem_loc = pattern;
   if (!(&(mem_loc+offet))) { 
      mem_loc = location;
      pattern = 0x55555555;
      i++;
   }
}

//Check to see if values written are consistent

Будет ли работать код выше ??Будет ли запись шестнадцатеричных шаблонов в память включать биты в шаблоне?

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

Спасибо

Ответы [ 3 ]

3 голосов
/ 26 марта 2012

У вас проблемы с курицей и яйцом.Чтобы получить достаточно кода для выполнения malloc или даже для использования кода на C, у вас уже есть рабочая память.

Вам необходимо определить свою проблему.Например, это проверка проекта или производственные испытания?Вы тестируете сам чип памяти или плату.Обычно вы покупаете рабочие / проверенные чипы (память) или чипы памяти, которые имеют качество, определенное поставщиком.И ваши испытания часто производственные испытания, точки производства пайкиСтроки данных, адресные строки, контрольные строки.

Проблема курицы и яйца заключается в том, что вы хотите запустить программное обеспечение на встроенном процессоре, для которого требуется код, который выполняется где-то, а это подразумевает память (может быть только флэш-памятью и не требует какой-либо или минимальной).идеальная ситуация - либо полностью исчерпать ресурс, используя только ресурсы процессора или только ресурсы внутреннего чипа, но без внешнего плунжера, чтобы можно было полностью протестировать внешний плунжер.Каждая адресная строка и т. Д. В противном случае вам нужно придумать схему или объявить куски памяти, которые не будут проверены.

Или, используя многоступенчатый подход, загрузочный код rom может быстро проверить небольшую часть оперативной памяти, не используя его для запуска.Затем скопируйте основную тестовую программу в этот маленький кусок памяти и запустите ее.Затем выполните основные тесты памяти с большей гибкостью кода.Можно использовать C вместо ассемблера, например.Вы можете, например, предварительно проверить, супер простой тест, 25% от оперативной памяти, затем скопировать тест там, проверить остальные 75%, затем переместить программу на другие 25% в памяти оперативной памяти и выполнить тяжелый тест на первом25%, которые не прошли полный тест.

Типы тестов, вам необходимо понять сбои, вы можете проверить паяные соединения, в частности, и следы на печатной плате.Таким образом, вы можете иметь открытые соединения, чтобы вы могли сделать каждый вывод единичным и нулевым, также вы можете иметь шорты, которые покрывают один и ноль, и у вас могут быть «дружественные биты», где соседние выводы могут иметь короткое замыкание друг к другупоэтому вы хотите, чтобы каждая пара сигналов отличалась друг от друга.

Часто люди проводят такие же тесты, как все, все нули, 5 с, As.Затем проверяет шахматную доску, где одна ячейка памяти имеет, скажем, 5 с, а другая - как.для тестирования адресной строки вам нужно использовать не степени двух, или даже лучше, каждая ячейка памяти в памяти имеет свое значение, например, 32-битные слова, каждое из которых получает свой адрес.

В качестве быстрого теста я рассмотрюбольшая часть этого в нескольких тестах, если вы используете псевдослучайный элемент, что-то повторяемое, например lfsr, один проход, чтобы заполнить всю память с помощью рандомизатора, выполнить повторное заполнение, вернуться назад и проверить.затем повторите процедуру и заполните инвертированными значениями, заново заполните и проверьте инвертированные значения.Вы получаете адресные биты, проверяются все строки данных, но не все соседи.повторный посев и начало всего этого по перемещению случайного образца вокруг может покрыть это.иногда просто используя случайный тест в качестве теста адреса и традиционные нули, по пять, как, 3s, Cs, 6s, 9s и т. д.

настолько, насколько вам нужен указатель на тестируемую память, вы просто не используете malloc.знать физический адрес и, если таковые имеются, заниматься переводом, чтобы в случае возникновения проблем вы общались по физическим адресам.Также вы знаете и контролируете, сколько памяти.Обычно я пишу тесты на основе процессора в C, но не буду использовать какие-либо вызовы библиотеки C (например, malloc или printf или что-то в этом роде).

2 голосов
/ 26 марта 2012

Повторяю ответ Мартина: вы не хотите использовать стандартные библиотечные вызовы для предоставления памяти для тестирования.

Ваш встроенный инструментарий должен иметь возможность создавать карту памяти вашего приложения.Вам нужно идентифицировать сегменты памяти, которые вы хотите протестировать, и извлечь их начальный адрес из файла карты.

Тестовый цикл может выглядеть примерно так:

 const int* AddressToTest = MEM_SEGMENT;
 const int* SegLength     = SEGMENT_LENGTH;
 volatile int* mem;
 for (mem = AddressToTest; mem < AddressToTest + SegLength; mem++)
 {
    *mem = PATTERN;
    if (*mem != PATTERN) {report("Read-Write Failure at %x",mem);}
 }
 //-or- you could separate the write and verify into 2 separate loops.

Большая ошибка здесьчто вы не можете проверить сегмент, с которого вы работаете, поэтому вам нужно тщательно планировать.У встроенных инструментов должен быть какой-то файл параметров компоновщика (и / или компилятор #pragmas), который контролирует, какой код использует какую память.Поэтому вам нужно настроить тестовый код так, чтобы он выполнялся не в тестируемой памяти, а в другом месте.

0 голосов
/ 26 марта 2012

Хотите использовать new?
Если вы пытаетесь протестировать определенные области памяти встроенной системы, не хотите ли вы установить этот адрес напрямую, а не полагаться на то, что дает new?

Если эта встроенная система действительно встроена в Linux или Windows, или в какую-либо другую сложную ОС, то, возможно, сложнее будет иметь адресные пространства памяти для различных процессов, кэшей, оптимистичного распределения.

...