diff options
| author | Andrey Zgarbul <zgarbul.andrey@gmail.com> | 2019-02-08 23:18:51 +0300 |
|---|---|---|
| committer | Andrey Zgarbul <zgarbul.andrey@gmail.com> | 2019-02-08 23:18:51 +0300 |
| commit | 5ef1f2088a089e9ac731cfc2037282a6033c2c82 (patch) | |
| tree | 5bad376b2f1d716eda5efb61b7bfcf61a4711e30 /ru/src/by-example/tips.md | |
| parent | 45659fdbbc1163efd71ed89f892beeeeffd54cee (diff) | |
russian translation
Diffstat (limited to 'ru/src/by-example/tips.md')
| -rw-r--r-- | ru/src/by-example/tips.md | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/ru/src/by-example/tips.md b/ru/src/by-example/tips.md new file mode 100644 index 0000000..3608dc2 --- /dev/null +++ b/ru/src/by-example/tips.md @@ -0,0 +1,63 @@ +# Советы и хитрости + +## Generics + +Ресурсы, совместно используемые двумя или более задачами реализуют трейт `Mutex` +во *всех* контекстах, даже в тех, где для доступа к данным не требуются +критические секции. Это позволяет легко писать обобщенный код оперирующий +ресурсами, который можно вызывать из различных задач. Вот такой пример: + +``` rust +{{#include ../../../examples/generics.rs}} +``` + +``` console +$ cargo run --example generics +{{#include ../../../ci/expected/generics.run}}``` + +Это также позволяет Вам изменять статические приоритеты задач без +переписывания кода. Если Вы единообразно используете `lock`-и для доступа +к данным в разделяемых ресурсах, тогда Ваш код продолжит компилироваться, +когда Вы измените приоритет задач. + +## Запуск задач из RAM + +Главной целью переноса описания программы на RTFM в атрибуты в +RTFM v0.4.x была возможность взаимодействия с другими атрибутами. +Напримерe, атрибут `link_section` можно применять к задачам, чтобы разместить +из в RAM; это может улучшить производительность в некоторых случаях. + +> **ВАЖНО**: Обычно атрибуты `link_section`, `export_name` и `no_mangle` +> очень мощные, но их легко использовать неправильно. Неверное использование +> любого из этих атрибутов может вызвать неопределенное поведение; +> Вам следует всегда предпочитать использование безопасных, высокоуровневых +> атрибутов вокруг них, таких как атрибуты `interrupt` и `exception` +> из `cortex-m-rt`. +> +> В особых случаях функций RAM нет безопасной абстракции в `cortex-m-rt` +> v0.6.5 но создано [RFC] для добавления атрибута `ramfunc` в будущем релизе. + +[RFC]: https://github.com/rust-embedded/cortex-m-rt/pull/100 + +В примере ниже показано как разместить высокоприоритетную задачу `bar` в RAM. + +``` rust +{{#include ../../../examples/ramfunc.rs}} +``` + +Запуск этой программы произведет ожидаемый вывод. + +``` console +$ cargo run --example ramfunc +{{#include ../../../ci/expected/ramfunc.run}}``` + +Можно посмотреть на вывод `cargo-nm`, чтобы убедиться, что `bar` расположен в RAM +(`0x2000_0000`), тогда как `foo` расположен во Flash (`0x0000_0000`). + +``` console +$ cargo nm --example ramfunc --release | grep ' foo::' +{{#include ../../../ci/expected/ramfunc.grep.foo}}``` + +``` console +$ cargo nm --example ramfunc --release | grep ' bar::' +{{#include ../../../ci/expected/ramfunc.grep.bar}}``` |
