优化嵌入式编程的.hex 文件大小

问题描述 投票:0回答:3

目标平台:Teensy 3.1(微控制器)

IDE:代码块

当前工具链:GNU

当前 .cpp 文件大小:~ 3kb

当前 .hex 文件大小:~ 950kb

考虑到相应的 .cpp 仅 ~ 3kb,这个 .hex 文件大小似乎大得不合理,这正常吗?我知道 .hex 会更大,但是大 300 倍?哎呀。

程序在我的计算机上按预期编译和运行,所以没有问题。

除了使用 Arduino IDE 将一些简单的草图加载到 UNO 上之外,我几乎没有任何嵌入式编程经验,因此任何关于简化我的程序的指示将不胜感激。这个问题可以在 C++ 代码中解决吗?或者我可以实现另一个途径/工具链来解决这个问题吗?

参考代码:

#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>

using namespace std;

int main() {

double hidden_out = 0;
double netOutput = 0;
double bias2_out = 0;
double delta1 = 0;
double delta2 = 0;
double delta3 = 0;
double delta4 = 0;
double delta5 = 0;
double bias = 1;
double val = 0;

vector<double> neuron1_out;
vector<double> neuron2_out;
vector<double> neuron3_out;
vector<double> neuron4_out;
vector<double> weightVals;
vector<double> bias1_out;
vector<double> topology;
vector<double> inputs;

neuron1_out.clear();
neuron2_out.clear();
neuron3_out.clear();
neuron4_out.clear();
weightVals.clear();
bias1_out.clear();
topology.clear();
inputs.clear();

topology.push_back(4);
topology.push_back(8);
topology.push_back(1);

inputs.push_back(1);
inputs.push_back(0);
inputs.push_back(0);
inputs.push_back(1);

ifstream read("weights.txt");

while(read >> val) {

    weightVals.push_back(val);

};

for(int i = 0; i < topology.at(1); ++i) {

    int j = i + topology.at(1);
    int k = j + topology.at(1);
    int m = k + topology.at(1);
    int n = m + topology.at(1);

    delta1 = (inputs.at(0) * weightVals.at(i));
    neuron1_out.push_back(delta1);

    delta2 = (inputs.at(1) * weightVals.at(j));
    neuron2_out.push_back(delta2);

    delta3 = (inputs.at(2) * weightVals.at(k));
    neuron3_out.push_back(delta3);

    delta4 = (inputs.at(3) * weightVals.at(m));
    neuron4_out.push_back(delta4);

    delta5 = (bias * weightVals.at(n));
    bias1_out.push_back(delta5);

}

for(unsigned i = 0; i < topology.at(1); ++i) {

    hidden_out += (weightVals.at(40 + i) * tanh(neuron1_out.at(i) + neuron2_out.at(i) +
                                            neuron3_out.at(i) + neuron4_out.at(i) + bias1_out.at(i)));

}

bias2_out = (bias * weightVals.back());

netOutput = tanh(hidden_out + bias2_out);

cout << "The output of this network is: " << netOutput << endl;

return 0;

}

一些背景知识:

** 这部分对于回答我的问题并不重要**

此文件是我打算加载到 Teensy 上的神经网络 (NN) 程序的大规模精简版本。基本思想是,原始神经网络程序太大、太复杂,我们的 MC 无法及时处理。通过提取基于计算机的神经网络的权重并将其导入到上面的程序中,我们有效地削减了神经网络中与训练和错误处理相关的不必要部分,并仅保留“前馈”功能。不幸的是,这只将我的 .hex 文件整体大小从 ~ 1150kb 减少到 ~ 950kb。

c++ optimization embedded hex neural-network
3个回答
5
投票

首先,了解hex文件格式是二进制图像的ascii文本表示。每个十六进制记录包含每个二进制字节两个字符,加上记录类型、位置、长度和校验和数据;因此,实际的二进制图像大小将小于十六进制文件大小的一半。

您的工具链将创建(或至少可以选择创建)一个链接器映射文件,该文件将显示实际大小以及构成图像的所有组件。

源文件大小并不代表程序大小。在您的例子中,您包含了非常消耗内存的 STL 和 iostream 库代码,最好避免在非常受限的目标上使用。


1
投票

HEX 文件的大小是其代表的实际程序大小的 3 倍。

我的猜测大部分是浮点模拟库和C++支持。您可以查看地图文件以找出占用空间的内容。


1
投票

尝试使用 GCC 为 Cortex-M3 编译此代码(来自 https://launchpad.net/gcc-arm-embedded 的最新版本)

因为在裸机系统中我不支持iostream和filestream,所以我注释掉了

ifstream read
cout << ...

编译后的代码大约需要 9.5kbytes(十六进制文件大小 - 36k)。

尝试删除

ifstream
(您的主板上有功能齐全的文件系统吗?)。例如,从 static const 数组中读取值。

© www.soinside.com 2019 - 2024. All rights reserved.