1.添加CTP驱动,编译kernel的时候出现: error: the frame size of 1968 bytes is larger than 1400 bytes [-Werror=frame-larger-than=]
此问题,后来定位是:memcpy(&config_charger[GTP_ADDR_LENGTH],send_cfg_charger_buf[sensor_id], cfg_len);
只要注释掉这一句,编译就Ok了,那么我们来分析一下这句有什么异常。
首先我们编译error的大概意思就是:size过大,超出范围了,所以就跟我们copy的内容有关,再来看看memcpy函数,
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include <string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针
所以为题不是send_cfg_charger_buf[sensor_id]有问题就是config_charger[GTP_ADDR_LENGTH]有问题,
我们可以用替换的方法来定位到底是什么出问题,经过确认后是send_cfg_charger_buf[sensor_id]的问题,然后来看看这个数组到底是什么
u8 cfg_info_group1_charger[] = CTP_CFG_GROUP1_CHARGER;
u8 cfg_info_group2_charger[] = CTP_CFG_GROUP2_CHARGER;
u8 cfg_info_group3_charger[] = CTP_CFG_GROUP3_CHARGER;
u8 cfg_info_group4_charger[] = CTP_CFG_GROUP4_CHARGER;
u8 cfg_info_group5_charger[] = CTP_CFG_GROUP5_CHARGER;
u8 cfg_info_group6_charger[] = CTP_CFG_GROUP6_CHARGER;
u8 *send_cfg_charger_buf[] = {cfg_info_group1_charger, cfg_info_group2_charger, cfg_info_group3_charger,
cfg_info_group4_charger, cfg_info_group5_charger, cfg_info_group6_charger};
去掉两组数据的话,然后就error: the frame size of 1600 bytes is larger than 1400 bytes [-Werror=frame-larger-than=],明显减小了,所以后来将u8 cfg_info_group1_charger[] = CTP_CFG_GROUP1_CHARGER;都定义为static u8 cfg_info_group1_charger[] = CTP_CFG_GROUP1_CHARGER;类型的问题就解决了。
问题的根本原因:就是我们kernel编译的时候gcc编译器有定义stack的大小,我们这个正好超出范围,局部变量保存在栈里,栈是系统根据变量的大小自动分配空间的。定义为static类型,存放在静态存储区,程序结束就释放掉了,所以问题就解决掉了。