<?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 tnkernel:ref:mutex</title>
        <description></description>
        <link>http://www.pic24.ru/</link>
        <image rdf:resource="http://www.pic24.ru/lib/images/favicon.ico" />
       <dc:date>2023-02-10T09:52:29+03:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/tnkernel/ref/mutex/intro?rev=1216590098"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_create?rev=1213883275"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_delete?rev=1213883961"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_lock?rev=1213885585"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_lock_polling?rev=1213885789"/>
                <rdf:li rdf:resource="http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_unlock?rev=1213886370"/>
            </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/tnkernel/ref/mutex/intro?rev=1216590098">
        <dc:format>text/html</dc:format>
        <dc:date>2008-07-21T01:41:38+03:00</dc:date>
        <title>TNKernel : Мютексы</title>
        <link>http://www.pic24.ru/doku.php/tnkernel/ref/mutex/intro?rev=1216590098</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; [1-42] --&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; - это объект RTOS, предназначенный для обеспечения конкурентного доступа к общим ресурсам. Мютекс представляет собой двоичный &lt;a href=&quot;http://www.pic24.ru/doku.php/tnkernel/ref/sem/intro&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sem:intro&quot;&gt;семафор&lt;/a&gt; с дополнительными свойствами (например, протоколы обхода неограниченной инверсии приоритетов).
&lt;/p&gt;

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

&lt;p&gt;
Часто возникает вопрос - а зачем вообще нужно блокировать ресурсы? Все дело в принципе работы вытесняющих RTOS - задача может быть прервана (вытеснена) в любой момент времени. Если в этот момент она использует некий системный ресурс (например, UART), а задача, которая вытеснила текущую так же начнет с ним работать - возникнет закономерный конфликт.
&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; [43-1917] --&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/tnkernel/ref/mutex/mutex_pr_inv_1.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:mutex:mutex_pr_inv_1.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/tnkernel/ref/mutex/mutex_pr_inv_1.png&quot; class=&quot;mediacenter&quot; title=&quot; Инверсия приоритетов &quot; alt=&quot; Инверсия приоритетов &quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Допустим в системе существуют две задачи с низким (А) и высоким (Б) приоритетом. В момент времени T1 задача (А) блокирует ресурс и начинает его обслуживать. В момент времени T2 задача (Б) вытесняет низкоприоритетную задачу (А) и  пытается завладеть ресурсом в момент времени T3. Но так как ресурс заблокирован, задача (Б) переводится в ожидание, а задача (А) продолжает выполнение. В момент времени Т4 задача (А) завершает обслуживание ресурса и разблокирует его. Так как ресурс ожидает задача (Б), она тут же начинает выполнение.
&lt;/p&gt;

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

&lt;p&gt;
Но это еще не самое страшное. Допустим в системе работают три задачи: низкоприоритетная (А), со средними приоритетом (Б) и высокоприоритетная (В):
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/mutex/mutex_pr_inv_2.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:mutex:mutex_pr_inv_2.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/tnkernel/ref/mutex/mutex_pr_inv_2.png&quot; class=&quot;mediacenter&quot; title=&quot; Неограниченная инверсия приоритетов &quot; alt=&quot; Неограниченная инверсия приоритетов &quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Если ресурс заблокирован задачей (А), а он требуется задаче (В), то наблюдается та же ситуация - высокоприоритетная задача блокируется. Но допустим, что задача (Б) вытеснила (А), после того как (В) ушла в ожидание ресурса. Задача (Б) ничего не знает о конфликте, поэтому может выполняться сколь угодно долго на промежутке времени (T5-T4). Кроме того, кроме (Б) в системе могут быть и другие задачи, с приоритетами больше (А), но меньше (Б). Поэтому длительность периода (T6-T3) в общем случае неопределена. Такую ситуацию называют &lt;strong&gt;неограниченной инверсией приоритетов&lt;/strong&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; Протокол наследования приоритета (Priority inheritance protocol)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Протокол увеличения приоритета (Priority ceiling protocol)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Инверсия приоритетов&quot; [1918-5665] --&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;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/mutex/mutex_pr_inv_3.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:mutex:mutex_pr_inv_3.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/tnkernel/ref/mutex/mutex_pr_inv_3.png&quot; class=&quot;mediacenter&quot; title=&quot; Протокол наследования приоритета &quot; alt=&quot; Протокол наследования приоритета &quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

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

&lt;p&gt;
Протокол наследования приоритета состоит в том, что приоритет задачи (А) повышается до приоритета задачи (Б) в момент времени T3, то есть когда (Б) пытается захватить заблокированный ресурс. Таким образом задачи с приоритетом больше (А) но меньше (Б) не могут реализовать неограниченную инверсию, и задача (Б) получит ресурс сразу после того как (А) его разблокирует.
&lt;/p&gt;

&lt;p&gt;
После того как задача (А) разблокирует ресурс, ее приоритет понижается до исходного.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Протокол наследования приоритета&quot; [5666-7056] --&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;потолок&lt;/strong&gt;).
&lt;/p&gt;

&lt;p&gt;
Допустим в системе существуют три задачи с низким (А), средним (Б) и высоким (В) приоритетом, которые могут заблокировать один ресурс:
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/mutex/mutex_pr_inv_4.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:mutex:mutex_pr_inv_4.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/tnkernel/ref/mutex/mutex_pr_inv_4.png&quot; class=&quot;mediacenter&quot; title=&quot; Протокол увеличения приоритета &quot; alt=&quot; Протокол увеличения приоритета &quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
В момент времени T3, когда задача (Б) пытается захватить заблокированный (А) ресурс, приоритет (А) &lt;em&gt;повышается&lt;/em&gt; до приоритета задачи (В), т.е. до максимального приоритета из всех задач, которые могут владеть ресурсом. Как только задача (А) освобождает ресурс в момент времени T4, ее приоритет понижается до исходного, а приоритет задачи (Б), ожидавшей ресурс повышается до (В).
&lt;/p&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://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; [7057-9322] --&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;

Взаимная блокировка - это аварийное состояние системы, которое может возникать при вложенности блокировок ресурсов. Допустим в системе существуют две задачи с низким (А) и высоким (Б) приоритетом, которые используют два ресурса - X и Y:
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/mutex/mutex_pr_inv_5.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:mutex:mutex_pr_inv_5.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/tnkernel/ref/mutex/mutex_pr_inv_5.png&quot; class=&quot;mediacenter&quot; title=&quot; Взаимная блокировка &quot; alt=&quot; Взаимная блокировка &quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
В момент времени T1 задача (А) блокирует ресурс X. Затем в момент времени T2 задачу (А) вытесняет более приоритетная задача (Б), которая в момент времени T3 блокирует ресурс Y. Если задача (Б) попытается заблокировать ресурс X (T4) не освободив ресурс Y, то она будет переведена в состояние ожидания, а выполнение задачи (А) будет продолжено. Если в момент времени T5 задача (А) попытается заблокировать ресурс Y, не освободив X, возникнет состояние взаимной блокировки - ни одна из задач (А) и (Б) не сможет получить управление.
&lt;/p&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://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; [9323-11267] --&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;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;typedef&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;struct&lt;/span&gt; _TN_MUTEX_S
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    CDLL_QUEUE_S        wait_queue;
    CDLL_QUEUE_S        mutex_queue;
    CDLL_QUEUE_S        lock_mutex_queue;
    TN_UWORD            attr;
&amp;nbsp;
    TN_TCB_S          &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt; holder;
    TN_UWORD            ceil_priority;
    TN_WORD             cnt;
    TN_OBJ_ID           id_mutex;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; TN_MUTEX_S;&lt;/pre&gt;
&lt;p&gt;
В состав структуры мютекса входят следующие элементы:

&lt;/p&gt;
&lt;table class = &quot;fpl&quot;&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;code&gt;wait_queue&lt;/code&gt;		&lt;/td&gt;
		&lt;td&gt;
 Очередь задач, ожидающих освобождение мютекса		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;code&gt;mutex_queue&lt;/code&gt;		&lt;/td&gt;
		&lt;td&gt;
 Элемент списка заблокированных задачей мютексов		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;code&gt;lock_mutex_queue&lt;/code&gt;		&lt;/td&gt;
		&lt;td&gt;
 Системная очередь заблокированных мютексов		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;code&gt;attr&lt;/code&gt;		&lt;/td&gt;
		&lt;td&gt;
 Атрибут (тип обхода инверсии приоритетов) мютекса		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;code&gt;holder&lt;/code&gt;		&lt;/td&gt;
		&lt;td&gt;
 Указатель на TCB задачи, блокирующей мютекс		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;code&gt;ceil_priority&lt;/code&gt;		&lt;/td&gt;
		&lt;td&gt;
 Максимальный приоритет из задач, которые могут использовать ресурс (требуется для протокола увеличения приоритета)		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;code&gt;cnt&lt;/code&gt;		&lt;/td&gt;
		&lt;td&gt;
 Зарезервировано		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;code&gt;id_mutex&lt;/code&gt;		&lt;/td&gt;
		&lt;td&gt;
 Поле идентификации объекта как мютекса		&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;

&lt;p&gt;&lt;div class=&quot;notewarning&quot;&gt;
Структура мютекса доступна только при определении &lt;code&gt;TN_DEBUG&lt;/code&gt;. Тем не менее, прямой доступ к элементам структуры мютекса крайне не рекомендуется, так как это является вмешательством в работу планировщика и других сервисов RTOS.

&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://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; [11268-14010] --&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://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_create&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:mutex:tn_mutex_create&quot;&gt;tn_mutex_create()&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://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task_and_int.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_task_and_int.png&quot;&gt;&lt;img src=&quot;http://www.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;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;   &lt;a href=&quot;http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_delete&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:mutex:tn_mutex_delete&quot;&gt;tn_mutex_delete()&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://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_task.png&quot;&gt;&lt;img src=&quot;http://www.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;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_ct_sw.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_ct_sw.png&quot;&gt;&lt;img src=&quot;http://www.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; colspan=&quot;3&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&quot;&gt;   &lt;a href=&quot;http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_lock&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:mutex:tn_mutex_lock&quot;&gt;tn_mutex_lock()&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://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_task.png&quot;&gt;&lt;img src=&quot;http://www.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;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_ct_sw.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_ct_sw.png&quot;&gt;&lt;img src=&quot;http://www.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;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_to.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://www.pic24.ru/lib/exe/fetch.php/tnkernel/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;&gt;   &lt;a href=&quot;http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_lock_polling&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:mutex:tn_mutex_lock_polling&quot;&gt;tn_mutex_lock_polling()&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://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_task.png&quot;&gt;&lt;img src=&quot;http://www.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;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_ct_sw.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_ct_sw.png&quot;&gt;&lt;img src=&quot;http://www.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;row7&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;row8&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;   &lt;a href=&quot;http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_unlock&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:mutex:tn_mutex_unlock&quot;&gt;tn_mutex_unlock()&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://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_task.png&quot;&gt;&lt;img src=&quot;http://www.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;a href=&quot;http://www.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_ct_sw.png?id=tnkernel%3Aref%3Amutex%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_ct_sw.png&quot;&gt;&lt;img src=&quot;http://www.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;/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; [14011-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_create?rev=1213883275">
        <dc:format>text/html</dc:format>
        <dc:date>2008-06-19T17:47:55+03:00</dc:date>
        <title>tn_mutex_create()</title>
        <link>http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_create?rev=1213883275</link>
        <description>




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

&lt;p&gt;

Функция предназначена для создания мютекса. Поле &lt;code&gt;id_mutex&lt;/code&gt; структуры &lt;code&gt;mutex&lt;/code&gt; должно быть равно нулю до момента создания мютекса. Таким образом уже созданные мютексы защищаются от повторного создания.
&lt;/p&gt;

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

&lt;p&gt;
Параметр &lt;code&gt;attribute&lt;/code&gt; указывает тип протокола обхода инверсии приоритетов: &lt;code&gt;TN_MUTEX_ATTR_CEILING&lt;/code&gt; - если используется протокол увеличения приоритета или &lt;code&gt;TN_MUTEX_ATTR_INHERIT&lt;/code&gt;, если используется протокол наследования приоритета.
&lt;/p&gt;

&lt;p&gt;
Если параметр &lt;code&gt;attribute&lt;/code&gt; равен &lt;code&gt;TN_MUTEX_ATTR_CEILING&lt;/code&gt;, необходимо указать параметр &lt;code&gt;ceil_priority&lt;/code&gt; - максимальный приоритет из задач, который могут владеть мютексом. Если же используется протокол наследования приоритета, то параметр &lt;code&gt;ceil_priority&lt;/code&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_RETVAL tn_mutex_create&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_MUTEX &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;mutex, TN_UWORD attribute, TN_UWORD ceil_priority&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;mutex&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;указатель на структуру мютекса типа &lt;code&gt;TN_MUTEX&lt;/code&gt;. Структура должна быть создана до момента вызова функции, статически или динамически&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;attribute&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;тип протокола обхода инверсии приоритетов, используемый мютексом. Параметр может принимать одно из двух значений:
&lt;/p&gt;
&lt;table class = &quot;fpl&quot;&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;code&gt;TN_MUTEX_ATTR_CEILING&lt;/code&gt;		&lt;/td&gt;
		&lt;td&gt;
 Используется протокол увеличения приоритета		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;code&gt;TN_MUTEX_ATTR_INHERIT&lt;/code&gt;		&lt;/td&gt;
		&lt;td&gt;
 Используется протокол наследования приоритета		&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
  
&lt;p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;ceil_priority&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;максимальный приоритет из всех задач, которые могут владеть мютексом. Допустим, мютексом могут владеть задачи с приоритетом 3, 4, 9 и 2. Максимальный приоритет - 2. Параметр игнорируется, если &lt;code&gt;attribute&lt;/code&gt; = &lt;code&gt;TN_MUTEX_ATTR_INHERIT&lt;/code&gt;&lt;/dd&gt;
&lt;/dl&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;em class=&quot;u&quot;&gt;замечание:&lt;/em&gt; данный код возврата возможен только в случае использования сервисов с проверкой параметров)&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;TERR_EXS&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;strong&gt;Пример вызова:&lt;/strong&gt;  

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;TN_MUTEX mutex_test;
&amp;nbsp;
&lt;span class=&quot;coMULTI&quot;&gt;/* Создается мютекс с протоколом увеличения приоритета.
   Максимальный приоритет из задач, которые используют мютекс равен 2
 */&lt;/span&gt;
&amp;nbsp;
tn_mutex_create&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;mutex_test, TN_MUTEX_ATTR_CEILING, &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&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://www.pic24.ru/doku.php/tnkernel/ref/mutex/intro#сервисы_управления_мютексами&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:mutex:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_mutex_create()&quot; [12-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_delete?rev=1213883961">
        <dc:format>text/html</dc:format>
        <dc:date>2008-06-19T17:59:21+03:00</dc:date>
        <title>tn_mutex_delete()</title>
        <link>http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_delete?rev=1213883961</link>
        <description>




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

&lt;p&gt;

Функция предназначена для удаления мютекса. Поле &lt;code&gt;id_mutex&lt;/code&gt; структуры &lt;code&gt;mutex&lt;/code&gt; после выполнения сервиса устанавливается в 0. Приоритет задачи, владеющий мютексом будет восстановлен, если он был изменен вследствие протокола обхода инверсии приоритетов.
&lt;/p&gt;

&lt;p&gt;
Задача владеющая мютексом никак не будет извещена о его удалении, однако, сервис освобождения мютекса вернет код ошибки &lt;code&gt;TERR_DLT&lt;/code&gt;. Все задачи, ожидающие освобождения мютекса будут переведены в состояние &lt;code&gt;RUNNABLE&lt;/code&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_RETVAL tn_mutex_delete&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_MUTEX &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;mutex&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;mutex&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;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;em class=&quot;u&quot;&gt;замечание:&lt;/em&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_NOEXS&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;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;extern&lt;/span&gt; TN_MUTEX mutex_test;
&amp;nbsp;
tn_mutex_delete&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;mutex_test&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://www.pic24.ru/doku.php/tnkernel/ref/mutex/intro#сервисы_управления_мютексами&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:mutex:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_mutex_delete()&quot; [14-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_lock?rev=1213885585">
        <dc:format>text/html</dc:format>
        <dc:date>2008-06-19T18:26:25+03:00</dc:date>
        <title>tn_mutex_lock()</title>
        <link>http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_lock?rev=1213885585</link>
        <description>




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

&lt;p&gt;

Функция предназначена для блокировки мютекса. Если мютекс еще не заблокирован, он блокируется и задача, которая вызвала сервис не переводится в состояние ожидания. Если мютекс заблокирован, задача переводится в состояние &lt;code&gt;WAITING&lt;/code&gt; и ставится в очередь задач, ожидающих освобождение мютекса. 
&lt;/p&gt;

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

&lt;p&gt;
Если задача заблокировала мютекс ранее, сервис возвращает код ошибки &lt;code&gt;TERR_ILUSE&lt;/code&gt;. Так же этот код возвращается в том случае, если задача пытается блокировать мютекс с протоколом увеличения приоритета (Priority Ceiling Protocol) и ее приоритет выше порога, заданного при создании мютекса.
&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_mutex_lock&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_MUTEX &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;mutex, TN_TIMEOUT timeout&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;mutex&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;timeout&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;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;em class=&quot;u&quot;&gt;замечание:&lt;/em&gt; данный код возврата возможен только в случае использования сервисов с проверкой параметров)&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;TERR_NOEXS&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_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_ILUSE&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;мютекс уже заблокирован задачей, вызвавшей сервис&lt;/dd&gt;
&lt;dd&gt;мютекс использует протокол увеличения приоритета, а задача, пытающаяся заблокировать его имеет приоритет выше порогового&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;TERR_TIMEOUT&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;strong&gt;Пример вызова:&lt;/strong&gt;  

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;TN_MUTEX mutex_test;
&amp;nbsp;
tn_mutex_lock&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;mutex_test, &lt;span class=&quot;nu0&quot;&gt;10&lt;/span&gt;&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://www.pic24.ru/doku.php/tnkernel/ref/mutex/intro#сервисы_управления_мютексами&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:mutex:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_mutex_lock()&quot; [14-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_lock_polling?rev=1213885789">
        <dc:format>text/html</dc:format>
        <dc:date>2008-06-19T18:29:49+03:00</dc:date>
        <title>tn_mutex_lock_polling()</title>
        <link>http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_lock_polling?rev=1213885789</link>
        <description>




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

&lt;p&gt;

Функция предназначена для захвата мютекса без блокировки задачи. Если мютекс еще не заблокирован, он блокируется. Если мютекс заблокирован, сервис возвращает код ошибки &lt;code&gt;TERR_TIMEOUT&lt;/code&gt;. 
&lt;/p&gt;

&lt;p&gt;
Если задача заблокировала мютекс ранее, сервис возвращает код ошибки &lt;code&gt;TERR_ILUSE&lt;/code&gt;. Так же этот код возвращается в том случае, если задача пытается блокировать мютекс с протоколом увеличения приоритета (Priority Ceiling Protocol) и ее приоритет выше порога, заданного при создании мютекса.
&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_mutex_lock_polling&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_MUTEX &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;mutex&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;mutex&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;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;em class=&quot;u&quot;&gt;замечание:&lt;/em&gt; данный код возврата возможен только в случае использования сервисов с проверкой параметров)&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;TERR_NOEXS&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_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_ILUSE&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;мютекс уже заблокирован задачей, вызвавшей сервис&lt;/dd&gt;
&lt;dd&gt;мютекс использует протокол увеличения приоритета, а задача, пытающаяся заблокировать его имеет приоритет выше порогового&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;TERR_TIMEOUT&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;strong&gt;Пример вызова:&lt;/strong&gt;  

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;TN_MUTEX mutex_test;
&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;tn_mutex_lock_polling&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;mutex_test&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;sy1&quot;&gt;==&lt;/span&gt; TERR_NO_ERR&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;&lt;/pre&gt;
&lt;p&gt;
&lt;br/&gt;
 

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

&lt;p&gt;

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

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_mutex_lock_polling()&quot; [14-] --&gt;</description>
    </item>
    <item rdf:about="http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_unlock?rev=1213886370">
        <dc:format>text/html</dc:format>
        <dc:date>2008-06-19T18:39:30+03:00</dc:date>
        <title>tn_mutex_unlock()</title>
        <link>http://www.pic24.ru/doku.php/tnkernel/ref/mutex/tn_mutex_unlock?rev=1213886370</link>
        <description>




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

&lt;p&gt;

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

&lt;p&gt;
Если задача, вызвавшая сервис, пытается разблокировать свободный мютекс, сервис возвращает код ошибки &lt;code&gt;TERR_ILUSE&lt;/code&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_RETVAL tn_mutex_unlock&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_MUTEX &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;mutex&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;mutex&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;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;em class=&quot;u&quot;&gt;замечание:&lt;/em&gt; данный код возврата возможен только в случае использования сервисов с проверкой параметров)&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;TERR_NOEXS&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_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_ILUSE&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;strong&gt;Пример вызова:&lt;/strong&gt;  

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;TN_MUTEX mutex_test;
&amp;nbsp;
tn_mutex_unlock&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy3&quot;&gt;&amp;amp;&lt;/span&gt;mutex_test&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://www.pic24.ru/doku.php/tnkernel/ref/mutex/intro#сервисы_управления_мютексами&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:mutex:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

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