This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320C6748:TMS320C6748 LCDK 缓存和 EDMA 问题

Guru**** 2033340 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/799386/ccs-tms320c6748-tms320c6748-lcdk-cache-and-edma-problems

器件型号:TMS320C6748
Thread 中讨论的其他器件:OMAPL138

工具/软件:Code Composer Studio

您好!

我已经与 EDMA 合作了一段时间、现在取得了一些成功。  使用高速缓存实现 EDMA 已成为一个重要问题、但在 EDMA 的 RX 缓冲器上尤其如此。

目前、我一直在使用 CSLR 高速缓存库、该库在通过 EDMA 接收数据时能够显著加快许多例程的速度、并且在通过 EDMA 接收数据以及在之前初始化高速缓存时没有遇到任何问题。 在转换到传输例程时、尽管我的输出缓冲器是正确的、EDMA 有时会丢弃数百个样本、有时会在例程结束时切断数据。  它似乎是由缓存例程引起的、在缓存未启用时工作正常。  但是、缓存是必要的、我不想编写我自己的代码、将我所需的代码移回 L2和 L1存储器中的第四个、而是使用已经开发好的缓存例程。

我已经阅读了有关 TMS320C674x 处理器的高速缓存用户手册、了解了与 EDMA 的一致性。  尽管更容易、我觉得将 EDMA 的输出 TX 缓冲器放置在存储器的不可高速缓存部分会更理想(我曾使用 Pragma 语句尝试过这种方法、但无法确定如何更改 SDRAM 可缓存的级别)

下面是我用于初始化高速缓存的代码:

void disable_cache (void)
{
//将 DDR2 (MAR 192 - 223)设置为不可缓存
对于(计数器= 192;计数器< 224;计数器++)
CSL_FINST (cacheRegs->MAR[计数器]、cache_mar_PC、不可缓存);

//禁用 L1P
CSL_FINST (cacheRegs->L1PCFG、cache_L1PCFG_MODE、disable);
失速=高速缓冲存储器->L1PCFG;

//禁用 L1D
CSL_FINST (cacheRegs->L1DCFG、cache_L1DCFG_MODE、disable);
STALL =高速缓冲存储器-> L1DCFG;

//禁用 L2
CSL_FINST (cacheRegs->L2CFG、cache_L2CFG_mode、disable);
stall =高速缓冲存储器-> L2CFG;
}//* disable_cache */

void setup_DDR2_cache (void)
{
//将 SDRAM (MAR 192-223)设置为可缓存
对于(计数器= 192;计数器< 224;计数器++)
CSL_FINST (cacheRegs->MAR[计数器]、cache_mar_PC、可缓存);
}/* setup_SDRAM_cache */



void enable_L1 (void)
{
//将 L1P 大小设置为32K
CSL_FINST (cacheRegs->L1PCFG、cache_L1PCFG_MODE、32K);
失速=高速缓冲存储器->L1PCFG;

//将 L1D 大小设置为32K
CSL_FINST (cacheRegs->L1DCFG、cache_L1DCG_MODE、32K);
stall = cacheRegs->L1DCFG;
}-->enable_L1 */

void enable_L2 (void)
{
//将 L2大小设置为256K
CSL_FINST (cacheRegs->L2CFG、cache_L2CFG_mode、128K);
STALL =高速缓冲存储器-> L2CFG;
}/* ENABLE_L2 */

有人能告诉我这个缓存例程有什么问题、或者告诉我一个从某种 TI 软件中有效的缓存例程吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您能告诉我您当前使用的软件包吗? 处理器 SDK? StarterWare? 这是裸机还是 TI-RTOS 应用?

    根据您的回答、我将寻找一个您可以参考的示例。

    此致、
    Sahin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sahin、

    对于 EDMA-MCASP、我将使用 StarterWare。 我在某个位置找到了 CSLR 代码、但该代码以及 CSLR.h 和 CSLR_CACHE.h 代码也是为了使代码更高效地运行。 这是裸机应用。  Starterware 上的示例似乎仅解决了 UART 的 EDMA 的高速缓存利用率问题。  我可能只是开始尝试将该代码调整为套件。  我已附加了两个缓存".h"文件。

    #ifndef _CSLR_H_
    #define _CSLR_H_
    
    #ifdef _cplusplus
    extern "C"{
    #endif
    
    //宏实现:
    //##运算符将两个标记串联到宏调用
    
    //宏构造规则上的注释
    //[1]##运算符不能是替换列表中的第一个或最后一个项
    //[2]在参数中的任何宏展开之前发生连接
    //换句话说, 如果一个字符串有两个独立部分->并且
    //一起组成一个完整的字符串、则会展开该字符串
    //输出以使 C 有要处理的内容
    //[3]如果连接的结果是一个有效的宏名称、 它可用于
    //进一步替换,即使它出现在可能
    //不可用的上下文中(突出显示#2)
    //如果替换列表中出现多个##操作员,
    则未定义评估的顺序//。
    
    /*"表达式"宏*/
    /*字段 make 宏*/
    #define CSL_FMK (per_REG_field、val) \
    (((val)<<CSL_##PER_REG_FIELD##_SHIFT)和 CSL_##PER_REG_FIELD##_MASK)
    
    //此宏采用一个字符串(PER_REG_FIELD),值
    // shift 是指定的移位,它具有掩码。
    //这通过以下方式准备要在另一个宏中使用的值:sit 或清除
    寄存器中的(1或0)//a 特定位、并清除其余所有位。
    
    
    /*字段提取宏*/
    #define CSL_FEXT (reg、per_REG_field) \
    ((((reg)& CSL_##per_REG_field##_mask)>>CSL_##per_REG_field##_shift)
    //此宏使用其掩码获取寄存器数,并通过 shift 将其移位//
    此宏通过指定将位提取为1或0。
    
    
    
    /*字段插入宏*//
    寄存器、寄存器字段、值
    #define CSL_fins (reg、per_REG_field、val) \
    ((reg)=(((reg)&~CSL_##per_REG_field##_mask)|CSL_FMK (per_REG_field、val)
    //此宏采用寄存器、字符串和值。
    //此宏将一个位(置位或清零)插入到寄存器的相应字段中,
    //并保持所有其他位不变。
    
    
    
    
    
    
    /*"令牌"宏*/
    
    /*字段制作(令牌)宏*
    /#define CSL_FMKT (per_REG_field、token) \
    CSL_FMK (per_REG_field、CSL_##per_REG_field##_##令牌)
    //此 makco 执行与 CSL_FMK 相同的操作,只是它采用
    了//a tken 而不是值。 换句话说、在
    用值调用//CSL_FMK 之前、令牌会被扩展并替换为一个值。
    
    
    
    /*字段插入(令牌)宏*/
    #define CSL_FINST (reg、per_REG_field、token) \
    CSL_fins (((reg)、per_REG_field、CSL_##per_REG_field##_### token)
    
    //此宏与 CSL_execfins 宏命令具有令牌而不
    是// a 值的相同操作。
    
    
    
    
    
    
    
    
    
    
    /*"原始"宏*/
    
    * Field Make (原始)宏*/
    #define CSL_FMKR (MSB、lsb、val) \
    (((val)&((1 <<((MSB)-(lsb)+ 1)- 1)))<<(lsb))
    
    /*字段提取(原始)宏*/
    #define CSL_FEXTR (reg、MSB、lsb) \
    ((((reg)>>(lsb)))和((1 <<((MSB)-(lsb)+ 1))-1)))
    
    //字段插入(原始)宏*/
    #define CSL_FINSR (reg、msb、lsb、val) \
    ((reg)=((reg)&~((((1 <<((MSB)-(lsb)+ 1))- 1)<<(lsb)))) \
    | CSL_FMKR (MSB、lsb、val)
    
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif //*_CSLR_H_*
    
    
    /**========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *@文件 cslr_cache.h
    *
    @path $(CSLPATH)\inc
    *
    @desc 此文件包含缓存的寄存器说明
    *
    *================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    */
    #ifndef _CSLR_cache_H_
    #define _CSLR_cache_H_
    
    #ifdef __cplusplus
    extern "C"{
    #endif
    
    #include 
    #include 
    
    
    /*最小单位= 1字节*
    
    //********* \
    *寄存器覆盖结构
    \********* /
    typedef 结构{
    易失性 UINT32 L2CFG;
    易失性 UINT8 RSVD0[28];
    易失性 UINT32 L1PCFG;
    易失性 uint32 L1PCC;
    易失性 UINT8 RSVD1[24];
    易失性 UINT32 L1DCFG;
    易失性 uint32 L1DCC;
    易失性 UINT8 RSVD2[16312];
    易失性 uint32 L2WBAR;
    易失性 uint32 L2WWC;
    易失性 UINT8 RSVC3[8];
    易失性 uint32 L2WIBAR;
    易失性 uint32 L2WIWC;
    易失性 uint32 L2IBAR;
    易失性 uint32 L2IWC;
    易失性 uint32 L1PIBAR;
    易失性 uint32 L1PIWC;
    易失性 UINT8 RSVD4[8];
    易失性 uint32 L1DWIBAR;
    易失性 uint32 L1DWIWC;
    易失性 UINT8 RSVD5[8];
    易失性 uint32 L1DWBAR;
    易失性 uint32 L1DWWC;
    易失性 uint32 L1DIBAR;
    易失性 uint32 L1DIWC;
    易失性 UINT8 RSVD6[4016];
    易失性 uint32 L2WB;
    易失性 UINT32 L2WBINV;
    易失性 UINT32 L2INV;
    易失性 UINT8 RSVD7[28];
    易失性 UINT32 L1PINV;
    易失性 UINT8 RSVD8[20];
    易失性 UINT32 L1DWB;
    易失性 UINT32 L1DWBINV;
    易失性 UINT32 L1DINV;
    易失性 UINT8 RSVD9[12212];
    易失性 uint32 MAR[256];
    }CSL_CacheRegs;
    
    /************* \
    *覆盖结构 typedef 定义
    \********* /
    typedef volatile CSL_CacheRegs *CSL_CacheRegsOvly;
    
    ********* \
    *字段定义宏
    \********* /*
    
    L2L2CFG */
    
    
    #define CSL_cache_L2CFG_NUM_MM_MASK (0x0F000000u)
    #define CSL_cache_0x000000CFG_NUM_MM_SHIFT (0x00000018u)
    #define CSL_cache_L2CFG_MM_MMART_MMACT_000U)#define CSL_CFG_000U_
    
    
    
    
    
    
    
    
    (0x0000CFG_CFG_CFG_VERSION_CFG_E0x0000U_CFG_EFF_CFG_WTRU_#define
    
    //
    #define CSL_CSAFET_L2CFG_IP_NORMAL (0x000000000000u)
    #define CSL_CSAFET_L2CFG_IP_Cache"(0x00000001u)
    
    #define CSL_CSAFET_L2CFG_ID_MASK (0x0000CFG_L2CFG_U)#define CSL_CFG_TRU-
    
    
    
    
    #define
    
    
    
    
    
    (0x0000000U_CFG_0x0000000U*#define) //
    #define CSL_Cache_L2CFG_L2CC_normal (0x00000000u)
    #define CSL_Cache_L2CFG_L2CC_freeze (0x00000001u)
    
    #define CSL_CSAFET_L2CFG_MODE_MASK (0x00000007u)
    #define CSL_CSAFETCFG_MODE_SHIFT (0x00000001u)
    
    -#define CSAFET_MODE-#define CSL_TRU-(0x0000U-#CST_DE- 0x0000CFG-#ETRU- 0x0000_MODE-#ETRU-# /
    #define CSL_CSAFF_L2CFG_MODE_DISABLE (0x0000000000000000)
    #define CSL_CSAFF_L2CFG_MODE_0K (0x0000000000000000)
    #define CSL_CSTACT_L2CFG_MODE_32K (0x00000001u)
    #define CSLCFG_RATE
    
    
    
    
    
    
    
    
    
    
    (0x00000001U_CLCFG_RATE
    )#define CST_CL_CLCFG_RAFF_MODE_CL_CL_CLK_CLK_CLK (0x00001U_CLCFG_REG_CL_CLCFG_TREMIT_CL000U_CL_CLK)#define
    //
    #define CSL_CSTACK_L1PCFG_MODE_DISABLE (0x000000000000u)
    #define CSL_CST_L1PCFG_MODE_0K (0x00000000000000u)
    #define CSL_CST_L1CFG_LSPACT_CSTACT_L000U/
    
    
    
    
    
    
    
    
    
    
    
    
    #define CST_CST_CL_CSTACT_L16000U_CSPACT_L16000U*#define CST_CSPACT_CST_CL_C000U_CSPACT_L16WTR_CL_CL_CST_CST_C000U_CST_CL_CL_C000U_CST_CL_C000U_CSPACT_L#define (0x0000000U_CSPACT_CST_CST_CL_CST_CL_CL_CST_CL_C000U_CST_C000U_CST_CSTACT_L#define (0x0000000U_CST_CLP#define #CST_CST_C000
    //
    #define CSL_CSAFET_L1PCC_POPER_NORM (0x000000000000u)
    #define CSL_CSAFET_L1PCC_POPER_FREEZE (0x00000001u)
    
    
    #define CSL_CSAFET_L1PCC_MODE-
    
    
    
    
    
    
    
    
    
    
    
    
    
    #define CSL_CL_CSAFET1U_CL_CSPACT_RATE (0x00001U_CSAF_CL_CST_CL_RACSR_#define )#define (0x00001U_CSL_CST_CL_CSR_CL_CL_CL_MODE-#define 0x00001U_CST_CSR_CL_CL_CL_CST_CST_CL_CSR_CL_CSR_CST_MODE-#define #define 0x00001U/#define 0x00001U_CST_CST_CST_CST_CST_CST_CST_CL_CL_CL_CL_CL_CL_CL_CL_TRFACT_L1U/#define
    */
    #define CSL_CSTACK_L1DCFG_MODE_DISABLE (0x0000000000u)
    #define CSL_CSL_CST_L1CFG_L1DC_MODE_0K (0x000000000001U
    )#define
    CSL_CSL_CST_CST_L1CC_CSTAC_L1CC_L000U/
    
    
    
    
    
    
    
    
    
    
    #define CC_CST_CSTACT_L1CC_C000U_CSTACT_L1CC_CSTACT_L000U_CSTACT_L#define #define (0x0000000U_CSPACT_CST_CST_CST_CL_CL_CST_CL_CST_CST_C000U_CST_CL_CL_CST_C000U_C000U_CL_CST_CST_C#define (0x0000000U_CST_CST_CST_C#define #define 0x0000000U_CST_CST_CST_CST_CL_CL_CST_
    
    //
    #define CSL_CSAM_L1DCC_POPER_NORMAL (0x0000000000u)
    #define CSL_CSAM_L1DCC_POPER_FREEZE (0x00000001u)
    
    
    #define CSL_CSAM_L1DCC_OPER_MASK (0x00000001u)
    #define CSL_CSAM_L1DCC_TOP_SHIP_L1D-(0x00000001U-
    )#define CSL_OCC_TOP-(0x0000_TOP_TOKEN_VCC_RTOP_TOKEN_VL1U-)
    //
    #define CSL_CACHE L1DCC_OPER_NORM (0x000000000000u)
    #define CSL_CACHE L1DCC_OPER_FREEZE (0x00000001u)
    
    #define CSL_CACHE_L2WCC_L1DCC_RESETVAL (0x0000WCC_RACST_SHAD_CFG)#define
    
    WDT_CL_CFG_WDT_CL_CFG_WDT_CL_CFG_WDT_CL_CFG_WDT_CL_CFG_WDT_CL_CL_TRU_TRU_TRU_CFGAC_CST_CFG_WDT_TRU_TRU_TRU_TRU_CST_ETRU_TRU_CST_TRU_TRU_TRU_TRU_TRU_ETRU_TRU_CST_TRU_TRU_TRU_CST_C0000_TRU_CSTU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_CST
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    CSL_CACHE_L2WIBAR_ADDR_RESETVAL (0x000000000000u)
    
    #define CSL_CNT_MASK
    
    
    
    
    (0x0000000000u)/* L2WIBAR_L2WIWC */#define CSL_CACHE_CNT_MASK (0x0000_CFG_RESTR_CL_TRU_ETRU_CL_TRU_TRU_ETRU_CL_TRUFF_CST_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRUST_TRU_TRU_TRU_TRU_TRU_TRUST_TRU_TRU_TRU_TRUST_TRU_TRU_TRU_TRUST_TRU_TRU_TRU_TRUST_TRU_TRU_TRU_TRU_TRUST_TRU_TRU_TRU_TRU_TRU_TRU_TRUST_TRU_TRU_TRU_TRU_TRU_
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    /* L1PIBAR */
    
    #define CSL_CSAFF_L1PIBAR_ADDR_MASK (0xFFFFFFFFu)
    #define CSL_CSAFF_L1PIBAR_ADDR_SHIFT (0x00000000U)#define
    CSL_CSAFF_L1PIBRACSR_CL_CST_CL_CL_CL1
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    (0x0000U_CSRT_CESW_CL_CL_TR_TR_TR_TR_CL1)#define CSAFF_TR_TRW_TR_TR_TRU*#EPT_CL1 (0x0000U_TRU_TRU_TRU_TRU_TRU_CSTAC_TRU_TRU_TRU_CESW_TRU_TRU_TRU_CSTAC_TRU_TRU_TRU_TRU_TRU_TRU_TRU_CSTAC_TRU_TRU_C0000.#ETRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_C
    
    
    
    
    
    
    
    (0x0000FFFFu)
    #define CSL_Cache_L1DWIWC_CNT_SHIFT (0x000000000000u)
    #define CSL_CACK_L1DWIWC_CNT_RESETVAL (0x0000000000u)
    
    #define CSL_CSWRAM_L1DWIWC_REST_L1DWWC_RACK_CL_CL_CL_TRU/#define
    
    TSW_TR_CL_CLADDR_CL_CL_TR_CL_TR_CL_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_TRU_
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    CSL_CACHE L1DIBAR_L1DIBAR_ADDR_RESETVAL (0x000000000000u)
    
    #define CSL_CACHE L1DIBAR_RESETVAL (0x00000000000000u)
    
    /* L1DIWC *
    
    
    #define CSL_CACHE_L1DCTWC_DRESTL_CL_TRUST_TRUST_CL_TREMU_CLK
    
    
    
    
    
    
    
    
    
    (0x0000_TREMU_TRU_TREMU_TRU_TREMU_TREMU_TRU_TREMU_TREMU_TRU_TRU_TREMU_TREMU_TREMU_TRU_TRU_TREMU_TRU_TREMU_TRU_TREMU_TREMU_TRU_TREMU_TRU_TREMU_TRU_TREMU_TRU_TRU_TRU_TREMU_TRU_TREMU_TRU_TREMU_TREMU_TREMU_TRU_TRU_TRU_TRU_TRU_TREMU_
    
    //
    #define CSL_CRACK_L2WB_CMDANDSTAT_WB (0x00000001u)
    #define CSL_CMDBIST_CMDANANDSTAT_NORMAL (0x000000000000u)
    
    #define CSL_CSTACT_BINST_CFG-#define
    
    
    
    
    CST_C0000U/
    
    
    
    #define CSTU_C000VBIN-#define CST_CL_CLBINTRU_C000U_CSTU_CL_CLBINTRU_CSTU_C000U_CLINTRU_CSTU_C000V
    (0x0000_CLBINTRU_CST_TRU_C000V
    
    )#define
    
    
    
    
    
    
    
    --CMDANDSTAT 令牌--*/
    #define CSL_CMDACK_L2INV_CMDANDSTAT_INV (0x00000001u)
    #define CSL_CMDACK_L2INV_CMDST_NORMAL (0x000000000000u)
    
    #define CSL_CMDST_RESETVAL (0x0000U_CLADDRV1U_CL_CLADDRV1U/
    
    #C00001U_CLADDRV1U/#C0000INST_CLADDRV1U_C000U/
    
    
    #define U_CLADDRV1U_CLADTRU_CL_CLADTRU_C000U_CLADTRU_C0000.#C000U_CLADTREMPT_CL_CLK_CL_CLK_CLADTREMPT_CL_CL_C000U/#C000U_CLADTRU_CLADTRU/#C0000.#C
    
    
    //
    #define CSL_CMDACK_L1PINV_CMDANDSTAT_INV (0x00000001u)
    #define CSL_CMDACK_NORMAL (0x0000000000000000)
    
    #define CSL_CACHE_L1PINV_RESETVAL (0x000000000000)
    
    /* LMDCL_ADDRESTL_CLAND1U/
    
    
    
    
    
    
    
    #define DCMDB-#define CST_TRU_DRESTL_DRV1DW1U_DRVST_DRV1U/#0x0000L (0x0000L
    
    )
    
    
    
    
    
    
    
    -CMDANDSTAT 令牌--*/
    #define CSL_CMDANCH_L1DWBIDV_CMDINST_WBIV (0x00000001u)
    #define CSL_CRAC1DWBIDV_CMDVBAT_NORMAL (0x000000000000)
    
    #define CSL_RACT_L1DCMDBINV/
    
    
    
    
    
    #define U_CST_DRV1DCMDBINL (0x0000U_DRV1U_DRV1U_CL_DRV1DCMDRV1U/#DRV1UST_DRV1DCMDBU/#U_DRV1DRV1U/#DRV1DCMDBCTL)
    
    /#define
    CSL_CMDACK_L1DINV_CMDANDSTAT_INV (0x00000001u)
    #define CSL_CRACK_L1DINV_CMDADSTAT_NORMAL (0x00000000000000u)
    
    #define CSL_CSL_CSAM_L1DINVAL (0x0000000U)
    
    /*#define CSL_CAST_CSR_CSAM_TRU_CSAF-
    
    
    #def_CSAF_CST_CL_CST_C000U_#define #CSAF_CSL_CSAF-#def_CSAF_CST_CSAF_C000U*#def_CL_CSAF_CSAF_CSAF_CST_TR_#def_CSAF_#def_C300000U*
    
    
    
    
    
    
    (0x0000U_CSL_CSAF_CSAF_CSAF_CST_CSAF_#def_CSAF_CST_CST_CSAF_CSAF_#def_CST_#CSAF_C
    
    
    
    
    
    
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tyler、

    感谢您提供信息。 您是否正在对源缓冲区和目标缓冲区执行高速缓存操作? 您将需要在传输前执行回写、然后在传输后执行失效以保持缓存一致性。 这是使用 EDMA 时的常见问题。

    您可以使用 StarterWare 中的以下 API、只需#包含 dspcache.h 头文件即可。  

    CacheWB ((unsigned int) TXbuffer、TX_buffer_size);
    CacheWB (unsigned int) RXbuffer、RX_buffer_size);
    
    CacheInv (unsigned int) TXbuffer、 TX_buffer_size);
    CacheInv (unsigned int) RXbuffer、RX_buffer_size);
    
    

    此外、由于您已经在使用 StarterWare、因此您应该能够使用 StarterWare 缓存 API 来启用缓存、而不是 CSL 代码。 可在~\OMAPL138_StarterWare\system_config\C674x\cache.c 中找到

    uartEdma_Cache.c 示例是启用高速缓存的良好参考:

    /*设置 MAR 位以启用传输缓冲区的缓存*/
    CacheEnableMAR ((unsigned int) buffer、TX_buffer_size);
    //启用缓存
    高速缓冲使能(L1PCFG_L1PMODE_32K | L1DCFG_L1DMODE_32K | L2CFG_L2MODE_256K); 

    顺便说一下、TI 不再维护或支持 StarterWare。 对于新开发、TI 建议从 Processor SDK 开始。

    希望这对您有所帮助。

    此致、
    Sahin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢您 Sahin、


    您发布的内容非常有用、我已经介绍了如何以这种方式实现缓存。  但是,我的问题仍然存在。

    我已经检查以确保我的 UART 中断不会以某种方式成为问题。  这是我在传输简单正弦波时从 DSP 获得的输出。  它应该是一个完整的缓冲器长度、但不是。  帧丢失有时是重复的、有时是随机的。  我的所有 TX 缓冲区看起来都很好、我已经使用三路缓冲技术实现了 EDMA、因此也不会出现任何问题。  似乎某处可能存在设置问题、但不确定可能会是什么、因为在过去使用 EDMA 实施时、这不是问题。

    在 EDMA 传输到 MCASP 时、我甚至尝试停止代码以防止任何内容被写入缓冲区、但我仍然遇到同样的错误。

    谢谢、

    Tyler

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Tyler、

    您的源地址和目标地址是什么? 如果您现在禁用缓存、问题是否会消失?

    此致、
    Sahin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sahin、

    我最终搬到了一个乒乓球缓冲器,似乎解决了我一直遇到的问题。 但是、如果我禁用高速缓存、问题将会消失。 到目前为止、我不需要三路缓冲器、我认为我不需要三路缓冲器、因此我已经从这种缓冲器中移走了。

    感谢你的所有帮助。

    Tyler