Thread 中讨论的其他器件:SYSBIOS
工具/软件:TI-RTOS
我正在尝试在 SYSBIOS 内的 Sitara 上使用 HWI。 我已经配置了引脚并成功关联了中断,我可以生成事件.... 一次。 调试显示在 SYSBIOS 函数 Hwi_dispatchIRQC()中,发送程序返回前的最后一步是禁用所有 HWI。 为什么? 鉴于在 HWI ISR 完成后调用了调度程序、我无法轻松地进行使能所有 HWI 调用来覆盖此操作。
以下是 HWI.c 中的代码:
/*
*==== Hwi_d调度 IRQC ===
*可配置 IRQ 中断调度程序。
*
void Hwi_d调度 IRQC (Hwi_IRP IRP)
{
/*
*在 ISR 堆栈上方保留足够的空间来处理
*多达16个32位栈驻留局部变量。
*此空间为 Swi 调度程序保留。
*
*如果 swi 调度程序要求的值大于此值、则必须执行此操作
*在 Hwi_Module_startup ()中处理此操作。
*
Hwi_Object * hwi;
BIOS_ThreadType forthreadType;
uINT intNum;
Int swKey;
uint32 oldThreshold;
#ifndef ti_sysbios_hal_hwi_disable_all_hooks
int i;
#endif
/*忽略杂散 INTS */
if (Hwi_intc.SIR_IRQ 和0x8000000){
hwi_module->sewoInts++;
Hwi_module->lastSpuriousInt = Hwi_intc.SIR_IRQ 和0x7f;
Hwi_intc.control = new_IRQ_AGR;
返回;
}
/*保存 ROV 调用堆栈视图的 IRP */
Hwi_module->IRP = IRP;
if (Hwi_dispatcherSwiSupport){
swKey = swi_disable();
}
/*将线程类型设置为 Hwi */
fortThreadType = BIOS_setThreadType (BIOS_ThreadType_Hwi);
/*仅处理此挂起中断*/
intNum = Hwi_intc.SIR_IRQ;//获取当前 int num *
/*记住先前的优先级阈值*/
oldThreshold = Hwi_intc.threshold;
/*将阈值设置为此中断的优先级*/
Hwi_intc.threshold = Hwi_intc.IRQ_priority &(Hwi_NUM_Priorities - 1);
/*清除此中断,强制重新排序,并允许*/中的新中断
Hwi_intc.control = new_IRQ_AGR;
Hwi = Hwi_module->dispatchTable[intNum];
Hwi->IRP = Hwi_module->IRP;
#ifndef ti_sysbios_hal_hwi_disable_all_hooks
/*调用 begin hooks */
对于(i = 0;i < Hwi_hooks.length;i++){
if (hwi_hooks.elem[i]。beginFxn!= NULL){
hwi_hooks.elem[i].begefxn ((IHwi_handle) hwi);
}
}
#endif
log_write5 (hwi_lm_begin、(IArg) hwi、(IArg) hwi->fxn、
(IARg)前推类型(IARg) intNum,hwi->IRP);
if (Hwi_dispatcherAutoNestingSupport){
Hwi_enable();
}
/*调用用户的 ISR func */
(hwi->fxn)(hwi->arg); <---- 我的 ISR 被调用
Hwi_disable(); <---- TI 调度程序代码禁用所有 HWI
log_write1 (Hwi_LD_end、(IArg) hwi);
/*恢复先前的阈值优先级*/
Hwi_intc.threshold = oldThreshold;
#ifndef ti_sysbios_hal_hwi_disable_all_hooks
/*调用终端挂钩*/
对于(i = 0;i < Hwi_hooks.length;i++){
if (Hwi_hooks.elem[i]。endFxn!= NULL){
hwi_hooks.elem[i]。endFxn ((IHwi_handle) hwi);
}
}
#endif
/*运行 Swi 调度程序*/
if (Hwi_dispatcherSwiSupport){
Swi_restore (swiKey);
}
/*恢复线程类型*/
BIOS_setThreadType (pretThreadType);
}
通过在我的初始中断之后禁用所有 HWI、它会将我的中断一次性地变为。 我已经介绍了我可以从 TI 找到的示例代码、《Sys/BIOS 用户手册》和 Doxygen 文件、但我无法解决此问题。 我们提请您提供帮助。
谢谢。
-Tim