diff options
| author | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-02-11 20:41:49 +0000 |
|---|---|---|
| committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-02-11 20:41:49 +0000 |
| commit | 672886a67a80136f5620115772ceec1a628d8ee6 (patch) | |
| tree | 98361d6d3dfced4b068771c31163b324573294b7 /book/ru/src/by-example/tasks.md | |
| parent | 1d52964df7abf9fba09933470d5c3dcce96760c4 (diff) | |
| parent | 0007a35a274ab2d07eb937e41971ea5e2c1cb5ff (diff) | |
Merge #139
139: russian translation r=japaric a=japaric
Co-authored-by: Jorge Aparicio <jorge@japaric.io>
Co-authored-by: Andrey Zgarbul <zgarbul.andrey@gmail.com>
Diffstat (limited to 'book/ru/src/by-example/tasks.md')
| -rw-r--r-- | book/ru/src/by-example/tasks.md | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/book/ru/src/by-example/tasks.md b/book/ru/src/by-example/tasks.md new file mode 100644 index 0000000..355bd4e --- /dev/null +++ b/book/ru/src/by-example/tasks.md @@ -0,0 +1,63 @@ +# Программные задачи + +RTFM обрабатывает прерывания и исключения как *аппаратные* задачи. Аппаратные +задачи могут вызываться устройством в ответ на события, такие как нажатие кнопки. +RTFM также поддерживает *программные* задачи, порождаемые программой из любого +контекста выполнения. + +Программным задачам также можно назначать приоритет и диспетчеризовать из +обработчиков прерываний. RTFM требует определения свободных прерываний в блоке +`extern`, когда используются программные задачи; эти свободные прерывания будут использованы, чтобы диспетчеризовать программные задачи. Преимущество программных +задач перед аппаратными в том, что на один обработчик прерывания можно назначить +множество задач. + +Программные задачи определяются заданием функциям атрибута `task`. Чтобы было +возможно вызывать программные задачи, имя задачи нужно передать в аргументе +`spawn` контекста атрибута (`init`, `idle`, `interrupt`, etc.). + +В примере ниже продемонстрированы три программных задачи, запускаемые на 2-х +разных приоритетах. Трем задачам назначены 2 обработчика прерываний. + +``` rust +{{#include ../../../../examples/task.rs}} +``` + +``` console +$ cargo run --example task +{{#include ../../../../ci/expected/task.run}}``` + +## Передача сообщений + +Другое преимущество программных задач - возможность передавать сообщения задачам +во время их вызова. Тип полезной нагрузки сообщения должен быть определен в +сигнатуре обработчика задачи. + +Пример ниже демонстрирует три задачи, две из которых ожидают сообщения. + +``` rust +{{#include ../../../../examples/message.rs}} +``` + +``` console +$ cargo run --example message +{{#include ../../../../ci/expected/message.run}}``` + +## Ёмкость + +Диспетчеры задач *не* используют динамическое выделение памяти. Память +необходимая для размещения сообщений, резервируется статически. Фреймворк +зарезервирует достаточно памяти для каждого контекста, чтобы можно было вызвать +каждую задачу как минимум единожды. Это разумно по умолчанию, но +"внутреннюю" ёмкость каждой задачи можно контролировать используя аргумент +`capacity` атрибута `task`. + +В примере ниже установлена ёмкость программной задачи `foo` на 4. Если ёмкость +не определена, тогда второй вызов `spawn.foo` в `UART0` вызовет ошибку. + +``` rust +{{#include ../../../../examples/capacity.rs}} +``` + +``` console +$ cargo run --example capacity +{{#include ../../../../ci/expected/capacity.run}}``` |
