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.
您好 Steven、
这是一个非 RTOS 应用程序还是 RTOS 应用程序?
R5F VIM INTC 支持 IRQ 和 FIQ、而 HWI API 允许将中断指定为 IRQ 或 FIQ。
下面记录了一个裸机(非 RTOS) GPIO 输入中断示例: https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/08_01_00_36/exports/docs/api_guide_am64x/EXAMPLES_DRIVERS_GPIO_INPUT_INTERRUPT.html。 此示例使用 IRQ。
HWI 记录在以下位置: https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/08_01_00_36/exports/docs/api_guide_am64x/KERNEL_DPL_HWI_PAGE.html
FIQ 的限制记录如下:
在进入中断回调函数之前、IRQ 和 FIQ 中断都通过调度程序。
对于 IRQ 中断、VIM VIC 端口被缺省启用并且 CPU 直接分支至 ISR (IRQ 调度程序)地址。
VIC 端口不支持 FIQ 的此功能、因此 R5F 必须读取 VIM MMR 才能在分支到发送器之前获取发送器地址。 但是、R5F FIQ 模式具有比 IRQ 更多的分组寄存器、因此需要在 ISR 中保存上下文的寄存器(使用的寄存器)较少。
我无法在 SDK 中找到任何 R5F VIM/FIQ 用法示例。
对于低延迟响应、我建议将中断调度程序代码/数据放置在 TCM 中、以及中断函数(回调)本身。 这可以使用链接器命令文件来实现。
此致、
弗兰克
您好、Frank、
谢谢、这些示例非常有用(不确定为什么我第一次错过了它们)。 我看到 FreeRTOS 和裸机都不支持在 FIQ 中断内保存/恢复 FPU。
这是否意味着 FIQ 中断不支持浮点运算? 还是我们必须手动保存/恢复 FPU 上下文? 这是我们的主要用例之一-在低延迟中断中在 R5F 上运行的浮点控制代码。
Steve
您好 Steven、
[引用 userid="187021" URL"~/support/processors-group/processors/f/processors-forum 1058989/am6442-r5f-external-interrupt/3920260#3920260]FIQ 中断中是否不支持浮点运算? 或者我们只需手动保存/恢复 FPU 上下文?FIQ 中断处理程序使用 TI-clang ARM 编译器"interrupt"关键字。 以下网址对此进行了说明: https://software-dl.ti.com/codegen/docs/tiarmclang/compiler_tools_user_guide/compiler_manual/c_cpp_language_implementation/attributes/function_attributes.html?highlight=interrupt#interrupt
如果中断的上下文和 FIQ ISR 都使用浮点寄存器、则必须在 FIQ ISR 中手动保存/恢复浮点寄存器。
这将需要与 SDK 处理 IRQ 的方式类似的 FIQ 中断处理、即在调用 C IRQ 发送程序之前调用汇编语言 ISR、以保存寄存器。
此致、
弗兰克
您好、Frank、
好的、这是有道理的、因为我们必须在其他平台上执行同样的操作。
SDK 是否包含执行此操作的任何函数? 提出这样的要求:如果 TI 已经拥有用于在 TI 处理器上保存/恢复 FPU 寄存器的 API、我们就不会重新发明轮子。
Steve
您好、Steve、
我无法找到用于此目的的函数。 但是、请参阅以下文件、了解可合并到 FIQ ISR 中的代码:
例如、此代码:
#if ENABLE_FPU_SAVE_RESTORE FMRX R0, FPSCR VPUSH {D0-D15} /* VPUSH {D16-D31} */ PUSH {R0} #endif
也许可以将代码制作到汇编宏中。
此致、
弗兰克