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.
工具/软件: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 软件中有效的缓存例程吗?
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