将手机的boot,system,splash,userdata,recovery,全部擦掉,然后再依次烧入。再开机时手机就死在了开机logo中。从串口输出的bootloader信息来看是发生了数据异常。但是如果再将splash擦掉,再烧写一遍。就不会有这个问题了。
分析问题:
通过打印log,最后将出错的代码定位在了释放内存函数free()中的list_delete(node),当中。说明在访问Node进出了问题。从程序执行的流程来看,先是从logo的高度,宽度和bpp计算出logo所需要的内存;然后以这个大小去向系统申请内存。然后再从flash当中读取logo数据。而从flash中读,是以整页为单位。这样之后读取出来的数据就要大于上面根据logo的尺寸所计算的大小,也就可能大于所申请的内存,从而导致占用了其它没有被申请的内存了。这样就出了问题。
解决方法:
以将logo的大小以flash页对齐之后,再去申请内存。
疑问:
为什么再次擦除,烧写slpash.img后,就过了呢?我把list_delete(node)中node的pre,next指针都打印出来后,发现next的值都是非法的,但前后都不同。现在不知道是什么原因。