Skip to content

Commit 9134f7d

Browse files
committed
update russian book
1 parent 8ddfcf8 commit 9134f7d

File tree

7 files changed

+285
-122
lines changed

7 files changed

+285
-122
lines changed

README_ru.md

+6
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,16 @@
5050

5151
- Приложения должны быть написаны в редакции 2018.
5252

53+
## [Руководство пользователя](https://rtic.rs) - [(Версия в разработке)](https://rtic.rs/dev)
54+
5355
## [Документация пользователя](https://rtic.rs)
5456

5557
## [Справочник по API](https://rtic.rs/stable/api/)
5658

59+
## [Сборник примеров, предоставляемы сообществом][examples]
60+
61+
[examples]: https://github.com/rtic-rs/rtic-examples
62+
5763
## Чат
5864

5965
Присоединяйтесь к нам, чтобы говорить о RTIC [в Matrix-комнате][matrix-room].

book/ru/src/by-example/app.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
Внутри модуля `app` атрибут ожидает найти функцию инициализации, помеченную
2525
атрибутом `init`. Эта функция должна иметь сигнатуру
26-
`fn(init::Context) [-> init::LateResources]` (возвращаемый тип нужен не всегда).
26+
`fn(init::Context) (-> init::LateResources, init::Monotonics)`.
2727

2828
Эта функция инициализации будет первой частью программы, выполняемой при запуске.
2929
Функция `init` будет запущена *с отключенными прерываниями* и будет иметь эксклюзивный доступ
@@ -54,6 +54,12 @@ $ cargo run --example init
5454
{{#include ../../../../ci/expected/init.run}}
5555
```
5656

57+
> **ПРИМЕЧАНИЕ**: Не забывайте указывать выбранное вами целевое устройство, передавая параметр target
58+
> в cargo (например `cargo run --example init --target thumbv7m-none-eabi`) или
59+
> настроив устройство, используемое по умолчанию для сборки примеров в `.cargo/config.toml`.
60+
> В нашем случае используется Cortex M3, эмулируемый с помощью QEMU, поэтому пишем `thumbv7m-none-eabi`.
61+
> Смотрите [`Создание нового проекта`](./new.md) для большей информации.
62+
5763
## `idle`
5864

5965
Функцию, помеченную атрибутом `idle` может опционально добавить в модуль.

book/ru/src/by-example/resources.md

+39-48
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,26 @@
77
Фреймворк дает пользователю полный контроль за тем, какой контекст может
88
получить доступ к какому ресурсу.
99

10-
Все ресурсы определены в одной структуре внутри модуля `#[app]`.
11-
Каждое поле структуры соответствует отдельному ресурсу.
12-
`struct`-ура должна быть аннотирована следующим атрибутом: `#[resources]`.
13-
14-
Ресурсам могут быть опционально даны начальные значения с помощью атрибута `#[init]`.
15-
Ресурсы, которым не передано начально значение, называются
16-
*поздними* ресурсами, более детально они описаны в одном из разделов на этой странице.
10+
Все ресурсы определены в *двух* структурах внутри модуля `#[app]`.
11+
Каждое поле этих структур соответствует отдельному ресурсу.
12+
Одна `struct`-ура должна быть аннотирована атрибутом `#[local]`.
13+
Другая `struct`-ура должна быть аннотирована атрибутом `#[shared]`.
14+
Разница между этими двумя множествами ресурсов будет описана познее.
1715

1816
Каждый контекс (задача-обработчик, `init` или `idle`) должен указать ресурсы, к которым
1917
он намерен обращаться, в соответсятвующем ему атрибуте с метаданными, используя
20-
аргумент `resources`. Этот аргумент принимает список имен ресурсов в качестве значения.
21-
Перечисленные ресурсы становятся доступны в контексте через поле `resources` структуры `Context`.
18+
либо аргумент `local`, либо `shared`. Этот аргумент принимает список имен ресурсов в качестве значения.
19+
Перечисленные ресурсы становятся доступны в контексте через поля `local` и `shared` структуры `Context`.
20+
21+
Во время выполнения при выходе из функции `#[init]` все ресурсы инициализированы.
22+
Функция `#[init]` должна возвращать начальные значения для всех ресурсов;
23+
отсюда следует, что тип возвращаемого ею значения включает типы
24+
структур `#[shared]` и `#[local]`.
25+
Поскольку ресурсы инициализированы в ходе функции `#[init]`, к ним нельзя
26+
получить доступ внетри функции `#[init]`.
2227

23-
Пример программы, показанной ниже содержит два обработчика прерывания, которые разделяют
24-
доступ к ресурсу под названием `shared`.
28+
Пример программы, показанной ниже содержит два обработчика прерывания.
29+
Каждый обработчик имеет доступ к его собственному `#[local]` ресурсу.
2530

2631
``` rust
2732
{{#include ../../../../examples/resource.rs}}
@@ -32,15 +37,17 @@ $ cargo run --example resource
3237
{{#include ../../../../ci/expected/resource.run}}
3338
```
3439

35-
Заметьте, что к ресурсу `shared` нельзя получить доступ из `idle`. Попытка сделать это
36-
приведет к ошибке компиляции.
40+
К ресурсу `#[local]` нельзя получить доступ извне задачи к которой он
41+
привязан атрибутом `#[task]`.
42+
Попытка обращения к одному и тому же ресурсу `#[local]` из более чем одной
43+
задачи - ошибка компиляции.
3744

3845
## `lock`
3946

40-
Критические секции необходимы для разделения изменяемых данных таким образом,
47+
Критические секции необходимы для доступа к ресурсам `#[shared]` таким образом,
4148
чтобы избежать гонок данных.
4249

43-
Поле `resources`, передаваемого `Context` реализует трейт [`Mutex`] для каждого разделяемого
50+
Поле `shared`, передаваемого `Context` реализует трейт [`Mutex`] для каждого разделяемого
4451
ресурса, доступного задаче.
4552

4653
Единственный метод этого трейта, [`lock`], запускает свой аргумент-замыкание в критической секции.
@@ -81,33 +88,7 @@ $ cargo run --example lock
8188
{{#include ../../../../examples/multilock.rs}}
8289
```
8390

84-
## Поздние ресурсы
85-
86-
Поздние ресурсы - такие ресурсы, которым не передано начальное значение во время компиляции
87-
с помощью атрибута `#[init]`, но которые вместо этого инициализируются во время выполнения
88-
с помощью значений из структуры `init::LateResources`, возвращаемой функцией `init`.
89-
90-
Поздние ресурсы полезны, например, для *move* (передача владения) периферии,
91-
инициализированной в `init`, в задачи.
92-
93-
Пример ниже использует поздние ресурсы, чтобы установить неблокируемый односторонний канал
94-
между обработчиком прерывания `UART0` и задачей `idle`. Для канала использована очередь типа
95-
один производитель-один потребитель [`Queue`]. Структура очереди разделяется на потребителя
96-
и производителя в `init`, а затем каждая из частей располагается в отдельном ресурсу;
97-
`UART0` владеет ресурсом производителя, а `idle` владеет ресурсом потребителя.
98-
99-
[`Queue`]: ../../../api/heapless/spsc/struct.Queue.html
100-
101-
``` rust
102-
{{#include ../../../../examples/late.rs}}
103-
```
104-
105-
``` console
106-
$ cargo run --example late
107-
{{#include ../../../../ci/expected/late.run}}
108-
```
109-
110-
## Только разделяемый доступ
91+
## Только разделяемый (`&-`) доступ
11192

11293
По-умолчанию фреймворк предполагает, что все задачи требуют эксклюзивный доступ (`&mut-`) к ресурсам,
11394
но возможно указать, что задаче достаточен разделяемый доступ (`&-`) к ресурсы с помощью синтакисиса
@@ -139,11 +120,21 @@ $ cargo run --example only-shared-access
139120

140121
## Неблокируемый доступ к изменяемым ресурсам
141122

142-
Есть две других возможности доступа к ресурсам
123+
Критическая секция *не* требуется для доступа к ресурсу `#[shared]`,
124+
к которому обращаются только из задач с *одинаковым* приоритетом.
125+
В этом случае вы можете избежать `lock` API, добавив атрибут поля `#[lock_free]` при объявдении ресурса (смотреть пример ниже).
126+
Заметьте, что это лишь для удобства: даже если вы используете `lock` API,
127+
во время выполнения фреймворк *не* создаст критическую секцию.
128+
Еще одно ценное замечание: использование `#[lock_free]` на ресурсах,
129+
разделяемых задачами, запускаемыми с разными приоритетами
130+
приведет к ошибке *компиляции* -- не импользование `lock` API может
131+
привести к гонке данных в этом случае.
143132

144-
* `#[lock_free]`: могут быть несколько задач с одинаковым приоритетом,
145-
получающие доступ к ресурсу без критических секций. Так как задачи с
146-
одинаковым приоритетом никогда не могут вытеснить друг друга, это безопасно.
147-
* `#[task_local]`: в этом случае должна быть только одна задача, использующая
148-
этот ресурс, так же как локальный `static mut` ресурс задачи, но (опционально) устанавливаемая с в init.
133+
``` rust
134+
{{#include ../../../../examples/lock-free.rs}}
135+
```
149136

137+
``` console
138+
$ cargo run --example lock-free
139+
{{#include ../../../../ci/expected/lock-free.run}}
140+
```

book/ru/src/by-example/tips.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Советы и хитрости
22

3+
Полные примеры для RTIC смотрите в репозитарии [rtic-examples][rtic-examples].
4+
5+
[rtic-examples]: https://github.com/rtic-rs/rtic-examples
6+
37
## Обобщенное программирование (Generics)
48

59
Все объекты, предоставляющие ресурысы реализуют трейт `rtic::Mutex`.

book/ru/src/internals/late-resources.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,7 @@ mod app {
103103
}
104104
```
105105

106-
Важная деталь здесь то, что `interrupt::enable` ведет себя как like a *compiler
107-
fence*, которое не дает компилятору пореставить запись в `X` *после*
106+
Важная деталь здесь то, что `interrupt::enable` ведет себя как *барьер компиляции*, который не дает компилятору переставить запись в `X` *после*
108107
`interrupt::enable`. Если бы компилятор мог делать такие перестановки появились
109108
бы гонки данных между этой записью и любой операцией `foo`, взаимодействующей с `X`.
110109

book/ru/src/internals/tasks.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ mod app {
7979
}
8080

8181
// очередь готовности диспетчера задач
82-
// `U4` - целое число, представляющее собой емкость этой очереди
83-
static mut RQ1: Queue<Ready<T1>, U4> = Queue::new();
82+
// `5-1=4` - представляет собой емкость этой очереди
83+
static mut RQ1: Queue<Ready<T1>, 5> = Queue::new();
8484

8585
// обработчик прерывания, выбранный для диспетчеризации задач с приоритетом `1`
8686
#[no_mangle]
@@ -151,9 +151,9 @@ mod app {
151151
const RQ1_CEILING: u8 = 2;
152152

153153
// используется, чтобы отследить сколько еще сообщений для `bar` можно поставить в очередь
154-
// `U2` - емкость задачи `bar`; максимум 2 экземпляра можно добавить в очередь
154+
// `3-1=2` - емкость задачи `bar`; максимум 2 экземпляра можно добавить в очередь
155155
// эта очередь заполняется фреймворком до того, как запустится `init`
156-
static mut bar_FQ: Queue<(), U2> = Queue::new();
156+
static mut bar_FQ: Queue<(), 3> = Queue::new();
157157

158158
// Поиск максимального приоритета для конечного потребителя `bar_FQ`
159159
const bar_FQ_CEILING: u8 = 2;
@@ -227,7 +227,7 @@ mod app {
227227

228228
// список свободной памяти: используется для отслеживания свободных ячеек в массиве `baz_INPUTS`
229229
// эта очередь инициализируется значениями `0` и `1` перед запуском `init`
230-
static mut baz_FQ: Queue<u8, U2> = Queue::new();
230+
static mut baz_FQ: Queue<u8, 3> = Queue::new();
231231

232232
// Поиск максимального приоритета для конечного потребителя `baz_FQ`
233233
const baz_FQ_CEILING: u8 = 2;

0 commit comments

Comments
 (0)