aboutsummaryrefslogtreecommitdiff
path: root/book/ru/src/internals/non-reentrancy.md
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2023-03-04 21:10:24 +0000
committerGitHub <noreply@github.com>2023-03-04 21:10:24 +0000
commit7c7d6558f6d9c50fbb4d2487c98c9a5be15f2f7b (patch)
tree80a47f0dc40059014e9448c4c2eb34c54dff45fe /book/ru/src/internals/non-reentrancy.md
parent1c5db277e4161470136dbd2a11e914ff1d383581 (diff)
parent98c5490d94950608d31cd5ad9dd260f2f853735c (diff)
Merge #694
694: RTIC 2 r=AfoHT a=korken89 Co-authored-by: Emil Fresk <emil.fresk@gmail.com> Co-authored-by: Per Lindgren <per.lindgren@ltu.se>
Diffstat (limited to 'book/ru/src/internals/non-reentrancy.md')
-rw-r--r--book/ru/src/internals/non-reentrancy.md79
1 files changed, 0 insertions, 79 deletions
diff --git a/book/ru/src/internals/non-reentrancy.md b/book/ru/src/internals/non-reentrancy.md
deleted file mode 100644
index 98eb00f..0000000
--- a/book/ru/src/internals/non-reentrancy.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# Нереентерабельность
-
-В RTIC задачи-обработчики *не* могут использоваться повторно. Переиспользование задачи-обработчика
-может сломать правила заимствования Rust и привести к *неопределенному поведению*.
-Задача-обработчик теоретически может быть переиспользована одним из двух способов: программно или аппаратно.
-
-## Программно
-
-Чтобы переиспользовать задачу-обработчик программно, назначенный ей обработчик прерывания
-должен быть вызван с помощью FFI (смотрите пример ниже). FFI требует `unsafe` код,
-что уменьшает желание конечных пользователей вызывать обработчик прерывания.
-
-``` rust
-#[rtic::app(device = ..)]
-mod app {
- #[init]
- fn init(c: init::Context) { .. }
-
- #[interrupt(binds = UART0)]
- fn foo(c: foo::Context) {
- static mut X: u64 = 0;
-
- let x: &mut u64 = X;
-
- // ..
-
- //~ `bar` может вытеснить `foo` в этом месте
-
- // ..
- }
-
- #[interrupt(binds = UART1, priority = 2)]
- fn bar(c: foo::Context) {
- extern "C" {
- fn UART0();
- }
-
- // этот обработчик прерывания вызовет задачу-обработчик `foo`, что сломает
- // ссылку на статическую переменную `X`
- unsafe { UART0() }
- }
-}
-```
-
-Фреймворк RTIC должен сгенерировать код обработчика прерывания, который вызывает
-определенные пользователем задачи-обработчики. Мы аккуратны в том, чтобы обеспечить
-невозможность вызова этих обработчиков из пользовательского кода.
-
-Пример выше раскрывается в:
-
-``` rust
-fn foo(c: foo::Context) {
- // .. пользовательский код ..
-}
-
-fn bar(c: bar::Context) {
- // .. пользовательский код ..
-}
-
-mod app {
- // все в этом блоке невидимо для пользовательского кода
-
- #[no_mangle]
- unsafe fn USART0() {
- foo(..);
- }
-
- #[no_mangle]
- unsafe fn USART1() {
- bar(..);
- }
-}
-```
-
-## Аппаратно
-
-Обработчик прерывания также может быть вызван без программного вмешательства.
-Это может произойти, если один обработчик будет назначен двум или более прерываниям
-в векторе прерываний, но синтаксиса для такого рода функциональности в RTIC нет.