如何读取数组的c文件,在内存中映射成真正的数组

2020-01-01 17:48发布

介绍下问题提出背景,我的程序中有个90多k的数组,70%以上都是连续的0,我打算用rle算法压缩,估计降低一半以上大小是可行的

初步思路是搞个上位机的命令行程序,读取这个数组c文件,压缩后生成一个bin文件,mdk支持在编译前运行命令,然后mdk装载这个bin文件生成最后的程序文件,整个过程都会自动完成

现在事情还没开始就遇上一个麻烦事,如何读取数组c文件,因为这个3维数组使用嵌套大括号表示数组层次,连续的0其实都是没标出的,编译器当然明白这些,但是如果自己来做的话就要自己解析这个数组c文件到内存里,这个也不是一会儿功夫可以搞定的啊

请问谁有这方面的经验,或者有开源的库可以干这个活呢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
35条回答
myxiaonia
1楼-- · 2020-01-05 01:34
 精彩回答 2  元偷偷看……
styleno1
2楼-- · 2020-01-05 05:36
本帖最后由 styleno1 于 2016-7-28 11:36 编辑

我试了,1024字节数组。
  1. #define ARRAY_SIZE 1024U
  2. int8_t data_map[ARRAY_SIZE] = {[0] = 1, [1] = 1};
复制代码
以下来自map:
  1. Code (inc. data)   RO Data    RW Data    ZI Data      Debug   
  2. 35482       3922      25398        900      12204     725748   Grand Totals
  3. 35482       3922      25398        344      12204     725748   ELF Image Totals (compressed)
复制代码
  1. Code (inc. data)   RO Data    RW Data    ZI Data      Debug   
  2. 35482       3922      25398       1924      12204     725797   Grand Totals
  3. 35482       3922      25398        356      12204     725797   ELF Image Totals (compressed)
复制代码
编辑说明:排版



myxiaonia
3楼-- · 2020-01-05 06:01
本帖最后由 myxiaonia 于 2016-7-28 11:46 编辑
styleno1 发表于 2016-7-28 11:19
我试了,1024字节数组。


真的可以  不好意思啊我刚才没看map  我给你比较看看

  1.     Total RO  Size (Code + RO Data)                52436 (  51.21kB)
  2.     Total RW  Size (RW Data + ZI Data)            133016 ( 129.90kB)
  3.     Total ROM Size (Code + RO Data + RW Data)      58152 (  56.79kB)
复制代码
使用内存数组,arm压缩存储超大数组,可以看到rw实际只增加了5KB,这个结果相当不错了,难以置信


现在的问题是如何在解压这个数组时把我需要的其中一些段提取出来,因为实际我只有64kram,我故意设置大内存才得出结果

我看arm链接器的rw压缩算法可能会用到lz77算法,此系列的算法基本都需要回溯,我必须指定只适用rle算法,再看看能压缩到多大
myxiaonia
4楼-- · 2020-01-05 07:21
指定链接器使用rl算法,压缩率明显降低,增大到了13.5k

  1.     Total RO  Size (Code + RO Data)                52408 (  51.18kB)
  2.     Total RW  Size (RW Data + ZI Data)            133016 ( 129.90kB)
  3.     Total ROM Size (Code + RO Data + RW Data)      66168 (  64.62kB)
复制代码
由于我的数组里面还有很多未填充的空位,未来是要填充的,综合考虑后rl算法对于我这个数组压缩率是70%,基本符合数组特征
myxiaonia
5楼-- · 2020-01-05 09:32
汇报一下进展,感谢楼上各位兄弟标志
基本完成预期目标,首先使用tcc用rle算法生成初步压缩数组,最大会在40多k大小,已经可以容纳在64k里,但是原程序内存占用好大,还是不能直接放在工程里,新建一个工程容纳这些数组然后选中需要的其中一组,通过内存共享的方式传递参数
把这个项目生成的bin文件(不到10k)包含到原程序,复位后立刻调用,准备好选中数组后再调用__main

现在这样的做法只能使用绝对定位方式,原因是mdk貌似无法生成位置无关代码,不知道为何,我实验结果 是库文件生成代码不是位置无关的
myxiaonia
6楼-- · 2020-01-05 12:06
 精彩回答 2  元偷偷看……

一周热门 更多>