TI-RTOS Kernel User‘s Guide:8---Hardware Abstraction Layer

本章描述提供硬件抽象的模块。

8.1Hardware Abstraction Layer APIs

SYS/BIOS提供中断、缓存和定时器的配置和管理服务。与其他SYS/BIOS服务(如线程)不同,这些模块直接对设备硬件的各个方面进行编程,并在硬件抽象层(HAL)包中分组在一起。本章描述了启用和禁用中断、插入中断向量、多个中断到单个向量的多路复用以及缓存无效或回写等服务。

在SYS/BIOS应用程序中,中断及其相关向量、缓存和计时器的任何配置或操作都必须通过SYS/BIOS HAL api完成。在早期版本的DSP/BIOS中,一些HAL服务是不可用的,开发人员被期望使用来自芯片支持库(CSL)的功能。最新的CSL版本(3.0或更高版本)是为不使用SYS/BIOS的应用程序设计的。他们的部分服务与SYS/BIOS不兼容。避免在同一个应用程序中使用CSL中断、缓存和计时器函数和SYS/BIOS,因为这种组合会导致复杂的中断相关调试问题。

HAL的 APIs 分为两类:在所有目标和设备上可用的通用APIs特定于目标/设备的APIs,仅对特定设备或ISA系列可用。通用api被设计为覆盖绝大多数用例。对于那些希望确保不同TI设备之间易于移植的开发人员来说,尽可能多地使用通用api是最佳选择。如果通用api不能使用对软件应用程序有利的特定于设备的硬件功能,则可以选择使用目标/设备特定的api,它提供完整的硬件权限。

在本章中,提供了每个HAL包的功能概述以及该包的通用API函数的使用示例。在描述了通用函数之后,还给出了基于C64x+设备提供的特定于目标/设备的api的示例。有关特定系列或设备可用的目标/设备特定API的完整描述,请参阅API参考文档。第8.5节HAL包组织概述了通用HAL包及其相关的特定于目标/设备的包,以便于找到合适的包。

8.2 HWI Module

 ti.sysbios.hal.Hwi 模块提供了一组用于管理硬件中断的api。这些api在所有受支持的目标和设备上都是通用的,应该能为大多数应用程序提供足够的功能.

8.2.1Associating a C Function with a System Interrupt Source

要将用户提供的C函数与特定的系统中断关联起来,您需要创建一个Hwi对象,该对象封装了有关Hwi模块所需的中断的信息。“create”函数的标准静态和动态形式由ti.sysbios.hal.Hwi模块支持。

下面的例子静态地创建了一个Hwi对象,该对象使用默认的实例配置参数将interrupt 5与"myIsr" C函数关联起来:

var Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
Hwi.create(5, '&myIsr');

动态配置相同中断所需的C代码如下:

#include <ti/sysbios/hal/Hwi.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>
Hwi_Handle myHwi;
Error_Block eb;
...
Error_init(&eb);
myHwi = Hwi_create(5, myIsr, NULL, &eb);
if (myHwi == NULL) {
 System_abort("Hwi create failed");
}

当默认实例参数满足创建Hwi对象时,使用NULL参数。

8.2.2Hwi Instance Configuration Parameters

以下配置参数及其默认值是为每个Hwi对象定义的。有关这些参数及其值的更详细讨论,请参阅在线文档中的ti.sysbios.hal.Hwi模块。(有关运行在线帮助的信息,请参见第25页1.6.1节,使用API参考帮助系统。)

maskSetting定义了中断调度程序如何管理中断嵌套:

//maskSetting定义了中断调度程序如何管理中断嵌套:
MaskingOption maskSetting = MaskingOption_SELF;
//当调度程序调用Hwi函数时,配置的“arg”参数将传递给它
UArg arg = 0;
//enabledInt参数用于在创建Hwi对象时自动启用或禁用中断
Bool enableInt = true;
//eventId”适用于允许将外设事件动态关联到中断号的C6000设备。缺省值-1使与中断号关联的eventId
//于正常(重置)状态(即不需要重新关联)。
Int eventId = -1;
//priority”参数是为那些支持中断优先级设置的架构提供的。默认值-1通知Hwi模块将中断优先级设置
//为适合设备的默认值
Int priority = -1;

8.2.3Creating a Hwi Object Using Non-Default Instance Configuration Parameters

在8.2.1节给出的示例的基础上,下面的示例展示了如何将中断号5与"myIsr" C函数关联起来,将"10"作为参数传递给"myIsr",并在创建后禁用中断。

//配置
var Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
/* initialize hwiParams to default values */
var hwiParams = new Hwi.Params;
hwiParams.arg = 10; /* Set myIsr5 argument to 10 */
hwiParams.enableInt = false; /* override default setting */
/* Create a Hwi object for interrupt number 5
 * that invokes myIsr5() with argument 10 */
Hwi.create(5, '&myIsr', hwiParams);
//运行
#include <ti/sysbios/hal/Hwi.h>
#include <xdc/runtime/Error.h>
Hwi_Params hwiParams;
Hwi_Handle myHwi;
Error_Block eb;
...
/* initialize error block and hwiParams to default values */
Error_init(&eb);
Hwi_Params_init(&hwiParams); 
hwiParams.arg = 10;
hwiParams.enableInt = FALSE;
myHwi = Hwi_create(5, myIsr, &hwiParms, &eb);
if (myHwi == NULL) {
 System_abort("Hwi create failed");
}

8.2.4Enabling and Disabling Interrupts

//Hwi模块 APIs全局或单独启用和禁用中断:
UInt Hwi_enable();  //全局启用所有中断,返回先前的启用/禁用状态
UInt Hwi_disable(); //全局禁用所有中断,返回先前的启用/禁用状态
Hwi_restore(UInt key);  
// 将全局中断恢复到以前的启用/禁用状态,“key”是Hwi_disable()或Hwi_enable()返回的值
UInt Hwi_enableInterrupt(UInt intNum);
UInt Hwi_disableInterrupt(UInt intNum);
Hwi_restoreInterrupt(UInt key);
Hwi_clearInterrupt(UInt intNum); //清除挂起的中断
//特定中断intNum

在C6000平台上,Hwi_disable()清除CSR (control status register)中的GIE位。在C2000平台上,Hwi_disable()在ST1寄存器中设置INTM位。

当您希望中断保持禁用状态时,会出现中断重新启用的情况。当Task线程调用Mailbox_post()、Semaphore_post()或Event_post()或类似的不包括Swi_post()的调用时,当硬件中断被禁用但任务调度程序被启用时,就会发生这种情况。所有XXX_post() api(除了Swi_post())都在内部调用Task_restore(),在本例中调用Hwi_enable()结束。

8.2.5A Simple Example Hwi Application

下面的示例创建两个Hwi对象。一个用于中断号5,另一个用于中断号6。为了便于说明,一个中断是静态创建的,另一个是动态创建的。等待中断完成的空闲函数也被添加到空闲函数列表中。

//Configuration
/* Pull in BIOS module required by ALL BIOS applications */
xdc.useModule('ti.sysbios.BIOS');

/* Pull in XDC runtime System module for various APIs used */
xdc.useModule('xdc.runtime.System');

/* Get handle to Hwi module for static configuration */
var Hwi = xdc.useModule('ti.sysbios.hal.Hwi');

var hwiParams = new Hwi.Params; /* Initialize hwiParams to default values */
hwiParams.arg = 10; /* Set myIsr5 argument */
hwiParams.enableInt = false; /* Keep interrupt 5 disabled until later */

/* Create a Hwi object for interrupt number 5 that invokes myIsr5() with argument 10 */
Hwi.create(5, '&myIsr5', hwiParams);

/* Add an idle thread 'myIdleFunc' that monitors interrupts. */
var Idle = xdc.useModule(ti.sysbios.knl.Idle);
Idle.addFunc('&myIdleFunc');
//Runtime
#include <xdc/std.h>
#include <xdc/runtime/System.h>
#include <xdc/runtime/Error.h>
#include <ti/sysbios/hal/Hwi.h>
Bool Hwi5 = FALSE;
Bool Hwi6 = FALSE;
main(Void) {
   Hwi_Params hwiParams;
   Hwi_Handle myHwi;
   Error_Block eb;
 /* Initialize error block and hwiParams to default values */
    Error_init(&eb);
    Hwi_Params_init(&hwiParams); 
/* Set myIsr6 parameters */
   hwiParams.arg = 12;
   hwiParams.enableInt = FALSE;
 /* Create a Hwi object for interrupt number 6 that invokes myIsr6() with argument 12 */
   myHwi = Hwi_create(6, myIsr6, &hwiParms, &eb);
   if (myHwi == NULL) {
      System_abort("Hwi create failed");
   }
 /* enable both interrupts */
    Hwi_enableInterrupt(5);
    Hwi_enableInterrupt(6);
 /* start BIOS */
    BIOS_start();
}
/* Runs when interrupt 5 occurs */
Void myIsr5(UArg arg) {
    If (arg == 10) {
        Hwi5 = TRUE;
    }
}
/* Runs when interrupt 6 occurs */
Void myIsr6(UArg arg) {
    If (arg == 12) {
        Hwi6 = TRUE;
    }  
}
/* The Idle thread checks for completion of interrupts 5 & 6 
 * and exits when they have both completed. */
Void myIdleFunc()
{
    If (Hwi5 && Hwi6) {
        System_printf("Both interrupts have occurred!");
        System_exit(0);
    }
}

8.2.6The Interrupt Dispatcher

为了整合为每个中断执行寄存器保存和恢复的代码,SYS/BIOS提供了一个中断调度程序,它自动为中断例程执行这些操作。使用Hwi调度程序允许用C编写ISR函数。

除了保留被中断线程的上下文,SYS/BIOS Hwi调度程序还编排了以下动作:(1)在中断处理过程中禁用SYS/BIOS Swi和Task调度,(2)在每个中断的基础上自动管理嵌套中断,(3)在每个中断的基础上自动管理嵌套中断,(4)运行Hwi功能,(5)调用任何配置的“end”Hwi Hook函数,(6)在中断处理后调用Swi和Task调度器,执行由Hwi函数内的操作引起的任何Swi和Task操作。

部分平台(如MSP430)不提供Hwi调度器。但是,生成中断存根是为了提供本质上相同的默认功能。但是,生成的中断存根不会自动管理嵌套中断,因为这在MSP430上不支持。

有关SYS/BIOS使用的具体硬件信息,请参见TI-RTOS内核设备附录(BIOS_INSTALL_DIR/docs/Device_Addendum.html)。

interrupt关键字或interrupt pragma不能用于定义由Hwi调度程序调用的C函数(或中断存根,在没有提供Hwi调度程序的平台上,如MSP430)。Hwi调度程序和中断存根包含这个功能,使用C修饰符将导致灾难性的结果,使用interrupt关键字或interrupt pragma的函数可能不使用Hwi调度程序或中断存根,也可能不调用SYS/BIOS api。

8.2.7Registers Saved and Restored by the Interrupt Dispatcher

调度程序为准备调用用户的Hwi函数而保存和恢复的寄存器符合C编译器文档中寄存器使用约定部分中定义的“由调用者保存”或“临时”寄存器。有关哪些寄存器被保存和恢复,或者TMS320函数符合德州仪器C运行时模型的更多信息,请参阅针对您的平台的优化编译器用户指南。

8.2.8Additional Target/Device-Specific Hwi Module Functionality

如8.5节所述,ti.sysbios.hal.Hwi模块是使用代理-委托机制实现的。所有ti.sysbios.hal.Hwi模块api都被转发到目标/设备特定的Hwi模块,该模块实现了所有ti.sysbios.hal.Hwi所需的api。每个Hwi模块实现都提供了该系列/设备独有的额外api和功能,如果需要,可以代替ti.sysbios.hal.Hwi模块使用。

例如,C64x+特定于目标的Hwi模块 ti.sysbios.family.c64p.Hwi除了在ti.sysbios.hal.Hwi模块中定义的api之外,还提供以下api:

Hwi_eventMap(UInt intNum, UInt eventId);  //将外设事件号重新映射为中断号
Bits16 Hwi_enableIER(Bits16 mask);
Bits16 Hwi_disableIER(Bits16 mask);
Bits16 Hwi_restoreIER(Bits16 mask);
//这三个api允许启用、禁用和恢复一组由“mask”参数定义的中断
//这些api提供了对' C64x+的内部IER寄存器的直接操作

要访问这些额外的api,您可以使用与C64x+目标相关联的目标/设备特定的Hwi模块,而不是ti.sysbios.hal.Hwi模块。有关目标/设备特定的Hwi模块的文档,请参见ti.sysbios.family.*.Hwi的CDOC文档。例如:ti.sysbios.family.c28.Hwi。

下面的例子是8.2.5节中部分例子的修改版本。修改以粗体显示。

//配置
var Hwi = xdc.useModule('ti.sysbios.family.c64p.Hwi');
/* Initialize hwiParams to default values */
var hwiParams = new Hwi.Params;
/* Set myIsr5 parameters */
hwiParams.arg = 10;
hwiParams.enableInt = false;
/* Create a Hwi object for interrupt number 5 
 * that invokes myIsr5() with argument 10 */
Hwi.create(5, '&myIsr5', hwiParams);
//运行
#include <ti/sysbios/family/c64p/Hwi.h>
#include <xdc/runtime/Error.h>
main(Void) {
    Hwi_Params hwiParams;
    Hwi_Handle myHwi;
    Error_Block eb;
 /* Initialize error block and hwiParams to default values */
    Error_init(&eb);
    Hwi_Params_init(&hwiParams); 
 /* Set myIsr6 parameters */
    hwiParams.arg = 12;
    hwiParams.enableInt = FALSE;
/* Create a Hwi object for interrupt number 6 that invokes myIsr6() with argument 12 */
    myHwi = Hwi_create(6, myIsr6, &hwiParms, &eb);
    if (myHwi == NULL) {
        System_abort("Hwi create failed");
    }
 /* Enable interrupts 5 & 6 simultaneously using the C64x+
* Hwi module Hwi_enableIER() API. */
 
    Hwi_enableIER(0x0060);

8.3Timer Module

 ti.sysbios.hal.Timer模块提供了一个使用定时器外设的标准接口,隐藏了定时器外设的任何目标/设备特定特征,继承了ti.sysbios.interfaces.ITimer接口。使用该模块创建一个计时器(即标记一个计时器以供使用),并将其配置为在计时器到期时调用tickFxn。仅当不需要对定时器外围设备进行任何自定义配置时才使用此模块。该模块有一个名为TimerProxy的配置参数,该参数默认情况下与目标/设备特定的实现一起插入。例如C64x目标的实现是ti.sysbios.family.c64.Timer。定时器可以配置为单次定时器或连续定时器。周期可以以定时器计数或微秒为单位指定。定时器中断总是使用Hwi调度程序。计时器tickFxn在一个Hwi线程的上下文中运行。Timer模块自动为Timer中断创建一个Hwi实例。

Timer_create() API接受一个timerId。timerId的取值范围从0到由TimerProxy确定的特定于目标/设备的值。timerId只是一个逻辑ID;它与实际计时器外设的关系由TimerProxy控制。

如果您的程序使用哪个计时器无关紧要,则指定timer的Timer.ANY(用于配置)或Timer_ANY(在C语言中),这意味着“使用任何可用的计时器”。例如,在配置中使用:

Timer.create(Timer.ANY, "&myIsr", timerParams);

// C program
myTimer = Timer_create(Timer_ANY, myIsr, &timerParams, &eb);
if (myTimer == NULL) {
    System_abort("Timer create failed");
}

timerParams包含许多配置计时器的参数。例如timerParams.startMode 可以设置为StartMode_AUTO或StartMode_USER。StartMode_AUTO表示在BIOS_start()时启动静态创建的定时器,在create()时启动动态创建的定时器。StartMode_USER指示程序使用Timer_start()启动计时器。参见8.3.1节中的示例。

您可以通过在运行时调用Timer_getNumTimers()来获得定时器外设的总数。这包括使用的和可用的定时器外设。您可以通过调用Timer_getStatus()来查询计时器的状态。

如果您希望使用特定的定时器外设或希望使用自定义定时器配置(设置定时器输出引脚、仿真行为等),则应该使用目标/设备特定的定时器模块。例如:ti.sysbios.family.c64.Timer。

Timer模块还允许您为计时器外设指定extFreq(外部频率)属性,并提供一个API来在运行时获取计时器频率。此外部频率属性仅支持定时器频率可以与CPU频率分开设置的目标。您可以使用Timer_getFreq()将计时器中断转换为实时中断。Timer模块提供了在运行时启动、停止和修改计时器周期的api。这些api有以下副作用。

Timer_setPeriod() :在周期寄存器之前停止计时器,然后重新启动计时器

Timer_stop() :停止计时器和禁用计时器中断

Timer_start() :清除计数,清除任何挂起的中断,在计时器开始之前启用计时器中断

这个C语言示例创建了一个周期为10微秒的计时器。它将参数1传递给myIsr函数。它指示Timer模块使用任何可用的定时器外设:

Timer_Params timerParams;
Timer_Handle myTimer;
Error_Block eb;
...
Error_init(&eb);
Timer_Params_init(&timerParams);
timerParams.period = 10; 
timerParams.periodType = Timer_PeriodType_MICROSECS;
timerParams.arg = 1;
myTimer = Timer_create(Timer_ANY, myIsr, &timerParams, &eb);
if (myTimer == NULL) {
   System_abort("Timer create failed");
}

//静态地创建了一个与前面的C示例具有相同特征的计时器。它指定timerId为1:
var timer = xdc.useModule('ti.sysbios.hal.Timer');
var timerParams = new Timer.Params();
timerParams.period = 10;
timerParams.periodType = Timer.PeriodType_MICROSECS;
timerParams.arg = 1;
timer.create(1, '&myIsr', timerParams);
// 创建的计时器设置频率extFreq.hi和extFreq.lo属性设置表示Hz频率的32位结构的高和低部分
Timer_Params timerParams;
Timer_Handle myTimer;
Error_Block eb;
...
Error_init(&eb);
Timer_Params_init(&timerParams); 
timerParams.extFreq.lo = 270000000; /* 27 MHz */
timerParams.extFreq.hi = 0;
myTimer = Timer_create(Timer_ANY, myIsr, &timerParams, &eb);
if (myTimer == NULL) {
   System_abort("Timer create failed");
}

// 配置示例为它创建的计时器指定一个频率
var Timer = xdc.useModule('ti.sysbios.hal.Timer'); 
var timerParams = new Timer.Params(); 
timerParams.extFreq.lo = 270000000; 
timerParams.extFreq.hi = 0; 
...
Timer.create(1, '&myIsr', timerParams);

// 这个C语言示例创建了一个计时器,它使用任何可用的计时器外设每2毫秒运行一次tickFxn()。它还创建了
//一个任务,当某些条件发生时,该任务将计时器的周期从2毫秒更改为4毫秒。tickFxn()本身打印一条消息,
//显示计时器的当前周期。
Timer_Handle timerHandle;
Int main(Void)
{
  Error_Block eb;
  Timer_Params timerParams;
  Task_Handle taskHandle;
  Error_init(&eb);
  Timer_Params_init(&timerParams);
  timerParams.period = 2000; /* 2 ms */
  timerHandle = Timer_create(Timer_ANY, tickFxn, &timerParams, &eb);
  if (timerHandle == NULL) {
     System_abort("Timer create failed");
  }
  taskHandle = Task_create(masterTask, NULL, &eb);
  if (taskHandle == NULL) {
     System_abort("Task create failed");
  }
}

Void masterTask(UArg arg0 UArg arg1)
{
 ...
 // Condition detected requiring a change to timer period
  Timer_stop(timerHandle);
  Timer_setPeriodMicroSecs(4000); /* change 2ms to 4ms */
  Timer_start(timerHandle);
 ...
}
Void tickFxn(UArg arg0)
{
  System_printf("Current period = %d\n", 
  Timer_getPeriod(timerHandle); 
}

8.3.1Target/Device-Specific Timer Modules

如8.5节所述,ti.sysbios.hal.Timer模块是使用代理-委托机制实现的。为每个支持的系列提供了单独的目标/设备特定定时器模块。例如,“ti.sysbios.timers.timer64.”定时器模块作为64P系列的定时器外设管理器。这些特定于目标/设备的模块提供了通用ti.sysbios.hal.Timer模块不支持的额外配置参数和api。

在ti.sysbios.timers.timer64.Timer模块中,定时器模块,controlInit、globalControlInit和emuMgtInit用来配置各种定时器属性。该模块还公开了一个Hwi Params结构作为其创建参数的一部分,允许配置与Timer关联的Hwi对象。该模块还公开了Timer_reconfig() API来允许重新配置静态创建的计时器。

var Timer = xdc.useModule('ti.sysbios.timers.timer64.Timer');
var timerParams = new Timer.Params();
timerParams.period = 2000; //2ms
timerParams.arg = 1;
timerParams.startMode = Timer.StartMode_USER;
timerParams.controlInit.invout = 1;
timerParams.globalControlInit.chained = false;
timerParams.emuMgtInit.free = false;
timerParams.suspSrc = SuspSrc_ARM;
Program.global.myTimer = Timer.create(1, "&myIsr", timerParams);

// 这个C示例使用在前面的配置示例中创建的myTimer,并在调用BIOS_start()之前,在程序的main()函数中使
//用不同的函数参数和startMode重新配置计时器。
#include <ti/sysbios/timers/timer64/Timer.h>
#include <xdc/cfg/global.h>
#include <xdc/runtime/Error.h>
Void myIsr(UArg arg)
{
 System_printf("myIsr arg = %d\n", (Int)arg);
 System_exit(0);
}
Int main(Int argc, char* argv[])
{
 Timer_Params timerParams;
 Error_Block eb;
 Error_init(&eb);
 Timer_Params_init(&timerParams);
 timerParams.arg = 2;
 timerParams.startMode = Timer_StartMode_AUTO;
 Timer_reconfig(myTimer, tickFxn, &timerParams, &eb);
 if (Error_check(&eb)) {
 System_abort("Timer reconfigure failed");
 }
 BIOS_start();
 return(0);
}

8.4Cache Module

缓存支持提供在缓存行执行缓存一致性操作的 API 函数级别或全局。缓存一致性操作包括:

Invalidate:使有效缓存行无效,丢弃受影响的缓存行的内容

Writeback:将缓存行的内容写入较低级别内存,例如L2缓存或外部内存,而不丢弃原始缓存中的行。

Writeback-Invalidation:将缓存行的内容写入较低级内存,然后丢弃原始缓存中的行内容

8.4.1Cache Interface Functions

缓存接口在 ti.sysbios.interfaces.ICache中定义,Cache接口包括以下函数,这些函数的实现是特定于目标/设备的。

Cache_enable():启用所有缓存

Cache_disable():禁用所有缓存

Cache_inv(blockPtr, byteCnt, type, wait):使指定的内存范围无效。当您使缓存行无效时,它的内容将被丢弃,并且缓存将该行标记为“干净”,以便下次读取该特定地址时,它将从外部存储器中获得。范围内的所有行在所有缓存中都无效。

Cache_wb(blockPtr, byteCnt, type, wait):回写指定的内存范围。当您执行回写时,缓存行的内容将被写入较低级别的内存。范围内的所有行都保留在缓存中有效,范围内的数据被写回源内存。

Cache_wbInv(blockPtr, byteCnt, type, wait):回写并使指定的内存范围无效。当您执行回写时,缓存行的内容将被写入较低级别的内存。当您使缓存行无效时,它的内容将被丢弃。范围内的所有行都被写回源内存,然后在所有缓存中失效

这些缓存api在一个地址范围上操作,从blockPtr的起始地址开始,扩展到指定的字节数。操作的地址范围被量化到每个缓存中的整个缓存行。blockPtr指向非缓存内存中的一个地址,该地址可能被缓存在一个或多个缓存中,也可能根本不缓存。如果blockPtr不对应于缓存行的开始,则使用该缓存行的开始。如果byteCnt不等于缓存行的整数,则将byteCnt四舍五入到等于缓存行的整数的下一个大小。type参数是Cache_Type类型的位掩码,它允许您指定应该在其中执行操作的一个或多个缓存。如果wait参数为true,则此函数将等待直到无效操作完成才返回。如果wait参数为false,则此函数立即返回。您可以稍后使用Cache_wait()来确保该操作已经完成。

Cache_wait():等待缓存wb/wbInv/inv操作完成。只有当缓存操作完成了所有的缓冲并且所有的内存写操作都到达源内存时,缓存操作才算真正完成。

如8.5节所述,该模块使用代理-委托机制实现。为每个支持的系列提供了一个单独的目标/设备特定的缓存模块。

额外的api被添加到这个模块中,用于特定于目标/设备的实现。例 ti.sysbios.family.c64p.Cache 缓存模块增加了特定于C64x+缓存的api,这些扩展的函数也有前缀“Cache_”。目前支持C64x+, C674x和ARM缓存。

C64x+专用:这些设备上的缓存是1级程序(L1P), 1级数据(L1D)和2级(L2)。有关L1P, L1D和L2缓存的信息,请参阅TMS320C64x+ DSP Megamodule参考指南(SPRU871)。

8.5HAL Package Organization

ti.sysbios.hal包中的三个SYS/BIOS模块:Hwi、Timer和Cache需要特定于目标/设备的API实现来实现其功能。为了在所有支持的系列/设备上为这些模块提供一组通用的api, SYS/BIOS使用代理-委托模块机制。(详见“RTSC接口入门:第12课”。)

这三个模块中的每一个都充当对应的特定于目标/设备的模块实现的代理。在使用中,所有Timer/Hwi/Cache API调用都被转发到适当的目标/特定于设备的模块实现

在应用程序构建过程的配置步骤中,ti.sysbios.hal包中的代理模块根据用户配置中指定的当前目标和平台定位并将自己绑定到适当的委托模块实现。bld文件。委托绑定过程在内部完成

下表显示了一些Timer、Hwi和Cache委托模块,可以根据应用程序的目标和设备进行选择。目标/设备到Timer、Cache和Hwi使用的委托模块的映射可以通过ti.sysbios.hal包联机帮助中的链接访问。

对于尚未开发定时器或缓存模块的目标/设备,hal。TimerNull或hal。使用CacheNull委托。在TimerNull/CacheNull中,ITimer/ICache中定义的api使用空函数实现

为了使代理-委托机制正常工作,代理和委托模块都必须是公共接口规范的实现。Timer、Hwi和Cache接口规范位于ti.sysbios.interface中,分别为ITimer、IHwi和ICache。这些接口规范定义了一组最小的通用api,相信它们将满足绝大多数应用程序的需求。对于那些可能需要这些接口规范中未定义的目标/设备特定功能的应用程序,相应的Timer、Hwi和Cache委托模块包含接口规范中定义的api的扩展。

要访问这些扩展的API集,您必须在配置文件中直接引用特定于目标/设备的模块,并在C源文件中包含其相应的头文件

  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值