pq113_6 发表于 2021-11-28 17:44

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

芯片是51内核的,执行上面部分是正常的,但是将usbEp0Buffer的数据通过memcpy拷贝到结构体gUsbReqInfo中(即下面部分),usbEp0Buffer的数据会被改掉
                #if 1
                {
                  uint8_t bmRequestType;
                  uint8_t bRequest;
                  uint16_t wValue;
                  uint16_t wIndex;
                  int16_t wLength;
                  bmRequestType = usbEp0Buffer;
                  bRequest = usbEp0Buffer;
                  wValue = (uint16_t)usbEp0Buffer << 8 | usbEp0Buffer;
                  wIndex = (uint16_t)usbEp0Buffer << 8 | usbEp0Buffer;
                  wLength = (uint16_t)usbEp0Buffer << 8 | usbEp0Buffer;
                  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 << 8 | usbEp0Buffer;
这是小端的

pq113_6 发表于 2021-11-29 09:01

ayb_ice 发表于 2021-11-29 08:32
大小端的问题,51编译器是大端的,你这
(uint16_t)usbEp0Buffer

不是这个问题,是数组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会全部 ...
先改正再说吧,如果上面的代码是正常的,那就是大小端的问题,大小端都错了,关键数据都错了,什么现象都有可能

pq113_6 发表于 2021-11-29 10:00

ayb_ice 发表于 2021-11-29 09:25
先改正再说吧,如果上面的代码是正常的,那就是大小端的问题,大小端都错了,关键数据都错了,什么现象都 ...

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

ayb_ice 发表于 2021-11-29 11:00

pq113_6 发表于 2021-11-29 10:00
我试过,举个例子吧
usbEp0Buffer = 0x80, usbEp0Buffer = 0x06, usbEp0Buffer = 0x00, usbEp0B ...

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

m564522634 发表于 2021-11-29 13:44

大小端,内存对齐问题

pq113_6 发表于 2021-11-29 13:49

ayb_ice 发表于 2021-11-29 11:00
关键部分关中断后再测试,说不定是其它地方修改的

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

pq113_6 发表于 2021-11-30 09:57

2个原因,一个是USB会改到这块内存,还有一个是以为usbEp0Buffer数组是定义在0x0000的xdata数组,不知道为什么会被改到,把绝对地址改到0x200后就好了
页: [1]
查看完整版本: 51单片机编译碰到的一个问题