This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/AM3358:Hwi 问题

Guru**** 2542790 points
Other Parts Discussed in Thread: SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/671827/rtos-am3358-hwi-issue

器件型号:AM3358
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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经解决了这个问题。 您可以将此关闭状态视为已关闭、此时无需采取进一步措施。 如果我有任何相关问题、我将发布新主题。 谢谢。