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

时间:2015-10-11 03:03:36

标签: c++ optimization embedded hex neural-network

预期平台:Teensy 3.1(微控制器)

IDE:CodeBlocks

当前工具链:GNU

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

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

这个.hex文件大小似乎不合理地大,考虑到相应的.cpp只有〜3kb,这是正常的吗?我知道.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无法及时处理。通过提取基于计算机的NN的权重并将其导入上述程序,我们有效地削减了与训练和错误处理相关的NN的不必要部分,并仅保留了前馈&#39;功能。不幸的是,这只会将我的整体.hex文件大小从~1150kb减少到~950kb。

3 个答案:

答案 0 :(得分:4)

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

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

源文件大小不是程序大小的指标。在您的情况下,您已经包含了非常需要内存的STL和iostream库代码,并且最好避免在顶点约束目标上使用。

答案 1 :(得分:1)

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

我的猜测是浮点仿真库和C ++支持。您可以查看地图文件以了解占用空间的内容。

答案 2 :(得分:1)

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

因为在裸机系统中我不支持iostream和filestream,所以我评论了ifstream readcout << ...

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

尝试删除ifstream(您的主板上是否有完整功能的文件系统?)。例如,从静态const数组中读取值。