libpng&zlib移植到山景p2064平台

前面贴子提到过作者花了好长一段时间和精力在Andesight平台上编译libpng库,其它程序调用该库接口的时候,提示“Out of memory”。表面意思是没有内存了,让作者深陷困惑之中,正想放弃移植之余。无奈公司没钱,只能硬着头皮继续搞。

  作为程序员,最终只拿着问题而无法解决,实属无耐。看来不能用库了,封装了看不到。只能把libpng和zlib有用的源码(一般放在代码首层),抽出来加入到目标程序中。当然configure、Makefile之类就不用了。

  后面需要的主要就是信心和耐心了。png解码IDAT前的头部,单步调试定位到ZMALLOC的地方,并且ZMALLOC分配7KB的空间失败,很是让人疑问,MCU 200KB+的内存,除了用于显示的50KB,还剩150KB,这才刚解头不可能7KB的空间都分配 不出来。一方面通过系统获取当前内存使用剩余量,一方面调用pvPortMalloc偿试分配 7KB内存,这样做的目的是查看到底是内存不足还是ZMALLOC有问题。调试结果pvPortMalloc成功,并且内存充足。说明库里面的ZMALLOC有问题,经过对库的内存分配和翻译的相关函数修改后,程序得以进行下去。偶尔有几次把png图片的头解了,但是不稳定,线程复位。有时候pvPortMalloc居然失败,内存监测还有很多余量,排除内存不够的假设,沉下心来继续定位到pvPortMalloc里,发现该函数涉及到线程的暂停和恢复,因此怀疑线程的栈空间不足,加大栈空间后,问题解决,PNG图片头可以解了。

  继续修改程序 ,png库里边提供了DEMO程序及接口,因为内存少,我只能逐行显示。在显示一行过程中,zlib的inflate函数需要分配两次32KB的内存,然后才能解,我做了两步:定位到问题所在点的时候,malloc前定位内存到底够不够,如果够的话,为什么分配不出来;如果是真的不够的话,把CACHE改小,释放 18KB的内存出来,然后两次32KB的内存都分配成功,可以解码。

  当然png解码后只显示一行,大小时320*4(一行320像素,每个像素4个字节(RGBA))。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值