查看: 1961|回复: 4

[原创] LPC55:使用USB RAM切记要字节对齐访问

[复制链接]

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20078
最后登录
2024-4-29
发表于 2021-9-2 11:27:02 | 显示全部楼层 |阅读模式
本帖最后由 小恩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库,如下:
1.jpg
图一
       Build工程后,连接Full Speed接口到电脑USB,Debug时发现错误,如下:
2.jpg
图二
       报错的原因是在Newlib库中的memcpy函数未使用字节对齐,直接操作了四字节的变量,而LPC系列USB RAM不支持四字节非对齐访问,如下:
3.jpg
图三
       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分区来存放数组,如下:
4.jpg
图四

初始化数组到指定的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的整数倍。


lpcxpresso55s69_dev_cdc_vcom_bm.zip

1.1 MB, 下载次数: 2, 下载积分: 威望 1

回复

使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2021-9-2 14:20:05 | 显示全部楼层
    字节对齐问题感觉就是一个老生常谈的问题。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-1-21 12:18
  • 签到天数: 1081 天

    [LV.10]以坛为家III

    16

    主题

    1903

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5056
    最后登录
    2024-4-30
    发表于 2021-9-2 14:51:15 | 显示全部楼层
    学习了
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 1480 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92793
    最后登录
    2024-4-29
    发表于 2021-9-2 15:41:43 | 显示全部楼层
    看来很多地方都要求有字节对齐啊。 TS1 - 副本 (4).jpg TS1 - 副本 (2).jpg TS1 - 副本 (3).jpg TS1 - 副本 (6).jpg TS1 - 副本 (5).jpg TS1 - 副本 (7).jpg TS1 - 副本 (8).jpg TS1 - 副本 (10).jpg TS1 - 副本 (9).jpg TS1.jpg
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 1480 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92793
    最后登录
    2024-4-29
    发表于 2021-9-2 15:47:36 | 显示全部楼层
    根本原因还是RAM的字节对齐要求,在ISP的时候也是 TS1 - 副本 (3).jpg TS1 - 副本 (2).jpg TS1 - 副本 (4).jpg TS1 - 副本 (7).jpg TS1 - 副本 (5).jpg TS1 - 副本 (6).jpg TS1 - 副本 (9).jpg TS1 - 副本 (8).jpg TS1 - 副本 (10).jpg TS1.jpg
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-30 09:38 , Processed in 0.144889 second(s), 33 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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