android编译error问题总结

在添加CTP驱动并编译kernel时遇到'frame size of 1968 bytes is larger than 1400 bytes'的错误。问题源于memcpy函数中send_cfg_charger_buf[sensor_id]导致的size过大。通过替换和分析,发现是send_cfg_charger_buf[sensor_id]数组过大,将其定义为static类型并移到静态存储区,从而解决了因栈空间限制引发的编译错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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类型,存放在静态存储区,程序结束就释放掉了,所以问题就解决掉了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值