vdsp4.5(bf561)中的CPLB

来源:互联网 发布:致知是什么意思 编辑:程序博客网 时间:2024/05/29 13:41
 
   在BF561中,每个核都提供了16K的指令缓存和32K的数据缓存,在程序生成时可以使用生成向导很方便地进行配置,那么向导到底做了什么?
1   ldf配置
如果没有使用CPLB,那么生成的LDF文件将把这些空间分配为指令存储器或者数据存储器,在使用了CPLB之后,LDF文件就变成了:
  
   MEMORY
   {
      MEM_A_L1_CODE_CACHE     { TYPE(RAM) START(0xFFA10000) END(0xFFA13FFF) WIDTH(8) }
      MEM_A_L1_DATA_B_CACHE   { TYPE(RAM) START(0xFF904000) END(0xFF907FFF) WIDTH(8) }
      MEM_A_L1_DATA_A_CACHE   { TYPE(RAM) START(0xFF804000) END(0xFF807FFF) WIDTH(8) }
      …
   } /* MEMORY */
      L1_code_cache
      {
         INPUT_SECTION_ALIGN(4)
         ___l1_code_cache = 1;
      } > MEM_A_L1_CODE_CACHE
      L1_data_a_cache
      {
         INPUT_SECTION_ALIGN(4)
         ___l1_data_cache_a = 1;
      } > MEM_A_L1_DATA_A_CACHE
      L1_data_b_cache
      {
         INPUT_SECTION_ALIGN(4)
         ___l1_data_cache_b = 1;
      } > MEM_A_L1_DATA_B_CACHE
这样就保留了Cache的存储空间。
2   要缓存的空间定义
vdsp向导生成了两个新的文件(*_cplbtab561a.c和*_cplbtab561b.c)来存放要缓存的空间定义:
#pragma section("cplb_data")
#pragma file_attr("DualCoreMem=CoreA")
 
cplb_entry dcplbs_table[] = {
};
 
#pragma section("cplb_data")
#pragma file_attr("DualCoreMem=CoreA")
 
cplb_entry icplbs_table[] = {
};
这两个数组就定义了要缓存的空间,它们的名称不可改变,但是内容可以根据需要进行修改。它们实际是供cplb_init这个函数使用的。
3   *_basiccrt.s
在*_basiccrt.s中多了如下代码:
 
/////////////////////////////////////////////////////////////////
// cplb-handler
#include "cplb.h"
       P1.H = _cplb_hdr;
       P1.L = _cplb_hdr;
       [P0-48] = P1; // write exception handler
.extern _cplb_hdr;
 
/////////////////////////////////////////////////////////////////
// cplb-init
       // initialise the CPLBs if they're needed. couldn't do
       // this before we set up the stacks.
       R0 = 127;                            // cplb_ctrl = 127
       CALL.X _cplb_init;
.extern _cplb_init;
.type _cplb_init,STT_FUNC;
 
       .section/DOUBLEANY data1;
___cplb_ctrl:
       .align 4;
       .byte4=127;
.global ___cplb_ctrl;
.type ___cplb_ctrl,STT_OBJECT;
       .section/DOUBLEANY program;  
       .align 2;
在这里,调用了cplb_init函数,同时定义了一个全局变量__cplb_ctrl,这个值实际控制了要使用哪些缓存,它的值定义位于cplb.h中,可以取以下几个值的或:
  • CPLB_ENABLE_ICPLBS – turns on instruction CPLBs
  • CPLB_ENABLE_ICACHE – turns on instruction caching into L1 Instruction memory
  • CPLB_ENABLE_DCPLBS – turns on data CPLBs
  • CPLB_ENABLE_DCACHE – turns on data caching into L1 Data A memory
  • CPLB_ENABLE_DCACHE2 – turns on data caching into L1 Data B memory
  • CPLB_SET_DCBS – sets the Data Cache Bank Select bit in the DMEM_CONTROL register. This specifies which bit of a memory address determines the data cache bank (A or B) used to cache the location. Depending on the placement of data within the application memory space, one setting or the other ensures more data is cached at run-time. This bit has no effect unless both CPLB_ENABLE_DCACHE and CPLB_ENABLE_DCACHE2 bits are also set. See the hardware reference manual for further details.
当然,__cplb_ctrl这个值也可以在c文件中定义。注意如果在c文件中定义其变量名要少一个下划线!
4   错误处理
当发生缼页等CPLB错误时,vdsp默认的处理函数是cplb_hdr,此函数在*_basiccrt.s中被设置。根据错误类型的不同,它将调用不同的子函数:
Error code
Response
CPLB_RELOADED
Indicates success; returns
CPLB_NO_ADDR_MATCH
缼页错误:调用_cplb_miss_without_replacement
CPLB_NO_UNLOCKED
Calls stub _cplb_miss_all_locked
CPLB_PROT_VIOL
读写保护错误:调用_cplb_protection_violation
others
Loops at label strange_return_from_cplb_mgr