工具/软件:TI-RTOS
您好!
我已经为定制板开发了一个大型测试应用。 在这种环境中、我们将使用
未定义的 GPIO (0-15)作为中断外部源。 此时、我使用评估板和
我开发了一个 TI RTOS 任务、在 TEST_PH1连接器(GPIO15)上放置了一个小开关。
当 ISR 运行时、系统的所有其他部分在 Task_sleep 函数上被阻止(但我想
所有 TI RTOS 均处于已阻止状态)。 我使用了以下 TI RTSC 库:
EDMA3 2.12.2.
IPC 3.44.0.00
NDK 2.25.0..9.
SYSBIOS 6.46.1.38
PDK 2.0.4
XCDTools 3.32.0.06
CCS TI v8.1.0 (CCS 6.1.3.00034)
ISR 代码如下:
******** C 文件:********
#include
#include
#include
#include
#include
#include
//#define IRQ_SIMUL
typedef 结构体事件2gpio_s
{
uint32_t GPIO;
uint32_t eventID;
} event2gpio_t;
volatile int a = 0;
CSL_GpioHandle hGpio =空;
const event2gpio_t myGpio2Event[]=
{
{ 0、CSL_GEM_PCIExpress_MSI_INTn_PLUS_2}、//请勿使用
{ 1、CSL_GEM_PCIExpress_MSI_INTn_plus_6}、//请勿使用
{ 2、CSL_GEM_GPINT2 }、
{ 3、CSL_GEM_GPINT3 }、
{ 4、CSL_GEM_GPINT4 }、
{ 5、CSL_GEM_GPINT5 }、
{ 6、CSL_GEM_GPINT6 }、
{ 7、CSL_GEM_GPINT7 }、
{ 8、CSL_GEM_GPINT8 }、
{ 9、CSL_GEM_GPINT9 }、
{10、CSL_GEM_GPINT10}、
{11、CSL_GEM_GPINT11}、
{12、CSL_GEM_GPINT12}、
{13、CSL_GEM_GPINT13}、
{14、CSL_GEM_GPINT14}、
{15、CSL_GEM_GPINT15}
};
静态空 GPIO02InterruptHandler (空*arg)
{
/*清除事件 ID。 *
CSL_intcEventClear ((CSL_IntcEventId)参数);
A++;
}
CSL_IntcContext intcContext;
CSL_IntcEventHandlerRecord 倍行器[30];
CSL_IntcObj intcObj;
CSL_IntcHandle hTest;
CSL_IntcGlobalEnableState ;
CSL_IntcEventHandlerRecord EventRecord;
CSL_IntcParam vectId;
// GPIO IRQ 设计库: e2e.ti.com/.../374048
/*********
** 全球职能 **
秘书长的报告 /
void mainFPGA (UARg arg0、UARg arg1)
{
int bankNum = 0;
#ifdef IRQ_Simul
int cnt = 1000;
int pinNum = FPGA_GPIOIRQ;
其他
int pinNum = 15;
#endif
Int alocal = 0;
DBG_printf ("开始%s TASKNAME \"%s"、
__func__,FPGATASKNAME/C*Task_handle_name (Task_sele())*/;
A = 0;
BankNum = 0;//在 Core0中触发 pinNum
IF (pinNum > SIZEOF (myGpio2Event))
{
DBG_printf ("错误:pinNum=%d 过大"、pinNum);
返回;
}
否则、如果(pinNum < 2)
{
DBG_printf ("错误:pinNum=%d 太小"、pinNum);
返回;
}
/********
******* INTC 配置*******
秘书长的报告 /
// INTC 模块初始化
intcContext.eventhandlerRecord = eventhandler;
intcContext.numEvtEntry = 10;
if (CSL_intcInit (&intcContext)!= CSL_Sok)
{
DBG_printf ("错误:gem-intc 初始化失败");
返回;
}
//启用 NMI
if (CSL_intcGlobalNmiEnable()!= CSL_SOK)
{
DBG_printf ("错误:gem - INTC 全局 NMI 启用失败");
返回;
}
/*启用全局中断*/
if (CSL_intcGlobalEnable (&state)!= CSL_SOK)
{
DBG_printf ("错误:gem - intc 全局启用失败");
返回;
}
vectId = CSL_INTC_VECTID_4;
hTest = CSL_intcOpen (&intcObj、myGpio2Event[pinNum].eventID、&vectId、NULL);
if (hTest == NULL)
{
DBG_printf ("错误:Gem - INTC 打开失败");
返回;
}
DBG_printf ("调试:gem-intc INT%d EventID%d"、hTest->vectId、hTest->EventID);
/*注册在事件发生时调用的回调处理程序。 *
EventRecord.handler =&GPIO02InterruptHandler;
EventRecord.arg = hTest;
if (CSL_intcPlugEventHandler (hTest、&EventRecord)!= CSL_Sok)
{
DBG_printf ("错误:Gem-INTC 插头事件处理程序失败");
返回;
}
/*启用事件。 *
if (CSL_intcHwControl (hTest、CSL_INTC_CMD_EVTENABLE、NULL)!= CSL_SOK)
{
DBG_printf ("错误:gem - INTC CSL_INTC_CMD_EVTENABLE 命令失败");
返回;
}
DBG_printf ("调试:Gem - INTC 配置已完成");
//打开 CSL GPIO 模块0
hGpio = CSL_GPIO_open (0);
#ifdef IRQ_Simul
//将 GPIO 引脚编号 pinNum 设置为输出引脚
CSL_GPIO_setPinDirOutput (hGpio、pinNum);
#endif
#ifdef 上升
#ifdef IRQ_Simul
CSL_GPIO_clearOutputData (hGpio、pinNum); //FPGA_GPIOIRQ=0
#endif
//将 GPIO 引脚引脚数上的中断检测设置为上升沿
CSL_GPIO_setRisingEdgeDetect (hGpio、pinNum);
其他
#ifdef IRQ_Simul
CSL_GPIO_setOutputData (hGpio、pinNum); //FPGA_GPIOIRQ=1
#endif
//将 GPIO 引脚引脚数上的中断检测设置为上升沿
CSL_GPIO_setFallingEdgeDetect (hGpio、pinNum);
#endif
//将 GPIO 引脚编号 pinNum 设置为输入引脚
CSL_GPIO_setPinDirInput (hGpio、pinNum);//将 FPGA_GPIOIRQ 设置为输入
//为组0启用每组 GPIO 中断
CSL_GPIO_bankInterruptEnable (hGpio、bankNum);
DBG_printf ("调试:Gem - INTC IRQ 等待");
操作
{
#ifdef IRQ_Simul
Clock0ISR (//*(UARg)*/FPGATASKNAME);
如果((cnt---)==0)
{
CNT = 100;
CSL_GPIO_setPinDirOutput (hGpio、pinNum);
#ifdef 上升
//切换 FPGA_GPIOIRQ 引脚以触发 GPIO 中断
CSL_GPIO_clearOutputData (hGpio、pinNum); //FPGA_GPIOIRQ=0
CSL_GPIO_setOutputData (hGpio、pinNum); //FPGA_GPIOIRQ=1
其他
//切换 FPGA_GPIOIRQ 引脚以触发 GPIO 中断
CSL_GPIO_setOutputData (hGpio、pinNum); //FPGA_GPIOIRQ=1
CSL_GPIO_clearOutputData (hGpio、pinNum); //FPGA_GPIOIRQ=0
#endif
}
其他
{
CSL_GPIO_setPinDirInput (hGpio、pinNum);//将 FPGA_GPIOIRQ 设置为输入
//为组0启用每组 GPIO 中断
// Task_sleep (10);//如果取消注释此行,此任务也将保持被阻止状态
}
其他
// Task_sleep (10);//如果取消注释此行,此任务也将保持被阻止状态
#endif
如果(a!=手动变焦)//等待进入 ISR
{
#ifdef IRQ_Simul
CSL_GPIO_setPinDirOutput (hGpio、pinNum);
#ifdef 上升
CSL_GPIO_clearOutputData (hGpio、pinNum); //FPGA_GPIOIRQ=0
其他
CSL_GPIO_setOutputData (hGpio、pinNum); //FPGA_GPIOIRQ=1
#endif
#endif
DBG_printf ("GPIO 中断发生 a =%d"、a);
手动变焦= A;
}
} while (global_var->exit_flag == false );
CSL_intcClose (&intcObj);
DBG_printf ("退出%s"、__func__);
Task_exit();
返回;
}
******** CFG 文件:********
VAR 内存 = xdc.useModule('xdc.runtime.Memory');
VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
VAR 任务 = xdc.useModule('ti.sysbios.knl.Task');
var ti_ndk_config_emac = xdc.useModule('ti.ndk.config.Emac');
VAR ICMP = xdc.useModule('ti.ndk.config.Icmp');
VAR Swi = xdc.useModule('ti.sysbios.knl.Swi');
VAR 计时器 = xdc.useModule('ti.sysbios.hal.Timer');
VAR SwTimerPrms =新的 Timer.Params();
SwTimerPrms.startMode = Timer.StartMode_Auto;
SwTimerPrms.period = 100000; // 1000000 uSecs = 100ms
SwTimerPrms.instance.name ="SWTimer";
VAR SwTimer = Timer.create (空、'&swthTimerHandler'、SwTimerPrms);
Task.common$.namedInstance = true;
VAR 时钟 = xdc.useModule('ti.sysbios.knl.Clock');
clock.tickPeriod = 750;
VAR Sem = xdc.useModule('ti.sysbios.knl.Semaphore');
VAR 诊断 = xdc.useModule('xdc.runtime.Diags');
var devType ="c6657";
VAR_l = XDC.loadPackage ('ti.CSL');
Csl.Settings.deviceType = devType;
Csl.Settings.useCSLIntcLib = true;
/*加载 OSAL 封装*/
var osType ="tirtos"
VAR OSAL = xdc.useModule('ti.osal.Settings');
OSAL.osType = osType;
OSAL.socType = devType;
VAR Qmss = xdc.loadPackage ('ti.drv.qms');
VAR EMAC = XDC.loadPackage ('ti.drv.emac');
emac.Settings.socType = devType;
VAR Nimu = XDC.loadPackage ('ti.transport.NDK.Nimu');
Nimu.Settings.socType = devType;
VAR LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
VAR EXC = xdc.useModule('ti.sysbios.family.c64p.Exception');
Exc.common$.logger = LoggerBuf.create();
EXC.enablePrint = true;
VAR Global = xdc.useModule('ti.ndk.config.Global');
global.enableCodeGeneration = false;
VAR Cache = xdc.useModule('ti.sysbios.family.c66.Cache');
VAR 启动 = xdc.useModule('xdc.runtime.Startup');
VAR 系统 = xdc.useModule('xdc.runtime.System');
VAR 设置 = xdc.useModule('ti.sysbios.posix.Settings');
settings.supportsMutexPriority = true;
VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
var heapMemParams = new HeapMem.Params();
heapMemParams.size = 0x3D000;
heapMemParams.sectionName ="systemHeap (系统堆)";
program.global.heap0 = HeapMem.create (heapMemParams);
Memory.defaultHeapInstance = Program.global.heap0;
Program.sectMap["sharedL2"] ="MSMCSRAM";
Program.sectMap["systemHeap"] ="MSMCSRAM";
Program.sectMap[".sysmem"] ="MSMCSRAM";
Program.sectMap[".args"] ="MSMCSRAM";
Program.sectMap[".cio"] ="MSMCSRAM";
Program.sectMap[".rodata"] ="MSMCSRAM";
Program.sectMap[".neardata"] ="MSMCSRAM";
Program.sectMap[".cppi"] ="MSMCSRAM";
Program.sectMap[".init_array"]="MSMCSRAM";
Program.sectMap[".qmss"] ="MSMCSRAM";
Program.sectMap[".cinit"] ="MSMCSRAM";
Program.sectMap[".bss"] ="MSMCSRAM";
Program.sectMap[".const"] ="MSMCSRAM";
Program.sectMap[".text"] ="MSMCSRAM";
Program.sectMap[".code"] ="MSMCSRAM";
Program.sectMap[".switch"] ="MSMCSRAM";
Program.sectMap[".data"] ="MSMCSRAM";
Program.sectMap[".vecs"] ="MSMCSRAM";
Program.sectMap["emacComm"] ="L2SRAM";
Program.sectMap[".far:taskStackSection"]="L2SRAM";
Program.sectMap[".stack"] = "L2SRAM";
Program.sectMap["platform_lib"] ="L2SRAM";
Program.sectMap[".fardata:benchmarking"]="DDR3";
Program.sectMap[".dstBufSec"]="L2SRAM";
Program.sectMap[".testData"]="L2SRAM";
Program.sectMap[".srioSharedMem"]="MSMCSRAM";
SysStd = xdc.useModule('xdc.runtime.SysStd');
System.SupportProxy = SysStd;
startup.lastFxns.$add ('&EVM_init');
BIOS.taskEnabled = true;
var drv = xdc.loadPackage ("ti.sdo.EDMA3.drv");
var rm = XDC.loadPackage ("ti.sdo.EDMA3.rm");
VAR 事件 = xdc.useModule('ti.sysbios.knl.Event');
VAR 空闲 = xdc.useModule('ti.sysbios.knl.Idle');
VAR CpIntc = xdc.useModule('ti.sysbios.family.c66.tci66xx.CpIntc');
VAR ECM = xdc.useModule ("ti.sysbios.family.c64p.EventCombiner");
VAR HWI = xdc.useModule('ti.sysbios.family.c64p.Hwi');
var halCache = xdc.useModule('ti.sysbios.hal.Cache');
ECM.eventGroupHwiNum[0]= 7;
ECM.eventGroupHwiNum[1]= 8;
VAR Utils = XDC.loadPackage ('ti.utils.profiling');
VAR PCIe = XDC.loadPackage ('ti.drv.PCIe');
PCIe.Settings.enableProfiling = true;
BIOS.smpEnabled = true;
clock.timerId =-1;
Clock.swiPriority = 15;
global.ipv6 = false;
环境['xdc.cfg.check.fatal']='fals';
VAR HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');
VAR 日志 = xdc.useModule('xdc.runtime.Log');
VAR Cppi = XDC.loadPackage ('ti.drv.cppi');
VAR IPC = xdc.useModule('ti.sdo.ipc.Ipc');
VAR SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
SharedRegion.translate = false;
var memmap = Program.cpu.memyMap;
Program.sectMap[".my_sect_iram"] ="L2SRAM";
Program.sectMap[".my_sect_ddr"] ="L2SRAM";
/* ===== gpio_test.cfg =========== /
Task.deleteTerminatedTasks = false;
BIOS.swiEnabled = true;
Program.sectMap[".csl_vect"]="L2SRAM";
VAR HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');
VAR 内核 = xdc.useModule('ti.sysbios.hal.Core');
VAR 板= XDC.loadPackage ('ti.board');
board.Settings.boardName ="evmC6657";
VAR GPIO = XDC.loadPackage ('ti.drv.GPIO');
GPIO.Settings.socType = devType;
VAR UART = xdc.useModule('ti.drv.uart.Settings');
UART.socType = devType;
Task.checkStackFlag = false;
var memmap = Program.cpu.memyMap;
*********** 控制台:*******
DigitalProc testBench 软件 ver 0.0.1 Build 46 CPU 频率1000 MHz DSP 的核心2个
DSP 硬件版本0 DSP 名称"TMS320C6657"板名称"TMDXEVM6657L"
MAC0:00:18:30:0A:22:88
00:00:00:00:07 PciExMain.c@2223: 启动 PciExMain TASKNAME "PciExTask"
00:00:00:00:00:00 PciExMain.c@2258: 版本号:0x02020007;字符串 PCIe LLD 修订版本:02.02.00.07:2016年12月13日:16:29:29
00:00:00:00:00 FPGAInterrupt.c@209: 启动 mainFPGA TASKNAME "FpgaTask"
00:00:00:00:00:00 FPGAInterrupt.c@280: 调试:Gem - INTC INT4 EventID89
00:00:00:00:00:00 FPGAInterrupt.c@300: 调试:完成 GBIM-INTC 配置
00:00:00:00:00:00 FPGAInterrupt.c@327: 调试:Gem - INTC IRQ 等待
00:00:00:00:00:00 FPGAInterrupt.c@370: 发生 GPIO 中断 A = 3
00:00:00:00:00:00 FPGAInterrupt.c@370: 发生 GPIO 中断 A = 5
00:00:00:00:00:00 FPGAInterrupt.c@370: 发生 GPIO 中断 A = 6
00:00:00:00:00:00 FPGAInterrupt.c@370: 发生 GPIO 中断 A = 12
00:00:00:00:00:00 FPGAInterrupt.c@370: 发生 GPIO 中断 A = 14
00:00:00:00:00:00 FPGAInterrupt.c@370: 发生 GPIO 中断 A = 18
00:00:00:00:00:00 FPGAInterrupt.c@370: 发生 GPIO 中断 A = 21
00:00:00:00:00:00 FPGAInterrupt.c@370: 发生 GPIO 中断 A = 22
00:00:00:00:00:00 FPGAInterrupt.c@370: 发生 GPIO 中断 A = 23
我假设 HWI CSL_INTC_VECTID_4已在 TI RTOS 中用作计时器计划
(或其他一些使用),当我使用此 vectID 时,RTOS 将保持被阻止。
如果我无法使用此 vectID、我可以使用哪一个?
我的错在哪里? 或者我错过了什么?
此致
Dario