打印
[C语言]

51单片机编译碰到的一个问题

[复制链接]
765|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pq113_6|  楼主 | 2021-11-28 17:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
芯片是51内核的,执行上面部分是正常的,但是将usbEp0Buffer的数据通过memcpy拷贝到结构体gUsbReqInfo中(即下面部分),usbEp0Buffer的数据会被改掉
                #if 1
                {
                    uint8_t bmRequestType;
                    uint8_t bRequest;
                    uint16_t wValue;
                    uint16_t wIndex;
                    int16_t wLength;
                    bmRequestType = usbEp0Buffer[0];
                    bRequest = usbEp0Buffer[1];
                    wValue = (uint16_t)usbEp0Buffer[3] << 8 | usbEp0Buffer[2];
                    wIndex = (uint16_t)usbEp0Buffer[5] << 8 | usbEp0Buffer[4];
                    wLength = (uint16_t)usbEp0Buffer[7] << 8 | usbEp0Buffer[6];
                    gUsbReqInfo.bmRequestType = bmRequestType;
                    gUsbReqInfo.bRequest = bRequest;
                    gUsbReqInfo.wValue = wValue;
                    gUsbReqInfo.wIndex = wIndex;
                    gUsbReqInfo.wLength = wLength;
                }
                #else
                memcpy((uint8_t *)(&gUsbReqInfo), usbEp0Buffer, sizeof(gUsbReqInfo));
                #endif
而且也试过将usbEp0Buffer直接赋值给gUsbReqInfo,也会有同样的问题。能想到的是应该是堆栈之类的影响?好久没玩过51内核的东西了,不知道怎么解决。

使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2021-11-29 08:32 | 只看该作者
大小端的问题,51编译器是大端的,你这
(uint16_t)usbEp0Buffer[3] << 8 | usbEp0Buffer[2];
这是小端的

使用特权

评论回复
板凳
pq113_6|  楼主 | 2021-11-29 09:01 | 只看该作者
ayb_ice 发表于 2021-11-29 08:32
大小端的问题,51编译器是大端的,你这
(uint16_t)usbEp0Buffer[3]

不是这个问题,是数组usbEp0Buffer的内容会变掉,代码里面是更改了gUsbReqInfo,但是usbEp0Buffer会全部被改掉

使用特权

评论回复
地板
ayb_ice| | 2021-11-29 09:25 | 只看该作者
本帖最后由 ayb_ice 于 2021-11-29 09:27 编辑
pq113_6 发表于 2021-11-29 09:01
不是这个问题,是数组usbEp0Buffer的内容会变掉,代码里面是更改了gUsbReqInfo,但是usbEp0Buffer会全部 ...

先改正再说吧,如果上面的代码是正常的,那就是大小端的问题,大小端都错了,关键数据都错了,什么现象都有可能

使用特权

评论回复
5
pq113_6|  楼主 | 2021-11-29 10:00 | 只看该作者
ayb_ice 发表于 2021-11-29 09:25
先改正再说吧,如果上面的代码是正常的,那就是大小端的问题,大小端都错了,关键数据都错了,什么现象都 ...

我试过,举个例子吧
usbEp0Buffer[0] = 0x80, usbEp0Buffer[1] = 0x06, usbEp0Buffer[2] = 0x00, usbEp0Buffer[3] = 0x01.
执行完赋值给gUsbReqInfo后,
usbEp0Buffer[0] = 0x80, usbEp0Buffer[1] = 0x80, usbEp0Buffer[2] = 0x80, usbEp0Buffer[3] = 0x80。
我的代码是读usbEp0Buffer,没有写usbEp0Buffer,这个问题怎么可能和大小端有关系?大小端的问题最多gUsbReqInfo的数据是错的,怎么会导致usbEp0Buffer数据被改到?

使用特权

评论回复
6
ayb_ice| | 2021-11-29 11:00 | 只看该作者
pq113_6 发表于 2021-11-29 10:00
我试过,举个例子吧
usbEp0Buffer[0] = 0x80, usbEp0Buffer[1] = 0x06, usbEp0Buffer[2] = 0x00, usbEp0B ...

关键部分关中断后再测试,说不定是其它地方修改的

使用特权

评论回复
7
m564522634| | 2021-11-29 13:44 | 只看该作者
大小端,内存对齐问题

使用特权

评论回复
8
pq113_6|  楼主 | 2021-11-29 13:49 | 只看该作者
ayb_ice 发表于 2021-11-29 11:00
关键部分关中断后再测试,说不定是其它地方修改的

目前看到的结果应该是USB写的,USB驱动有个地方判断错误了

使用特权

评论回复
9
pq113_6|  楼主 | 2021-11-30 09:57 | 只看该作者
2个原因,一个是USB会改到这块内存,还有一个是以为usbEp0Buffer数组是定义在0x0000的xdata数组,不知道为什么会被改到,把绝对地址改到0x200后就好了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

284

帖子

2

粉丝