Как я могу визуализировать память (SRAM) использование программы AVR?

  1. Разделите ваши данные на K непересекающихся сгибов. Пусть каждый сгиб K содержит одинаковое количество предметов из каждого из m классов (многослойная перекрестная проверка; если у вас есть 100 предметов из класса A и 50 из класса B, и вы делаете 2-кратную проверку, каждая складка должна содержать случайные 50 предметов из А и 25 из В).

    1. Для i в 1..k:

      • Обозначить сгиб в тестовом сгибе
      • Указать один из оставшихся k-1 сгибов проверки Свернуть (это может быть случайным или функцией i, на самом деле не имеет значения)
      • Укажите все оставшиеся сгибы тренировочной складки
      • Выполните поиск по сетке для всех свободных параметров (например, скорость обучения, количество нейронов в скрытом слое, обучение вашим данным обучения и вычислительные потери ваших данных проверки. Выберите параметры, минимизирующие потери
      • Используйте классификатор с параметрами выигрыша для оценки потерь при тестировании. Накопление результатов

Теперь вы собрали совокупные результаты по всем сгибам. Это ваше последнее выступление. Если вы собираетесь применить это по-настоящему, в дикой природе, используйте лучшие параметры из сетки поиска, чтобы тренироваться на всех данных.

19
задан Matthew Murdoch 1 September 2009 в 10:18
поделиться

7 ответов

Вы говорите, что malloc не работает и возвращает NULL:

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

Следует иметь в виду два сценария:

a: у вас есть куча размером 16 КБ, вы уже выполнили маллокирование 10 КБ и пытаетесь выполнить malloc еще 10 КБ. Ваша куча слишком мала.

b: Чаще всего у вас есть куча 16 КБ, вы выполняете кучу вызовов malloc / free / realloc, и ваша куча заполнена менее чем на 50%: вы вызываете malloc для 1K, и он НЕ РАБОТАЕТ - в чем дело? Ответ - свободное пространство в куче фрагментировано - нет непрерывных 1 КБ свободной памяти, которую можно вернуть. C Менеджеры кучи не могут сжать кучу, когда это происходит, поэтому вы обычно в плохом состоянии. Есть методы, позволяющие избежать фрагментации, но сложно понять, действительно ли это проблема. Вам нужно будет добавить прокладки протоколирования в malloc и free, чтобы вы могли понять, какие операции с динамической памятью выполняются.

РЕДАКТИРОВАТЬ:

Вы говорите, что все ошибки выполняются при запуске, поэтому фрагментация не является проблемой проблема.

В этом случае будет легко заменить динамическое размещение статическим.

пример старого кода:

char *buffer;

void init()
{
  buffer = malloc(BUFFSIZE);
}

новый код:

char buffer[BUFFSIZE];

После того, как вы сделали это повсюду, ваш ЛИНКЕР должен вас предупредить если все не умещается в доступной памяти. Не забудьте уменьшить размер кучи, но помните, что некоторые системные функции времени выполнения io могут по-прежнему использовать кучу, поэтому вы не сможете полностью удалить ее.

Сложно понять, действительно ли это проблема. Вам нужно будет добавить прокладки протоколирования в malloc и free, чтобы вы могли понять, какие операции с динамической памятью выполняются.

РЕДАКТИРОВАТЬ:

Вы говорите, что все ошибки выполняются при запуске, поэтому фрагментация не является проблемой проблема.

В этом случае будет легко заменить динамическое размещение статическим.

пример старого кода:

char *buffer;

void init()
{
  buffer = malloc(BUFFSIZE);
}

новый код:

char buffer[BUFFSIZE];

После того, как вы сделали это повсюду, ваш ЛИНКЕР должен вас предупредить если все не умещается в доступной памяти. Не забудьте уменьшить размер кучи, но помните, что некоторые системные функции времени выполнения io могут по-прежнему использовать кучу, поэтому вы не сможете полностью удалить ее.

Сложно понять, действительно ли это проблема. Вам нужно будет добавить прокладки протоколирования в malloc и free, чтобы вы могли понять, какие операции с динамической памятью выполняются.

РЕДАКТИРОВАТЬ:

Вы говорите, что все ошибки выполняются при запуске, поэтому фрагментация не является проблемой проблема.

В этом случае будет легко заменить динамическое размещение статическим.

пример старого кода:

char *buffer;

void init()
{
  buffer = malloc(BUFFSIZE);
}

новый код:

char buffer[BUFFSIZE];

После того, как вы сделали это повсюду, ваш ЛИНКЕР должен вас предупредить если все не умещается в доступной памяти. Не забудьте уменьшить размер кучи, но помните, что некоторые системные функции времени выполнения io могут по-прежнему использовать кучу, поэтому вы не сможете полностью удалить ее.

РЕДАКТИРОВАТЬ:

Вы говорите, что все ошибки выполняются при запуске, поэтому фрагментация не является проблемой.

В этом случае должно быть легко заменить динамическое распределение статическим.

старый пример кода:

char *buffer;

void init()
{
  buffer = malloc(BUFFSIZE);
}

новый код:

char buffer[BUFFSIZE];

После того, как вы сделали это повсюду, ваш ЛИНКЕР должен предупредить вас, если все не умещается в доступной памяти. Не забудьте уменьшить размер кучи, но помните, что некоторые системные функции времени выполнения io могут по-прежнему использовать кучу, поэтому вы не сможете полностью удалить ее.

РЕДАКТИРОВАТЬ:

Вы говорите, что все ошибки выполняются при запуске, поэтому фрагментация не является проблемой.

В этом случае должно быть легко заменить динамическое распределение статическим.

старый пример кода:

char *buffer;

void init()
{
  buffer = malloc(BUFFSIZE);
}

новый код:

char buffer[BUFFSIZE];

После того, как вы сделали это повсюду, ваш ЛИНКЕР должен предупредить вас, если все не умещается в доступной памяти. Не забудьте уменьшить размер кучи, но помните, что некоторые системные функции времени выполнения io могут по-прежнему использовать кучу, поэтому вы не сможете полностью удалить ее.

11
ответ дан 30 November 2019 в 03:20
поделиться

​​Обычным подходом было бы заполнить память известным шаблоном и затем проверить, какие области были перезаписаны.

3
ответ дан 30 November 2019 в 03:20
поделиться

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

Один из методов - заполнить большую часть области стека известным шаблоном (например, 0x55) при запуске. Обычно это делается с помощью небольшого фрагмента кода на ранней стадии выполнения программного обеспечения, либо в самом начале main (), либо, возможно, даже до того, как main () запускается в коде запуска. Конечно, будьте осторожны, чтобы не перезаписать небольшой объем используемого стека в этот момент. Затем, поработав некоторое время с программой, проверьте содержимое стека и посмотрите, где 0x55 все еще не поврежден. То, как вы «проверяете», зависит от вашего целевого оборудования. Предполагая, что у вас подключен отладчик, вы можете просто остановить работу микроконтроллера и прочитать данные из памяти.

Если у вас есть отладчик, который может выполнять точку останова при доступе к памяти (немного более причудливую, чем обычная точка останова на выполнение), тогда вы может установить точку останова в определенном месте стека - например, на самом дальнем пределе пространства стека. Это может быть чрезвычайно полезно, поскольку также показывает, какой именно фрагмент кода выполняется, когда он достигает такой степени использования стека. Но для этого требуется, чтобы ваш отладчик поддерживал функцию точки останова при доступе к памяти, и ее часто не найти в отладчиках «младшего класса».

Если вы также используете кучу,

2
ответ дан 30 November 2019 в 03:20
поделиться

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

0
ответ дан 30 November 2019 в 03:20
поделиться

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

2
ответ дан 30 November 2019 в 03:20
поделиться

Предполагая, что вы используете только один стек (то есть не RTOS или что-то еще) и что стек находится в конце памяти, увеличиваясь вниз, в то время как куча начинается после BSS / DATA регион, взросление. Я видел реализации malloc, которые фактически проверяют указатель стека и терпят неудачу при столкновении. Вы можете попробовать это сделать.

Если вы не можете адаптировать код malloc, вы можете поместить свой стек в начало памяти (используя файл компоновщика). В общем, всегда полезно знать / определять максимальный размер стека. Если поставить его в начало, вы получите ошибку при чтении за пределами начала ОЗУ. Куча будет в конце и, вероятно, не сможет вырасти дальше конца, если это достойная реализация (вместо этого вернет NULL).

1
ответ дан 30 November 2019 в 03:20
поделиться

В Unix-подобных операционных системах библиотечная функция sbrk () с параметром 0 позволяет вам доступ к самому верхнему адресу динамически выделяемой памяти кучи. Возвращаемое значение - указатель void *, и его можно сравнить с адресом произвольной переменной, выделенной стеком.

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

Иногда операционная система имеет другие концепции для управления памятью (например, OS / 9) ), который помещает кучу и стек в разные сегменты свободной памяти. приложения заранее, чтобы позволить системе выделить сегменты памяти совпадающего размера.

0
ответ дан 30 November 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: