c++ - Contiki 中的内存溢出

标签 c++ c contiki cooja

我正在开发一个需要 msp430 数学函数的应用程序。使用 powf、sqrt 等函数时,会发生内存溢出 (ROM)。一个这样的例子是,当我使用这个 float i 变量而不使用静态时,我的代码可以工作。 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,但这可能会导致系统不稳定。还有其他有效处理内存溢出的建议吗?

可以遵循什么方法来有效地管理嵌入式系统中的内存。

最佳答案

在第一种情况下,符号 i 是局部的(在函数的堆栈帧上),因此编译器能够优化函数调用并计算 powf 的值(10, 2.1) 在编译时。在第二种情况下,符号 i 在函数外定义。

优化器看不到它没有被主进程外部的一些其他代码修改。因此它不会优化 powf ,您最终会尝试链接浮点功能。由于 msp430 在硬件中不支持浮点,因此链接器最终会尝试向可执行文件中添加大量二进制代码。可执行文件太大,链接失败。

升级编译器并不能神奇地解决问题。你需要释放一些内存。遵循 Contiki 配置指南:https://github.com/contiki-os/contiki/wiki/Reducing-Contiki-OS-firmware-size

关于c++ - Contiki 中的内存溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55702462/

相关文章:

Contiki 操作系统 : How to read from GIO pin of SKY-mote

c++ - 在 Visual Studio 6.0 中使用 WinHTTP

c++ - 如何获取最近添加到 qlistwidget 中的行

c - 并非每个单元格都已填充时打印数组

c - 为什么在我包含 stdio.h 时没有声明 "gets()"函数?

c - 在 OCaml 库中只运行一次代码

RTIMER_NOW() 和 clock_time() 之间的 Contiki 区别

c - RAM 和 ROM 使用情况

c++ - 确保内存映射页在内存中

c++ - 图案打印——我在这段 C++ 代码中哪里出错了?