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内核的东西了,不知道怎么解决。
大小端的问题,51编译器是大端的,你这
(uint16_t)usbEp0Buffer << 8 | usbEp0Buffer;
这是小端的 ayb_ice 发表于 2021-11-29 08:32
大小端的问题,51编译器是大端的,你这
(uint16_t)usbEp0Buffer
不是这个问题,是数组usbEp0Buffer的内容会变掉,代码里面是更改了gUsbReqInfo,但是usbEp0Buffer会全部被改掉 本帖最后由 ayb_ice 于 2021-11-29 09:27 编辑
pq113_6 发表于 2021-11-29 09:01
不是这个问题,是数组usbEp0Buffer的内容会变掉,代码里面是更改了gUsbReqInfo,但是usbEp0Buffer会全部 ...
先改正再说吧,如果上面的代码是正常的,那就是大小端的问题,大小端都错了,关键数据都错了,什么现象都有可能
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数据被改到? pq113_6 发表于 2021-11-29 10:00
我试过,举个例子吧
usbEp0Buffer = 0x80, usbEp0Buffer = 0x06, usbEp0Buffer = 0x00, usbEp0B ...
关键部分关中断后再测试,说不定是其它地方修改的 大小端,内存对齐问题 ayb_ice 发表于 2021-11-29 11:00
关键部分关中断后再测试,说不定是其它地方修改的
目前看到的结果应该是USB写的,USB驱动有个地方判断错误了 2个原因,一个是USB会改到这块内存,还有一个是以为usbEp0Buffer数组是定义在0x0000的xdata数组,不知道为什么会被改到,把绝对地址改到0x200后就好了
页:
[1]