vdsp4.5(bf561)中的CPLB

本文详细介绍了BF561处理器中CPLB的配置过程,包括LDF文件的配置、缓存空间的定义、基本运行时文件的修改及错误处理等内容。
 
   在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
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌云阁主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值