<?xml version="1.0" encoding="utf-8"?>
<!-- generator="FeedCreator 1.7.2-ppt DokuWiki" -->
<?xml-stylesheet href="http://www.pic24.ru/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="http://www.pic24.ru/feed.php">
        <title>PIC24 osa:ref:appendix</title>
        <description></description>
        <link>http://www.pic24.ru/</link>
        <image rdf:resource="http://www.pic24.ru/lib/images/favicon.ico" />
       <dc:date>2023-02-10T18:10:14+03:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/osa/ref/appendix/3leds_pic10f?rev=1295279060"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/osa/ref/appendix/configuration?rev=1285336234"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/osa/ref/appendix/dynamic_timers_old?rev=1265310938"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/osa/ref/appendix/errorlist?rev=1295697814"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/osa/ref/appendix/intro?rev=1245364624"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/osa/ref/appendix/leds28?rev=1246956300"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/osa/ref/appendix/optimization?rev=1245363319"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/osa/ref/appendix/quartet?rev=1275505175"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/osa/ref/appendix/resources?rev=1331541901"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/osa/ref/appendix/speed?rev=1331541883"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/osa/ref/appendix/static_timers_old?rev=1230068485"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/osa/ref/appendix/tutor1?rev=1233487566"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="http://www.pic24.ru/lib/images/favicon.ico">
        <title>PIC24</title>
        <link>http://www.pic24.ru/</link>
        <url>http://www.pic24.ru/lib/images/favicon.ico</url>
    </image>
    <item rdf:about="http://www.pic24.ru/doku.php/osa/ref/appendix/3leds_pic10f?rev=1295279060">
        <dc:format>text/html</dc:format>
        <dc:date>2011-01-17T18:44:20+03:00</dc:date>
        <title>Пример использования OSA: 3LEDS_PIC10F</title>
        <link>http://www.pic24.ru/doku.php/osa/ref/appendix/3leds_pic10f?rev=1295279060</link>
        <description>


&lt;h1&gt;&lt;a name=&quot;пример_использования_osa3leds_pic10f&quot; id=&quot;пример_использования_osa3leds_pic10f&quot;&gt;Пример использования OSA: 3LEDS_PIC10F&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Пример использования OSA: 3LEDS_PIC10F&quot; [1-80] --&gt;
&lt;h2&gt;&lt;a name=&quot;проект&quot; id=&quot;проект&quot;&gt;Проект&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Данный пример демонстрирует использование OSA для написания программы под 12-разрядные контроллеры. Файл &lt;a href=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/3leds.rar&quot; class=&quot;media mediafile mf_rar&quot; title=&quot;osa:3leds.rar&quot;&gt;3leds.rar&lt;/a&gt; нужно распаковать в папку &amp;quot;C:\TEST\3LEDS&amp;quot;. В папке проект для &lt;strong&gt;PIC10F222&lt;/strong&gt; (его можно пересобрать также для &lt;strong&gt;F202&lt;/strong&gt; и &lt;strong&gt;F206&lt;/strong&gt;).
&lt;/p&gt;

&lt;p&gt;

Программа управляет 7-цветным светодиодом с помощью ШИМ. В ходе работы плавно создаются разные комбинации яркости всех трех светодиодов. Есть 4 режима скорости (от очень медленного до очень быстрого).
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Проект&quot; [81-896] --&gt;
&lt;h2&gt;&lt;a name=&quot;принципиальная_схема&quot; id=&quot;принципиальная_схема&quot;&gt;Принципиальная схема&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Ниже приведена схема включения ПИКа. ПИК управляет 3-мя транзисторами, в коллекторе каждого из которых стоит светодиод. Следует обратить внимание, что к ножкам управления транзисторами также подключены кнопки.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/appendix/3leds_pic10f.jpg?id=osa%3Aref%3Aappendix%3A3leds_pic10f&quot; class=&quot;media&quot; title=&quot;osa:ref:appendix:3leds_pic10f.jpg&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/appendix/3leds_pic10f.jpg&quot; class=&quot;media&quot; title=&quot;3leds_pic10f.jpg&quot; alt=&quot;3leds_pic10f.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Кнопка &lt;span class=&quot;important&quot;&gt;S1&lt;/span&gt; делает активным красный цвет.&lt;br/&gt;

Кнопка &lt;span class=&quot;important&quot;&gt;S2&lt;/span&gt; делает активным зеленый цвет.&lt;br/&gt;

Кнопка &lt;span class=&quot;important&quot;&gt;S3&lt;/span&gt; делает активным синий цвет.&lt;br/&gt;

Кнопка &lt;span class=&quot;important&quot;&gt;S4&lt;/span&gt; изменяет скорость работы (4 скорости).&lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;

&lt;strong&gt;Примечание.&lt;/strong&gt; Значение сопротивлений токозадающих резисторов &lt;strong&gt;R11&lt;/strong&gt;, &lt;strong&gt;R12&lt;/strong&gt; и &lt;strong&gt;R13&lt;/strong&gt; подбираются под конкретные светодиоды.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Принципиальная схема&quot; [897-1912] --&gt;
&lt;h2&gt;&lt;a name=&quot;описание_работы&quot; id=&quot;описание_работы&quot;&gt;Описание работы&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Программа состоит из 3-х задач:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;span class=&quot;important&quot;&gt;Task_Leds&lt;/span&gt; - формирует импульсы управления светодиодами нужной длительности.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;span class=&quot;important&quot;&gt;Task_Work&lt;/span&gt; - формирует значения интенсивностей для всех светодиодов&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;span class=&quot;important&quot;&gt;Task_Buttons&lt;/span&gt; - обрабатывает кнопки&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Описание работы&quot; [1913-2344] --&gt;
&lt;h3&gt;&lt;a name=&quot;task_leds&quot; id=&quot;task_leds&quot;&gt;Task_Leds&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Большую часть времени программа находится в задаче &lt;span class=&quot;important&quot;&gt;Task_Leds&lt;/span&gt;. Эта задача ждет, когда таймер TMR0 переполнится, и в этот момент подает &amp;quot;1&amp;quot; на все светодиоды. Далее в цикле отмеряются правильные длительности импульсов. Для этого в программе есть 3 переменные (по одной для каждого цвета), в которых содержится информация о текущей интенсивности. Как только таймер TMR0 становится больше значения интенсивности, соответствующий светодиод гаснет. Когда погаснут все 3 светодиода, управление передается остальным задачам.
&lt;/p&gt;

&lt;p&gt;
Две другие задачи: &lt;span class=&quot;important&quot;&gt;Task_Work&lt;/span&gt; и &lt;span class=&quot;important&quot;&gt;Task_Buttons&lt;/span&gt; - находятся в ожидании установки битов &lt;strong&gt;&lt;em&gt;bRunTaskWork&lt;/em&gt;&lt;/strong&gt; и &lt;strong&gt;&lt;em&gt;bRunTaskButtons&lt;/em&gt;&lt;/strong&gt;, соответственно. Эти биты устанавливает задача &lt;span class=&quot;important&quot;&gt;Task_Leds&lt;/span&gt; после того, как обработает 1 период управления светодиодами.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Task_Leds&quot; [2345-3698] --&gt;
&lt;h3&gt;&lt;a name=&quot;task_work&quot; id=&quot;task_work&quot;&gt;Task_Work&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
При получении управления &lt;span class=&quot;important&quot;&gt;Task_Work&lt;/span&gt; проверяет, пора ли изменять интенсивность светодиодов. Для этого есть переменная &lt;strong&gt;&lt;em&gt;Work&lt;/em&gt;&lt;/strong&gt;, которая увеличивается каждый раз при попадании в задачу. Скорость увеличения (фактически - скорость изменения интенсивности) определяется 2-мя старшими битами переменной. Как только младшие 5 бит переменной &lt;strong&gt;&lt;em&gt;Work&lt;/em&gt;&lt;/strong&gt; переполняются, задача вызывает функцию &lt;span class=&quot;important&quot;&gt;ChangeIntensity()&lt;/span&gt;, которая делает один шаг изменения интенсивности в соответсвие со значениями переменных &lt;strong&gt;&lt;em&gt;Red&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;Green&lt;/em&gt;&lt;/strong&gt; и &lt;em&gt;&lt;strong&gt;Blue&lt;/strong&gt;.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
В данной программе применен простой способ: интенсивности всех светодиодов изменяются с одинаковой скоростью. Но каждый может сам под себя переписать функцию &lt;span class=&quot;important&quot;&gt;ChangeIntensity()&lt;/span&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Task_Work&quot; [3699-4960] --&gt;
&lt;h3&gt;&lt;a name=&quot;task_button&quot; id=&quot;task_button&quot;&gt;Task_Button&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Эта задача, так же как и &lt;span class=&quot;important&quot;&gt;Task_Work&lt;/span&gt;, запускается один раз в период, т.е. в 16 мс. При получени управления все ножки устанавливаются на вход, после чего проверяется, нет ли &amp;quot;1&amp;quot; на каком-либо входе. Если есть, то нажатая кнопка обрабатывается. Кнопки &lt;span class=&quot;important&quot;&gt;SW1&lt;/span&gt;, &lt;span class=&quot;important&quot;&gt;SW2&lt;/span&gt; и &lt;span class=&quot;important&quot;&gt;SW3&lt;/span&gt; устанавливают яркость соответствующего светодиода максимальной (остальные гасятся) и устанавливает переменную Mode.cState в режим, соответствующий цвету. Кнопка &lt;span class=&quot;important&quot;&gt;SW4&lt;/span&gt; изменяет скорость работы (всего 4 скорости). После обработки кнопок все ножки обратно устанавливаются на выход и задача становится в режим ожидания отпускания кнопок.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Task_Button&quot; [4961-6054] --&gt;
&lt;h2&gt;&lt;a name=&quot;фото&quot; id=&quot;фото&quot;&gt;Фото&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Качество фото не очень, но примерно видно, что должно получиться.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/appendix/color2.jpg?id=osa%3Aref%3Aappendix%3A3leds_pic10f&quot; class=&quot;media&quot; title=&quot;osa:ref:appendix:color2.jpg&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/appendix/color2.jpg&quot; class=&quot;media&quot; title=&quot;color2.jpg&quot; alt=&quot;color2.jpg&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/appendix/color5.jpg?id=osa%3Aref%3Aappendix%3A3leds_pic10f&quot; class=&quot;media&quot; title=&quot;osa:ref:appendix:color5.jpg&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/appendix/color5.jpg&quot; class=&quot;media&quot; title=&quot;color5.jpg&quot; alt=&quot;color5.jpg&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/appendix/color7.jpg?id=osa%3Aref%3Aappendix%3A3leds_pic10f&quot; class=&quot;media&quot; title=&quot;osa:ref:appendix:color7.jpg&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/appendix/color7.jpg&quot; class=&quot;media&quot; title=&quot;color7.jpg&quot; alt=&quot;color7.jpg&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/appendix/color8.jpg?id=osa%3Aref%3Aappendix%3A3leds_pic10f&quot; class=&quot;media&quot; title=&quot;osa:ref:appendix:color8.jpg&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/appendix/color8.jpg&quot; class=&quot;media&quot; title=&quot;color8.jpg&quot; alt=&quot;color8.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/appendix/color9.jpg?id=osa%3Aref%3Aappendix%3A3leds_pic10f&quot; class=&quot;media&quot; title=&quot;osa:ref:appendix:color9.jpg&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/appendix/color9.jpg&quot; class=&quot;media&quot; title=&quot;color9.jpg&quot; alt=&quot;color9.jpg&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/appendix/color10.jpg?id=osa%3Aref%3Aappendix%3A3leds_pic10f&quot; class=&quot;media&quot; title=&quot;osa:ref:appendix:color10.jpg&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/appendix/color10.jpg&quot; class=&quot;media&quot; title=&quot;color10.jpg&quot; alt=&quot;color10.jpg&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/appendix/color11.jpg?id=osa%3Aref%3Aappendix%3A3leds_pic10f&quot; class=&quot;media&quot; title=&quot;osa:ref:appendix:color11.jpg&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/appendix/color11.jpg&quot; class=&quot;media&quot; title=&quot;color11.jpg&quot; alt=&quot;color11.jpg&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/appendix/color12.jpg?id=osa%3Aref%3Aappendix%3A3leds_pic10f&quot; class=&quot;media&quot; title=&quot;osa:ref:appendix:color12.jpg&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/appendix/color12.jpg&quot; class=&quot;media&quot; title=&quot;color12.jpg&quot; alt=&quot;color12.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Фото&quot; [6055-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/osa/ref/appendix/configuration?rev=1285336234">
        <dc:format>text/html</dc:format>
        <dc:date>2010-09-24T17:50:34+03:00</dc:date>
        <title>Конфигурация OSAcfg.h</title>
        <link>http://www.pic24.ru/doku.php/osa/ref/appendix/configuration?rev=1285336234</link>
        <description>


&lt;h1&gt;&lt;a name=&quot;конфигурация_osacfg.h&quot; id=&quot;конфигурация_osacfg.h&quot;&gt;Конфигурация OSAcfg.h&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;

Файл OSAcfg.h для каждой программы должен быть свой, и его желательно держать в той же директории, где и сама программа. Этот файл автоматически включается файлом OSA.h и является настроечным (в нем определяется, где хранятся какие данные, сколько максимально может быть задач, семафоров, таймеров и пр.).
Шаблон этого файла лежит в папке OSA\PROJECT.
&lt;/p&gt;

&lt;p&gt;
В самом простом случае этот файл может быть пустым, тогда будут приняты все настройки по умолчанию.
&lt;/p&gt;

&lt;p&gt;

&lt;p&gt;&lt;div class=&quot;noteimportant&quot;&gt;
Для упрощения создания/редактирования файла конфигурации можно воспользоваться утилитой &lt;strong&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/osacfg_tool_setup.rar&quot; class=&quot;media mediafile mf_rar&quot; title=&quot;osa:osacfg_tool_setup.rar&quot;&gt;OSAcfg_Tool&lt;/a&gt;&lt;/strong&gt;

&lt;/div&gt;&lt;/p&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Конфигурация OSAcfg.h&quot; [2-1090] --&gt;
&lt;h2&gt;&lt;a name=&quot;системные_константы&quot; id=&quot;системные_константы&quot;&gt;Системные константы&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0&quot;&gt; Имя константы &lt;/th&gt;&lt;th class=&quot;col1&quot;&gt; Описание &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_ALL&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Разрешить все &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_CSEM&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Если определена эта константа, то в программу включается код по работе с счетными семафорами &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_QUEUE&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Если определена эта константа, то в программу включается код по работе с очередями сообщений &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_SQUEUE&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Если определена эта константа, то в программу включается код по работе с очередями коротких однобайтовых сообщений &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_QUEUE_SQUEUE_IDENTICAL&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt; Если используются сразу и очереди сообщений и очереди коротких сообщений, и есть уверенность в том, что размерность указателя на сообщение (тип &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/description/data_types#ost_msg&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:description:data_types&quot;&gt;OST_MSG&lt;/a&gt;&lt;/span&gt;) и короткого соощения (тип &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/description/data_types#ost_smsg&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:description:data_types&quot;&gt;OST_SMSG&lt;/a&gt;&lt;/span&gt;) одинакова, то можно определить эту константу, чтобы для работы с обоими типами очередей выполнялась одними и теми же функциями. Особенно актуально для PIC10, PIC12 и PIC16.  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_CRITICAL_SECTION&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Если определена, то в программу включаются функции входа в критическую секцию и выхода из нее &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Системные константы&quot; [1091-2847] --&gt;
&lt;h2&gt;&lt;a name=&quot;управление_приоритетами&quot; id=&quot;управление_приоритетами&quot;&gt;Управление приоритетами&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0&quot;&gt; Имя константы &lt;/th&gt;&lt;th class=&quot;col1&quot;&gt; Допустимые значения &lt;/th&gt;&lt;th class=&quot;col2&quot;&gt; Описание &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_PRIORITY_LEVEL&lt;/span&gt;&lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt; &lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_PRIORITY_NORMAL&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; (defaul) Обычный приоритетный режим с последовательной проверкой задач на готовность в порядке их создания  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; &lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_PRIORITY_DISABLED&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Принудительно устанавливает всем задачам высший приоритет. Можно использовать для ускорения работы планировщика, если приоритетность не важна  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; &lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_PRIORITY_EXTENDED&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Расширенный приоритетный режим, который распределяет ресурсы ядра микроконтроллера между задачами пропорционально весам их приоритетов  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; &lt;span style='color:lightblue; '&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_DISABLE_PRIORITY&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; old style consant &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; То же, что и &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_PRIORITY_DISABLE  &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Управление приоритетами&quot; [2848-3955] --&gt;
&lt;h2&gt;&lt;a name=&quot;управление_таймерами&quot; id=&quot;управление_таймерами&quot;&gt;Управление таймерами&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0&quot;&gt; Имя константы &lt;/th&gt;&lt;th class=&quot;col1&quot;&gt; Описание &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_TTIMERS&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Если эта константа определена, то в программу будут включены функции по определению задержек в задачах и таймеры в &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/description/data_types#ost_tcb&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:description:data_types&quot;&gt;OST_TCB&lt;/a&gt;&lt;/span&gt;. Если в программе не планируется использовать &lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Delay&lt;/span&gt; или ожидание событий с таймаутами, то эту константу можно не определять (тогда получится меньший код и освободится RAM). &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_DTIMERS&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Если определена, то в программе можно использовать динамические таймеры &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_QTIMERS&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Если определена, то в программе можно использовать очкркдь таймеров &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_STIMERS&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;Количество статических таймеров. Если определена, то создается массив статических таймеров такой размерности  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_STIMERS_ENABLE_ALLOCATION&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Если определена, то в код включаются функции по назначению статических таймеров в ходе выполнения программы &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_STIMERS_OPTIMIZE_SPEED&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Если определена, то код по управлению статическими таймерами в &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer будет оптимизирован по размеру (иначе - по скорости) &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row7&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TTIMERS_OPTIMIZE_SPEED&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Если определена, то код по управлению таймерами задач в &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer будет оптимизирован по размеру (иначе - по скорости) &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Управление таймерами&quot; [3956-5945] --&gt;
&lt;h2&gt;&lt;a name=&quot;сервисы_в_прерываниях&quot; id=&quot;сервисы_в_прерываниях&quot;&gt;Сервисы в прерываниях&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0&quot;&gt; Имя константы &lt;/th&gt;&lt;th class=&quot;col1&quot;&gt; Описание &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_INT_BSEM&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1 rightalign&quot;&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_INT_CSEM&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Разрешает отправлять счетные семафоры из прерываний &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_INT_FLAG&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Разрешает работать с флагами внутри прерывания &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_INT_MSG&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Разрешает отправку сообщений из прерываний &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_INT_SMSG&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Разрешает отправку коротких сообений из прерываний &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_INT_QUEUE&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Разрешает отправку сообщений и коротких сообщений через очередь из прерываний &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row7&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_INT_ALL&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Если определена, то включает все выше перечисленные константы &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Сервисы в прерываниях&quot; [5946-6879] --&gt;
&lt;h2&gt;&lt;a name=&quot;содержание_данных&quot; id=&quot;содержание_данных&quot;&gt;Содержание данных&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0&quot;&gt; Имя константы &lt;/th&gt;&lt;th class=&quot;col1&quot;&gt; Описание &lt;/th&gt;&lt;th class=&quot;col2&quot;&gt; Требуется памяти &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TASKS&lt;/span&gt;    &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Количество задач, которые одновременно могут быть активны&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;На каждую задачу:&lt;br/&gt;
 Для &lt;strong&gt;PIC12&lt;/strong&gt; - по 2 байта.&lt;br/&gt;
 Для &lt;strong&gt;PIC16&lt;/strong&gt; - по 3 байта.&lt;br/&gt;
 Для &lt;strong&gt;PIC18&lt;/strong&gt; - по 4 байта.&lt;br/&gt;
 Для &lt;strong&gt;PIC24&lt;/strong&gt; и &lt;strong&gt;dsPIC&lt;/strong&gt; - по 20 байт.&lt;br/&gt;
 Для &lt;strong&gt;AVR&lt;/strong&gt; - по 5 байт.&lt;br/&gt;
 Если в программе используются таймеры (определена константа &lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_TTIMERS&lt;/span&gt;), то а каждую задачу добавляется &lt;span class=&quot;important&quot;&gt;&lt;span class=&quot;curid&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration#типы_данных&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OS_TTIMER_SIZE&lt;/a&gt;&lt;/span&gt;&lt;/span&gt; байт.&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BSEMS&lt;/span&gt;    &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;Количество бинарных семафоров	&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;&lt;strong&gt;Для 8-разрядных&lt;/strong&gt;: По 1 байту на каждую неполную восьмерку семафоров. &lt;strong&gt;Для 16-разрядных&lt;/strong&gt;: По 1 слову, на каждые 16 семафоров.&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span style='color:lightblue; '&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TIMERS8&lt;/span&gt; (устаревшая)  &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;Количество пользовательских 8-разрядных таймеров	&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;На каждый по 1 байту&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span style='color:lightblue; '&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TIMERS16&lt;/span&gt; (устаревшая) &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;Количество пользовательских 16-разрядных таймеров	&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;На каждый по 2 байту&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span style='color:lightblue; '&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TIMERS24&lt;/span&gt; (устаревшая) &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;Количество пользовательских 24-разрядных таймеров	&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;На каждый по 2 байту (в этих таймерах нет младшего байта)&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span style='color:lightblue; '&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TIMERS32&lt;/span&gt; (устаревшая) &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;Количество пользовательских 32-разрядных таймеров	&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;На каждый по 4 байта&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Содержание данных&quot; [6880-8803] --&gt;
&lt;h2&gt;&lt;a name=&quot;типы_данных&quot; id=&quot;типы_данных&quot;&gt;Типы данных&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0&quot;&gt; Имя константы &lt;/th&gt;&lt;th class=&quot;col1&quot;&gt; Значение по умолчанию &lt;/th&gt;&lt;th class=&quot;col2&quot;&gt; Описание &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TIMER_SIZE&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; 2 &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Количество байт, занимаемых системным таймером. Может быть = 1, 2 или 4.&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_STIMER_SIZE&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TIMER_SIZE &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Количество байт, занимаемых статическим таймером. Может быть = 1, 2 или 4.&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TTIMER_SIZE&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TIMER_SIZE &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Количество байт, занимаемых таймером задачи. Может быть = 1, 2 или 4.&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_QTIMER_SIZE&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TIMER_SIZE &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Количество байт, занимаемых таймерами в очереди таймеров. Может быть = 1, 2 или 4.&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_DTIMER_SIZE&lt;/span&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TIMER_SIZE &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Количество байт, занимаемых динамическим таймером. Может быть = 1, 2 или 4.&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_CSEM_SIZE&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; 1 &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Количество байт, выделяемое под каждый счетный семафор. Определяет, в каких пределах может меняться счетный семафор. Может быть = 1, 2 или 4&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row7&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_SMSG_TYPE&lt;/span&gt;*      &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; unsigned char &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Тип коротких сообщений, которыми обмениваются задачи.&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row8&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_MSG_TYPE&lt;/span&gt;*       &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; void * &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Тип сообщений для MSG и QUEUE. &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;

* - эти типы нельзя переопределять при использовании PIC12.
&lt;/p&gt;
&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Типы данных&quot; [8804-10378] --&gt;
&lt;h2&gt;&lt;a name=&quot;размещение_данных_для_pic10_pic12_pic16_и_pic18&quot; id=&quot;размещение_данных_для_pic10_pic12_pic16_и_pic18&quot;&gt;Размещение данных для PIC10, PIC12, PIC16 и PIC18&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Константы &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_xxx могут принимать значения:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Для PIC10, PIC12, PIC16: 0, 1, 2 или 3 - выбор банка bank0, bank1, bank2, bank3, соотвт.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Для PIC18: 0, не 0 - accsess и не access, соотв.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Для PIC24: 0, не 0 - near и не near, соотв.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Для STM8: 0, не 0 - near и не near, соотв.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0&quot;&gt; Имя константы &lt;/th&gt;&lt;th class=&quot;col1&quot;&gt; Значение по умолчанию &lt;/th&gt;&lt;th class=&quot;col2&quot;&gt; Описание &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;&lt;/span&gt;*        &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;0                  &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Определяет, где будут храниться все переменные системы (если для них не указаны другие).&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_BSEMS&lt;/span&gt;*     &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;         &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Для двоичных семафоров.&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_TASKS&lt;/span&gt;*     &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;         &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Банк, в котором будут размещены дескрипторы задач&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_STIMERS&lt;/span&gt;*    &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_TIMERS     &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Для статических таймеров&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ADDRESS_TASK&lt;/span&gt;    &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;-     &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Для mikroC PRO for PIC16: Для размещения дескрипторов задач по определенному адресу памяти (например в 0x120 (для bank2) или 0x190 (для bank3)&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span style='color:lightblue; '&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_TIMERS&lt;/span&gt;*     &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;         &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Для статических таймеров старрого типа&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row7&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span style='color:lightblue; '&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_TIMERS8&lt;/span&gt;* (устаревшая)   &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_TIMERS     &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Для 8-разрядных статических таймеров&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row8&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span style='color:lightblue; '&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_TIMERS16&lt;/span&gt;* (устаревшая)  &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_TIMERS     &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Для 16-разрядных статических таймеров&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row9&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span style='color:lightblue; '&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_TIMERS24&lt;/span&gt;* (устаревшая)  &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_TIMERS     &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Для 24-разрядных статических таймеров&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row10&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span style='color:lightblue; '&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_TIMERS32&lt;/span&gt;* (устаревшая)  &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_TIMERS     &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Для 32-разрядных статических таймеров&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row11&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;span style='color:lightblue; '&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_TIMEOUTS&lt;/span&gt;* (устаревшая)  &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_BANK_TIMERS     &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Для битовых полей - флагов переполнения (таймаутов) пользовательских статических таймеров.&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;
* - игнорируется в CCS и mikroC PRO, а также для контроллеров AVR
&lt;/p&gt;
&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Размещение данных для PIC10, PIC12, PIC16 и PIC18&quot; [10379-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/osa/ref/appendix/dynamic_timers_old?rev=1265310938">
        <dc:format>text/html</dc:format>
        <dc:date>2010-02-04T22:15:38+03:00</dc:date>
        <title>OSA : Динамические таймеры</title>
        <link>http://www.pic24.ru/doku.php/osa/ref/appendix/dynamic_timers_old?rev=1265310938</link>
        <description>


&lt;h1&gt;&lt;a name=&quot;osa_динамические_таймеры&quot; id=&quot;osa_динамические_таймеры&quot;&gt;OSA : Динамические таймеры&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;

&lt;p&gt;&lt;div class=&quot;noteclassic&quot;&gt;С версии 100210 динамические таймеры заменены более эффективной &amp;quot;очередью таймеров&amp;quot; (Qtimers). Все сервисы поддержки динамических таймеров остаются для совместимости со старыми проектами, и в будущем упразднятся не будут. Просто динамические таймеры признаны неэффективными из-за низкой скорости их обработки при пересчетет в &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer()
&lt;/div&gt;&lt;/p&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;OSA : Динамические таймеры&quot; [1-676] --&gt;
&lt;h3&gt;&lt;a name=&quot;описание&quot; id=&quot;описание&quot;&gt;Описание&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Для использования динамических таймеров в &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration#системные_константы&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OSAcfg.h&lt;/a&gt; должна быть определена константа:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#define OS_ENABLE_DTIMERS&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
Это включит в программу код обработки списка таймеров, а также функции для работы с динамическими таймерами. Переменные динамических таймеров описываются так:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;OST_DTIMER mytimer;&lt;/pre&gt;
&lt;p&gt;

В памяти будет создана переменная, содержащая сам счетчик таймера, флаги его состояния и указатель на следующий таймер. Разрядность счетчика таймера задается константой &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration#типы_данных&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OS_DTIMER_SIZE&lt;/a&gt;.
&lt;p&gt;&lt;div class=&quot;noteclassic&quot;&gt;
Для &lt;strong&gt;PIC16&lt;/strong&gt; динамические таймеры могут располагаться только в банках &lt;strong&gt;bank0&lt;/strong&gt; и &lt;strong&gt;bank1&lt;/strong&gt;.

&lt;/div&gt;&lt;/p&gt;
&lt;/p&gt;

&lt;p&gt;
Обработчик сервиса &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_timer&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_timer&quot;&gt;OS_Timer&lt;/a&gt;&lt;/span&gt; пробегает по списку активных динамических таймеров и увеличивает каждый из них на 1, отслеживая переполнение. При старте программы список пуст.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Описание&quot; [677-2203] --&gt;
&lt;h3&gt;&lt;a name=&quot;состояния&quot; id=&quot;состояния&quot;&gt;Состояния&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Динамический таймер может находится в одном из 4-х состояний:
&lt;/p&gt;
&lt;table class = &quot;fpl&quot;&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;strong&gt;Не создан&lt;/strong&gt; (или &lt;strong&gt;удален&lt;/strong&gt;)		&lt;/td&gt;
		&lt;td&gt;
 таймер не добавлен в список активных таймеров. Система про него ничего не знает и, следовательно, не обрабатывает.		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;strong&gt;Активен&lt;/strong&gt;		&lt;/td&gt;
		&lt;td&gt;
 таймер создан сервисом &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_create&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_create&quot;&gt;OS_Dtimer_Create&lt;/a&gt;&lt;/span&gt; и присутствует в списке активных таймеров. Чем больше активных таймеров, тем дольше выполняется их обработка в &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_timer&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_timer&quot;&gt;OS_Timer&lt;/a&gt;&lt;/span&gt; (в среднем по 18 тактов на активный таймер для PIC16 и 23 - для PIC18). Поэтому неиспользуемые таймеры желательно удалять сервисом &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_delete&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_delete&quot;&gt;OS_Dtimer_Delete&lt;/a&gt;&lt;/span&gt;.		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;strong&gt;Считает&lt;/strong&gt;		&lt;/td&gt;
		&lt;td&gt;
 запускается сервисом &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_run&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_run&quot;&gt;OS_Dtimer_Run&lt;/a&gt;&lt;/span&gt; или &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_continue&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_continue&quot;&gt;OS_Dtimer_Continue&lt;/a&gt;&lt;/span&gt; и при каждом вызове &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_timer&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_timer&quot;&gt;OS_Timer&lt;/a&gt;&lt;/span&gt; увеличивается на 1.		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;strong&gt;Остановлен&lt;/strong&gt;		&lt;/td&gt;
		&lt;td&gt;
 остановлен сервисом &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_stop&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_stop&quot;&gt;OS_Dtimer_Stop&lt;/a&gt;&lt;/span&gt;, при этом таймер активен (т.е. есть в списке), но не изменяется при вызове &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_timer&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_timer&quot;&gt;OS_Timer&lt;/a&gt;&lt;/span&gt;.		&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;

&lt;em class=&quot;u&quot;&gt;Важным свойством&lt;/em&gt; динамического таймера является то, что после переполнения он продолжает счет (в отличие от статического, который после переполнения останавливается). Это позволяет отсчитывать равные интервалы времени в независимости от того, в какой момент таймер обработан задачей. Например, таймер был запущен на отсчет интервала в 1 секунду. Секунда прошла (произошло переполнение таймера), а задача, ожидающая этот таймер, не смогла начать выполняться из-за того, что сейчас выполняется или готова к выполнению более приоритетная задача. В результате этого задача сможет обработать таймер только через некоторое время после его переполнения (например, через 100 мс). Но, обработав его, она вновь задает интервал счета в 1 секунду, и при этом учитывается, что уже прошло 100 мс. Поэтому следующее переполнение произойдет через 900 мс. Все остальные таймеры (и таймеры задач,  и статические таймеры) останавливают счет после переполнения.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Состояния&quot; [2204-5633] --&gt;
&lt;h3&gt;&lt;a name=&quot;пример_использования&quot; id=&quot;пример_использования&quot;&gt;Пример использования&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Ниже приведен пример использования таймера для генерации импульса заданной длительности с частотным заполнением (предполагаем, что интервал &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_timer&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_timer&quot;&gt;OS_Timer&lt;/a&gt;&lt;/span&gt; = 1 ms:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;OST_SMSG smsg;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; Task1 &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;;;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        ...
        &lt;span class=&quot;me1&quot;&gt;OS_Smsg_Send&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;smsg, &lt;span class=&quot;nu0&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;  &lt;span class=&quot;co1&quot;&gt;// Нам нужен импульс 200 мс&lt;/span&gt;
        ...
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; Task2 &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    OST_SMSG msg;
    &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; OST_DTIMER myTimer;
    RB0 &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;;
    OS_Dtimer_Create&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;myTimer&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;;;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        OS_Smsg_Wait&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;smsg, msg&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        OS_Dtimer_Run&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;myTimer, msg&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span class=&quot;kw1&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
            RB0 &lt;span class=&quot;sy3&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;;
            OS_Delay&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;	&lt;span class=&quot;co1&quot;&gt;// Частота генерации = 100 Гц&lt;/span&gt;
        &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;!&lt;/span&gt;OS_Dtimer_Check&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;myTimer&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        RB0 &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Пример использования&quot; [5634-6568] --&gt;
&lt;h3&gt;&lt;a name=&quot;сервисы_для_работы_с_динамическими_таймерами&quot; id=&quot;сервисы_для_работы_с_динамическими_таймерами&quot;&gt;Сервисы для работы с динамическими таймерами&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0 centeralign&quot;&gt;  Сервис  &lt;/th&gt;&lt;th class=&quot;col1 centeralign&quot;&gt;  Аргументы  &lt;/th&gt;&lt;th class=&quot;col2 centeralign&quot;&gt;  Описание  &lt;/th&gt;&lt;th class=&quot;col3 centeralign&quot;&gt;  Свойства  &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot; colspan=&quot;4&quot;&gt; &lt;strong&gt;Создание/Удаление&lt;/strong&gt;    &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_create&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_create&quot;&gt;OS_Dtimer_Create&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Добавляет dtimer в очередь активных таймеров. После создания таймер обнулен остановлен, флаг переполнения сброшен.  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_not_int.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_not_int.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_not_int.png&quot; class=&quot;media&quot; title=&quot;Нельзя вызывать из прерывания&quot; alt=&quot;Нельзя вызывать из прерывания&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_delete&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_delete&quot;&gt;OS_Dtimer_Delete&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Удаляет dtimer из очереди активных таймеров.  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_not_int.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_not_int.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_not_int.png&quot; class=&quot;media&quot; title=&quot;Нельзя вызывать из прерывания&quot; alt=&quot;Нельзя вызывать из прерывания&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot; colspan=&quot;4&quot;&gt; &lt;strong&gt;Управление&lt;/strong&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_run&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_run&quot;&gt;OS_Dtimer_Run&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer, newtime)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Запустить dtimer на отсчет времени newtime с момента вызова этого сервиса. Флаг переполнения сбрасывается.  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_break&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_break&quot;&gt;OS_Dtimer_Break&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Останавливаем таймер. Он остается активным, но не увеличивается при выполнении &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_timer&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_timer&quot;&gt;OS_Timer&lt;/a&gt;&lt;/span&gt;(). Флаг переполнения устанавливается.  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row7&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_wait&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_wait&quot;&gt;OS_Dtimer_Wait&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Ожидаем завершения счета таймера.  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_task.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_task.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_task.png&quot; class=&quot;media&quot; title=&quot;Разрешен вызов только в контексте задачи&quot; alt=&quot;Разрешен вызов только в контексте задачи&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_ct_sw.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_ct_sw.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_ct_sw.png&quot; class=&quot;media&quot; title=&quot;Переключает контекст&quot; alt=&quot;Переключает контекст&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row8&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_delay&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_delay&quot;&gt;OS_Dtimer_Delay&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer, delay)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Выдержать задержку с использованием динамического таймера dtimer  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_task.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_task.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_task.png&quot; class=&quot;media&quot; title=&quot;Разрешен вызов только в контексте задачи&quot; alt=&quot;Разрешен вызов только в контексте задачи&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_ct_sw.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_ct_sw.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_ct_sw.png&quot; class=&quot;media&quot; title=&quot;Переключает контекст&quot; alt=&quot;Переключает контекст&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row9&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot; colspan=&quot;4&quot;&gt; &lt;strong&gt;Проверка&lt;/strong&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row10&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;code&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/description/data_types#ost_dtimer&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:description:data_types&quot;&gt;_OST_DTIMER&lt;/a&gt; &lt;/code&gt;&lt;br/&gt;
 &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_get&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_get&quot;&gt;OS_Dtimer_Get&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Получить оставшееся время счета  (необходимо запрещать прерывания)  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row11&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;code&gt;bool &lt;/code&gt;&lt;br/&gt;
 &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_check&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_check&quot;&gt;OS_Dtimer_Check&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Проверить, было ли переполнение.  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row12&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;code&gt;bool &lt;/code&gt;&lt;br/&gt;
 &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_isrun&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_isrun&quot;&gt;OS_Dtimer_IsRun&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Проверить, считает ли таймер  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row13&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot; colspan=&quot;4&quot;&gt; &lt;strong&gt;Дополнительно&lt;/strong&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row14&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_pause&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_pause&quot;&gt;OS_Dtimer_Pause&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Останавливаем таймер. Он остается активным, но не увеличивается при выполнении &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_timer&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_timer&quot;&gt;OS_Timer&lt;/a&gt;&lt;/span&gt;(). Флаг переполнения остается без изменений.  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row15&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_continue&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_continue&quot;&gt;OS_Dtimer_Continue&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Восстанавливаем счет таймера.  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row16&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_update&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_update&quot;&gt;OS_Dtimer_Update&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer, time)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Запустить таймер на отсчет времени time с момента последнего переполнения. Флаг переполнения сбрасывается.  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row17&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_add&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_add&quot;&gt;OS_Dtimer_Add&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer, addtime)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Добавить время к таймеру во время счета. Флаг переполнения остается без изменений.  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row18&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;code&gt;bool &lt;/code&gt;&lt;br/&gt;
 &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_isactive&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_isactive&quot;&gt;OS_Dtimer_IsActive&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Проверить, есть ли таймер в списке активных таймеров.  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row19&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; &lt;code&gt;bool &lt;/code&gt;&lt;br/&gt;
 &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_dtimer_isstopped&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_dtimer_isstopped&quot;&gt;OS_Dtimer_IsStopped&lt;/a&gt;&lt;/span&gt;  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  &lt;code&gt;(dtimer)&lt;/code&gt;  &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; Проверить, остановлен ли таймер  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Adynamic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Использует системный таймер&quot; alt=&quot;Использует системный таймер&quot; /&gt;&lt;/a&gt;  &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Сервисы для работы с динамическими таймерами&quot; [6569-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/osa/ref/appendix/errorlist?rev=1295697814">
        <dc:format>text/html</dc:format>
        <dc:date>2011-01-22T15:03:34+03:00</dc:date>
        <title>OSA : Error list</title>
        <link>http://www.pic24.ru/doku.php/osa/ref/appendix/errorlist?rev=1295697814</link>
        <description>


&lt;h1&gt;&lt;a name=&quot;osa_error_list&quot; id=&quot;osa_error_list&quot;&gt;OSA : Error list&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;OSA : Error list&quot; [11-42] --&gt;
&lt;h3&gt;&lt;a name=&quot;unknown_compiler&quot; id=&quot;unknown_compiler&quot;&gt;#1 : Unknown compiler!&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

OSA работает только со следующими компиляторами:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; HI-TECH PICC STD&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; HI-TECH PICC18 STD&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Microchip C18&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Microchip C30&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; CCS PICC&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; microC PRO for PIC&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

Остальные компиляторы пока не поддерживаются.
&lt;/p&gt;
&lt;hr /&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;#1 : Unknown compiler!&quot; [43-373] --&gt;
&lt;h3&gt;&lt;a name=&quot;constants_os_xxx_bank_are_not_allowed_now_use_os_bank_xxx_instead&quot; id=&quot;constants_os_xxx_bank_are_not_allowed_now_use_os_bank_xxx_instead&quot;&gt;#2 : Constants OS_xxx_BANK are not allowed now (use OS_BANK_xxx instead)&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Эта ошибка возникает, когда вы пытаетесь разместить переменные OSA с помощью устаревших констант. Новые константы имеют префикс имени &amp;quot;&lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OS_BANK_&lt;/a&gt;&lt;/span&gt;&amp;quot; (См. &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration#размещение_данных_для_pic10_pic12_pic16_и_pic18&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;конфигурация&lt;/a&gt;.)

&lt;/p&gt;
&lt;hr /&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;#2 : Constants OS_xxx_BANK are not allowed now (use OS_BANK_xxx instead)&quot; [374-899] --&gt;
&lt;h3&gt;&lt;a name=&quot;incorrect_os_bank_xxx_value_should_be_0_1_2_or_3&quot; id=&quot;incorrect_os_bank_xxx_value_should_be_0_1_2_or_3&quot;&gt;#3 .. #12 : Incorrect OS_BANK_xxx value (should be 0, 1, 2 or 3)&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Одна или несколько констант &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OS_BANK_xxx&lt;/a&gt;&lt;/span&gt; имеют недопустимое значение (в файле &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OSAcfg.h&lt;/a&gt;&lt;/span&gt;). Разрешены только значения 0, 1, 2 и 3.

&lt;/p&gt;
&lt;hr /&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;#3 .. #12 : Incorrect OS_BANK_xxx value (should be 0, 1, 2 or 3)&quot; [900-1267] --&gt;
&lt;h3&gt;&lt;a name=&quot;ost_timer_is_not_supported_use_os_timer_size_instead&quot; id=&quot;ost_timer_is_not_supported_use_os_timer_size_instead&quot;&gt;#13 : OST_TIMER is not supported! Use OS_TIMER_SIZE instead&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Вы пытаетесь переопределить тип таймера через устаревшую константу &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/description/data_types#ost_timer&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:description:data_types&quot;&gt;OST_TIMER&lt;/a&gt;&lt;/span&gt;. В старых версиях этой константе приравнивалось имя типа напрямую (например, &lt;strong&gt;char&lt;/strong&gt; или &lt;strong&gt;unsigned long&lt;/strong&gt;). Теперь тип таймеров задается указанием размерности переменной. Например:
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#define OS_TIMER_SIZE    4      // таймеры будет типа unsigned long&lt;/span&gt;&lt;/pre&gt;&lt;hr /&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;#13 : OST_TIMER is not supported! Use OS_TIMER_SIZE instead&quot; [1268-1948] --&gt;
&lt;h3&gt;&lt;a name=&quot;can_t_redefine_name_ost_xxx_in_osacfg.h_._use_os_xxx_type_instead&quot; id=&quot;can_t_redefine_name_ost_xxx_in_osacfg.h_._use_os_xxx_type_instead&quot;&gt;#14 .. #15 : Can&amp;#039;t redefine name OST_xxx in &amp;#039;OSAcfg.h&amp;#039;. Use OS_xxx_TYPE instead.&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Начиная с версии 90200 типы &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/description/data_types#ost_msg&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:description:data_types&quot;&gt;OST_MSG&lt;/a&gt;&lt;/span&gt; и &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/description/data_types#ost_smsg&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:description:data_types&quot;&gt;OST_SMSG&lt;/a&gt;&lt;/span&gt; не могут быть переопределены напрямую. Теперь они переопределяются через константы &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OS_MSG_TYPE&lt;/a&gt;&lt;/span&gt; и &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OS_SMSG_TYPE.&lt;/a&gt;&lt;/span&gt; Причина описана ниже:
&lt;/p&gt;

&lt;p&gt;
Например &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/description/data_types#ost_msg&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:description:data_types&quot;&gt;OST_MSG&lt;/a&gt;&lt;/span&gt; определена в файле &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OSAcfg.h&lt;/a&gt;&lt;/span&gt; так:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#define OST_MSG    void *&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
Когда определяется несколько переменных:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;OST_MSG msg1, msg2, msg3;&lt;/pre&gt;
&lt;p&gt;
компилятор делает подстановку:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt; msg1, msg2, msg3;&lt;/pre&gt;
&lt;p&gt;
Как видно, толь &lt;strong&gt;msg1&lt;/strong&gt; будет указателем, а &lt;strong&gt;msg2&lt;/strong&gt; and &lt;strong&gt;msg3&lt;/strong&gt; будет иметь просто тип void.
&lt;/p&gt;

&lt;p&gt;
Ситуацию можно было бы исправить так:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;kw4&quot;&gt;typedef&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt; OST_MSG;&lt;/pre&gt;
&lt;p&gt;
Но тогда будет невозможно переопределять эти типы вручную. По этой причине переопределение типа &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/description/data_types#ost_msg&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:description:data_types&quot;&gt;OST_MSG&lt;/a&gt;&lt;/span&gt; сделано так:
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#define OS_MSG_TYPE     int *&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
а сам &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/description/data_types#ost_msg&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:description:data_types&quot;&gt;OST_MSG&lt;/a&gt;&lt;/span&gt; определяется без вмешательства пользователя в файле OSA.h:
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;kw4&quot;&gt;typedef&lt;/span&gt; OS_MSG_TYPE   OST_MSG;&lt;/pre&gt;&lt;hr /&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;#14 .. #15 : Can't redefine name OST_xxx in 'OSAcfg.h'. Use OS_xxx_TYPE instead.&quot; [1949-3733] --&gt;
&lt;h3&gt;&lt;a name=&quot;incorrect_os_csem_size_value_m.b._only_1_2_or_4_see_osacfg.h&quot; id=&quot;incorrect_os_csem_size_value_m.b._only_1_2_or_4_see_osacfg.h&quot;&gt;#16 : Incorrect OS_CSEM_SIZE value (m.b. only 1, 2 or 4)! (see OSAcfg.h)&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Введено неправильно значение размера переменных типа счетного семафора. Допустимые значения:

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 1 - для unsigned char&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 2 - для unsigned int&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 4 - для unsigned long&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;#16 : Incorrect OS_CSEM_SIZE value (m.b. only 1, 2 or 4)! (see OSAcfg.h)&quot; [3734-4086] --&gt;
&lt;h3&gt;&lt;a name=&quot;bad_os_xxx_size_must_be_1_2_or_4&quot; id=&quot;bad_os_xxx_size_must_be_1_2_or_4&quot;&gt;#17 .. #21 : Bad OS_xxx size (must be 1, 2 or 4)&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Введено неправильно значение размера переменных таймера. Допустимые значения:

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 1 - для unsigned char&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 2 - для unsigned int&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 4 - для unsigned long&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;#17 .. #21 : Bad OS_xxx size (must be 1, 2 or 4)&quot; [4087-4387] --&gt;
&lt;h3&gt;&lt;a name=&quot;qtimers_are_not_supported_under_12-bit_controllers_pic10_and_pic12&quot; id=&quot;qtimers_are_not_supported_under_12-bit_controllers_pic10_and_pic12&quot;&gt;#22: Qtimers are not supported under 12-bit controllers (PIC10 and PIC12)&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Qtimers are not supported with 12-bit controllers. Actualy, there is no needness to use them on 12-bit PICs, since benefit is noticed only with large number of timers.

&lt;/p&gt;
&lt;hr /&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;#22: Qtimers are not supported under 12-bit controllers (PIC10 and PIC12)&quot; [4388-4647] --&gt;
&lt;h3&gt;&lt;a name=&quot;stm8_with_rom_64k_are_not_supported_yet&quot; id=&quot;stm8_with_rom_64k_are_not_supported_yet&quot;&gt;#25: STM8 with ROM &amp;gt; 64K are not supported yet&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Контроллеры STM8 с ROM &amp;gt; 64K пока что не поддерживаются

&lt;/p&gt;
&lt;hr /&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;#25: STM8 with ROM &gt; 64K are not supported yet&quot; [4648-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/osa/ref/appendix/intro?rev=1245364624">
        <dc:format>text/html</dc:format>
        <dc:date>2009-06-19T02:37:04+03:00</dc:date>
        <title>OSA : Приложения</title>
        <link>http://www.pic24.ru/doku.php/osa/ref/appendix/intro?rev=1245364624</link>
        <description>


&lt;h1&gt;&lt;a name=&quot;osa_приложения&quot; id=&quot;osa_приложения&quot;&gt;OSA : Приложения&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/services/alphabetical&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:services:alphabetical&quot;&gt;Алфавитный указатель&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/services/brieflist&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:services:brieflist&quot;&gt;Памятка&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;Конфигурация OSAcfg.H&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/resources&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:resources&quot;&gt;Статистика используемой ядром памяти&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/speed&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:speed&quot;&gt;Скоростные характеристики&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/optimization&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:optimization&quot;&gt;Рекомендации по оптимизации&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/static_timers_old&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:static_timers_old&quot;&gt;Статические таймеры старого типа&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/osa/ref/appendix/leds28?rev=1246956300">
        <dc:format>text/html</dc:format>
        <dc:date>2009-07-07T12:45:00+03:00</dc:date>
        <title>Пример использования OSA: LEDS_28PINS</title>
        <link>http://www.pic24.ru/doku.php/osa/ref/appendix/leds28?rev=1246956300</link>
        <description>




&lt;h1&gt;&lt;a name=&quot;пример_использования_osaleds_28pins&quot; id=&quot;пример_использования_osaleds_28pins&quot;&gt;Пример использования OSA: LEDS_28PINS&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Пример использования OSA: LEDS_28PINS&quot; [12-83] --&gt;
&lt;h2&gt;&lt;a name=&quot;проект&quot; id=&quot;проект&quot;&gt;Проект&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Данный пример демонстрирует некоротые возможности RTOS OSA. Файл &lt;a href=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/leds_28pins.rar&quot; class=&quot;media mediafile mf_rar&quot; title=&quot;osa:leds_28pins.rar&quot;&gt;leds_28pins.rar&lt;/a&gt; нужно распаковать в папку &amp;quot;C:\TEST\LEDS_28PINS&amp;quot;. В папке с примером созданы 3 проекта:
&lt;/p&gt;
&lt;table class = &quot;fpl&quot;&gt;
	&lt;tr&gt;
		&lt;td&gt;
&lt;span class=&quot;important&quot;&gt;leds_28pins_picc.mcp&lt;/span&gt;		&lt;/td&gt;
		&lt;td&gt;
для HT-PICC (PIC16F873)		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
&lt;span class=&quot;important&quot;&gt;leds_28pins_picc18.mcp&lt;/span&gt;		&lt;/td&gt;
		&lt;td&gt;
для HT-PICC18 (PIC18F252)		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
&lt;span class=&quot;important&quot;&gt;leds_28pins_mcc18.mcp&lt;/span&gt;		&lt;/td&gt;
		&lt;td&gt;
для Microchip C18 (PIC18F252)		&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Проект&quot; [84-602] --&gt;
&lt;h2&gt;&lt;a name=&quot;принципиальная_схема&quot; id=&quot;принципиальная_схема&quot;&gt;Принципиальная схема&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Ниже приведена схема включения PIC&amp;#039;а для проверки работы примера.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://www.pic24.ru/lib/exe/fetch.php?media=http%3A%2F%2Fwiki.pic24.ru%2Flib%2Fexe%2Ffetch.php%2Fosa%2Fref%2Fappendix_leds28%2Fleds_28pins.jpg&quot; class=&quot;media&quot; title=&quot;http://wiki.pic24.ru/lib/exe/fetch.php/osa/ref/appendix_leds28/leds_28pins.jpg&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php?media=http%3A%2F%2Fwiki.pic24.ru%2Flib%2Fexe%2Ffetch.php%2Fosa%2Fref%2Fappendix_leds28%2Fleds_28pins.jpg&quot; class=&quot;media&quot; title=&quot;leds_28pins.jpg&quot; alt=&quot;leds_28pins.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Принципиальная схема&quot; [603-866] --&gt;
&lt;h2&gt;&lt;a name=&quot;описание_работы&quot; id=&quot;описание_работы&quot;&gt;Описание работы&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;описание_работы_устройства&quot; id=&quot;описание_работы_устройства&quot;&gt;Описание работы устройства&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

К ПИКу подсоединены 4 кнопки и 4 трехцветных светодиода. Каждому светодиоду соответствует своя кнопка. При коротком нажатии на любую кнопку соответсвующий ей светодиод выдает серию из 5 коротких вспышек.
Длительным нажанием на кнопку изменяется цвет мерцания соответсвующего кнопке светодиода. Кнопки можно нажимать в любой последовательности и любой комбинации.
&lt;/p&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;описание_логики_программы&quot; id=&quot;описание_логики_программы&quot;&gt;Описание логики программы&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Логически программа состоит из 9-ти простых задач:

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;span class=&quot;important&quot;&gt;Task_Buttons&lt;/span&gt; - Обработка кнопок (в файле Task_Buttons.c):&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; определение нажатия кнопки&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; устранение дребезга&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; определение длительного удерживания кнопки&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;span class=&quot;important&quot;&gt;Task_Leds&lt;/span&gt; - Обработка светоидов (в файле Task_Leds.c). Используется в самом простом варианте. Включает и выключает светодиоды.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;span class=&quot;important&quot;&gt;Task_Work&lt;/span&gt; - основная задача. Принимает сообщения от &lt;span class=&quot;important&quot;&gt;Task_Buttons&lt;/span&gt; о состоянии кнопок. В зависимости от принятого сообщения:&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; отправляет сообщения задаче Task_ChangeColors поменять цвет светодиода, начать мигать.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; устанавливает счетные семафоры для задач TaskBlinkX()&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;span class=&quot;important&quot;&gt;Task_ChangeColors&lt;/span&gt; -получая сообщения из очереди сообщений от &lt;span class=&quot;important&quot;&gt;Task_Work&lt;/span&gt;, меняет цвета светодиодов.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;span class=&quot;important&quot;&gt;Task_Blink0&lt;/span&gt;-&lt;span class=&quot;important&quot;&gt;TaskBlink3&lt;/span&gt; - задачи, мигающие каждая своим светодиодом с заданным цветом и заданным количеством импульсов (задается счетными семафоами в &lt;span class=&quot;important&quot;&gt;Task_Work&lt;/span&gt;)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;span class=&quot;important&quot;&gt;Task_Sleep&lt;/span&gt; - кладет контроллер в SLEEP. Если нет готовых к выполнению задач, то на 18мс кладется в SLEEP (из SLEEP&amp;#039;а выходит по WDT)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;

&lt;p&gt;
При нажатии на кнопку задача &lt;span class=&quot;important&quot;&gt;Task_Buttons&lt;/span&gt;, устранив дребезг, отсылает сообщение &lt;span class=&quot;important&quot;&gt;SMsgButton&lt;/span&gt; = &lt;em&gt;BUTTON_PRESSED&lt;/em&gt;. Это сообщение принимается задачей &lt;span class=&quot;important&quot;&gt;Task_Work&lt;/span&gt;, и зажигается соответсвующий светодиод.
&lt;/p&gt;

&lt;p&gt;
При отпускании кнопки &lt;span class=&quot;important&quot;&gt;Task_Buttons&lt;/span&gt; отсылает сообщение &lt;em&gt;BUTTON_SHORT&lt;/em&gt; (короткое нажатие на кнопку). &lt;span class=&quot;important&quot;&gt;Task_Work&lt;/span&gt; ловит его и устанавливает счетный семафор в значение 5 для конкретной кнопки (в программе 4 счетных семафора: &lt;span class=&quot;important&quot;&gt;csem[0]&lt;/span&gt;, &lt;span class=&quot;important&quot;&gt;csem[1]&lt;/span&gt;, &lt;span class=&quot;important&quot;&gt;csem[2]&lt;/span&gt;, &lt;span class=&quot;important&quot;&gt;csem[3]&lt;/span&gt; - по одному на каждую кнопку).
&lt;/p&gt;

&lt;p&gt;
Задачи &lt;span class=&quot;important&quot;&gt;Task_Blink0&lt;/span&gt; - &lt;span class=&quot;important&quot;&gt;Task_Blink3&lt;/span&gt; ждут каждая свой семафор. Как только он оказывается не равным нулю, задача вспыхивает светодиодом 1 раз и уменьшает значение счетного семафора на 1. Таким образом, учитывая, что &lt;span class=&quot;important&quot;&gt;Task_Work&lt;/span&gt; устанавливает все семафоры = 5, получается по 5 вспышек.
&lt;/p&gt;

&lt;p&gt;
Если &lt;span class=&quot;important&quot;&gt;Task_Buttons&lt;/span&gt; обнаруживает, что кнопка удерживается длительное время (1 сек), то она отправляет сообщение &lt;em&gt;BUTTON_HOLD&lt;/em&gt;, а &lt;span class=&quot;important&quot;&gt;Task_Work&lt;/span&gt;, приняв такое сообщение, отсылает сообщение в очередь сообщений для задачи &lt;span class=&quot;important&quot;&gt;Task_ChengeColor&lt;/span&gt;, которая, достав сообщение из очереди, изменяет цвет соответствующего светодиода и устанавливает счетный семафор в 1, чтобы получить одну короткую вспышку новым цветом.
&lt;/p&gt;

&lt;p&gt;
Если &lt;span class=&quot;important&quot;&gt;Task_ChangeColor&lt;/span&gt; не получает сообщение из очереди долгое время (дольше 3 секунд), то она вспыхивает одиночными вспышками поочереди всеми светодиодами.
&lt;/p&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;ножка_ra0&quot; id=&quot;ножка_ra0&quot;&gt;Ножка RA0&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

Большую часть времени контроллер находится в Sleep&amp;#039;е. Ножка &lt;strong&gt;RA0&lt;/strong&gt; устанавливается в 1, когда контроллер просыпается и сбрасывается в 0, когда опять засыпает. По этой ножке можно смотреть, сколько времени уходит на обработку всех задач.
&lt;/p&gt;
&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Описание работы&quot; [867-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/osa/ref/appendix/optimization?rev=1245363319">
        <dc:format>text/html</dc:format>
        <dc:date>2009-06-19T02:15:19+03:00</dc:date>
        <title>OSA : Рекомендации по оптимизации</title>
        <link>http://www.pic24.ru/doku.php/osa/ref/appendix/optimization?rev=1245363319</link>
        <description>


&lt;h1&gt;&lt;a name=&quot;osa_рекомендации_по_оптимизации&quot; id=&quot;osa_рекомендации_по_оптимизации&quot;&gt;OSA : Рекомендации по оптимизации&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;

Здесь будут описаны правила, советы и рекомендации по конфигурированию OSA, а также по применению сервисов OSA с целью увеличения эффективности использования ресурсов микроконтроллера. Есть три ресурса, которые хотелось бы сэкономить: RAM, ROM и время. Сначала я предполагал разбить этот раздел на три части, посвятив каждую из них своему параметру. Однако, получилось так, что приемы и советы по экономии RAM и ROM практически идентичны, поэтому им будет посвящена одна часть.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;OSA : Рекомендации по оптимизации&quot; [1-932] --&gt;
&lt;h2&gt;&lt;a name=&quot;оптимизация_памяти&quot; id=&quot;оптимизация_памяти&quot;&gt;Оптимизация памяти&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Оптимизация памяти в основном производится за счет правильного конфигурирования, но есть и приемы, относящиеся к использованию сервисов. Начальная конфигурация по умолчанию (когда файл osacfg.h пустой) подобрана так, чтобы обеспечить программиста всем необходимым, не давая ничего лишнего. Но каждая программа индивидуальна и есть смысл для каждой подбирать оптимальную конфигурацию.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Оптимизация памяти&quot; [933-1686] --&gt;
&lt;h3&gt;&lt;a name=&quot;отключение_приоритетов&quot; id=&quot;отключение_приоритетов&quot;&gt;Отключение приоритетов&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Во многих приложениях отключение приоритетности - очень полезная вещь. Как было описано выше (в разделе &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/articles/rtos_usage#как_расставлять_приоритеты&quot; class=&quot;wikilink1&quot; title=&quot;osa:articles:rtos_usage&quot;&gt;Как расставлять приоритеты&lt;/a&gt;), в большинстве приложений под кооперативной ОСРВ приоритетность не нужна. Когда мы отключаем приоритетность, код планировщика сильно упрощается и сокращается, т.к. он больше не содержит цикла предварительного перебора всех задач в поиске готовых и кода сравнения приоритетов. Кроме того, из прораммы выкидываются системные переменные, содержащие максимальный приоритет, адрес задачи с максимальным приоритетом и адрес последней выполненной задачи. Т.е., отключив приоритеты, мы экономим и RAM, и ROM, и время работы планировщика (см. &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/articles/rtos_usage#отключение_приоритетов&quot; class=&quot;wikilink1&quot; title=&quot;osa:articles:rtos_usage&quot;&gt;ниже&lt;/a&gt;).
&lt;/p&gt;

&lt;p&gt;
По умолчанию приоритетность включена. Отключить ее можно, задав в файле osacfg.h константу:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#define OS_DISABLE_PRIORITY&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;!-- SECTION &quot;Отключение приоритетов&quot; [1687-3329] --&gt;
&lt;h3&gt;&lt;a name=&quot;размерность_таймеров&quot; id=&quot;размерность_таймеров&quot;&gt;Размерность таймеров&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Таймеры в OSA - очень гибкий в настройке инструмент. Помимо того, что есть три типа таймеров: таймеры задач, пользовательские статические и пользовательские динамические таймеры, - каждый из которых обладает своими преимуществами, есть еще возможность выбирать размерность каждого типа таймера в зависимости от возложенных на него задач.
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;(&lt;strong&gt;Примечание.&lt;/strong&gt; Есть еще четвертый тип таймеров, исторически сложилось так, что называется он &amp;quot;статические таймеры старого типа&amp;quot;, но т.к. эти таймеры были довольно сложны в настройке, от их дальнейшего сопровождения пришлось отказаться, хотя в системе они остались и функционируют. См. приложение к документации)&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
По умолчанию размерность таймера равна двум байтам. Это покрывает большую часть потребностей в организации задержек в программах. Такие таймеры могут отсчитывать до 65535 системных тиков (периодов вызова &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer). Больше обычно не нужно. Но зато часто встречаются случаи, когда все задержки (и ожидания событий с таймаутами) не длиннее 255 тиков. Например, &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer вызывается в обработчике прерывания по TMR2, настроенного так, чтобы его период был 10 мс. В этом случае, используя отсчет таймера в 255 тиков, мы получаем задержку в 2.5 секунды. Для многих приложений этого более чем достаточно. 
&lt;/p&gt;

&lt;p&gt;
Поэтому во многих случаях есть смысл таймеры задач сделать однобайтовыми. Делается это заданием размерности таймера в файле osacfg.h:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#define OS_TTIMER_SIZE      1&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
Что мы выигрываем, уменьшив размерность таймеров задач? 
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Во-первых, функция инициализации таймера в своих параметрах будет получать не 2 байта, а один (кто знаком со внутренней организацией HT-PICC, знают, что однобайтовый параметр передается напрямую через WREG, в то время как двухбайтовый требует для передачи дополнительную ячейку памяти);&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Во-вторых, сильно сокращается код функции &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer(). Дело в том, что эта функция для сокращения размера кода и скорости работы увеличивает все таймеры не в цикле, а по очереди напрямую. Поэтому уменьшение размерности таймера задач уменьшит размер функции пропорционально количеству задач (чем больше задач, тем сильнее сократится &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer);&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; В-третьих, все дескрипторы задач станут на один байт меньше (при 10 задачах в системе уже экономия в 10 байт, а для PIC16 это немало).&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

&lt;em&gt;&lt;strong&gt;Примечание 1.&lt;/strong&gt; Размерность можно также менять и у статических, и у динамических таймеров.&lt;/em&gt;&lt;br/&gt;
 
&lt;em&gt;&lt;strong&gt;Примечание 2.&lt;/strong&gt; Для 16-разрядных контроллеров (PIC24 и dsPIC) уменьшение размерности таймера до одного байта  не приведет к сокращению кода или экономии RAM.&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Размерность таймеров&quot; [3330-7838] --&gt;
&lt;h3&gt;&lt;a name=&quot;замена_таймеров_задач_статическими_таймерами&quot; id=&quot;замена_таймеров_задач_статическими_таймерами&quot;&gt;Замена таймеров задач статическими таймерами&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Иногда при дефиците ресурсов может оказаться полезным воспользоваться статическими таймерами, вместо таймеров задач. При включении таймеров задач (включаются определением константы &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_ENABLE_TTIMERS) появляется возможность использовать в задачах задержки (&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Delay) и ожидание событий с выходом по таймауту (&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_xxx_Wait_TO). За каждым дескриптором задачи при этом закрепляется свой таймер (так называемый таймер задач), и их будет столько, сколько дескрипторов зарезервировано в osacfg.h (константа &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TASKS). Получается, что если у нас 10 задач, а таймеры используются, например, только в трех, то мы имеем в памяти 7 переменных, которые не используются, но занимают место. 
&lt;/p&gt;

&lt;p&gt;
В таких случаях имеет смысл отключить таймеры задач и воспользоваться статическими таймерами. Для нашего примера мы определяем константу в osacfg.h:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#define OS_STIMERS     3&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
И теперь у нас только 3 ячейки памяти занято таймерами, а мы сэкономили 7 ячеек. При двухбайтовых таймерах это 14 байт оперативной памяти. Теперь задержки в задачах будут выглядеть так:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;    OS_Stimer_Delay&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;ST_ID, &lt;span class=&quot;nu0&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;
&lt;p&gt;

где ST_ID - номер статического таймера (от 0 до 2 в нашем примере).
&lt;/p&gt;

&lt;p&gt;
Как заменить сервисы ожидания с выходом по таймауту, если все сервисы &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_xxx_Wait_TO требуют наличия таймеров задач? Очень просто, воспользовавшись сервисом &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Cond_Wait, который позволяет ожидать в задаче &lt;strong&gt;любое&lt;/strong&gt; условие. Например, мы ждем сообщение из очереди:
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;    &lt;span class=&quot;co1&quot;&gt;// С таймерами задач&lt;/span&gt;
    OS_Queue_Wait_TO&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;queue, msg, &lt;span class=&quot;nu0&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;!&lt;/span&gt;OS_IsTimeout&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span class=&quot;coMULTI&quot;&gt;/* обрабатываем сообщение */&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span class=&quot;co1&quot;&gt;// Без таймеров задач, но со статическими таймерами&lt;/span&gt;
    OS_Stimer_Run&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;nu0&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    OS_Cond_Wait&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;OS_Queue_Check&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;queue&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;sy3&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;sy3&quot;&gt;!&lt;/span&gt;OS_Stimer_Check&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;!&lt;/span&gt;OS_Stimer_Check&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        OS_Queue_Accept&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;queue, msg&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span class=&quot;coMULTI&quot;&gt;/* обрабатываем сообщение */&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
При использовании статического таймера запись оказалась более громоздкой, тем не менее сгенерированный код будет примерно одинаковым по размеру.
&lt;/p&gt;

&lt;p&gt;
Итак, что мы выигрываем от замены таймеров задач статическими таймерами?
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; В памяти не создаются таймеры для тех задач, которые их не используют;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Сокращается обработчик &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer (т.к. он должен пробегаться по всему списку таймеров задач, даже по неиспользуемым);&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

Теряем мы удобство и наглядность.
&lt;/p&gt;

&lt;p&gt;
Еще одно применение статических таймеров можно рассмотреть в контексте предыдущего параграфа (&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/articles/rtos_usage#размерность_таймеров&quot; class=&quot;wikilink1&quot; title=&quot;osa:articles:rtos_usage&quot;&gt;Размерность таймеров&lt;/a&gt;). Там мы указали, что часто бывает так, что задержки в задачах не превышают 255 системных тиков. Но бывает и так, что в 9-ти задачах не превышают, а 10-ой, хоть тресни, нужен 32-разрядный таймер. Понятно, что из-за одной задачи не хотелось бы всем приделывать 4-байтовые таймеры. Поэтому удобно организовать один 4-байтовый статический таймер для этой задачи, а всем остальным определить 1-байтовые. Вот фрагмент файла osacfg.h:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#define OS_ENABLE_TTIMERS          // Разрешаем использование таймеров задач&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_TTIMER_SIZE      1      // Размерность таймеров задач&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_STIMERS          1      // Определяем один статический таймер&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_STIMER_SIZE      4      // Размерность статического таймера&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;!-- SECTION &quot;Замена таймеров задач статическими таймерами&quot; [7839-13180] --&gt;
&lt;h3&gt;&lt;a name=&quot;os_timer_inline&quot; id=&quot;os_timer_inline&quot;&gt;OS_Timer inline&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Сервис &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer вызывает системную функции _&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer(). Учитывая, что чаще всего вызов этого сервиса производят по переполнению какого-либо таймера (TMR0, TMR1, TMR2), обычно он располагается внутри функции-прерывания. Компиляторы от HTSoft в таком случае ведут себя следующим образом: т.к. сама функция _&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer() относительно функции прерывания находится во внешнем другом модуле, то функция прерывания ничего не знает о ресурсах, которые использует _&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer(), поэтому при входе в прерывание сохраняются все критичные регистры, которые, по предположению компилятора, может изменить внешняя функция. К ним относятся: все FSR, пара PRODH:PROLH, 15 регистров btemp, и тройка регистров TABLAT, TBLPTRH:TBLPTRL. Возможно в самом прерывании они и не используются, а все прерывание выглядит так:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; interrupt myisr &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    OS_EnterInt&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TMR2IF&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        TMR2IF &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;;
        OS_Timer&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
    OS_LeaveInt&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
Но на этапе компиляции файла, содержащего код прерывания, компилятор не знает, что творится внутри функции, вызываемой сервисом &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer. Сохранение/восстановление при входе/выходе из прерывания занимает более 100 слов памяти ROM и, соответственно, более 100 машинных циклов. Т.е. если у нас таймер запрограммирован так, чтобы прерывание происходило каждые 256 циклов, то более 40% всего процессорного времени будет тратиться только на вход и выход из прерывания. 
&lt;/p&gt;

&lt;p&gt;
В ОСРВ OSA есть возможность вместо вызова функции _&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer подставлять ее тело напрямую. Для этого нужно определить константу в файле osacfg.h:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#define OS_USE_INLINE_TIMER&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Ограничение:&lt;/strong&gt; если эта константа определена, то в программе &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer() может вызываться в единственном месте. Возможно, в дальнейшем это ограничение будет снято.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;OS_Timer inline&quot; [13181-16136] --&gt;
&lt;h3&gt;&lt;a name=&quot;размещение_переменных&quot; id=&quot;размещение_переменных&quot;&gt;Размещение переменных&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

(Этот параграф имеет отношение не столько к OSA, сколько к PIC18)
&lt;/p&gt;

&lt;p&gt;
Для PIC18 некоторый выигрыш по программной памяти даст размещение переменных в ACCESS-банке (первые 128 или 96 байт RAM-памяти). Обращение к таким переменным производится без предварительной установки регистра BSR, следовательно, при частом обращении к ним можно сэкономить на всех инструкциях movlb. Свои переменные можно размещать в этом банке вручную. Например, для HT-PICC18:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;near &lt;span class=&quot;kw4&quot;&gt;char&lt;/span&gt; a;
near &lt;span class=&quot;kw4&quot;&gt;int&lt;/span&gt;  i;&lt;/pre&gt;
&lt;p&gt;

для MCC18:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#pragma udata access my_vars&lt;/span&gt;
near &lt;span class=&quot;kw4&quot;&gt;char&lt;/span&gt; a;
near &lt;span class=&quot;kw4&quot;&gt;int&lt;/span&gt;  i;&lt;/pre&gt;
&lt;p&gt;
В ОСРВ OSA также есть возможность размещать все внутренние переменные в разных банках: дескрипторы задач, системные переменные, статический таймеры, бинарные семафоры. Для каждого типа этих данных можно указать свой банк (0 - access, 1 - остальная память):

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#define OS_BANK_OS          0         // Размещение системных переменных&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_BANK_TASKS       1         // Размещение дескрипторов задач&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_BANK_BSEMS       0         // Размещение двоичных семафоров&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_BANK_OS          1         // Размещение статических таймеров&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;!-- SECTION &quot;Размещение переменных&quot; [16137-17972] --&gt;
&lt;h3&gt;&lt;a name=&quot;отправка_сообщений&quot; id=&quot;отправка_сообщений&quot;&gt;Отправка сообщений&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Обычно сообщения отправляются сервисом &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Msg_Send. Как этот сервис работает? Предварительно он проверяет, занят дескриптор сообщения или свободен (т.е. обработано ли предыдущее сообщение или еще нет). Если дескриптор занят, то задача становится в режим ожидания и передает управление планировщику. Иногда бывает так, что не принципиально, обработалось предыдущее сообщение или нет. Например, задача измеряет напряжение бортовой сети автомобиля и сообщением отправляет его головной задаче. Головной задаче не важна последовательность изменений напряжения, ей нужно текущее значение. Поэтому иногда нет смысла выполнять лишние операции по проверки занятости дескриптора, по формированию адреса возврата, да еще задержки на неопределенное время. Для отправки сообщения, не дожидаясь освобождения дескриптора (т.е. фактически для перетирания старого тела сообщения новым), можно пользоваться сервисом:
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;    OS_Msg_Send_Now&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;msg_cb, msg&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;
&lt;p&gt;
Например, для PIC16 этот сервис занимает 7 слов программной памяти, в то время как &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Msg_Send требует 17 слов.
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;&lt;strong&gt;Примечание&lt;/strong&gt;. Это же относится к отправке коротких сообщений, а также к отправке сообщений и коротких сообщений в очередь.&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Отправка сообщений&quot; [17973-20138] --&gt;
&lt;h3&gt;&lt;a name=&quot;очереди_сообщений&quot; id=&quot;очереди_сообщений&quot;&gt;Очереди сообщений&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

OSA предоставляет возможность программисту использовать два типа очередей в своей программе, причем их можно использовать одновременно, т.к. они независимы друг от друга. Однако, их независимость порождает небольшую проблему: в программе присутствуют отдельные функции по добавлению/извлечению сообщения для обоих типов очередей. Т.е. в программной памяти два экземпляра функции _&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Queue_Send и два экземпляра функции _&lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Queue_Accept. Это позволяет программисту использовать в своей программе сообщения разных типов и размерностей. Но если в программе используются сообщения одинаковых размерностей? Т.е. размерность указателя на сообщения такая же, как размерность короткого сообщения (для PIC16, например, указатель на RAM однобайтовый). В этом случае использование двух экземпляров функций неоправданно. 
&lt;/p&gt;

&lt;p&gt;
В таких случаях программисту предоставляется возможность объединить эти функции, т.е., вернее, использовать одни и те же функции для сообщений разных типов. Для этого нужно в файле osacfg.h определить константу:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#define OS_QUEUE_SQUEUE_IDENTICAL&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
Так мы сэкономим около 100 слов программной памяти. Однако после применения такого приема следует помнить, что был сделан допуск относительно размерности сообщений. И если вдруг нужно будет поменять тип одного из сообщений (указателя на сообщение или короткого сообщения), то следует пересмотреть возможность использования одной функции для работы с очередями этих сообщений.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Очереди сообщений&quot; [20139-22768] --&gt;
&lt;h2&gt;&lt;a name=&quot;оптимизация_скорости&quot; id=&quot;оптимизация_скорости&quot;&gt;Оптимизация скорости&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Оптимизация скорости&quot; [22769-22821] --&gt;
&lt;h3&gt;&lt;a name=&quot;выбор_приоритетов&quot; id=&quot;выбор_приоритетов&quot;&gt;Выбор приоритетов&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Давайте еще раз рассмотрим принцип работы планировщика в ОСРВ OSA. Планировщик по очереди перебирает все активные (созданные) задачи, проверяя их готовность. Одновременно он сравнивает приоритеты у всех готовых задач, для чего лучший из приоритетов, а также адрес задачи с лучшим приоритетам сохраняет в своих внутренних переменных. После прохода всех задач управление передается той, чей адрес сохранен во внутренней переменной, т.е. чей приоритет был высшим из всех готовых задач.
&lt;/p&gt;

&lt;p&gt;
Если во время проверки встречаются несколько готовых задач с одинаковым приоритетом, то управление получит та из них, которая была проверена первой. Получается так, что если планировщик натыкается на готовую задачу с высшим приоритетом (0), то дальнейший поиск делать бессмысленно, поскольку, даже если и найдутся еще готовые задачи с высшим приоритетом, планировщик все равно запустит ту, которая была найдена первой. Планировщик OSA пользуется этим моментом и, находя готовую задачу с высшим приоритетом, сразу же прерывает поиск и передает управление найденной задаче.
&lt;/p&gt;

&lt;p&gt;
Учитывая, что полное время проверки готовности одной задачи (с выбором адреса задачи, с передачей ей управления для проверки готовности, с самой проверкой и с возвратом в планировщик) длится около 70 тактов. И если у нас 10 задач, то общий поиск будет длиться около 700 тактов.
Если же присутствует задача с нулевым приоритетом, то в случае ее готовности время работы планировщика сократится в среднем вдвое (это время будет колебаться от 70 до 700 тактов в зависимости от того, с какой задачи планировщик начинает просмотр).
&lt;/p&gt;

&lt;p&gt;
Итак, рекомендация такова: если используется приоритетный режим, то желательно самым приоритетным задачам устанавливать именно высший (а не просто самый высокий) приоритет, т.к. это ускорит работу планировщика.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Выбор приоритетов&quot; [22822-26129] --&gt;
&lt;h3&gt;&lt;a name=&quot;полное_отключение_приоритетов&quot; id=&quot;полное_отключение_приоритетов&quot;&gt;Полное отключение приоритетов&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Об этом уже разговор был. Постольку, поскольку при отключении приоритетности убирается код, занимающийся предварительным перебором задач и сравнением приоритетов, то работа планировщика ускорится в &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_TASKS раз.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Полное отключение приоритетов&quot; [26130-26584] --&gt;
&lt;h3&gt;&lt;a name=&quot;замена_ожидания_на_задержку&quot; id=&quot;замена_ожидания_на_задержку&quot;&gt;Замена ожидания на задержку&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Два слова о том, как проверяется условие при ожидании. Например, задача ожидает установку двоичного семафора. Что при этом происходит:
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; задача переводит себя в режим ожидания (сбрасывает себе флаг bReady);&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; задача сохраняет текущее значение программного счетчика;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; задача выполняет проверку семафора;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; если семафор установлен, то задача переводит себя в режим готовности (устанавливает флаг bReady);&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; задача возвращает управление планировщику; (обратите внимание, что возврат в планировщик произойдет при любом значении семафора, т.к. среди задач может оказаться более приоритетная, которая ожидает тот же семафор);&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; планировщик, проверив все остальные задачи, доходит до нашей;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; планировщик передает управление на тот адрес, который задача сохранила в шаге 2 (при этом мы попадаем в задачу как раз в то место, где производится проверка семафора);&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; задача выполняет повторную проверку семафора (он за это время мог быть сброшен более приоритетной задачей);&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; если семафор уже сброшен, то задача переводит себя в режим ожидания (сбрасывает флаг bReady);&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; если семафор установлен и задача готова к выполнению, то она идет выполнять дальнейший код (который следует за ожиданием семафора);&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; если семафор установлен, но задача еще в режиме ожидания, то идем на шаг 4.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;

Т.е. &lt;strong&gt;при ожидании события планировщик всегда заглядывает внутрь задачи&lt;/strong&gt; (передает ей управление, чтобы она сама проверила свое условие). Это требует времени. Если семафор устанавливается довольно редко, а скорость реакции на него некритична (например, в будильнике, по которому мы просыпаемся на работу не так важно, зазвенит он в 07:00:00 или в 07:00:05), то очень много тактов процессора тратится впустую.
&lt;/p&gt;

&lt;p&gt;
Теперь рассмотрим поведение планировщика, когда какая-либо задача находится в ожидании задержки &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Delay. Что происходит, когда задача выполняет &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Delay(100):
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; таймер в дескрипторе задачи инициализируется указанным значением (в нашем примере 100);&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; задача устанавливает себе бит bDelay (что говорит за то, что она выполняет задержку);&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; задача запоминает текущее значение программного счетчика;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; задача возвращает управление планировщику;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; когда у планировщика доходит очередь до проверки этой задачи, он предварительно проверяет бит bDelay  в ее дескрипторе;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; если этот бит установлен, то понятно, что задача еще не готова, и планировщик ее пропускает.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;

&lt;em&gt;(Примечание. Бит bDelay сбрасывается обработчиком сервиса &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer).&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
Т.е. при выполнении задачей задержки &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Delay &lt;strong&gt;планировщик не передает управление задаче до конца задержки&lt;/strong&gt;. Т.е. не теряет 50 тактов на заход внутрь задачи и проверку условия.
&lt;/p&gt;

&lt;p&gt;
Таким образом, если есть некритичные к реакции события, можно ускорить работу планировщика, делая замены подобные этой:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;    &lt;span class=&quot;co1&quot;&gt;// Обычное ожидание события&lt;/span&gt;
    OS_Bsem_Wait&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &lt;span class=&quot;co1&quot;&gt;// Ожидание, которое ускорит работу планировщика&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        OS_Delay&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;              &lt;span class=&quot;co1&quot;&gt;// Проверяем условие с интервалом в 10 системных тиков&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;!&lt;/span&gt;OS_Check_Bsem&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;
&lt;p&gt;

&lt;em&gt;&lt;strong&gt;Примечание.&lt;/strong&gt; Эффективной будет только задержка с использованием таймеров задач. Статический и динамические таймеры здесь не подойдут.&lt;/em&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Замена ожидания на задержку&quot; [26585-32138] --&gt;
&lt;h3&gt;&lt;a name=&quot;проверка_условия_перед_ожиданием&quot; id=&quot;проверка_условия_перед_ожиданием&quot;&gt;Проверка условия перед ожиданием&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Вернемся к описанию работы планировщика при ожидании события в какой-либо задаче, описанному в предыдущем параграфе. Как видно, вне зависимости от того, произошло событие на момент проверки или нет, мы по-любому передаем управление планировщику. Объяснение такому поведению уже приводилось: среди задач может оказаться более приоритетная, ожидающая этого же события, и управление должно быть сперва передано ей. Но допустим, что мы на 100% уверены, что второй задачи, ожидающей того же события нет. А нам жалко терять время на выход из задачи и на ожидание того, когда она станет самой приоритетной. Поэтому в таком случае можно прибегнуть к следующему приему:
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;    &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;!&lt;/span&gt;OS_Bsem_Check&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; OS_Bsem_Wait&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;
&lt;p&gt;
Т.е. мы сперва проверяем, не установлен ли уже семафор, и, только убедившись, что еще нет, возвращаемся в планировщик.
&lt;/p&gt;

&lt;p&gt;
(&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/articles/rtos_usage#советы_по_оптимизации&quot; class=&quot;wikilink1&quot; title=&quot;osa:articles:rtos_usage&quot;&gt;К списку советов по оптимизации&lt;/a&gt;)
&lt;/p&gt;
&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Проверка условия перед ожиданием&quot; [32139-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/osa/ref/appendix/quartet?rev=1275505175">
        <dc:format>text/html</dc:format>
        <dc:date>2010-06-02T22:59:35+03:00</dc:date>
        <title>Пример использования OSA: QUARTET</title>
        <link>http://www.pic24.ru/doku.php/osa/ref/appendix/quartet?rev=1275505175</link>
        <description>


&lt;h1&gt;&lt;a name=&quot;пример_использования_osaquartet&quot; id=&quot;пример_использования_osaquartet&quot;&gt;Пример использования OSA: QUARTET&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Пример использования OSA: QUARTET&quot; [1-77] --&gt;
&lt;h2&gt;&lt;a name=&quot;проект&quot; id=&quot;проект&quot;&gt;Проект&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Программа &lt;strong&gt;quartet&lt;/strong&gt; синтезирует мелодию по заданным нотам (используется фрагмент произведения И.С.Баха N1067). Файл &lt;a href=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/quartet4.rar&quot; class=&quot;media mediafile mf_rar&quot; title=&quot;osa:quartet4.rar&quot;&gt;quartet4.rar&lt;/a&gt; нужно распаковать в папку &amp;quot;C:\TEST\QUARTET&amp;quot;. В папке проект для &lt;strong&gt;PIC16F628A&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Программа генерирует 4-канальную мелодию, используя 8-разрядный ШИМ с частотой 78 КГц.  Мелодия играется четырьмя инструментами: басс, скрипка и 2 гитары (конечно, названия условны, т.к. звуки не очень похожи на настоящие инструменты). Каждый канал может быть включен или выключен с помощью переключателей.
&lt;/p&gt;

&lt;p&gt;
Вот &lt;span class=&quot;important&quot;&gt;&lt;acronym title=&quot;Motion Picture Experts Group Layer 3&quot;&gt;MP3&lt;/acronym&gt;&lt;/span&gt; (&lt;a href=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/quartet_mp3.rar&quot; class=&quot;media mediafile mf_rar&quot; title=&quot;osa:quartet_mp3.rar&quot;&gt;скачать&lt;/a&gt;), записанный с выхода этого устройства.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Проект&quot; [78-1145] --&gt;
&lt;h2&gt;&lt;a name=&quot;принципиальная_схема&quot; id=&quot;принципиальная_схема&quot;&gt;Принципиальная схема&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Ниже приведена схема включения ПИКа. 8-разрядный цифровой ШИМ-сигнал сглаживается RC-фильтром R22-C3 и через резистор R24 (для регулирования громкости) поступает на наушники.
&lt;/p&gt;

&lt;p&gt;

&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/appendix/quartet_pwm.jpg?id=osa%3Aref%3Aappendix%3Aquartet&quot; class=&quot;media&quot; title=&quot;osa:ref:appendix:quartet_pwm.jpg&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/appendix/quartet_pwm.jpg?w=850&quot; class=&quot;media&quot; title=&quot;quartet_pwm.jpg&quot; alt=&quot;quartet_pwm.jpg&quot; width=&quot;850&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Переключатель &lt;span class=&quot;important&quot;&gt;SW1&lt;/span&gt; включает/отключает басс.&lt;br/&gt;

Переключатель &lt;span class=&quot;important&quot;&gt;SW2&lt;/span&gt; включает/отключает скрипку.&lt;br/&gt;

Переключатель &lt;span class=&quot;important&quot;&gt;SW3&lt;/span&gt; включает/отключает первую гитару.&lt;br/&gt;

Переключатель &lt;span class=&quot;important&quot;&gt;SW4&lt;/span&gt; включает/отключает вторую гитару.&lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Принципиальная схема&quot; [1146-1926] --&gt;
&lt;h2&gt;&lt;a name=&quot;описание_работы&quot; id=&quot;описание_работы&quot;&gt;Описание работы&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Программа состоит из следующих файлов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;quartet_main.c&lt;/strong&gt; - основная программа: задачи, функции по чтению нот.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;music.c&lt;/strong&gt; - формальное описание музыки: содержит 4 массива с нотами для каждого канала.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;sinus.c&lt;/strong&gt; - содержит по одному периоду синуса для каждого иструмента. Из этих таблиц генерируется сигнал.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;interrupt.c&lt;/strong&gt; - содержит код синтезатора звука. Он весь помещен в прерывание по TMR2 (вызывается раз в 100 мкс).&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

Ниже подробно рассмотрим работу задач из файла &lt;strong&gt;quartet_main.c&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Наша программа состоит из 5 задач. Грубо говоря, 4 задачи - музыканты, каждый со своим инструментом, и 5-я задача - дирижер, который синхронизирует работу первых 4-х.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Описание работы&quot; [1927-3099] --&gt;
&lt;h3&gt;&lt;a name=&quot;управление_звуком&quot; id=&quot;управление_звуком&quot;&gt;Управление звуком&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Для уравления звуком в прорамме определен тип &lt;strong&gt;TSound&lt;/strong&gt;, который содержит всю информацию о звуке для &amp;quot;музыканта&amp;quot;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; какую ноту играем;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; и из какой нотной тетради;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; держим ли паузу;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; повторяем ли фрагмент;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
для &amp;quot;дирижера&amp;quot;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; когда он должен дать следующую команду;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; закончились ли ноты у &amp;quot;музыканта&amp;quot;;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
для синтезатора:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; частота текущей ноты;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; текущее время ее звучания (для правильного формирования огибающей);&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Управление звуком&quot; [3100-3892] --&gt;
&lt;h3&gt;&lt;a name=&quot;музыканты&quot; id=&quot;музыканты&quot;&gt;&amp;quot;Музыканты&amp;quot;&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

В программе 4 &amp;quot;музыканта&amp;quot;: Task_BASS, Task_VIOLIN, Task_GUITAR1, Task_GUITAR2. Все &amp;quot;музыканты&amp;quot; постоянно находятся в режиме ожидания команды от &amp;quot;дирижера&amp;quot; (в виде бинарного семафора). Получив команду, &amp;quot;музыкант&amp;quot; вычитывает следующую ноту из своего нотного стана, играет ее (формирует данные для синтезатора звука в &lt;strong&gt;interrupt.c&lt;/strong&gt;).
&lt;/p&gt;

&lt;p&gt;
Обработка ноты происходит в функции &lt;strong&gt;NoteWork()&lt;/strong&gt;, куда в качестве параметра передается переменная управления звуком TSound. По ней вычитывается следуюая нота (или инструкция: повтор, пауза и пр.) и выполняются операции по формированию указаний синтезатору, а также формируется длительность текущей ноты (паузы), которая уменьшается на 1 каждый раз при получении команды от &amp;quot;дирижeра&amp;quot;.
&lt;/p&gt;

&lt;p&gt;
Когда &amp;quot;музыкант&amp;quot; доходит до конца нотной тетради, он сообщает &amp;quot;дирижеру&amp;quot;, что у него закончились ноты (сбрасывает флаг в переменной &lt;strong&gt;flag_Playing&lt;/strong&gt;). После чего становится в ожидание команды от &amp;quot;дирижера&amp;quot; начать музыку сначала (в виде бинарного семафора). Получив эту команду, &amp;quot;музыкант&amp;quot; переходит в начало нотной теради (переменная управления звуком переинициализируется) и передает команду &amp;quot;дирижера&amp;quot; следующему &amp;quot;музыканту&amp;quot;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Музыканты&quot; [3893-5920] --&gt;
&lt;h3&gt;&lt;a name=&quot;дирижер&quot; id=&quot;дирижер&quot;&gt;&amp;quot;Дирижер&amp;quot;&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Задача Task_CONDUCTOR (&amp;quot;дирижер&amp;quot;) имеет низший приоритет, чтобы не мешать выполнению задач &amp;quot;музыкантов&amp;quot;. Дирижер&amp;quot; отсчитывает такты (как метроном) и следит за тем, чтобы музыканты вовремя получали команды. Задача &amp;quot;дирижер&amp;quot; запускается один раз в 150 мс и при каждом запуске проверяет состояние проигрываемой мелодии. Как только &amp;quot;дирижер&amp;quot; замечает, что все &amp;quot;музыканты&amp;quot; доиграли свои партии до конца (т.е. все биты во флаге &lt;strong&gt;flag_Playing&lt;/strong&gt; сброшены), он дает команду &amp;quot;музыкантам&amp;quot; играть сначала.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Дирижер&quot; [5921-6812] --&gt;
&lt;h3&gt;&lt;a name=&quot;два_слова_о_синтезаторе&quot; id=&quot;два_слова_о_синтезаторе&quot;&gt;Два слова о синтезаторе&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Синтезатор реализован в функции прерывания в файле &lt;strong&gt;interrupt.c&lt;/strong&gt;. Подпрограмма пробегается по всем четырем переменным управления звуком и формирует цифровой сигнал. Для формирования цифрового сигнала у синтезатора есть:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; три таблицы &amp;quot;паттернов&amp;quot;: bass[], violin[], guitar[] - где записано по одному периоду сигнала с разными частотными характеристиками;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; формулы для формирования огибающей сигнала (помечены комментариями FORMING_SIGNAL_xxx): атака, спад, сустейн.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; макрос быстрого перемножения (signed char)*(unsigned char), чтобы перемножать синусоиду на амплитуду огибающей.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

Все четыре мгновенных значения амплитуды для каждого инструмента суммируются, делятся на 4 и записываются в переменную m_cDAC, которая при следующем входе в прерывание будет скопирована в буферный регистр PWM CCPR1L (два младших разряда копируются в биты CCP1X и CCP1Y регистра CCP1CON).
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Два слова о синтезаторе&quot; [6813-8364] --&gt;
&lt;h3&gt;&lt;a name=&quot;о_нотах&quot; id=&quot;о_нотах&quot;&gt;О нотах&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Здесь приведу немного информации на случай, если кому-то захочется свою мелодию запрограммировать).
&lt;/p&gt;

&lt;p&gt;
В файле &lt;strong&gt;music.c&lt;/strong&gt; есть буквенные определения нот (C0 - до первой октавы, C0_ - до диез первой октавы, D0 - ре и т.д.) Всего в программе выделены частоты под 4 с половиной октавы (57 нот). Но при задании ноты в нотном стане (в массивах &lt;strong&gt;notelist_xxx&lt;/strong&gt;) для задания номера ноты (макрос &lt;strong&gt;play()&lt;/strong&gt;) используются только 5 бит, т.е. можно пронумеровать только 32 ноты. Поэтому введена возможность установки базовой октавы (макрос &lt;strong&gt;setbase()&lt;/strong&gt;). Длительность ноты задается только двумя битами, поэтому всего 4 варианта длительностей. Если нужно нота большей длительности, то следует ее либо добить паузой (макрос &lt;strong&gt;pause()&lt;/strong&gt;), либо командой продолжения звучания (макрос &lt;strong&gt;playmore()&lt;/strong&gt;). Список нот должен заканчиваться макросом &lt;strong&gt;stop()&lt;/strong&gt;, чтобы &amp;quot;музыканты&amp;quot; не обращались к неинициализированным ячейкам пямяти.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;О нотах&quot; [8365-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/osa/ref/appendix/resources?rev=1331541901">
        <dc:format>text/html</dc:format>
        <dc:date>2012-03-12T12:45:01+03:00</dc:date>
        <title>OSA : Статистика используемой ядром памяти</title>
        <link>http://www.pic24.ru/doku.php/osa/ref/appendix/resources?rev=1331541901</link>
        <description>


&lt;h1&gt;&lt;a name=&quot;osa_статистика_используемой_ядром_памяти&quot; id=&quot;osa_статистика_используемой_ядром_памяти&quot;&gt;OSA : Статистика используемой ядром памяти&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Данная статистика приведена для оценки используемых под OSA ресурсов, чтобы пользователь мог наиболее оптимально выбрать контроллер под свою задачу. 
&lt;/p&gt;
&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0 centeralign&quot;&gt;  Компилятор        &lt;/th&gt;&lt;th class=&quot;col1 centeralign&quot;&gt;  min, ROM/RAM  &lt;/th&gt;&lt;th class=&quot;col2 centeralign&quot;&gt;  normal, ROM/RAM  &lt;/th&gt;&lt;th class=&quot;col3 centeralign&quot;&gt;  full, ROM/RAM  &lt;/th&gt;&lt;th class=&quot;col4 centeralign&quot;&gt;  Байт на задачу*, RAM  &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot; colspan=&quot;5&quot;&gt; &lt;br/&gt;
 &lt;strong&gt;PIC10 (PIC12)&lt;/strong&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Hi-tech PICC            &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   153 / 11   &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;   250 / 14    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;   363 / 14       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;   2  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot; colspan=&quot;5&quot;&gt; &lt;br/&gt;
 &lt;strong&gt;PIC16 (PIC12)&lt;/strong&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; HT-PICC STD             &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   152 / 8    &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;   258 / 11    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;   396 / 13       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;   3  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; microC PRO              &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   180 / 14   &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;   307 / 17    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;   474 / 17       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;   3  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; CCS PICC                &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   254 / ..   &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;   399 / ..    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;   573 / ..       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;   3  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row7&quot;&gt;
		&lt;td class=&quot;col0&quot; colspan=&quot;5&quot;&gt; &lt;br/&gt;
 &lt;strong&gt;PIC18&lt;/strong&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row8&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; HT-PICC18 STD           &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   336 / 7    &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;   548 / 10    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;   982 / 16       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;   3  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row9&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; MPLAB C18               &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   598 / 7    &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;   862 / 10    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  1214 / 16       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;   4  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row10&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; microC PRO              &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   426 / 11   &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;   746 / 16    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  1136 / 17       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;   3  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row11&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; CCS PICC                &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   436 / ..   &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;   696 / ..    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  1046 / ..       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;   3  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row12&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot; colspan=&quot;5&quot;&gt; &lt;br/&gt;
 &lt;strong&gt;PIC24 (dsPIC)&lt;/strong&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row13&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; MPLAB C30               &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   846 / 10   &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  1065 / 16    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  1305 / 16       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;  20  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row14&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot; colspan=&quot;5&quot;&gt; &lt;br/&gt;
 &lt;strong&gt;AVR&lt;/strong&gt;       &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row15&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; WinAVR                  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   602 / 8    &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  1030 / 13    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  1348 / 15       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;  10  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row16&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; IAR                     &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   550 / 8    &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;   958 / 13    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  1108 / 15       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;   5  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row17&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot; colspan=&quot;5&quot;&gt; &lt;br/&gt;
 &lt;strong&gt;STM8&lt;/strong&gt;      &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row18&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Cosmic                  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   462 / 8    &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;   729 / 13    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;   974 / 15       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;   5  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row19&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; IAR                     &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   664 / 8    &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  1053 / 13    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  1388 / 15       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;  13  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row20&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Raisonance              &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;   434 / 8    &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;   709 / 13    &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;   918 / 15       &lt;/td&gt;&lt;td class=&quot;col4 centeralign&quot;&gt;   5  &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;

* см. примечания ниже
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Расшифровка режимов тестирования:&lt;/strong&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;min&lt;/strong&gt; (минимальный нобор сервисов)&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; приоритеты отключены&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; доступны бинарные семафоры, сообщения, флаги&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;normal&lt;/strong&gt; (наиболее часто используемый набор сервисов)&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; приоритеты включены&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; таймер задач&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; доступны бинарные семафоры, сообщения, флаги&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; доступны ожидания событий с выходом по таймауту&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;full&lt;/strong&gt; (полный набор сервисов, за исключением пользовательских таймеров)&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; приоритеты включены&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; таймеры задач&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; доступны бинарные и счетные семафоры, сообщения, флаги, очереди сообщений&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; доступны ожидания событий с выходом по таймауту&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; доступны критические секции&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;

(Во всех трех режимах доступны сервисы переключения контекста, ожидания событий, управения задачами, установки/запрета прерываний)
&lt;/p&gt;

&lt;p&gt;

&lt;strong&gt;Примечания&lt;/strong&gt;:
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; параметр ROM:&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; для PIC10, PIC12 и PIC16 память ROM отображается в словах, для всех остальных - в байтах;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; для MCC18 параметр ROM включает в себя сектор инициализации;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; для MCC30 параметр ROM включает в себя сектор инициализации;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; все программы собирались с максимально доступной оптимизацией;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; дополнительно в RAM выделяется память под &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OS_TASKS&lt;/a&gt;&lt;/span&gt; дескрипторов задач&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; в таблице приведен базовый размер дескриптора задач. Он может увеличиться:&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; при наличии таймера задач (&lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OS_ENABLE_TTIMERS&lt;/a&gt;&lt;/span&gt;) - на количество байт, занимаемых таймером (по умолчанию 2);&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; для контроллеров с ROM &amp;gt;64K - на 2 байта (для хранения старший байтов адреса)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; при использовании режима &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OS_PRIORITY_EXTENDED&lt;/a&gt;&lt;/span&gt; - на 2 байта&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Варьируя параметры системной конфигурации (&lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;osacfg.h&lt;/a&gt;&lt;/span&gt;), можно выбрать наиболее оптимальный режим. Например, изменив размерность таймера, можно сократить используемую RAM и ROM. Можно в полном режиме отключить приоритеты, получив выигрыш в ROM и скорости. И т.д.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;OSA : Статистика используемой ядром памяти&quot; [11-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/osa/ref/appendix/speed?rev=1331541883">
        <dc:format>text/html</dc:format>
        <dc:date>2012-03-12T12:44:43+03:00</dc:date>
        <title>OSA : Скоростные характеристики</title>
        <link>http://www.pic24.ru/doku.php/osa/ref/appendix/speed?rev=1331541883</link>
        <description>


&lt;h1&gt;&lt;a name=&quot;osa_скоростные_характеристики&quot; id=&quot;osa_скоростные_характеристики&quot;&gt;OSA : Скоростные характеристики&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;

Здесь приведены цифры для оценки времени, требуемого операционной системе для выбора очередной задачи для запуска в разных режимах под разными компиляторами. Что это значит? Допустим, вы пишете программу для PIC16 под компилятором HTPICC, и у вас возникает вопос: &amp;quot;сколько временых ресурсов отнимет OSA?&amp;quot; или &amp;quot;как быстро произойдет переключение с одной задачи на другую?&amp;quot; (для кооперативных RTOS эти вопросы равнозначны). Ответ на этот вопрос приведен в таблице, где вы находите строку с используемым компилятором, затем столбец с используемым режимом работы (неприоритетный, приоритетный, расширенный приоритетный) и видите среднее количество тактов, требуемое OSA для переключения с одной задачи на другую (это число пропорционально зависит от количества активных задач). Далее найденное число умножаем на время выполнения инструкции и получаем время переключения.
&lt;/p&gt;
&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0 centeralign&quot;&gt;  Compiler  &lt;/th&gt;&lt;th class=&quot;col1 centeralign&quot;&gt;  PRIORITY_DISABLED  &lt;/th&gt;&lt;th class=&quot;col2 centeralign&quot;&gt;  PRIORITY_NORMAL  &lt;/th&gt;&lt;th class=&quot;col3 centeralign&quot;&gt;  PRIORITY_EXTENDED  &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot; colspan=&quot;5&quot;&gt; &lt;br/&gt;
 &lt;strong&gt;PIC10 (PIC12)&lt;/strong&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Hi-tech PICC            &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;     54*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;     84*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;        -         &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot; colspan=&quot;5&quot;&gt; &lt;br/&gt;
 &lt;strong&gt;PIC16 (PIC12)&lt;/strong&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; HT-PICC STD             &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;     49*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;     80*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;     123*N        &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; microC PRO              &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;     74*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;    119*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;     224*N        &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; CCS PICC                &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;     62*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;    107*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;     167*N        &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row7&quot;&gt;
		&lt;td class=&quot;col0&quot; colspan=&quot;5&quot;&gt; &lt;br/&gt;
 &lt;strong&gt;PIC18&lt;/strong&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row8&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; HT-PICC18 STD           &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;     45*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;     70*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;      85*N        &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row9&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; MPLAB C18               &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;     55*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;     96*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;     117*N        &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row10&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; microC PRO              &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;     73*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;     99*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;     187*N        &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row11&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; CCS PICC                &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;     49*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;     88*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;     101*N        &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row12&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot; colspan=&quot;5&quot;&gt; &lt;br/&gt;
 &lt;strong&gt;PIC24 (dsPIC)&lt;/strong&gt;  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row13&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; MPLAB C30               &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;     60*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;     87*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;     113*N        &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row14&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot; colspan=&quot;5&quot;&gt; &lt;br/&gt;
 &lt;strong&gt;AVR&lt;/strong&gt;       &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row15&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; WinAVR                  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;    108*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;    172*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;     190*N        &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row16&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; IAR                     &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;    100*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;    148*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;     177*N        &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row17&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot; colspan=&quot;5&quot;&gt; &lt;br/&gt;
 &lt;strong&gt;STM8&lt;/strong&gt;      &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row18&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Cosmic                  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;     35*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;     58*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;      71*N        &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row19&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; IAR                     &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;     93*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;    118*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;     238*N        &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row20&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Raisonance              &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;     61*N     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;     80*N      &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;     120*N        &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;

N - количество активных задач
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Оценка среднего времени переключения. Пример 1&lt;/strong&gt;
Исходные данные:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Контроллер PIC16F628&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; компилятор HT PICC STD&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 4 задачи (N = 4)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; расширенный приоритетный режим (PRIORITY_EXTENDED)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; тактовая частота 20 МГц (т.е. время выполнения инструкции = 200нс)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

Находим в таблице значение, соответствующее контроллеру, компилятору и используемому режиму. В нашем случае оно равно 123*N. N у нас равно 4, т.е. предполагается, что одновременно работают 4 задачи.
&lt;/p&gt;

&lt;p&gt;
Среднее время переключения (с момента выполнения, например, &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_yield&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_yield&quot;&gt;OS_Yield&lt;/a&gt;&lt;/span&gt;() в одной задачи до момента получения управления другой задачей) будет:
&lt;/p&gt;

&lt;p&gt;
t = 123 * 4 * 200нс = 492 * 200нс = &lt;strong&gt;98.4 мкс&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Оценка среднего времени переключения. Пример 2&lt;/strong&gt;
Исходные данные:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Контроллер STM8S105C6&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; компилятор Cosmic&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 8 задач (N = 8)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; обычный приоритетный режим (PRIORITY_NORMAL)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; тактовая частота 16 МГц (т.е. время выполнения инструкции = 62.5нс)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

Находим в таблице значение, соответствующее контроллеру, компилятору и используемому режиму. В нашем случае оно равно 58*N. N у нас равно 8, т.е. предполагается, что одновременно работают 8 задач.
&lt;/p&gt;

&lt;p&gt;
Среднее время переключения будет:
&lt;/p&gt;

&lt;p&gt;
t = 58 * 8 * 62.5ns = 464 * 62.5ns = &lt;strong&gt; 29 us&lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;
</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/osa/ref/appendix/static_timers_old?rev=1230068485">
        <dc:format>text/html</dc:format>
        <dc:date>2008-12-24T00:41:25+03:00</dc:date>
        <title>OSA : Статические таймеры старого типа</title>
        <link>http://www.pic24.ru/doku.php/osa/ref/appendix/static_timers_old?rev=1230068485</link>
        <description>


&lt;h1&gt;&lt;a name=&quot;osa_статические_таймеры_старого_типа&quot; id=&quot;osa_статические_таймеры_старого_типа&quot;&gt;OSA : Статические таймеры старого типа&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;OSA : Статические таймеры старого типа&quot; [1-84] --&gt;
&lt;h2&gt;&lt;a name=&quot;введение&quot; id=&quot;введение&quot;&gt;Введение&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;p&gt;&lt;div class=&quot;noteclassic&quot;&gt;
(Начиная с версии 81010, статические таймеры обновлены. Статические таймеры старого типа также остаются доступны, но, ввиду неудобства их применения, их использовать не рекомендуется. Новые статические таймеры описаны в разделе &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/services/timers#статические_таймеры&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:services:timers&quot;&gt;Статические таймеры&lt;/a&gt;)

&lt;/div&gt;&lt;/p&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;p&gt;&lt;div class=&quot;noteclassic&quot;&gt;
Эти таймеры рекомендуется использовать тогда, когда код программы критичен к скорости, либо есть необходимость экономии RAM и ROM. В остальных случаях рекомендуется использовать динамические таймеры.

&lt;/div&gt;&lt;/p&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Введение&quot; [85-1032] --&gt;
&lt;h2&gt;&lt;a name=&quot;описание&quot; id=&quot;описание&quot;&gt;Описание&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Есть четыре типа статических таймеров (они отличаются разрядностью): 8-, 16- 24- и 32-разрядные. 8-разрядные занимают по одному байту на таймер, 16- и 24-х разрядные – по 2, 32-х – 4 байта. Тип таймера следует выбирать исходя из максимального времени работы этого таймера. Одновременно в программе могут работать статические таймеры всех 4-х типов. 
&lt;/p&gt;

&lt;p&gt;
В погоне за экономией RAM и ROM организация работы с таймерами не очень удобна. Количество используемых таймеров и их тип должны быть определены на этапе компиляции. Количество таймеров задается в файле &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OSAcfg.h&lt;/a&gt;&lt;/span&gt;:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co1&quot;&gt;// Количество 8-разрядных таймеров&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_TIMERS8    5&lt;/span&gt;
&lt;span class=&quot;co1&quot;&gt;// Количество 16-разрядных таймеров&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_TIMERS16   2&lt;/span&gt;
&lt;span class=&quot;co1&quot;&gt;// Количество 24-разрядных таймеров&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_TIMERS24   0&lt;/span&gt;
&lt;span class=&quot;co1&quot;&gt;// Количество 32-разрядных таймеров&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_TIMERS32   1&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
При этом в памяти создаются массивы соответствующих типов, где и будут храниться таймеры. Кроме того, если в программе есть хотя бы один статический таймер, то создаются битовые переменных для индикации переполнения. Например, в программе используются 5 8-разрядных таймеров, 2 16-разрядных и 1 32-разрядный. Всего 8, следовательно, создастся байтовая переменная, каждый бит которой будет отвечать за свой таймер.
&lt;/p&gt;

&lt;p&gt;
Обращение к статическим таймерам производится через их &lt;strong&gt;ID&lt;/strong&gt; – порядковый номер, причем младшие номера принадлежат 8-разрядным таймерам, а старшие – 32-разрядным. Все номера последовательны. Для нашего примера определено 8 таймеров:
0..4 – 8-разрядные таймеры
5..6 – 16-разрядные
7 – 32-разрядный
&lt;/p&gt;

&lt;p&gt;
Удобно все &lt;strong&gt;ID&lt;/strong&gt; таймеров определять через enum:

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;enum&lt;/span&gt; OSA_TIMERS_ENUM
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span class=&quot;co1&quot;&gt;// 8-битные&lt;/span&gt;
    T8_TIMER0,
    T8_TIMER1,
    T8_TIMER2,
    T8_TIMER3,
    T8_TIMER4,
            &lt;span class=&quot;co1&quot;&gt;// 16-битные&lt;/span&gt;
    T16_TIMER0,
    T16_TIMER1,
            &lt;span class=&quot;co1&quot;&gt;// 24-битные&lt;/span&gt;
&amp;nbsp;
            &lt;span class=&quot;co1&quot;&gt;// 32-битные&lt;/span&gt;
    T32_TIMER0
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;
&lt;p&gt;
Тогда упростится обращение к таймерам и есть гарантия, что случайно не появится двух таймеров с одним и тем же &lt;strong&gt;ID&lt;/strong&gt;. Все сервисы для таймеров разных типов одинаковы, за исключением сервиса &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_runtimerx&quot; class=&quot;wikilink2&quot; title=&quot;osa:ref:allservices:os_runtimerx&quot; rel=&quot;nofollow&quot;&gt;OS_RunTimerX&lt;/a&gt;&lt;/span&gt;, который запускает таймер в работу, - этот сервис свой для каждого типа таймера.
&lt;/p&gt;

&lt;p&gt;
После выполнения &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_init&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_init&quot;&gt;OS_Init&lt;/a&gt;&lt;/span&gt;() все статические таймеры остановлены.
Ниже приведен пример использования таймера для выделения кванта времени задаче поиска информации на карте памяти (т.к. память большая, то поиск может затянуться).
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co1&quot;&gt;// Определения в OAScfg.h&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_ENABLE_TIMER&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_TIMERS8  1&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;kw2&quot;&gt;enum&lt;/span&gt; OS_TIMERS_ENUM &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
   T8_Timer                  &lt;span class=&quot;co1&quot;&gt;// Таймер для выделения кванта времени задаче поиска&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;sy2&quot;&gt;----------------------------------------------------------------------&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co1&quot;&gt;// Фрагмент программы (предполагаем, что интервал OS_Timer = 1 ms)&lt;/span&gt;
OST_MSG pmsg, pmsg2;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; Task1 &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    OST_MSG msg;
    &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;long&lt;/span&gt; Data;
    &lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;;;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        ...
        &lt;span class=&quot;me1&quot;&gt;OS_SendMsg&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;pmsg, &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;OST_MSG&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;Data&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;    &lt;span class=&quot;co1&quot;&gt;// Нужно найти данные Data&lt;/span&gt;
        OS_WaitMsg&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;pmsg2, msg&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;              &lt;span class=&quot;co1&quot;&gt;// Ждем завершения поиска&lt;/span&gt;
        ...
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; Task_SearchData &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    OST_SMSG msg;
    &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;long&lt;/span&gt; Data;
    &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;long&lt;/span&gt; Addr;
&amp;nbsp;
    &lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;;;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
       OS_WaitMsg&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;pmsg, msg&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
       Data &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;long&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;msg&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
       OS_RunTimer&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;T8_Timer, &lt;span class=&quot;nu0&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;                 &lt;span class=&quot;co1&quot;&gt;// Запустить таймер на 10 мс&lt;/span&gt;
       &lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Addr &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;; Addr &lt;span class=&quot;sy1&quot;&gt;&amp;lt;&lt;/span&gt; MAX_ADDRESS; Addr&lt;span class=&quot;sy2&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
           &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;MemoryRead&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Addr&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;sy1&quot;&gt;==&lt;/span&gt; Data&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;        &lt;span class=&quot;co1&quot;&gt;// Если нашли нужные данные,&lt;/span&gt;
               OS_SendMsg&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;pmsg2, &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;OST_MSG&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;Addr&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;; &lt;span class=&quot;co1&quot;&gt;// отправить сообщение и выйти из цикла&lt;/span&gt;
               &lt;span class=&quot;kw1&quot;&gt;break&lt;/span&gt;;
           &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
           &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;OS_CheckTimer&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;T8_Timer&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;         &lt;span class=&quot;co1&quot;&gt;// Таймер переполнился?&lt;/span&gt;
                OS_Yield&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;                       &lt;span class=&quot;co1&quot;&gt;// Передать управление планировщику&lt;/span&gt;
                OS_RunTimer&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;T8_Timer, &lt;span class=&quot;nu0&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;        &lt;span class=&quot;co1&quot;&gt;// Запустить таймер снова&lt;/span&gt;
           &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
       &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
       &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Addr &lt;span class=&quot;sy1&quot;&gt;==&lt;/span&gt; MAX_ADDRESS&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;                 &lt;span class=&quot;co1&quot;&gt;// Если не нашли данных&lt;/span&gt;
            Addr &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu12&quot;&gt;0xFFFFFFFF&lt;/span&gt;;
            OS_SendMsg&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;pmsg2, &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;OST_MSG&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;Addr&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;    &lt;span class=&quot;co1&quot;&gt;// Отправляем -1&lt;/span&gt;
       &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
После получения задания на поиск (после получения сообщения &lt;em&gt;pmsg&lt;/em&gt;) задача &lt;em&gt;Task_Search&lt;/em&gt; будет полностью захватывать время процессора, передавая упарвление другим задачам раз в 10мс.
&lt;/p&gt;
&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Описание&quot; [1033-7338] --&gt;
&lt;h2&gt;&lt;a name=&quot;примечания_для_статических_таймеров&quot; id=&quot;примечания_для_статических_таймеров&quot;&gt;Примечания для статических таймеров&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;размещение_статических_таймеров_в_памяти&quot; id=&quot;размещение_статических_таймеров_в_памяти&quot;&gt;Размещение статических таймеров в памяти&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Размещение статических таймеров программист указывает в файле &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OSAcfg.h.&lt;/a&gt;&lt;/span&gt; Для этого есть константы &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OS_BANK_TIMEOUTS&lt;/a&gt;&lt;/span&gt; и &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;OS_BANK_TIMERSx&lt;/a&gt;&lt;/span&gt; (x = 8, 16, 24, 32). Эти константы описаны в главе &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/appendix/configuration#размещение_данных&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:appendix:configuration&quot;&gt;Конфигурация&lt;/a&gt;.
&lt;/p&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;примечание_о_24-х_разрядных_таймерах&quot; id=&quot;примечание_о_24-х_разрядных_таймерах&quot;&gt;Примечание о 24-х разрядных таймерах&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Эти таймеры фактически 16-разрядные, но увеличиваются они один раз в 256 тиков. Они не годятся для формирования точных задержек из-за такой дискретности, но позволяют формировать довольно большие задержки, не прибегая к использованию 32-разрядного. Получается экономия RAM на 2 байта с одного такого таймера и некоторая экономия ROM за счет работы с 2-х, а не 4-х байтовыми переменными.
&lt;/p&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;максимальные_задержки_статических_таймеров&quot; id=&quot;максимальные_задержки_статических_таймеров&quot;&gt;Максимальные задержки статических таймеров&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Разрядность статического таймера выбирается на этапе проектирования с учетом того, какие временные интервалы предполагается отмерять. Здесь для удобства сведены максимально допустимые задержки (округлены в меньшую сторону) для наиболее часто используемых значений системного тика:
&lt;/p&gt;
&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0&quot;&gt;Интервал вызова &lt;span class=&quot;important&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_timer&quot; class=&quot;wikilink1&quot; title=&quot;osa:ref:allservices:os_timer&quot;&gt;OS_Timer&lt;/a&gt;&lt;/span&gt;&lt;/th&gt;&lt;th class=&quot;col1&quot;&gt;8-разрядные&lt;/th&gt;&lt;th class=&quot;col2&quot;&gt;16-разрядные&lt;/th&gt;&lt;th class=&quot;col3&quot;&gt;24-разрядные&lt;/th&gt;&lt;th class=&quot;col4&quot;&gt;32-разрядные&lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; 1 ms &lt;/td&gt;&lt;td class=&quot;col1 rightalign&quot;&gt;	256 мс &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; 65.5 сек &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; 4 ч 40 мин &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 49 суток &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; 10 ms &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; 2.5 сек &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; 10 мин &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; 46 ч &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 497 суток &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; 18.2 ms &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; 4.6 сек &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; 19 мин &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; 84 ч &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 900 суток &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; 256 us &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; 65 мс &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; 16 сек &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; 1 ч 10 мин &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 12 суток &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; 512 us &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; 130 мс &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; 32.5 сек &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; 2 ч 20 мин &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 24 суток &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; 1024 us &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; 260 мс &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; 67 сек &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; 4 ч 45 мин &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 50 суток &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row7&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; 2048 us &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; 528 мс &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; 2 мин 15 сек &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; 9 ч 30 мин &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 100 суток &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row8&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; 4096 us &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; 1 с &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; 4 мин 30 сек &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; 19 ч &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 200 суток &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row9&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; 8192 us &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; 2 с &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; 9 мин &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; 38 ч &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 400 суток &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;

Для всех таймеров, кроме 24-разрядных, дискретность = 1 системному тику. Для 24-разрядных дискретность = 256 системным тикам = полному периоду 8-разрядного таймера.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Примечания для статических таймеров&quot; [7339-10429] --&gt;
&lt;h2&gt;&lt;a name=&quot;сервисы_управления_статическими_таймерами&quot; id=&quot;сервисы_управления_статическими_таймерами&quot;&gt;Сервисы управления статическими таймерами.&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0 centeralign&quot;&gt;  Сервис  &lt;/th&gt;&lt;th class=&quot;col1 centeralign&quot;&gt;  Описание  &lt;/th&gt;&lt;th class=&quot;col2 centeralign&quot;&gt;  Свойства  &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot; colspan=&quot;3&quot;&gt;&lt;strong&gt;Запуск&lt;/strong&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_runtimer8&quot; class=&quot;wikilink2&quot; title=&quot;osa:ref:allservices:os_runtimer8&quot; rel=&quot;nofollow&quot;&gt;OS_RunTimer8&lt;/a&gt; (&lt;em&gt;timer8_id, time&lt;/em&gt;)  &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Запустить 8-разрядный таймер для отсчета&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Astatic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Сервис использует таймаут&quot; alt=&quot;Сервис использует таймаут&quot; /&gt;&lt;/a&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_runtimer16&quot; class=&quot;wikilink2&quot; title=&quot;osa:ref:allservices:os_runtimer16&quot; rel=&quot;nofollow&quot;&gt;OS_RunTimer16&lt;/a&gt; (&lt;em&gt;timer16_id, time&lt;/em&gt;)  &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Запустить 16-разрядный таймер для отсчета&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Astatic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Сервис использует таймаут&quot; alt=&quot;Сервис использует таймаут&quot; /&gt;&lt;/a&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_runtimer24&quot; class=&quot;wikilink2&quot; title=&quot;osa:ref:allservices:os_runtimer24&quot; rel=&quot;nofollow&quot;&gt;OS_RunTimer24&lt;/a&gt; (&lt;em&gt;timer24_id, time&lt;/em&gt;)  &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Запустить 24-разрядный таймер для отсчета&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Astatic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Сервис использует таймаут&quot; alt=&quot;Сервис использует таймаут&quot; /&gt;&lt;/a&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_runtimer32&quot; class=&quot;wikilink2&quot; title=&quot;osa:ref:allservices:os_runtimer32&quot; rel=&quot;nofollow&quot;&gt;OS_RunTimer32&lt;/a&gt; (&lt;em&gt;timer32_id, time&lt;/em&gt;)  &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Запустить 32-разрядный таймер для отсчета &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Astatic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Сервис использует таймаут&quot; alt=&quot;Сервис использует таймаут&quot; /&gt;&lt;/a&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0&quot; colspan=&quot;3&quot;&gt;&lt;strong&gt;Остановка&lt;/strong&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row7&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_stoptimer&quot; class=&quot;wikilink2&quot; title=&quot;osa:ref:allservices:os_stoptimer&quot; rel=&quot;nofollow&quot;&gt;OS_StopTimer&lt;/a&gt; (&lt;em&gt;timer_id&lt;/em&gt;)  &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Останавливаем таймер (при этом устанавливается флаг Timeout для этого таймера) &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Astatic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Сервис использует таймаут&quot; alt=&quot;Сервис использует таймаут&quot; /&gt;&lt;/a&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row8&quot;&gt;
		&lt;td class=&quot;col0&quot; colspan=&quot;3&quot;&gt;&lt;strong&gt;Проверка&lt;/strong&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row9&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;em&gt;bool&lt;/em&gt; &lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_checktimer&quot; class=&quot;wikilink2&quot; title=&quot;osa:ref:allservices:os_checktimer&quot; rel=&quot;nofollow&quot;&gt;OS_CheckTimer&lt;/a&gt; (&lt;em&gt;timer_id&lt;/em&gt;)  &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Проверить, закончил ли таймер счет. &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Astatic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Сервис использует таймаут&quot; alt=&quot;Сервис использует таймаут&quot; /&gt;&lt;/a&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row10&quot;&gt;
		&lt;td class=&quot;col0&quot; colspan=&quot;3&quot;&gt;&lt;strong&gt;Ожидание&lt;/strong&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row11&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;&lt;a href=&quot;http://www.pic24.ru/doku.php/osa/ref/allservices/os_waittimer&quot; class=&quot;wikilink2&quot; title=&quot;osa:ref:allservices:os_waittimer&quot; rel=&quot;nofollow&quot;&gt;OS_WaitTimer&lt;/a&gt; (&lt;em&gt;timer_id&lt;/em&gt;)  &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Ожидаем завершения счета таймера &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; &lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_task.png?id=osa%3Aref%3Aappendix%3Astatic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_task.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_task.png&quot; class=&quot;media&quot; title=&quot;Разрешен вызов только в контексте задачи&quot; alt=&quot;Разрешен вызов только в контексте задачи&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_ct_sw.png?id=osa%3Aref%3Aappendix%3Astatic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_ct_sw.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_ct_sw.png&quot; class=&quot;media&quot; title=&quot;Переключает контекст&quot; alt=&quot;Переключает контекст&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/attr_call_to.png?id=osa%3Aref%3Aappendix%3Astatic_timers_old&quot; class=&quot;media&quot; title=&quot;osa:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/attr_call_to.png&quot; class=&quot;media&quot; title=&quot;Сервис использует таймаут&quot; alt=&quot;Сервис использует таймаут&quot; /&gt;&lt;/a&gt; &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;plugin_uparrow&quot;&gt;
  &lt;a href=&quot;#&quot; title=&quot;Наверх&quot;&gt;
    &lt;img src=&quot;http://www.pic24.ru/lib/plugins/uparrow/images/blue_arrow.png&quot; alt=&quot;Наверх&quot;/&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Сервисы управления статическими таймерами.&quot; [10430-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/osa/ref/appendix/tutor1?rev=1233487566">
        <dc:format>text/html</dc:format>
        <dc:date>2009-02-01T14:26:06+03:00</dc:date>
        <title>OSA :  UNDER CONSTRUCTION</title>
        <link>http://www.pic24.ru/doku.php/osa/ref/appendix/tutor1?rev=1233487566</link>
        <description>
&lt;p&gt;

&lt;br/&gt;
 
&lt;br/&gt;
 
&lt;br/&gt;
 
&lt;br/&gt;
 
&lt;br/&gt;
 
&lt;br/&gt;
 
&lt;br/&gt;
 

&lt;/p&gt;

&lt;h1&gt;&lt;a name=&quot;under_construction&quot; id=&quot;under_construction&quot;&gt;UNDER CONSTRUCTION&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;br/&gt;
 
&lt;br/&gt;
 
&lt;br/&gt;
 
&lt;br/&gt;
 
&lt;br/&gt;
 
&lt;br/&gt;
 
&lt;br/&gt;
 
&lt;br/&gt;
 
&lt;br/&gt;
 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;UNDER CONSTRUCTION&quot; [30-101] --&gt;
&lt;h1&gt;&lt;a name=&quot;osa_regulator_-_урок&quot; id=&quot;osa_regulator_-_урок&quot;&gt;OSA : Regulator - урок&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;

Здесь приводится небольшой урок по проектированию программы с использованием ОСРВ OSA.
 
Допустим, нам нужно написать программу управления скоростью вращения вентилятора. Вентилятор 
питается от сети 220В 50Гц и управляется симисторным регулятором. Назовем ее Regulator.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;OSA : Regulator - урок&quot; [102-628] --&gt;
&lt;h2&gt;&lt;a name=&quot;структура_программы&quot; id=&quot;структура_программы&quot;&gt;Структура программы&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Структура программы&quot; [629-679] --&gt;
&lt;h3&gt;&lt;a name=&quot;задачи&quot; id=&quot;задачи&quot;&gt;Задачи&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Сперва наперво определимся со структурой программы. 
&lt;/p&gt;

&lt;p&gt;
Для начала разобьем ее на простые модули, каждый их которых занимается своим делом. Наша программа 
должна: 
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; управлять силовой частью;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; менять режимы работы по нажатию кнопок;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; индицировать текущий режим;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; для полноты добавим звуковую индикацию обработки кнопок.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Таким образом, мы имеем 4 задачи управления внешними устройствами: силовая часть, кнопки, 
индикатор, динамик. К ним добавим одну задачу, координирующую работу этих четырех задач и 
обеспечивающую интерфейс пользователя. Такое разбиение на задачи - немного утрированное. Например, 
учитывая простоту и малый объем задачи индикации, ее можно было бы объединить с 
задачей-координатором. Тем не менее, мы оставим такое разбиение, чтобы подчеркнуть разделение 
именно по функцианальному признаку.
&lt;/p&gt;

&lt;p&gt;
Теперь рассмотрим все задачи по отдельности. 
&lt;/p&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;задача_интерфейса_пользователя_task_user&quot; id=&quot;задача_интерфейса_пользователя_task_user&quot;&gt;Задача интерфейса пользователя (Task_User)&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

Эта задача определяет логику работы всего устройства. Работая с остальными задачами как с 
драйверами внешних устройств, она координирует их работу между собой. Эта задача при нажатии на 
кнопку &amp;quot;+&amp;quot; или &amp;quot;-&amp;quot; должна изменить режим работы для увеличения или уменьшения скорости вращения 
вентилятора. Если увеличивать (уменьшать) уже не куда, то задача должен быть выдан предупреждающий
звуковой сигнал (низкой частоты). Кроме того, при смене режима на индикаторе должен отобразиться 
номер текущего режима.
&lt;/p&gt;

&lt;p&gt;
Т.е. это задача будет:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; ждать сигнала, что кнопка нажата (не заботясь о таких деталях, как полярность кнопки, дребезг &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
контактов - обо всем этом будет думать задача обработки кнопок);
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; изменять номер режима;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; выводить цифру на экран (не заботясь о том, какой тип экрана, как он подключен и пр. - обо &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
всем этом будет думать задача-индикатор);
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; сообщать низким звуковым сигналом о достижении минимального или максимального режима (не &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
заботясь о том, какой динамик подключен).
&lt;/p&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;задача_управления_силовой_частью_task_regulator&quot; id=&quot;задача_управления_силовой_частью_task_regulator&quot;&gt;Задача управления силовой частью (Task_Regulator)&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

Эта задача должна быть синхронизирована с частотой сети 100 Гц (т.к. мы управляем полуволнами). 
Как тольконачинается полуволна, мы открываем симистор, тем самым включая мотор вентилятора. 
Выдерживая какую-то паузу, мы закрываем симистор. (Длительность паузы определяется текущим режимом 
работы и выбирается пользователем с помощью кнопок в задаче Task_User). 
&lt;/p&gt;

&lt;p&gt;
Итак, эта задача:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; ожидает сигнала о том, что полупериод начался;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; открывает симистор;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; выдерживает нужную паузу;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; закрывает симистор.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

(рисунок)
&lt;/p&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;задача_обработки_кнопок_task_buttons&quot; id=&quot;задача_обработки_кнопок_task_buttons&quot;&gt;Задача обработки кнопок (Task_Buttons)&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

Эта задача будет с итервалом в 10 мс опрашивать состояния кнопок. При нажатии отпускании кнопки 
должен подавляться дребезг (возьмем 50 мс) во избежании ложного срабатывания. При каждом нажатии 
кнопки должен издаваться звуковой сигнал (для &amp;quot;+&amp;quot; более высокой частотой, для &amp;quot;-&amp;quot; менее высокой)
&lt;/p&gt;

&lt;p&gt;
Т.е. в функции этой задачи входит:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; раз в 10 мс считавание текущего состояния портов, к которым подключены кнопки &amp;quot;+&amp;quot; и &amp;quot;-&amp;quot;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; сравнение текущего состояния портов с предыдущим и отсчет, сколько времени состояния портов не &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
изменялись (для подавления дребезга);
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; подтверждение факта нажатия кнопки высоким звуковым сигналом;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; сигнализация программе о том, что нажата такая-то кнопка.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;задача_индикации_task_indicator&quot; id=&quot;задача_индикации_task_indicator&quot;&gt;Задача индикации (Task_Indicator)&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

В этой задаче будем выводить номер текущего режима (от 0 до 9) на 7-сегментный индикатор. 
&lt;/p&gt;

&lt;p&gt;
Эиа задача будет:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; ждать сигнала о том, что нужно вывести цифру;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; после получения сигнала выводить ее на индиатор.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;задача_вывода_звука_task_sound&quot; id=&quot;задача_вывода_звука_task_sound&quot;&gt;Задача вывода звука (Task_Sound)&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

Эта задача будет формировать импульсы заданной длительности и частоты. Для вывода звука будет 
использован модуль ШИМ. Другие задачи только сообщают ей, какой длительности и какой частоты 
должен быть звук.
&lt;/p&gt;

&lt;p&gt;
Перечислим функции этой задачи:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; ожидание команды из-вне;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; формирование регистров для генерации меандра на динамик;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; выдерживание нужной паузы;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; выключение генерации.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Задачи&quot; [680-7637] --&gt;
&lt;h3&gt;&lt;a name=&quot;взаимосвязь_задач&quot; id=&quot;взаимосвязь_задач&quot;&gt;Взаимосвязь задач&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Итак, у нас есть 5 задач, которые работают параллельно. Конечно же, это псевдопараллельность, т.к. 
в один момент времени может выполняться только одна задача, но за счет того, что ядро операционной 
системы бысто по очереди перебирает все задачи, сосдается эффект параллельности. В чем прелесть? 
Напрмер, задаче интерфейса требуется издать звуковой сигнал длительностью 0.5 сек. Она всего 
навсего выдает команду параллельной задаче вывода звука и, забывая о ней, продолжает заниматься 
своими делами, в то время как пауза в 0.5 секунды ложится на плечи задачи вывода звука. Задача 
интерфейс тем временем может продолжать принимать/отправлять команды другим задачам.
&lt;/p&gt;

&lt;p&gt;
Здесь мы определимся с тем, как задачи будут общаться между собой, т.е. ответим на два вопроса:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; какой информацией задачи будут обмениваться;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; как они это будут делать. Способ передачи данных между задачами (семафоры, сообщения и &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
пр.) будем выбирать, исходя из области значений конкретных данных.
&lt;/p&gt;

&lt;p&gt;
В нашей программе есть переменная, которая используется почти во всех задачах - текущий режим. 
Есть смысл сделать ее глобальной.
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;    &lt;span class=&quot;kw4&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;char&lt;/span&gt; m_ucMode;&lt;/pre&gt;
&lt;p&gt;
Задача Task_Buttons будет сообщать задаче Task_User какая кнопка нажата. Т.е. эта задача  
должна иметь возможноть передать два значения: нажата кнопка &amp;quot;-&amp;quot; или нажата кнопка &amp;quot;+&amp;quot;. Нам нужно 
выбрать объект операционной системы, через который задача будет сообщать о нажатых кнопках. В 
арсенале OSA есть следующие объекты для передачи данных: бинарный семафор (Bsem), счетный 
семафор (Csem), флаг (Flag), указатель на сообщение (Msg), короткое однобайтовое сообщение (SMsg). 
&lt;/p&gt;

&lt;p&gt;
Bsem, очевидно не подойдет, т.к. он способен передавать только 1 бит информации (он либо 
установлен, либо нет), в то время как нам нужно как минимум два бита: нажата кнопка и какая 
именно. В принципе, тут можно было бы обойтись двумя семафорами, но такой подход не совсем 
корректен, во-первых, с концептуальной точки зрения, а во-вторых (и в-главных), это накладывает 
ограничения на количество используемых кнопок (вдруг при расширении программы потребуется добавить 
еще 3-4 кнопки?).
&lt;/p&gt;

&lt;p&gt;
Csem, хоть и способен передавать гораздо более широкий спектр значений, но не подойдет из-за 
концептуального несоответствия: он призван считать (увеличиваться и уменьшася), а не 
устанавливаться в произвольные значение (не взирая на то, что в OSA это возможно).
&lt;/p&gt;

&lt;p&gt;
Остаются три способа передачи информации, которые нам подходят: Flag, Msg, SMsg. Учитывая, что 
предпочтительнее выбирать наименее ресурсоемкий инструмент, мы отказываемся от указателя на 
сообщение, т.к. в памяти занимает 2 байта на дескриптор указателя и 1 байт самого сообщения, в 
отличие от Flag и SMsg, которые занимают по одному байту. 
&lt;/p&gt;

&lt;p&gt;
Между Flag и SMsg мы сделаем выбор в пользу флагов, т.к. с их помощью можно передать информацию о 
нажатии нескольких кнопок одновременно (сейчас это не нужно, но при дальнейшем развитии проекта 
может оказаться полезным). Через SMsg все это тоже передать, но концептуально правильнее выбрать 
именно Flag, т.к. эта переменная позволяет работать с каждой кнопкой в отдельности (например, 
где-то понадобится ожидание конкретной кнопки).
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;    OST_FLAG    flag_Buttons;&lt;/pre&gt;
&lt;p&gt;

Кроме того, задача обработки кнопок должна заставлять динамик пищать:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; более высокой частотой - при нажатии на &amp;quot;+&amp;quot;;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; менее высокой частотой - при нажатии на &amp;quot;-&amp;quot;.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Т.е. она должна сообщить задаче вывода звука частоту тона и длительность звучания. Т.к. за один раз 
передаются сразу несколько значений, то есть смысл для передачи данных использовать уазатель на 
структуру, содержащую данные о частоте и длительности. Т.е. для передачи данных будем использовать 
Msg - указатель на сообщение.
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;    &lt;span class=&quot;kw4&quot;&gt;typedef&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;struct&lt;/span&gt; _TSound
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span class=&quot;kw4&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;char&lt;/span&gt;    ucFreq;
        &lt;span class=&quot;kw4&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;int&lt;/span&gt;     wDuration;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    OST_MSG_CB    msg_Sound;&lt;/pre&gt;
&lt;p&gt;

Task_User при получении сообщения от задачи Task_Buttons должна изменить режим. Если 
режим уже максимальный или минимальный, то выдать звуковой сигнал низкой частоты (это делается 
через уже определенную переменную &lt;strong&gt;msg_Sound&lt;/strong&gt;). При смене режима задача-координатор должна 
сообщить задаче-индикатору, что нужно отобразить текущий режим. Т.к. сам режим - глобальная 
переменная, то задаче Task_Indicator нужно только махнуть флажком, что пора выводить цифру на 
экран. Для этого нам достаточно одного бита информации, т.е. есть возможность воспользоваться Bsem 
- бинарным семафором.
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;enum&lt;/span&gt; ENUM_BSEMS &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    ...
    &lt;span class=&quot;me1&quot;&gt;BS_INDICATE&lt;/span&gt;
    ...
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
Наконец, осталось только определиться с тем, как мы будем синхронизировать задачу управления 
силовой частью с частотой в сети. Учитывая схемотехническое решение (см. ниже), для синхронизации 
по фронту будем использовать флаг прерывания INTF, который будет устанавливаться аппаратно при 
возникновении падающего фронта на входе RB0.
&lt;/p&gt;

&lt;p&gt;
Таким образом, у нас получилась следующая модель программы:
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/osa/ref/appendix/tutor_tasks.png?id=osa%3Aref%3Aappendix%3Atutor1&quot; class=&quot;media&quot; title=&quot;osa:ref:appendix:tutor_tasks.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/osa/ref/appendix/tutor_tasks.png&quot; class=&quot;media&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Взаимосвязь задач&quot; [7638-16200] --&gt;
&lt;h3&gt;&lt;a name=&quot;приоритеты&quot; id=&quot;приоритеты&quot;&gt;Приоритеты&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Очевидно, что высшим приоритетом должна обладать задача управления силовой частью, т.к. она должна 
быть четко синхронизирована с началом фазы напряжения сети. Распределение приортетов остальных 
задач, в принципе, не важно, за одним исключением: задача вывода звука получает сообщения сразу от 
двух задач (задачи обработки кнопок и задачи интрефейса). Поэтому, чтобы лишний раз не ставить 
задачи отправки сообщений в ожидание (перед отправкой сообщения они будут дожидаться, когда 
предыдущее сообщение будет обработано), есть смысл сделать приоритет задачи вывода звука более 
высоким.
&lt;/p&gt;

&lt;p&gt;
Итак, иерархия приоритетов будет такова:

&lt;/p&gt;
&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0 centeralign&quot;&gt;  Задача                    &lt;/th&gt;&lt;th class=&quot;col1 centeralign&quot;&gt;  Имя функции     &lt;/th&gt;&lt;th class=&quot;col2 centeralign&quot;&gt;  Приоритет   &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Управление силовой частью  &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt; Task_Regulator    &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  0 (высший)  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Вывод звука                &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt; Task_Sound        &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  1           &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Координатор                &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt; Task_Coordinator  &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  2           &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Обработка кнопок           &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt; Task_Buttons      &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  2           &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Индикация                  &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt; Task_Indicate     &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  2           &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Приоритеты&quot; [16201-17882] --&gt;
&lt;h2&gt;&lt;a name=&quot;реализация&quot; id=&quot;реализация&quot;&gt;Реализация&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Реализация&quot; [17883-17917] --&gt;
&lt;h3&gt;&lt;a name=&quot;реализация_задач&quot; id=&quot;реализация_задач&quot;&gt;Реализация задач&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Здесь мы создадим файл &amp;quot;regulator.c&amp;quot; и напишем функции, описывающие работу каждой задачи. Каждая 
задача будет нами написана как самостоятельная подпрограмма, не учитывающая никаких особенностей 
остальных задач.
&lt;/p&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;task_user&quot; id=&quot;task_user&quot;&gt;Task_User&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

Основная задача, обеспечивающая управление режимами и интерфейс пользователя будет выглядеть так:
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; Task_User &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; TSound s_Sound;
&amp;nbsp;
    &lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;;;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span class=&quot;co1&quot;&gt;// Ждем нажатия кнопки (утановки любого бита в переменной flag_Buttons)&lt;/span&gt;
&amp;nbsp;
        OS_Flag_Wait_1x&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;flag_Buttons&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
        &lt;span class=&quot;co1&quot;&gt;// Проверка кнопки &amp;quot;+&amp;quot;&lt;/span&gt;
&amp;nbsp;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;flag_Buttons &lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
            m_ucMode++;
            &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;m_ucMode &lt;span class=&quot;sy1&quot;&gt;&amp;gt;=&lt;/span&gt; MAX_MODE&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
                m_ucMode &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; MAX_MODE;
                s_Sound.&lt;span class=&quot;me1&quot;&gt;ucFreq&lt;/span&gt; &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;50&lt;/span&gt;;
                s_Sound.&lt;span class=&quot;me1&quot;&gt;wDuration&lt;/span&gt; &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;4000&lt;/span&gt;;   &lt;span class=&quot;co1&quot;&gt;// 4000 * 100 us = 400 ms&lt;/span&gt;
                OS_Msg_Send&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;msg_Sound, &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;OST_MSG&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;s_Sound&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span class=&quot;co1&quot;&gt;// Проверка кнопки &amp;quot;-&amp;quot;&lt;/span&gt;
&amp;nbsp;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;flag_Buttons &lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
            &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;m_ucMode &lt;span class=&quot;sy1&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
                m_ucMode &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; MAX_MODE;
                s_Sound.&lt;span class=&quot;me1&quot;&gt;ucFreq&lt;/span&gt; &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;50&lt;/span&gt;;
                s_Sound.&lt;span class=&quot;me1&quot;&gt;wDuration&lt;/span&gt; &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;4000&lt;/span&gt;;   &lt;span class=&quot;co1&quot;&gt;// 4000 * 100 us = 400 ms&lt;/span&gt;
                OS_Msg_Send&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;msg_Sound, &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;OST_MSG&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;s_Sound&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
            &lt;span class=&quot;kw1&quot;&gt;else&lt;/span&gt; m_ucMode--;
&amp;nbsp;
        &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span class=&quot;co1&quot;&gt;// Ждем отпускания кнопок&lt;/span&gt;
&amp;nbsp;
        OS_Flag_Wait_00&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;flag_Buttons&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;task_regulator&quot; id=&quot;task_regulator&quot;&gt;Task_Regulator&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#define MAX_MODE    10                  // Количество режимов скорости&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;char&lt;/span&gt; Speeds&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;MAX_MODE&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt;  &lt;span class=&quot;co1&quot;&gt;// Длительности управляющих импульсов&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;nu0&quot;&gt;3&lt;/span&gt;, &lt;span class=&quot;nu0&quot;&gt;4&lt;/span&gt;, &lt;span class=&quot;nu0&quot;&gt;5&lt;/span&gt;, &lt;span class=&quot;nu0&quot;&gt;6&lt;/span&gt;, &lt;span class=&quot;nu0&quot;&gt;7&lt;/span&gt;, &lt;span class=&quot;nu0&quot;&gt;8&lt;/span&gt;, &lt;span class=&quot;nu0&quot;&gt;9&lt;/span&gt;, &lt;span class=&quot;nu0&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;;    &lt;span class=&quot;co1&quot;&gt;// для всех режимов&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; Task_Regulator &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;;;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        pin_REGULATOR &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;;          &lt;span class=&quot;co1&quot;&gt;// Выключаем симистор&lt;/span&gt;
        OS_Cond_Wait&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;INTF&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;         &lt;span class=&quot;co1&quot;&gt;// Ждем начала фазы сети&lt;/span&gt;
&amp;nbsp;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;m_ucMode&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;               &lt;span class=&quot;co1&quot;&gt;// Открываем симистор, только если ненулевой режим&lt;/span&gt;
            pin_REGULATOR &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;;
&amp;nbsp;
        INTF &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;;
&amp;nbsp;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;m_ucMode &lt;span class=&quot;sy1&quot;&gt;&amp;gt;=&lt;/span&gt; MAX_MODE&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; m_ucMode &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;;
&amp;nbsp;
        OS_Delay&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Speeds&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;m_ucMode&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;; &lt;span class=&quot;co1&quot;&gt;// Выдерживаем задержку, сооиветствующую режиму.&lt;/span&gt;
                                    &lt;span class=&quot;co1&quot;&gt;// Чем дольше задержка, тем быстрее будет&lt;/span&gt;
                                    &lt;span class=&quot;co1&quot;&gt;// вращаться вентилятор.&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;task_buttons&quot; id=&quot;task_buttons&quot;&gt;Task_Buttons&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

В этой задаче читаем состояния портов, к которым подсоединены кнопки. После устранения дребезга, 
выставляем флаги в соответствие с нажатыми кнопками.
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; Task_Buttons &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;co1&quot;&gt;// Переменные, которые должны сохранять&lt;/span&gt;
    &lt;span class=&quot;co1&quot;&gt;// свое значение после переключения контекста&lt;/span&gt;
    &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;char&lt;/span&gt; s_ucButtons;       &lt;span class=&quot;co1&quot;&gt;// Текуще состояние кнопок&lt;/span&gt;
    &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;char&lt;/span&gt; s_ucJitter;        &lt;span class=&quot;co1&quot;&gt;// Счетчик для устранения дребезг&lt;/span&gt;
    &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; TSound        s_Sound;           &lt;span class=&quot;co1&quot;&gt;// Переменная для отправки сообщения&lt;/span&gt;
                                            &lt;span class=&quot;co1&quot;&gt;// задаче вывода звука&lt;/span&gt;
&amp;nbsp;
    &lt;span class=&quot;co1&quot;&gt;// Временные переменные.&lt;/span&gt;
    &lt;span class=&quot;kw4&quot;&gt;char&lt;/span&gt; cTemp;
&amp;nbsp;
    &lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;;;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        s_ucButtons &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; cTemp;                        &lt;span class=&quot;co1&quot;&gt;// Запоминаем последнее состояние входов&lt;/span&gt;
&amp;nbsp;
        OS_Delay&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;                      &lt;span class=&quot;co1&quot;&gt;// Интервал опроса = 100 * 100uS = 10 ms&lt;/span&gt;
        cTemp &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;;
&amp;nbsp;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;!&lt;/span&gt;pin_BUTTON_PLUS&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;  cTemp |= &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;;  &lt;span class=&quot;co1&quot;&gt;// Копируем сотояния кнопок во временную переменую&lt;/span&gt;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;!&lt;/span&gt;pin_BUTTON_MINUS&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; cTemp |= &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;;
&amp;nbsp;
        &lt;span class=&quot;co1&quot;&gt;// Обработка дребезга&lt;/span&gt;
&amp;nbsp;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;s_ucButtons &lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nu12&quot;&gt;0x80&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; s_ucButtons++;       &lt;span class=&quot;co1&quot;&gt;// Обработка дребезга. Счетчик будет&lt;/span&gt;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;cTemp &lt;span class=&quot;sy3&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; s_ucButtons&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; s_ucJitter &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;;       &lt;span class=&quot;co1&quot;&gt;// расти только тогда, когда&lt;/span&gt;
                                                        &lt;span class=&quot;co1&quot;&gt;// сотояние кнопок не изменяется.&lt;/span&gt;
&amp;nbsp;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;s_ucJitter &lt;span class=&quot;sy3&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;continue&lt;/span&gt;;
&amp;nbsp;
        &lt;span class=&quot;co1&quot;&gt;// Попали сюда, значит, после нажатия/отпускания кнопки и устоявшегося состояния&lt;/span&gt;
        &lt;span class=&quot;co1&quot;&gt;// на входе прошло 50 мс.&lt;/span&gt;
&amp;nbsp;
        OS_Flag_Init&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;flag_Buttons, cTemp&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;cTemp &lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;cTemp &lt;span class=&quot;sy3&quot;&gt;^&lt;/span&gt; s_ucButtons&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;      &lt;span class=&quot;co1&quot;&gt;// Звук выдаем, только если кнопка была нажата&lt;/span&gt;
        &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
            s_Sound.&lt;span class=&quot;me1&quot;&gt;ucFreq&lt;/span&gt; &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;100&lt;/span&gt;;
            &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;cTemp &lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; s_Sound.&lt;span class=&quot;me1&quot;&gt;ucFreq&lt;/span&gt; &lt;span class=&quot;sy2&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;20&lt;/span&gt;;
            s_Sound.&lt;span class=&quot;me1&quot;&gt;wDuration&lt;/span&gt; &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;2000&lt;/span&gt;;   &lt;span class=&quot;co1&quot;&gt;// 2000 * 100 us = 200 ms&lt;/span&gt;
&amp;nbsp;
            &lt;span class=&quot;co1&quot;&gt;// Отправляем сообщение задаче вывода звука&lt;/span&gt;
            OS_Msg_Send&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;msg_Sound, &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;OST_MSG&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;s_Sound&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;task_sound&quot; id=&quot;task_sound&quot;&gt;Task_Sound&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

Эта задача большую часть времени находится в состоянии ожидания сообщения. Как только она его 
получает, она включает генерацию модуля ШИМ на заданное время.
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; Task_Sound &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    TSound &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;pSound;
&amp;nbsp;
    &lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;;;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        CCPR1L &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;;
        OS_Msg_Wait&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;msg_Sound, &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;OST_MSG&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; pSound&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;        &lt;span class=&quot;co1&quot;&gt;// Ждем сообщение&lt;/span&gt;
&amp;nbsp;
        &lt;span class=&quot;co1&quot;&gt;// Формируем параметры ШИМ из тела сообщения&lt;/span&gt;
        PR2 &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; pSound&lt;span class=&quot;sy2&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sy1&quot;&gt;&amp;gt;&lt;/span&gt;ucFreq;                           &lt;span class=&quot;co1&quot;&gt;// Частота тона&lt;/span&gt;
        CCPR1L &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; PR2 &lt;span class=&quot;sy1&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;;                              &lt;span class=&quot;co1&quot;&gt;// Скважность = 2&lt;/span&gt;
&amp;nbsp;
        OS_Delay&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;pSound&lt;span class=&quot;sy2&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sy1&quot;&gt;&amp;gt;&lt;/span&gt;wDuration&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;                    &lt;span class=&quot;co1&quot;&gt;// Выдерживаем паузу&lt;/span&gt;
        CCPR1L &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;;
&amp;nbsp;
        OS_Delay&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;                                 &lt;span class=&quot;co1&quot;&gt;// Ждем паузу 1000*100us = 100ms,&lt;/span&gt;
                                                        &lt;span class=&quot;co1&quot;&gt;// чтобы звук не сливался, когда&lt;/span&gt;
                                                        &lt;span class=&quot;co1&quot;&gt;// принимаются два сообщения подряд&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;task_indicate&quot; id=&quot;task_indicate&quot;&gt;Task_Indicate&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

Здесь все просто: ждем установки двоичного семафора, а затем зажигаем сегменты индикатора в 
соответствие со значением m_ucMode.
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;kw4&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;char&lt;/span&gt; SEGMENTS&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;co1&quot;&gt;//abcdefgh&lt;/span&gt;
    &lt;span class=&quot;nu6&quot;&gt;0b11111110&lt;/span&gt;,     &lt;span class=&quot;co1&quot;&gt;// 0&lt;/span&gt;
    &lt;span class=&quot;nu6&quot;&gt;0b01100000&lt;/span&gt;,     &lt;span class=&quot;co1&quot;&gt;// 1&lt;/span&gt;
    &lt;span class=&quot;nu6&quot;&gt;0b11011010&lt;/span&gt;,     &lt;span class=&quot;co1&quot;&gt;// 2&lt;/span&gt;
    &lt;span class=&quot;nu6&quot;&gt;0b11110010&lt;/span&gt;,     &lt;span class=&quot;co1&quot;&gt;// 3&lt;/span&gt;
    &lt;span class=&quot;nu6&quot;&gt;0b01100110&lt;/span&gt;,     &lt;span class=&quot;co1&quot;&gt;// 4&lt;/span&gt;
    &lt;span class=&quot;nu6&quot;&gt;0b10110110&lt;/span&gt;,     &lt;span class=&quot;co1&quot;&gt;// 5&lt;/span&gt;
    &lt;span class=&quot;nu6&quot;&gt;0b10111110&lt;/span&gt;,     &lt;span class=&quot;co1&quot;&gt;// 6&lt;/span&gt;
    &lt;span class=&quot;nu6&quot;&gt;0b11100000&lt;/span&gt;,     &lt;span class=&quot;co1&quot;&gt;// 7&lt;/span&gt;
    &lt;span class=&quot;nu6&quot;&gt;0b11111110&lt;/span&gt;,     &lt;span class=&quot;co1&quot;&gt;// 8&lt;/span&gt;
    &lt;span class=&quot;nu6&quot;&gt;0b11110110&lt;/span&gt;,     &lt;span class=&quot;co1&quot;&gt;// 9&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; Task_Indicator &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;;;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        OS_Bsem_Wait&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;BS_INDICATE&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;m_ucMode &lt;span class=&quot;sy1&quot;&gt;&amp;gt;=&lt;/span&gt; MAX_MODE&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; m_ucMode &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;;
        PORTB &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; SEGMNTS&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;m_ucMode&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;!-- SECTION &quot;Реализация задач&quot; [17918-25387] --&gt;
&lt;h3&gt;&lt;a name=&quot;проект&quot; id=&quot;проект&quot;&gt;Проект&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

Теперь создадим проект в MPLab, из которого уже получим рабочий HEX-фалй для прошивки в 
контроллер. Следуя указаниям из параграфа &amp;quot;Описание/Проект&amp;quot;, создадим проект.

&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; В MPLab через меню Project/New создаем новый проект с именем &amp;quot;regulator&amp;quot; и выбираем рабочую &lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
папку для него.
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; В рабочей папке создаем пустой файл OSAcfg.h&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; В начало нашего файла &amp;quot;regulator.c&amp;quot; добавляем включение файла &amp;quot;osa.h&amp;quot;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Через меню &amp;quot;Project/Build options…/Progect&amp;quot; открываем параметры проекта и на закладке &lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
&amp;quot;Directories&amp;quot; указываем пути &amp;quot;Include Search Path&amp;quot;: 
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; путь к файлам самого проекта;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; путь к файлу osa.h. &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Все, что нам осталось - это сконфигурировать систему, инициализировать ее, создать задачи 
(т.е. объяснить операционной системе, какие функции являются задачами) и запустить планировщик на 
выполнение. 
&lt;/p&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;main&quot; id=&quot;main&quot;&gt;main()&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

Инициаизация и запуск задач делается в функции main(). Кроме того, учитывая, что в нашей 
программе используются задержки, нам нужно в периодическом месте программы вызывать системный 
сервис &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt;_Timer, который будет следить за всеми задержками. Мы его привяжем к прерыванию по TMR0.
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; interrupt isr &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;T0IF&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        T0IF &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;;
        OS_Timer&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
    wdt_work&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;             &lt;span class=&quot;co1&quot;&gt;// (описание см. ниже)&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; main &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    init&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;                 &lt;span class=&quot;co1&quot;&gt;// Для начала инициализируем все настройки периферии ПИКа&lt;/span&gt;
                            &lt;span class=&quot;co1&quot;&gt;// (описание см. ниже)&lt;/span&gt;
&amp;nbsp;
    OS_Init&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    OS_Task_Create&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;, Task_User&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    OS_Task_Create&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu19&quot;&gt;0&lt;/span&gt;, Task_Regulator&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    OS_Task_Create&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;, Task_Buttons&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    OS_Task_Create&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;, Task_Indicator&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    OS_Task_Create&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;, Task_Sound&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    OS_Run&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;osacfg.h&quot; id=&quot;osacfg.h&quot;&gt;OSAcfg.h&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

Ну, и напоследок - конфигурация ОС. В каждом проекте, написанным с использованием OSA, должен быть 
конфигурационный файл OSAcfg.h.
&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#ifndef _OSA_CFG_H&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define _OSA_CFG_H&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co2&quot;&gt;#define OS_TASKS                5       // Резервируем память под 5 дескрипторов задач&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_ENABLE_TIMER                 // Говорим системе, что будем использовать задержки&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define OS_USE_INLINE_TIMER             // Для ускорения вызова OS_Timer делаем его in-line&lt;/span&gt;
                                        &lt;span class=&quot;co1&quot;&gt;// функцией&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co2&quot;&gt;#define OS_BSEMS                1       // Резервируем память под 1 бинарный семафор&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;kw2&quot;&gt;enum&lt;/span&gt; ENUM_BSEMS &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;                       &lt;span class=&quot;co1&quot;&gt;// Задаем иденфикационные намера бинарным семафорам&lt;/span&gt;
    BS_INDICATE
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&amp;nbsp;
&lt;span class=&quot;co2&quot;&gt;#endif&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;остальные_функции&quot; id=&quot;остальные_функции&quot;&gt;Остальные функции&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;

У нас осталось две неописанных функции: init() - инициализация периферии, и wdt_work() - сброс WDT 
при условии нормальной работы. Здесь мы не будем останавливаться на подробностях этих 
функций, а текст этих функций с комментариями см. в исходниках программы.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Проект&quot; [25388-29443] --&gt;
&lt;h2&gt;&lt;a name=&quot;резюме&quot; id=&quot;резюме&quot;&gt;Резюме&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Резюме&quot; [29444-29469] --&gt;
&lt;h3&gt;&lt;a name=&quot;что_мы_получили&quot; id=&quot;что_мы_получили&quot;&gt;Что мы получили&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

В результате меньше, чем за час работы, мы получили простую наглядную программу, разбитую на 
функционально независимые куски - задачи. Кроме того, такие задачи как Task_Buttons или Task_Sound 
можно смело переносить в другие программы. 
&lt;/p&gt;

&lt;p&gt;
Если в дальнейшем будут какие-то глобальные схематические изменения (например, вместо 
7-сегментного индикатора будет использоваться ЖК-индикатор; или вместо простых кнопок 
будет использоваться матричная клавиатура; или будет использован пьезодинамик со встроенным 
генератором), то все, что потребуется - это изменение одной отдельной задачи. При этом нам не 
нужно будет думать о том, как поведут себя остальные задачи. Мы определились с форматом связи 
между задачами и все, о чем нам нужно помнить при переписывании какой-либо задачи, - это 
соблюдение формата и типа входных и выходных данных. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Что мы получили&quot; [29470-31015] --&gt;
&lt;h3&gt;&lt;a name=&quot;можно_ли_было_обойтись_без_rtos&quot; id=&quot;можно_ли_было_обойтись_без_rtos&quot;&gt;Можно ли было обойтись без RTOS?&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Можно ли было обойтись без RTOS?&quot; [31016-] --&gt;</description>
    </item>
</rdf:RDF>
