<?xml version="1.0" encoding="utf-8"?>
<!-- generator="FeedCreator 1.7.2-ppt DokuWiki" -->
<?xml-stylesheet href="http://wiki.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://wiki.pic24.ru/feed.php">
        <title>PIC24 tnkernel:ref:sys</title>
        <description></description>
        <link>http://wiki.pic24.ru/</link>
        <image rdf:resource="http://wiki.pic24.ru/lib/images/favicon.ico" />
       <dc:date>2023-02-10T22:30:15+03:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/intro?rev=1216590580"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_start_system?rev=1208777889"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_context_get?rev=1213956093"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_enter_critical?rev=1208808218"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_exit_critical?rev=1208808367"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_time_get?rev=1208808953"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_time_set?rev=1208808904"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_tslice_ticks?rev=1216587279"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_tick_int_processing?rev=1241385614"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="http://wiki.pic24.ru/lib/images/favicon.ico">
        <title>PIC24</title>
        <link>http://wiki.pic24.ru/</link>
        <url>http://wiki.pic24.ru/lib/images/favicon.ico</url>
    </image>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/intro?rev=1216590580">
        <dc:format>text/html</dc:format>
        <dc:date>2008-07-21T01:49:40+03:00</dc:date>
        <title>TNKernel : Системные сервисы</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/intro?rev=1216590580</link>
        <description>


&lt;h1&gt;&lt;a name=&quot;tnkernel_системные_сервисы&quot; id=&quot;tnkernel_системные_сервисы&quot;&gt;TNKernel : Системные сервисы&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;TNKernel : Системные сервисы&quot; [2-61] --&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, они позволяют управлять системой в целом или получать текущие параметры системы. К системным сервисам относятся функция запуска &lt;code&gt;tn_start_system()&lt;/code&gt;, функция управления карусельным планированием &lt;code&gt;tn_sys_tslice_ticks()&lt;/code&gt;, функция обработчика системного таймера &lt;code&gt;tn_tick_int_processing()&lt;/code&gt;, функции реализации критической секции &lt;code&gt;tn_sys_enter_critical()&lt;/code&gt; и &lt;code&gt;tn_sys_exit_critical()&lt;/code&gt;, функции обслуживания системного времени &lt;code&gt;tn_sys_time_set()&lt;/code&gt; и &lt;code&gt;tn_sys_time_get()&lt;/code&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://wiki.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; [62-955] --&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;code&gt;tn_start_system()&lt;/code&gt; обеспечивает инициализацию всех внутренних структур RTOS, создание двух &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/task/intro#системные_задачи&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:task:intro&quot;&gt;системных задач&lt;/a&gt; и первое переключение контекста на системную задачу таймера. Фукция &lt;code&gt;tn_start_system()&lt;/code&gt; вызывается только один раз и является функцией без возврата.
&lt;/p&gt;

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

&lt;p&gt;
Диаграма запуска TNKernel изображена на рисунке:
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/sys/tn_startup_diagram.png?id=tnkernel%3Aref%3Asys%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:sys:tn_startup_diagram.png&quot;&gt;&lt;img src=&quot;http://wiki.pic24.ru/lib/exe/fetch.php/tnkernel/ref/sys/tn_startup_diagram.png&quot; class=&quot;mediacenter&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Сервис запуска &lt;code&gt;tn_start_system()&lt;/code&gt; как правило вызывается из функции &lt;code&gt;main()&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;p&gt;&lt;div class=&quot;notewarning&quot;&gt;
Системные прерывания должны быть запрещены до момента вызова &lt;code&gt;tn_start_system()&lt;/code&gt;.

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

&lt;p&gt;
Функция &lt;code&gt;tn_start_system()&lt;/code&gt; создает две системные задачи &lt;code&gt;tn_idle_task()&lt;/code&gt; и &lt;code&gt;tn_timer_task()&lt;/code&gt; и запускает задачу &lt;code&gt;tn_timer_task()&lt;/code&gt;, которая при старте последовательно вызывает две callback-функции - &lt;code&gt;appl_init_callback()&lt;/code&gt; и &lt;code&gt;cpu_interrupt_enbl_callback()&lt;/code&gt;. Указатели на эти функции передаются в систему в вызове &lt;code&gt;tn_start_system()&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
Функция &lt;code&gt;appl_init_callback()&lt;/code&gt; служит для инициализации системного таймера, периферийных модулей, создания необходимых задач. В функции &lt;code&gt;cpu_interrupt_enbl_callback()&lt;/code&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://wiki.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; [956-3368] --&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;системным таймером&lt;/strong&gt;. Как правило, период таймера постоянен на всем протяжении работы и это период называется &lt;strong&gt;системным тиком&lt;/strong&gt;. Системный тик - это минимальная единица времени доступная планировщику. Все времена, таймауты указываются именно в системных тиках а не в абсолютных единицах времени.
&lt;/p&gt;

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

&lt;p&gt;
&lt;p&gt;&lt;div class=&quot;notewarning&quot;&gt;
Функция &lt;code&gt;tn_tick_int_processing()&lt;/code&gt; должна вызываться только в обработчике прерывания.

&lt;/div&gt;&lt;/p&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://wiki.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; [3369-4894] --&gt;
&lt;h2&gt;&lt;a name=&quot;управление_round-robin&quot; id=&quot;управление_round-robin&quot;&gt;Управление Round-Robin&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

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

&lt;p&gt;
В TNKernel включен сервис &lt;code&gt;tn_sys_tslice_ticks()&lt;/code&gt;, позволяющий настраивать длительность кванта выполнения для каждого приоритета или отключать карусельное планирование.
&lt;/p&gt;

&lt;p&gt;
&lt;p&gt;&lt;div class=&quot;noteclassic&quot;&gt;
Карусельное планирование отключено по умолчанию для всех приоритетов.

&lt;/div&gt;&lt;/p&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://wiki.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;Управление Round-Robin&quot; [4895-5969] --&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;em&gt;Критическая секция&lt;/em&gt; это часть задачи, в которой осуществляется доступ к разделяемому ресурсу. Если один и тот же ресурс (например, глобальную переменную) используют две или более задач, критические секции называют конкурирующими. В этом случае необходимо защитить критическую секцию таким образом, чтобы доступ к ресурсу являлся атомарным. 
&lt;/p&gt;

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

&lt;p&gt;
В TNKernel для PIC24/dsPIC переключение контекста запрещает функция &lt;code&gt;tn_sys_enter_critical()&lt;/code&gt;  и разрешает  функция &lt;code&gt;tn_sys_exit_critical()&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
Вызов функций &lt;code&gt;tn_sys_enter_critical()&lt;/code&gt; и &lt;code&gt;tn_sys_exit_critical()&lt;/code&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; foo &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;
    tn_sys_enter_critical&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;coMULTI&quot;&gt;/* ... */&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; TN_TASK task_1 &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;sy2&quot;&gt;*&lt;/span&gt;param&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;coMULTI&quot;&gt;/* ... */&lt;/span&gt;
&amp;nbsp;
        tn_sys_enter_critical&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        foo&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        tn_sys_exit_critical&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;
        &lt;span class=&quot;coMULTI&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;p&gt;
Однако рекомендуется использовать симметричный вызов функций запрещения и разрешения планирования, так как обратное может привести к логическим ошибкам.
&lt;/p&gt;

&lt;p&gt;
Запрещение переключения контекста не приветствуется, это является вмешательством в работу планировщика. Однако функции &lt;code&gt;tn_sys_enter_critical()&lt;/code&gt; и &lt;code&gt;tn_sys_exit_critical()&lt;/code&gt; могут быть полезны для выполнения относительно быстрых операций, для которых использование мютекса слишком избыточно. Примером такой операции может служить &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/faq#разделяемые_ресурсы&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:faq&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://wiki.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; [5970-8791] --&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;code&gt;tn_sys_time_get()&lt;/code&gt; и установлено с помощью вызова &lt;code&gt;tn_sys_time_set()&lt;/code&gt;. 
&lt;/p&gt;

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

&lt;p&gt;
Допустим в системе присутствует задача, период &amp;quot;вызова&amp;quot; которой должен быть строго постоянным. Обычно такое поведение реализуется следующим образом.
&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; TN_TASK task_1 &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;sy2&quot;&gt;*&lt;/span&gt;param&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;
        foo&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        tn_task_sleep&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;FOO_PERIOD&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;p&gt;
Возможна ситуация, когда длительность выполнения функции &lt;code&gt;foo()&lt;/code&gt; может превышать системный тик - в этом случае периодичность нарушается. Способов решения такой проблемы несколько - например, дополнительная задача, освобождающая семафор с фиксированным периодом или использование объекта типа &amp;quot;таймер&amp;quot;. Однако первое ведет к дополнительной трате ресурсов, а второе в TNKernel пока не реализовано.
&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;void&lt;/span&gt; TN_TASK task_1 &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;sy2&quot;&gt;*&lt;/span&gt;param&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    TN_SYS_TIM_T t;
&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;
        t &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; tn_sys_time_get&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        foo&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        t &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; tn_sys_time_get&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;sy2&quot;&gt;-&lt;/span&gt; t;
&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;t &lt;span class=&quot;sy1&quot;&gt;&amp;lt;&lt;/span&gt; FOO_PERIOD&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
            tn_task_sleep&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;FOO_PERIOD &lt;span class=&quot;sy2&quot;&gt;-&lt;/span&gt; t&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span class=&quot;kw1&quot;&gt;else&lt;/span&gt;
            tn_task_sleep&lt;span class=&quot;br0&quot;&gt;&amp;#40;&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;#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://wiki.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; [8792-11135] --&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;

TNKernel имеет следующий набор системных сервисов:

&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&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&quot;&gt;   &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_start_system&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:tn_start_system&quot;&gt;tn_start_system()&lt;/a&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&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&quot;&gt;   &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_tick_int_processing&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:tn_tick_int_processing&quot;&gt;tn_tick_int_processing()&lt;/a&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://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_int.png?id=tnkernel%3Aref%3Asys%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_int.png&quot;&gt;&lt;img src=&quot;http://wiki.pic24.ru/lib/exe/fetch.php/tnkernel/ref/attr_call_int.png&quot; class=&quot;media&quot; title=&quot;Разрешен вызов только в прерывании&quot; alt=&quot;Разрешен вызов только в прерывании&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_ct_sw.png?id=tnkernel%3Aref%3Asys%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_ct_sw.png&quot;&gt;&lt;img src=&quot;http://wiki.pic24.ru/lib/exe/fetch.php/tnkernel/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;row4&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;   &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_tslice_ticks&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:tn_sys_tslice_ticks&quot;&gt;tn_sys_tslice_ticks()&lt;/a&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Управление round-robin планированием &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; &lt;a href=&quot;http://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task.png?id=tnkernel%3Aref%3Asys%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_task.png&quot;&gt;&lt;img src=&quot;http://wiki.pic24.ru/lib/exe/fetch.php/tnkernel/ref/attr_call_task.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&quot;&gt;   &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_context_get&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:tn_sys_context_get&quot;&gt;tn_sys_context_get()&lt;/a&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://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task_and_int.png?id=tnkernel%3Aref%3Asys%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_task_and_int.png&quot;&gt;&lt;img src=&quot;http://wiki.pic24.ru/lib/exe/fetch.php/tnkernel/ref/attr_call_task_and_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;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&quot;&gt;   &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_enter_critical&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:tn_sys_enter_critical&quot;&gt;tn_sys_enter_critical()&lt;/a&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://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task.png?id=tnkernel%3Aref%3Asys%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_task.png&quot;&gt;&lt;img src=&quot;http://wiki.pic24.ru/lib/exe/fetch.php/tnkernel/ref/attr_call_task.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;&gt;   &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_exit_critical&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:tn_sys_exit_critical&quot;&gt;tn_sys_exit_critical()&lt;/a&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://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task.png?id=tnkernel%3Aref%3Asys%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_task.png&quot;&gt;&lt;img src=&quot;http://wiki.pic24.ru/lib/exe/fetch.php/tnkernel/ref/attr_call_task.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&quot; colspan=&quot;3&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&quot;&gt;   &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_time_get&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:tn_sys_time_get&quot;&gt;tn_sys_time_get()&lt;/a&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://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task_and_int.png?id=tnkernel%3Aref%3Asys%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_task_and_int.png&quot;&gt;&lt;img src=&quot;http://wiki.pic24.ru/lib/exe/fetch.php/tnkernel/ref/attr_call_task_and_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;row11&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;   &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_time_set&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:tn_sys_time_set&quot;&gt;tn_sys_time_set()&lt;/a&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://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task_and_int.png?id=tnkernel%3Aref%3Asys%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_task_and_int.png&quot;&gt;&lt;img src=&quot;http://wiki.pic24.ru/lib/exe/fetch.php/tnkernel/ref/attr_call_task_and_int.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://wiki.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; [11136-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_start_system?rev=1208777889">
        <dc:format>text/html</dc:format>
        <dc:date>2008-04-21T15:38:09+03:00</dc:date>
        <title>tn_start_system()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_start_system?rev=1208777889</link>
        <description>


&lt;h2&gt;&lt;a name=&quot;tn_start_system&quot; id=&quot;tn_start_system&quot;&gt;tn_start_system()&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Функция предназначена для запуска системы. В функции создаются две системные задачи - задача таймера (timer) и задача простоя (idle), затем производится переключение контекста на задачу таймера. Возврат из функции не производится.
&lt;/p&gt;

&lt;p&gt;
&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;kw4&quot;&gt;void&lt;/span&gt; tn_start_system &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_UWORD &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;timer_task_stack,
                      TN_UWORD timer_task_stack_size,
                      TN_UWORD &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;idle_task_stack,
                      TN_UWORD idle_task_stack_size,
                      &lt;span class=&quot;kw4&quot;&gt;void&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;app_in_cb&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;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;,
                      &lt;span class=&quot;kw4&quot;&gt;void&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;cpu_int_en&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;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;,
                      &lt;span class=&quot;kw4&quot;&gt;void&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;idle_user_cb&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;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;#41;&lt;/span&gt;;&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Разрешен вызов:&lt;/strong&gt; &lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
Один раз в функции &lt;code&gt;main()&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Параметры функции:&lt;/strong&gt;
&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;timer_task_stack&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;указатель на стек задачи системного таймера&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;timer_task_stack_size&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;размер стека задачи системного таймера&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;idle_task_stack&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;указатель на стек системной задачи простоя&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;idle_task_stack_size&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;размер стека системной задачи простоя&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;app_in_cb&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;указатель на функцию инициализации приложения. Функция вызывается один раз при старте системы&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;cpu_int_en&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;указатель на функцию конфигурации и разрешения прерываний. Функция вызывается один раз при старте системы после вызова функции &lt;code&gt;app_in_cb&lt;/code&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;idle_user_cb&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;указатель на функцию, которая периодически вызывается из системной задачи простоя  &lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;&lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Возвращаемые значения:&lt;/strong&gt;  
&lt;/p&gt;

&lt;p&gt;
нет
&lt;/p&gt;

&lt;p&gt;
&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;co2&quot;&gt;#define TMR_TASK_STACK_SIZE   128&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define IDL_TASK_STACK_SIZE    64&lt;/span&gt;
&amp;nbsp;
TN_UWORD stk_tmr_task&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;TMR_TASK_STACK_SIZE&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;;
TN_UWORD stk_idl_task&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;IDL_TASK_STACK_SIZE&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; Appl_Init &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;coMULTI&quot;&gt;/* инициализация приложения */&lt;/span&gt;
    &lt;span class=&quot;coMULTI&quot;&gt;/* инициализация системного таймера */&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;kw4&quot;&gt;void&lt;/span&gt; Int_Init &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;coMULTI&quot;&gt;/* разрешение прерывания от системного таймера */&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;kw4&quot;&gt;void&lt;/span&gt; IDLE_func &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;coMULTI&quot;&gt;/* */&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;int&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;
    tn_start_system &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;stk_tmr_task,
                     TMR_TASK_STACK_SIZE,
                     stk_idl_task,
                     IDL_TASK_STACK_SIZE,
                     Appl_Init,
                     Int_Init,
                     IDLE_func
                    &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; &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;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&lt;br/&gt;
 

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

&lt;p&gt;

&lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/intro#системные_сервисы&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_start_system()&quot; [11-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_context_get?rev=1213956093">
        <dc:format>text/html</dc:format>
        <dc:date>2008-06-20T14:01:33+03:00</dc:date>
        <title>tn_sys_context_get()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_context_get?rev=1213956093</link>
        <description>


&lt;h2&gt;&lt;a name=&quot;tn_sys_context_get&quot; id=&quot;tn_sys_context_get&quot;&gt;tn_sys_context_get()&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Функция возвращает текущий контекст системы. Сервис можно использовать для проверки текущего контекста в функции, которая может вызываться как из контекста задачи, так и из пользовательского прерывания.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Вызов:&lt;/strong&gt;

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;TN_CONTEXT tn_sys_context_get &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;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Разрешен вызов:&lt;/strong&gt; &lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
В контексте задачи, в прерывании, в пользовательской критической секции
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Параметры функции:&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
нет
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Возвращаемые значения:&lt;/strong&gt;  
&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;TN_CONTEXT_TASK&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;Контекст задачи&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;TN_CONTEXT_SYS_INT&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;Системное прерывание&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;TN_CONTEXT_CRITICAL&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;Пользовательская критическая секция&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;&lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
&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;kw4&quot;&gt;void&lt;/span&gt; foo &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;
    TN_CONTEXT context;
&amp;nbsp;
    context &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; tn_sys_context_get&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;context &lt;span class=&quot;sy1&quot;&gt;==&lt;/span&gt; TN_CONTEXT_TASK&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        tn_sem_signal&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;sem&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;kw1&quot;&gt;else&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;context &lt;span class=&quot;sy1&quot;&gt;==&lt;/span&gt; TN_CONTEXT_SYS_INT&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        tn_sem_isignal&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;sem&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;p&gt;
&lt;br/&gt;
 

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

&lt;p&gt;

&lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/intro#системные_сервисы&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_sys_context_get()&quot; [11-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_enter_critical?rev=1208808218">
        <dc:format>text/html</dc:format>
        <dc:date>2008-04-22T00:03:38+03:00</dc:date>
        <title>tn_sys_enter_critical()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_enter_critical?rev=1208808218</link>
        <description>


&lt;h2&gt;&lt;a name=&quot;tn_sys_enter_critical&quot; id=&quot;tn_sys_enter_critical&quot;&gt;tn_sys_enter_critical()&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Вызов функции запрещает переключение контекста (в том числе и системные прерывания) до тех пор, пока не будет вызвана парная функция &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_exit_critical&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:tn_sys_exit_critical&quot;&gt;tn_sys_exit_critical()&lt;/a&gt;. 
&lt;/p&gt;

&lt;p&gt;
&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;kw4&quot;&gt;void&lt;/span&gt; tn_sys_enter_critical &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;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Разрешен вызов:&lt;/strong&gt; &lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
В контексте задачи
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Параметры функции:&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
нет
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Возвращаемые значения:&lt;/strong&gt;  
&lt;/p&gt;

&lt;p&gt;
нет
&lt;/p&gt;

&lt;p&gt;
&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;kw4&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;long&lt;/span&gt; Global_Variable;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; TN_TASK Task_1 &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;sy2&quot;&gt;*&lt;/span&gt;param&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;
        tn_sys_enter_critical&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        Global_Variable &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1255456&lt;/span&gt;;
        tn_sys_exit_critical&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;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; TN_TASK Task_2 &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;sy2&quot;&gt;*&lt;/span&gt;param&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;long&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;long&lt;/span&gt; tmp;
&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;
        tn_sem_acquire&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;sem_rc, TN_WAIT_INFINITE&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
        tn_sys_enter_critical&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        tmp &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; Global_Variable;
        tn_sys_exit_critical&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;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;tmp&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
            tn_sem_signal&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;sem_tr&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;p&gt;
&lt;br/&gt;
 

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

&lt;p&gt;

&lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/intro#системные_сервисы&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_sys_enter_critical()&quot; [11-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_exit_critical?rev=1208808367">
        <dc:format>text/html</dc:format>
        <dc:date>2008-04-22T00:06:07+03:00</dc:date>
        <title>tn_sys_exit_critical()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_exit_critical?rev=1208808367</link>
        <description>


&lt;h2&gt;&lt;a name=&quot;tn_sys_exit_critical&quot; id=&quot;tn_sys_exit_critical&quot;&gt;tn_sys_exit_critical()&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Вызов функции разрешает переключение контекста и системные прерывания после вызова парной функции &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_enter_critical&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:tn_sys_enter_critical&quot;&gt;tn_sys_enter_critical()&lt;/a&gt;. 
&lt;/p&gt;

&lt;p&gt;
&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;kw4&quot;&gt;void&lt;/span&gt; tn_sys_exit_critical &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;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Разрешен вызов:&lt;/strong&gt; &lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
В контексте задачи
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Параметры функции:&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
нет
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Возвращаемые значения:&lt;/strong&gt;  
&lt;/p&gt;

&lt;p&gt;
нет
&lt;/p&gt;

&lt;p&gt;
&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;kw4&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;long&lt;/span&gt; Global_Variable;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; TN_TASK Task_1 &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;sy2&quot;&gt;*&lt;/span&gt;param&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;
        tn_sys_enter_critical&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        Global_Variable &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1255456&lt;/span&gt;;
        tn_sys_exit_critical&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;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; TN_TASK Task_2 &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;sy2&quot;&gt;*&lt;/span&gt;param&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;long&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;long&lt;/span&gt; tmp;
&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;
        tn_sem_acquire&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;sem_rc, TN_WAIT_INFINITE&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
        tn_sys_enter_critical&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        tmp &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; Global_Variable;
        tn_sys_exit_critical&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;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;tmp&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
            tn_sem_signal&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;sem_tr&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;p&gt;
&lt;br/&gt;
 

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

&lt;p&gt;

&lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/intro#системные_сервисы&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_sys_exit_critical()&quot; [11-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_time_get?rev=1208808953">
        <dc:format>text/html</dc:format>
        <dc:date>2008-04-22T00:15:53+03:00</dc:date>
        <title>tn_sys_time_get()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_time_get?rev=1208808953</link>
        <description>




&lt;h2&gt;&lt;a name=&quot;tn_sys_time_get&quot; id=&quot;tn_sys_time_get&quot;&gt;tn_sys_time_get()&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Функция возвращает значение системных часов - 32-битной беззнаковой переменной, инкрементируемой каждый системный тик.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Вызов:&lt;/strong&gt;

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;TN_SYS_TIM_T tn_sys_time_get &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;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Разрешен вызов:&lt;/strong&gt; &lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
В контексте задачи, в системном прерывании
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Параметры функции:&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
нет
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Возвращаемые значения:&lt;/strong&gt;  
&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;TN_SYS_TIM_T&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;значение системных часов в системных тиках  &lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;&lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
&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;kw4&quot;&gt;void&lt;/span&gt; TN_TASK Task &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;sy2&quot;&gt;*&lt;/span&gt;param&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    TN_SYS_TIM_T sys_time;
&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;
        sys_time &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; tn_sys_time_get&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        foo&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        sys_time &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; tn_sys_time_get&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;sy2&quot;&gt;-&lt;/span&gt; sys_time;
&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;sys_time &lt;span class=&quot;sy1&quot;&gt;&amp;lt;&lt;/span&gt; TASK_CALL_PERIOD&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
            tn_task_sleep&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TASK_CALL_PERIOD &lt;span class=&quot;sy2&quot;&gt;-&lt;/span&gt; sys_time&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span class=&quot;kw1&quot;&gt;else&lt;/span&gt;
            tn_task_sleep&lt;span class=&quot;br0&quot;&gt;&amp;#40;&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;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&lt;br/&gt;
 

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

&lt;p&gt;

&lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/intro#системные_сервисы&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_sys_time_get()&quot; [13-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_time_set?rev=1208808904">
        <dc:format>text/html</dc:format>
        <dc:date>2008-04-22T00:15:04+03:00</dc:date>
        <title>tn_sys_time_set()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_time_set?rev=1208808904</link>
        <description>




&lt;h2&gt;&lt;a name=&quot;tn_sys_time_set&quot; id=&quot;tn_sys_time_set&quot;&gt;tn_sys_time_set()&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Функция устанавливает системные часы - 32-битной беззнаковую переменную, инкрементируемую каждый системный тик.
&lt;/p&gt;

&lt;p&gt;
&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;kw4&quot;&gt;void&lt;/span&gt; tn_sys_time_get &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_SYS_TIM_T value&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Разрешен вызов:&lt;/strong&gt; &lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
В контексте задачи, в системном прерывании
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Параметры функции:&lt;/strong&gt;
&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;value&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;величина присваиваемая системным часам (в системных тиках) &lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;&lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Возвращаемые значения:&lt;/strong&gt;  
&lt;/p&gt;

&lt;p&gt;
нет
&lt;/p&gt;

&lt;p&gt;
&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;kw4&quot;&gt;void&lt;/span&gt; TN_TASK Task &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;sy2&quot;&gt;*&lt;/span&gt;param&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    TN_SYS_TIM_T sys_time;
&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;
        tn_sys_time_set&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;;
        foo&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        sys_time &lt;span class=&quot;sy1&quot;&gt;=&lt;/span&gt; tn_sys_time_get&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;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;sys_time &lt;span class=&quot;sy1&quot;&gt;&amp;lt;&lt;/span&gt; TASK_CALL_PERIOD&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
            tn_task_sleep&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TASK_CALL_PERIOD &lt;span class=&quot;sy2&quot;&gt;-&lt;/span&gt; sys_time&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span class=&quot;kw1&quot;&gt;else&lt;/span&gt;
            tn_task_sleep&lt;span class=&quot;br0&quot;&gt;&amp;#40;&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;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&lt;br/&gt;
 

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

&lt;p&gt;

&lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/intro#системные_сервисы&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_sys_time_set()&quot; [12-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_tslice_ticks?rev=1216587279">
        <dc:format>text/html</dc:format>
        <dc:date>2008-07-21T00:54:39+03:00</dc:date>
        <title>tn_sys_tslice_ticks()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_sys_tslice_ticks?rev=1216587279</link>
        <description>




&lt;h2&gt;&lt;a name=&quot;tn_sys_tslice_ticks&quot; id=&quot;tn_sys_tslice_ticks&quot;&gt;tn_sys_tslice_ticks()&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Функция устанавливает период переключения задач по карусельному методу (round-robin) для выбранного приоритета. Возможна установка индивидуального периода переключения для каждого приоритета.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Вызов:&lt;/strong&gt;

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;TN_RETVAL tn_sys_tslice_ticks &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_UWORD priority, TN_UWORD value&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Разрешен вызов:&lt;/strong&gt; &lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
В контексте задачи
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Параметры функции:&lt;/strong&gt;
&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;priority&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;приоритет задач для которого устанавливается период переключения по методу round-robin. &lt;code&gt;priority&lt;/code&gt; ⊆ [1 … (&lt;code&gt;TN_NUM_PRIORITY&lt;/code&gt; - 2)]&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;value&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;величина кванта времени, выделяемого каждой задаче (период переключения) в системных тиках. &lt;code&gt;value&lt;/code&gt; ⊆ [&lt;code&gt;NO_TIME_SLICE&lt;/code&gt; … &lt;code&gt;MAX_TIME_SLICE&lt;/code&gt;], где &lt;code&gt;NO_TIME_SLICE&lt;/code&gt; = 0, а &lt;code&gt;MAX_TIME_SLICE&lt;/code&gt; = (&lt;code&gt;UINT_MAX&lt;/code&gt; - 1). Если &lt;code&gt;value&lt;/code&gt; = &lt;code&gt;NO_TIME_SLICE&lt;/code&gt;, карусельное планирование для задач с приоритетом &lt;code&gt;priority&lt;/code&gt; не осуществляется.  &lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;&lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Возвращаемые значения:&lt;/strong&gt;  
&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;TERR_WRONG_PARAM&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;некорректное значение параметра &lt;sup&gt;&lt;a href=&quot;#fn__1&quot; name=&quot;fnt__1&quot; id=&quot;fnt__1&quot; class=&quot;fn_top&quot;&gt;1)&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;TERR_WCONTEXT&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;попытка вызова функции в прерывании или в пользовательской критической секции&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;TERR_NO_ERR&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;успешное выполнение  &lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;&lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
&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;coMULTI&quot;&gt;/* установка round-robin кванта равного 10 системных тиков
   для задач с приоритетом равным 10
*/&lt;/span&gt;
tn_sys_tslice_ticks&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;nu0&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
&lt;span class=&quot;coMULTI&quot;&gt;/* запрещение карусельного планирования для задач с
   приоритетом равным 10
*/&lt;/span&gt;
tn_sys_tslice_ticks&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;10&lt;/span&gt;, NO_TIME_SLICE&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;
&lt;p&gt;
&lt;br/&gt;
 

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

&lt;p&gt;

&lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/intro#системные_сервисы&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_sys_tslice_ticks()&quot; [12-] --&gt;&lt;div class=&quot;footnotes&quot;&gt;
&lt;div class=&quot;fn&quot;&gt;&lt;sup&gt;&lt;a href=&quot;#fnt__1&quot; id=&quot;fn__1&quot; name=&quot;fn__1&quot; class=&quot;fn_bot&quot;&gt;1)&lt;/a&gt;&lt;/sup&gt; 
данный код возврата возможен только в случае использования сервисов с проверкой параметров&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_tick_int_processing?rev=1241385614">
        <dc:format>text/html</dc:format>
        <dc:date>2009-05-04T01:20:14+03:00</dc:date>
        <title>tn_tick_int_processing()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/tn_tick_int_processing?rev=1241385614</link>
        <description>


&lt;h2&gt;&lt;a name=&quot;tn_tick_int_processing&quot; id=&quot;tn_tick_int_processing&quot;&gt;tn_tick_int_processing()&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

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

&lt;p&gt;
&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;kw4&quot;&gt;void&lt;/span&gt; tn_tick_int_processing &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;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Разрешен вызов:&lt;/strong&gt; &lt;br/&gt;
 
&lt;/p&gt;

&lt;p&gt;
В прерывании
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Параметры функции:&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
нет
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Возвращаемые значения:&lt;/strong&gt;  
&lt;/p&gt;

&lt;p&gt;
нет
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Пример вызова:&lt;/strong&gt;  

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;tn_sys_interrupt &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;_T2Interrupt&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;        &lt;span class=&quot;coMULTI&quot;&gt;/* прерывание от таймера TMR2 */&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    IFS0bits.&lt;span class=&quot;me1&quot;&gt;T2IF&lt;/span&gt; &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;coMULTI&quot;&gt;/* сброс флага прерывания */&lt;/span&gt;
    tn_tick_int_processing&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;br/&gt;
 

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

&lt;p&gt;

&lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sys/intro#системные_сервисы&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sys:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_tick_int_processing()&quot; [11-] --&gt;</description>
    </item>
</rdf:RDF>
