Merge branch 'docs/update_cn_translation' into 'master'
docs: Update CN translation for several docs Closes DOC-8745 and DOC-8735 See merge request espressif/esp-idf!33071
This commit is contained in:
@@ -89,17 +89,45 @@
|
||||
|
||||
须注意从未关联到内核的任务中调用 :cpp:func:`esp_intr_alloc` 的情况。在任务切换期间,这些任务可能在不同内核之间进行迁移,因此无法确定中断分配到了哪个 CPU,给释放中断句柄造成困难,也可能引起调试问题。建议使用特定 CoreID 参数的 :cpp:func:`xTaskCreatePinnedToCore` 来创建中断分配任务,这对于内部中断源而言是必要的。
|
||||
|
||||
.. _iram_safe_interrupts_handlers:
|
||||
|
||||
IRAM-safe 中断处理程序
|
||||
----------------------
|
||||
IRAM 安全中断处理程序
|
||||
---------------------
|
||||
|
||||
``ESP_INTR_FLAG_IRAM`` flag 注册的中断处理程序始终在 IRAM(并从 DRAM 读取其所有数据)中运行,因此在擦除和写入 flash 时无需禁用。
|
||||
在执行 SPI flash 的写入和擦除操作时,{IDF_TARGET_NAME} 会禁用 cache,中断处理程序将无法访问 SPI flash 和 SPIRAM。因此,ESP-IDF 中存在两种中断处理程序,它们各有优缺点:
|
||||
|
||||
这对于需要保证最小执行延迟的中断来说非常有用,因为 flash 写入和擦除操作可能很慢(擦除可能需要数十毫秒或数百毫秒才能完成)。
|
||||
**IRAM 安全中断处理程序** - 只能访问内部内存中的代码和数据(代码存储在 IRAM 中,数据存储在 DRAM 中)。
|
||||
|
||||
如果中断被频繁调用,可以将中断处理程序保留在 IRAM 中,避免 flash cache 丢失。
|
||||
.. list::
|
||||
|
||||
有关更多详细信息,请参阅 :ref:`SPI flash API 相关文档 <iram-safe-interrupt-handlers>`。
|
||||
- **+** **延迟**:flash 写入和擦除操作相对缓慢,例如擦除可能需要几十或几百毫秒才能完成,但这些中断处理程序不受影响,执行速度较快且延迟较低,能够保证最小执行延迟。
|
||||
- **-** **占用内部内存**:中断处理程序占用了宝贵的内部内存,这些内存本可以用于其他目的。
|
||||
- **+** **cache 未命中**:中断处理程序不依赖 cache, 因此就不会出现 cache 未命中带来的不确定性,因为代码和数据已存储在内部存储器中了。
|
||||
- **使用场景**:请使用 :c:macro:`ESP_INTR_FLAG_IRAM` 标志,通过中断分配器 API 注册此类中断。
|
||||
|
||||
**非 IRAM 安全中断处理程序** - 可能会访问 flash 中的代码和(只读)数据。
|
||||
|
||||
.. list::
|
||||
|
||||
- **-** **延迟**:在进行 flash 操作时,中断处理程序会被推迟,因此平均延迟较高且难以预测。
|
||||
- **+** **占用内部内存**:该中断处理程序不使用内部 RAM,或者使用的内存比 IRAM 安全中断要少。
|
||||
- **使用场景**:通过中断分配器 API 注册此类中断时,请 **不要** 使用 :c:macro:`ESP_INTR_FLAG_IRAM` 标志。
|
||||
|
||||
*请注意,没有任何显式标记将中断处理程序标识为 IRAM 安全。* 当且仅当要访问的代码和数据存储在内部内存中时,中断处理程序才被隐式标记为 IRAM 安全。“IRAM 安全”这个术语实际上有点误导性,因为除了将处理程序的代码放在 IRAM 中之外,还有更多其他要求。以下是 **不属于** IRAM 安全的中断处理程序示例:
|
||||
|
||||
.. list::
|
||||
|
||||
- 部分代码放置在 flash 中。
|
||||
- 放置在 IRAM 中但调用了存储在 flash 里的函数。
|
||||
- 代码放置在 IRAM 中但访问了位于 flash 中的只读变量。
|
||||
|
||||
关于如何将代码和数据放置在 IRAM 或 DRAM 中,请参见 :ref:`how-to-place-code-in-iram`。
|
||||
|
||||
有关 SPI flash 操作及其与中断处理程序交互的更多详细信息,请参见 :ref:`SPI flash API 文档 <iram-safe-interrupt-handlers>`。
|
||||
|
||||
.. note::
|
||||
|
||||
如果不能 100% 确定中断处理程序访问的所有代码和数据都位于 IRAM(代码)或 DRAM(数据)中,切勿使用 ``ESP_INTR_FLAG_IRAM`` 标志注册中断处理程序。忽略这一点将导致(有时是偶发性的):ref:`cache 错误 <cache_error>`。通过调用函数间接访问代码和数据时也需要注意这点。
|
||||
|
||||
.. _intr-alloc-shared-interrupts:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user