Thread 中讨论的其他器件:SYSBIOS
我不熟悉 SYS/BIOS、过去主要从事裸机工作。 我看到了一个与 XINT1的零/低延迟中断 ISR 调用相关的问题。 在裸机上、我添加了允许中断嵌套的代码、从而获得了非常低的延迟(~24个周期) XINT1 ISR 调用。 我想在 SYS/BIOS 中创建类似的效果、但这里我看到的延迟在2-5 us 范围内、这对我的应用来说太长。 下面是关于咨询和问题的更多详细信息。
提问:
PWM 生成需要与外部异步脉冲同步、具有非常严格的计时要求 、精度低至20-30ns。 具体情况解释如下:
- 在 GPIO 输入上接收外部异步脉冲。
- 在来自接收 GPIO 的脉冲的上升沿触发外部中断(XINT1)。
- 在 XINT1 ISR 中、重新加载 PWM 比较寄存器、并且将 PWM1计数器复位为零。
问题:
从概念上讲、这是一个实现的简单逻辑、我已成功在裸机中对其进行了测试、满足了所有时序要求。 然而、在 SYSBIOS OSAL2中、 我所面临的挑战是与 XINT ISR 调用相关的中断延迟抖动。
从 µs 到在 XINT ISR 中修改 PWM 寄存器的那一刻、我将看到 ISR 延迟抖动高达5 μ s。
因此、为了应对这种高 ISR 延迟、我尝试了使用 ti_sysBIOS_family_c28_hwi.zeroLatencyIERMask。 (该设置是否允许已标记中断组在 SYS/BIOS 中嵌套中断?)
当我在 app.cfg 中设置 ti_sysbios_family_c28_hwi.zeroLatencyIERMask 时、我看不到调用的 XINT1 ISR 回调函数。
在 main 中,我添加了 BIOS_start()之前的代码。
主要()
{
//…… 用户任务
//在 OSAL2中初始化的 PWM 和其他任务
……
...
//插入零延迟中断*/
HWI_插头 (35、XINT1_ISR);
XintInit裸 机 ();
HWI_enableIER (0x0001);
BIOS_启动 ();
}
Bool XintInit裸 机(空)
{
//初始化 GPIO
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;// GPIO
GpioCtrlRegs.GPADIR.bit.GPIO13 = 0;//输入
GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 0;//仅 XINT1同步到 SYSCLKOUT
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 13;// XINT1为 GPIO0
EDIS;
XIntruptRegs.XINT1CR.BIT.POLARITY = 1;//上升沿中断
XIntruptRegs.XINT1CR.bit.enable = 1;//启用 XINT1
PieCtrlRegs.PIEIER1.bit.intx4 = 0u;// 2)禁用 PIE 组中的 XINTx
asm (" RPT #4 || NOP ");// 3)等待5个周期
IFR &=~0x0001u;// 4)清除此 PIE 组的 IFR 位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;// 5)必须确认 PIE 组
PieCtrlRegs.PIEIER1.bit.INTx4 = 1U;//启用 XINT1中断
返回 true;
}
#pragma CODE_SECTION (XINT1_ISR、"ramfuncs")
__interrupt void XINT1_ISR (void)
{
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.TBCTL.bit.CTRMODE=0;//pwmdrv_cm_count_up;
GpioDataRegs.GPATOGGLE.bit.GPIO21 = 1;
//确认此中断以从组1获取更多内容
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
随附的是供参考的视频。 请建议如何使 SYSBIOS 中的代码像裸机一样运行。
e2e.ti.com/.../RTOS_5F00_Timing.MOV