TI-RTOS Kernel(SYS/BIOS)---硬件抽象层

本节介绍提供的硬件抽象模块

Hardware Abstraction Layer APIs

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

HAL APIs分为两类:

  • 可用于所有目标和设备的通用APIs
  • 只对特定设备或ISA家族可用的目标/设备特定的APIs

通用APIs被设计用于覆盖绝大多数用例。对于那些关心确保不同TI设备之间的可移植性的开发人员来说,尽可能多地使用API是最好的服务。在通用APIs无法启用对软件应用程序有利的特定于设备的硬件特性的情况下,可以选择使用目标/特定于设备的API,它提供完整的硬件授权。

本章提供了每个HAL包的功能概述,以及该包的通用API函数的用法示例。在对泛型函数描述之后,还给了基于"C64x+"设备的目标特定api的示例。

HWI Module

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

Associating a C Function with a System Interrupt Source

为了将用户提供的C函数与特定的系统中断关联起来,需要创建一个Hwi对象,该对象封装了Hwi模块所需的中断相关信息。

ti.sysbios.hal.Hwi模块支持"create"功能的标准静态和动态形式。

Configuration example: 下面的例子静态创建了一个Hwi对象,它使用默认的示例配置参数将中断5与"mylsr"C函数关联起来:

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

Runtime example: 动态配置相同的中断所需的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参数。

Hwi Instance Configuration Parameters

为每个Hwi对象定义了以下配置参数及其默认值。

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

      MaskingOption maskSetting = MaskingOption_SELF;
    
  • 当调度程序调用Hwi函数时,配置的"arg"参数将被传递给它。

      UArg arg = 0;
    
  • "enabledInt"用于在创建Hwi对象时自动启用或禁用中断。

      Bool enableInt = true;
    
  • "eventId"容纳C6000设备,允许外部事件与中断号的动态关联。缺省值-1使与中断号关联的eventId处于正常(reset)状态(即不需要重新关联)。

      Int eventId = -1;
    
  • "priority"参数是为那些支持中断优先级设置的架构提供的。默认值-1通知Hwi模块将中断优先级设置为适合设备的默认值。

    Int priority = -1;

Create a Hwi Object Using Non-Default Instance Configuration Parameters

下面的例子展示了如何将5号中断与"mylsr"C函数关联起来,将"10"作为参数传递给"myslr",并在创建之后保持中断禁用。

Configuration example:

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);

Runtime example:

#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");
}

Enabling and Disable Interrupts

可以启用和禁用中断全局或单独与以下Hwi模块APIs:

  • UInt Hwi_enable()

    全局启用所有中断。返回以前的启用/禁用状态

  • UInt Hwi_disable()

    全局禁用所有中断。返回以前的启用/禁用状态

  • Hwi_restore(UInt key)

    将全局中断恢复到以前的启用/禁用状态。"key"是Hwi_disable()或Hwi_enable()返回的值

  • 下面的APIs用于启用、禁用和恢复由"intNum"给出的特定中断。它们与全局的Hwi_enable/disable/restore APIs具有相同的含义:

       UInt Hwi_enableInterrupt(UInt intNum);
       UInt Hwi_disableInterrupt(UInt intNum);
       Hwi_restoreInterrupt(UInt key);
    
  • Hwi_clearInterrupt(UInt intNum);

    从当前挂起的中断集中清除"intNum"

在处理关键的部分,禁用硬件中断是很有用的。

在C6000平台上,Hwi_disable()清除控制状态寄存器(CSR)中的GIE位。在C2000平台上,Hwi_disable()设置ST1寄存器中的INTM位

A Simple Example Hwi Application

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

Configuration example:

/* 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 example:

#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);
    }
}

The Interrupt Dispatcher

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

除了保留被中断线程的上下文之外,SYS/BIOS Hwi调度器还会编排以下的动作:

  • 中断处理期间禁用SYS/BIOS Swi和Task调度
  • 在每个中断的基础上自动管理嵌套中断
  • 调用任何已配置的"begin" Hwi Hook函数
  • 运行Hwi函数
  • 调用任何已配置的"end" Hwi Hook函数
  • 在中断处理后调用Swi和Task调度程序来执行任何Swi和Task操作,这些操作由Hwi函数中的操作产生。

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

Registers Saved and Restored by the Interrupt Dispatcher

dispatcher为准备调用用户的Hwi函数而保存和恢复的寄存器符合C编译器文档中寄存器使用约定部分定义的"由调用者保存"或"scratch"寄存器。

Additional Target/Device-Specific Hwi Module Functionality

ti.sysbios.hal.Hwi模块使用代理-委托机制实现的。所有ti.sysbios.hal.Hwi模块的API被转发到一个目标/设备特定的Hwi模块,该模块实现所有ti.sysbios.hal.Hwi所需的APIs。这些Hwi模块的每一个实现都提供了额外的API和功能独特的family/device,可以代替ti.sysbios.hal.Hwi模块,如果需要。

例如,‘C64x+’ 特定目标的Hwi模块,ti.sysbios.family.c64P.Hwi,除了ti.sysbios.hal.Hwi模块中定义的APIs外,还提供了以下APIs:

  • Hwi_eventMap(UInt intNum, UInt eventId);

    将外围事件号重新映射为中断号

  • Bits16 Hwi_enableIER(Bits16 mask);
    Bits16 Hwi_disableIER(Bits16 mask);
    Bits16 Hwi_restoreIER(Bits16 mask);

    这三个API允许启用,禁用和恢复由"mask"参数定义的一组中断。这些APIs提供了对’C64x+'内部IER寄存器的直接操作。

要想访问这些额外的APIs,需要使用与‘C64x+’目标相关联的目标/设备的Hwi模块,而不是ti.sysbios.hal.Hwi模块。

Configuration example:

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);

Runtime example:

#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);
    ……

Timer Module

ti.sysbios.hal.Timer模块提供了一个使用定时器外设的标准接口。它隐藏定时器外设的任何目标/设备特定的特征。他继承ti.sysbios.interfaces.ITimer接口

可以使用此模块创建一个计时器(即,标记一个计时器供使用),并将其配置为在计时器到期时调用tickFxn。只有在不需要对定时器外设进行任何自定义配置时才使用此模块。

这个模块有一个名为TimerProxy的配置参数,默认情况下,他被插入到目标/设备特定的实现中。例如,C64x目标的实现是ti.sysbios.family.c64.Timer。

定时器可以配置为一次性或连续模式定时器。周期可以指定为计时器计数或微秒。

定时器中断总是使用Hwi调度程序。定时器tickFxn在Hwi线程的上下文中运行。Timer模块自动为定时器中断创建一个Hwi实例。

Timer_create() API接收一个timerId。timerId可以是从0到由TimerProxy决定的目标/设备特定值。timerId只是一个逻辑ID;它与实际定时器外设的关系由TimerProxy控制。

如果使用哪个定时器对程序无关紧要,则指定Timer.ANY(为配置)或Timer_ANY(在C中)的timerId,这意味着"使用任何可用的计时器"。例如,在配置中使用:

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

在C程序中,使用:

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

timerParams包括许多参数来配置定时器。例如,timerParam.startMode被设置为StartMode_AUTO或StartMode_USER。StartMode_AUTO设置表示静态创建的计时器将在BIOS_start()中启动,动态创建的计时器将在create()时启动。StartMode_USER表示您的程序使用Timer_start()启动计时器。

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

如果你想要使用一个特定的定时器外设或者想要使用一个自定义的定时器配置(设置定时器输出管脚,仿真行为等),你应该使用目标/设备特定的定时器模块。例如,ti.sysbios.family.c64.Timer。

Timer模块还允许您为计时器外围设备指定extFreq(外部频率)属性,并提供一个API来在运行时获取计时器频率。这个外部频率属性只支持定时器频率可以与CPU频率分开设置的目标。

可以使用Timer_getFreq()将计时器终端转换为实时中断。

Timer模块提供了在运行时启动、停止和修改计时器周期的APIs。这些APIs有下列的副作用。

  • Timer_setPeriod()在设置周期寄存器之前停止计时器。然后重新启动计时器。
  • Timer_stop()停止定时器并禁用计时器中断。
  • Timer_start()清除计数器,清除任何挂起的中断,并在启动计时器之前启用计时器中断。

Runtime example: 这个C示例创建了一个周期10微秒的计时器。它将参数1传递给mylsr函数。它指示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");
}

Configuration example: 这个示例静态地创建一个计时器,其特征与前面地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);

Runtime example: 这个C示例为它创建的计时器设置一个频率。extFreq.hi和extFreq.Io属性设置用于表示频率(Hz)的结构的高32位和低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");
}

Configuration example: 此配置示例为它创建的计时器指定一个频率。

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);

Runtime example: 这个C示例创建了一个计时器,它使用任何可用的计时器外围设备,没2毫秒运行一次tickFxn()。它还创建一个task,当某些条件发生时,将计时器的周期从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);   
}

Target/Device-Specific Timer Modules

ti.sysbios.hal.Timer模块使用代理-委托机制实现。为每个受支持的系列提供了一个单独的目标/特定于设备的Timer模块。例如,ti.sysbios.timers.timer64。定时器模块作为64P系列的定时器外设管理器。

这些目标/设备特定的模块提供了泛型ti.sysbios.hal.Timer模块不支持的附加配置参数和APIs。

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

Configuraton example: 这个配置示例指定计时器参数,包括它创建的计时器myTimer的目标/设备特定参数。

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);

Runtime example: 这个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);
}

Cache Module

缓存支持提供API函数,这些函数在缓存行级别或全局级别执行一致性操作。缓存一致性操作是:

  • Invalidate. 使有效的缓存线无效,并丢弃受影响的缓存线的内容。
  • Writeback. 将高速缓存线路的内容写入较低级别内存,例如L2高速缓存或外部内存,而不丢弃原始高速缓存中的线路。
  • Writeback-Invalidation. 将高速缓存行的内容写入较低级别内存,然后丢弃原始高速缓存中的行内容。

Cache Interface Functions

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

  • Cache_enable(); 使能全部缓存。
  • Cache_disable(); 关闭全部缓存。
  • Cache_Inv(blockPtr,byteCnt,type,wait);使指定的内存范围无效。当使缓存行无效时,它的内容将被丢弃,缓存将该行标记为“clean”,以便下次读取特定地址时,他将从外部内存获取。范围内的所有行在所有缓存中都无效。
  • Cache_wb(blockPtr,byteCnt,type,wait);写回指定范围的内存。当执行回写时,缓存线的内容被写入较低级别的内存。范围内的所有行在缓存中都是有效的,范围内的数据被写回源内存。
  • Cache_wbInv(blockPtr,byteCnt,type,wait);将指定的内存范围写回并使其失效。当执行回写时,缓存线的内容被写入较低级别内存。当使缓存行无效时,它的内容将被丢弃。该范围的所有行都被写回源内存,然后再所有缓存中失效。

这些缓存APIs操作的地址范围以blockPtr的起始地址开始,并扩展指定的字节计数。所操作的地址范围被量化为每个缓存中的整条高速缓存线。

blockPtr指向非缓存内存中的一个地址,该地址可能被缓存到一个或多个缓存中,也可能根本不被缓存。如果blockPtr不对应于一个缓存行的开始位置,则使用该缓存行的开始位置。

如果byteCnt不等于整个缓存行数,则将byteCnt四舍五入到等于整个缓存行数的下一个大小。

type参数是Cache_Type类型的位掩码,它允许您指定一个或多个执行动作的缓存。

如果参数wait为true,则该函数将等待直到无效操作完成才返回。如果wait参数为false,则该函数立即返回。可以稍后使用Cache_wait()来确保该操作已经完成。

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

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

额外的APIs被添加到这个模块中用于特定目标/特定设备的实现。例如,ti.sysbios.family.c64P.Cache模块添加特定于C64x+缓存的APIs。这些扩展具有前缀为"Cahce_"的函数。

目前C64x+、C674x和ARM 缓存是被支持的。

C64x specific: 这些设备上的缓存是一级程序(L1P)、一级数据(L1D)和二级(L2)。

HAL Package Organization

位于ti.sysbios.hal包中的三个SYS/BIOS模块:Hwi、Timer和Cache需要目标/设备特定的API实现来实现它们的功能。为了再所有受支持的家族/设备上为这些模块提供一组通用的API,SYS/BIOS使用了代理-委托机制。

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

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

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

在这里插入图片描述
对于计时器或缓存模块尚未开发的目标/设备,hal.TimerNull或hal.CacheNull 委托被使用。在TimerNull/CacheNull中,ITimer/ICache中定义的APIs使用null函数实现。

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

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

参考文献:

  1. 《TI-RTOS Kernel (SYS/BIOS) User’s Guide》

猜你喜欢

转载自blog.csdn.net/Xiao_Jie123/article/details/120985693
TI