本帖最后由 小恩GG 于 2021-9-2 16:45 编辑
使用USB RAM切记要字节对齐访问 在程序开发中,非字节对齐会影响CPU运行效率,有些CPU或内存甚至不支持非字节对齐访问。小编在使用Newlib库运行USB案例时,发现memcpy函数使用非对齐字节访问USB RAM报错,本文对USB RAM字节对齐访问此进行讲解。 1. Newlib库memcpy函数以对齐字节方式访问USB RAM 以LPC55s69_dev_cdc_vcom_bm为例,导入工程时将c/c++Library从默认的Redlib替换成Newlib库,如下: 图一 Build工程后,连接Full Speed接口到电脑USB,Debug时发现错误,如下: 图二 报错的原因是在Newlib库中的memcpy函数未使用字节对齐,直接操作了四字节的变量,而LPC系列USB RAM不支持四字节非对齐访问,如下: 图三 Newlibnano库memcpy函数是单字节拷贝,并不存在字节对齐问题,所以工程要使用Newlib库时,需要重写memcpy函数,并将usb_device_lpcip3511.c中的两处memcpy函数替换,如下: void *mymemcpy(void *dst,const void *src,size_t num) { assert((dst!=NULL)&&(src!=NULL)); uint8_t * psrc = (uint8_t *)src; uint8_t * pdst = (uint8_t *)dst; while(num-->0)*pdst++ = *psrc++; return dst; } 替换完成之后再次调试,设备管理器出现新串口,说明程序运行正常。 注意:如果未使用Newlib库,无上述问题。 2. USB RAM的使用 在MCU开发中,有时遇到大数组操作时,RAM资源紧张,需要将数组存储在USB RAM中,在读写USB RAM时要注意进行字节对齐。 首先创建USB RAM分区来存放数组,如下: 图四
初始化数组到指定的USB RAM,如下: #include "cr_section_macros.h" __DATA(RAM5) uint32_t array[10];
在main.c中查看数组的地址,输出值为0x40102000: PRINTF("array address is %x\n",array_aligned);
字节对齐方式读取USB RAM中的值,读取正常: PRINTF("array is %x\n",*(uint32_t *)(0x40102000));
非字节对齐方式读取USB RAM中的值,会报错,如下: PRINTF("array is %x\n",*(uint32_t *)(0x40102001)); PRINTF("array is %x\n",*(uint16_t *)(0x40102001));
所以在使用USB RAM时,操作32位或16位数组,一定要注意字节对齐,即数组地址应为4的整数倍。
|