# Советы и хитрости ## Обобщенное программирование (Generics) Ресурсы, совместно используемые двумя или более задачами, реализуют трейт `Mutex` во *всех* контекстах, даже в тех, где для доступа к данным не требуются критические секции. Это позволяет легко писать обобщенный код оперирующий ресурсами, который можно вызывать из различных задач. Вот такой пример: ``` rust {{#include ../../../../examples/generics.rs}} ``` ``` console $ cargo run --example generics {{#include ../../../../ci/expected/generics.run}}``` Это также позволяет Вам изменять статические приоритеты задач без переписывания кода. Если Вы единообразно используете `lock`-и для доступа к данным в разделяемых ресурсах, тогда Ваш код продолжит компилироваться, когда Вы измените приоритет задач. ## Запуск задач из ОЗУ Главной целью переноса описания программы на RTFM в атрибуты в RTFM v0.4.x была возможность взаимодействия с другими атрибутами. Напримерe, атрибут `link_section` можно применять к задачам, чтобы разместить их в ОЗУ; это может улучшить производительность в некоторых случаях. > **ВАЖНО**: Обычно атрибуты `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` в ОЗУ. ``` rust {{#include ../../../../examples/ramfunc.rs}} ``` Запуск этой программы произведет ожидаемый вывод. ``` console $ cargo run --example ramfunc {{#include ../../../../ci/expected/ramfunc.run}}``` Можно посмотреть на вывод `cargo-nm`, чтобы убедиться, что `bar` расположен в ОЗУ (`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}}```