Переполнение памяти в Contiki - PullRequest
1 голос
/ 16 апреля 2019

Я работаю над приложением, которое требует msp430 математических функций.При использовании таких функций, как powf, sqrt и т. Д. Происходит переполнение памяти (ПЗУ).Одним из таких случаев является то, что мой код работает, когда я использую эту переменную float i без использования static.enter image description here

#include "contiki.h"

#include <stdio.h> /* For printf() */
#include <math.h>
#define DEBUG DEBUG_NONE
/*---------------------------------------------------------------------------*/
PROCESS(hello_world_process, "Hello world process");
AUTOSTART_PROCESSES(&hello_world_process);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(hello_world_process, ev, data)
{
  PROCESS_BEGIN();
  float i;
  i = 2.1;
  printf("Hello, world\n");
  printf("%i\n", (int)powf(10,i));
  PROCESS_END();
}
/*---------------------------------------------------------------------------*/

Однако во втором случае это не работает ...

#include "contiki.h"

#include <stdio.h> /* For printf() */
#include <math.h>
#define DEBUG DEBUG_NONE
static float i;
/*---------------------------------------------------------------------------*/
PROCESS(hello_world_process, "Hello world process");
AUTOSTART_PROCESSES(&hello_world_process);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(hello_world_process, ev, data)
{
  PROCESS_BEGIN();
  i = 2.1;
  printf("Hello, world\n");
  printf("%i\n", (int)powf(10,i));
  PROCESS_END();
}
/*---------------------------------------------------------------------------*/

Предлагаемый ответ - обновить msp430-gcc, но этоможет привести к нестабильности системы.Любые другие предложения для эффективной обработки переполнения памяти?

Какая методология может использоваться для эффективного управления памятью во встроенных системах.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

В первом случае символ i является локальным (в кадре стека функции), поэтому компилятор может оптимизировать вызов функции и вычислить значение powf(10, 2.1) во время компиляции.Во втором случае символ i определен вне функции.

Оптимизатору не удается увидеть, что он не модифицируется каким-либо другим кодом, внешним по отношению к основному процессу.Следовательно, он не оптимизирует powf, и в итоге вы пытаетесь связать объекты с плавающей запятой.Так как msp430 не поддерживает аппаратное обеспечение с плавающей запятой, компоновщик пытается добавить много двоичного кода в исполняемый файл.Исполняемый файл становится слишком большим, и соединение не удается.

Обновление компилятора не решит проблему магическим образом.Вам нужно освободить память.Следуйте рекомендациям по настройке Contiki: https://github.com/contiki-os/contiki/wiki/Reducing-Contiki-OS-firmware-size

0 голосов
/ 17 апреля 2019

Если вам нужно сэкономить ОЗУ, вы можете подумать о сокращении:

QUEUEBUF_CONF_NUM: количество пакетов в очереди канального уровня. 4, вероятно, является нижней границей для разумной работы. По мере увеличения нагрузки на транспорт, например, более частый трафик или большие дейтаграммы, вам нужно будет увеличить этот параметр.

NBR_TABLE_CONF_MAX_NEIGHBORS: количество записей в соседней таблице. Значение, превышающее максимальную плотность сети, является безопасным. Также будет работать значение ниже этого, поскольку таблица соседей будет автоматически фокусироваться на соответствующих соседях. Но слишком низкие значения приведут к снижению производительности.

NETSTACK_MAX_ROUTE_ENTRIES: количество записей маршрутизации, т. Е. В режиме без сохранения RPL, количество ссылок в графе маршрутизации и в режиме хранения, количество элементов таблицы маршрутизации. В корне сети это должно быть установлено на максимальный размер сети. В режиме без хранения другие узлы могут установить этот параметр равным 0. В режиме хранения рекомендуется, чтобы все узлы также предоставляли достаточное количество записей для каждого узла в сети. UIP_CONF_BUFFER_SIZE: размер буфера IPv6. Минимальное значение для функциональной совместимости составляет 1280. В закрытых системах, где не используются большие датаграммы, понижаем это значение, например, до. 140 может быть разумным.

SICSLOWPAN_CONF_FRAG: Включает / отключает фрагментацию 6LoWPAN. Отключите это, если весь ваш трафик соответствует одному пакету канального уровня. Обратите внимание, что это также сохранит некоторые важные ПЗУ. Если вам нужно сохранить ROM, вы можете рассмотреть следующие вопросы:

UIP_CONF_TCP: включает / отключает TCP. Убедитесь, что это отключено, когда TCP не используется.

UIP_CONF_UDP: включает / отключает UDP. Убедитесь, что это отключено, когда UDP не используется.

SICSLOWPAN_CONF_FRAG: как упомянуто выше. Отключить, если фрагментация не требуется.

LOG_CONF_LEVEL_ *: журналы занимают большое количество ПЗУ. Уменьшите уровни журнала, чтобы сохранить еще немного.

Существует много других параметров, которые влияют на использование ОЗУ / ПЗУ. Вы можете проверить os / contiki-default-conf.h, а также специфичные для платформы файлы contiki-conf.h для вдохновения. Или используйте .flashprof и .ramprof для определения горячих точек.

* Ответ на вики Contiki в Tutorial: использование RAM и ROM Георг Ойконому

...