查看: 1561|回复: 3

[分享] 飞思卡尔KL系列官方驱动库似乎存在严重bug

[复制链接]

该用户从未签到

4

主题

11

帖子

0

新手上路

Rank: 1

积分
46
最后登录
1970-1-1
发表于 2014-10-1 10:06:18 | 显示全部楼层 |阅读模式
本帖最后由 thegu 于 2014-10-1 15:15 编辑

这个函数经常出问题,浪费了不少时间,一开始还以为是取变量地址有问题。stdlib.c文件的memcpy,先按4bytes拷贝,然后按照每次1byte拷贝。按照32bit拷贝时候没做地址检查,如果内存地址不是4的整数倍,会触发hard fault 03中断。如果是对结构体内存拷贝,对字符串的一部分拷贝,非常容易出现这个问题。
void *
memcpy (void *dest, const void *src, unsigned n)
{
    int longs, bytes;
    uint32 *dpl = (uint32 *)dest;
    uint32 *spl = (uint32 *)src;
    uint8  *dpb, *spb;

    if ((dest != NULL) && (src != NULL) && (n > 0))
    {
        bytes = (n & 0x3);
        longs = (n - bytes) >> 2;
   
        while (longs--)
            *dpl++ = *spl++;
        
        dpb = (uint8 *)dpl;
        spb = (uint8 *)spl;
        
        while (bytes--)
            *dpb++ = *spb++;
    }
    return dest;
}

改成
void *
memcpy (void *dest, const void *src, unsigned n)
{uint8 *d=(uint8*)dest, *s=(uint8*)src,i=0;

for(;i<n;i++)
*(d+i)=*(s+i);  
  return dest;

}
问题消失。
回复

使用道具 举报

该用户从未签到

15

主题

194

帖子

0

高级会员

Rank: 4

积分
551
最后登录
1970-1-1
发表于 2014-10-3 13:00:05 | 显示全部楼层
顶顶  我也去看看
回复 支持 反对

使用道具 举报

该用户从未签到

15

主题

194

帖子

0

高级会员

Rank: 4

积分
551
最后登录
1970-1-1
发表于 2014-10-3 13:06:11 | 显示全部楼层
怎么也做一个if ((dest != NULL) && (src != NULL) && (n > 0))检查吧
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2014-10-9 13:08:06 | 显示全部楼层
谢谢你的分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-21 03:03 , Processed in 0.086058 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表