<?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:sem</title>
        <description></description>
        <link>http://wiki.pic24.ru/</link>
        <image rdf:resource="http://wiki.pic24.ru/lib/images/favicon.ico" />
       <dc:date>2023-02-10T15:45:54+03:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/intro?rev=1216589568"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_acquire?rev=1213955308"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_create?rev=1209166029"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_delete?rev=1209166762"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_ipolling?rev=1209901092"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_isignal?rev=1209249947"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_polling?rev=1209249724"/>
                <rdf:li rdf:resource="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_signal?rev=1209248196"/>
            </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/sem/intro?rev=1216589568">
        <dc:format>text/html</dc:format>
        <dc:date>2008-07-21T01:32:48+03:00</dc:date>
        <title>TNKernel : Семафоры</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/intro?rev=1216589568</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-48] --&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, предназначенный для синхронизации задач и обеспечения конкурентного доступа к ресурсам программы. В текущий момент времени только одна задача может &amp;quot;владеть&amp;quot; семафором. Задача, пытающаяся завладеть уже захваченным семафором переводится в состояние &lt;code&gt;WAITING&lt;/code&gt; и ставится в очередь задач, ожидающих семафор, до тех пор пока он не будет освобожден.
&lt;/p&gt;

&lt;p&gt;
Существует несколько типов семафоров - счетный семафор, двоичный семафор (подтип счетного) и семафор конкурентного доступа или &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/mutex/intro&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:mutex:intro&quot;&gt;мютекс&lt;/a&gt;. В TNKernel мютекс является отдельным объектом и рассмотрен в соответствующем &lt;a href=&quot;http://wiki.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;p&gt;
Счетный семафор можно сравнить с менеджером отеля у которого есть несколько ключей от одной комнаты. Менеджер будет выдавать жильцам комнаты (задачам RTOS) ключи до тех пор, пока они не кончатся (семафор захвачен). Как только один из жильцов вернет ключ от комнаты, он сразу будет выдан жильцу (задаче), ожидающему ключ.
&lt;/p&gt;

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

&lt;p&gt;
Двоичный семафор является подтипом счетного - его счетчик свободных ресурсов может принимать только значения 0 (захвачен) и 1 (свободен). В TNKernel семафоры не разделяются на двоичные и счетные - максимальное значение счетчика ресурсов задается при создании семафора.
&lt;/p&gt;

&lt;p&gt;
&lt;p&gt;&lt;div class=&quot;noteclassic&quot;&gt;
В TNKernel освободившийся семафор захватит задача, которая стоит первой в очереди задач ожидающих этот семафор, вне зависимости от приоритетов задач в очереди.

&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; [49-3436] --&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;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_SEM_S_STRUCT
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    CDLL_QUEUE_S        wait_queue;
    TN_UWORD            count;
    TN_UWORD            max_count;
    TN_OBJ_ID           id_sem;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; TN_SEM_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;count&lt;/code&gt;		&lt;/td&gt;
		&lt;td&gt;
 Счетчик свободных ресурсов семафора		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;
 &lt;code&gt;max_count&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_sem&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://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; [3437-4786] --&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/sem/tn_sem_create&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sem:tn_sem_create&quot;&gt;tn_sem_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://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task.png?id=tnkernel%3Aref%3Asem%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;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;   &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_delete&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sem:tn_sem_delete&quot;&gt;tn_sem_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://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task.png?id=tnkernel%3Aref%3Asem%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;a href=&quot;http://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_ct_sw.png?id=tnkernel%3Aref%3Asem%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; 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://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_signal&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sem:tn_sem_signal&quot;&gt;tn_sem_signal()&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%3Asem%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;a href=&quot;http://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_ct_sw.png?id=tnkernel%3Aref%3Asem%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;row6&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;   &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_isignal&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sem:tn_sem_isignal&quot;&gt;tn_sem_isignal()&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%3Asem%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%3Asem%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;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://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_acquire&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sem:tn_sem_acquire&quot;&gt;tn_sem_acquire()&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%3Asem%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;a href=&quot;http://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_ct_sw.png?id=tnkernel%3Aref%3Asem%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;a href=&quot;http://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_to.png?id=tnkernel%3Aref%3Asem%3Aintro&quot; class=&quot;media&quot; title=&quot;tnkernel:ref:attr_call_to.png&quot;&gt;&lt;img src=&quot;http://wiki.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;row9&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;   &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_polling&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sem:tn_sem_polling&quot;&gt;tn_sem_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://wiki.pic24.ru/lib/exe/detail.php/tnkernel/ref/attr_call_task.png?id=tnkernel%3Aref%3Asem%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;row10&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;   &lt;a href=&quot;http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_ipolling&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sem:tn_sem_ipolling&quot;&gt;tn_sem_ipolling()&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%3Asem%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%3Asem%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;/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; [4787-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_acquire?rev=1213955308">
        <dc:format>text/html</dc:format>
        <dc:date>2008-06-20T13:48:28+03:00</dc:date>
        <title>tn_sem_acquire()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_acquire?rev=1213955308</link>
        <description>




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

&lt;p&gt;

Сервис предназначен для захвата семафора.
&lt;/p&gt;

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

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

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

&lt;p&gt;
Если значение параметра &lt;code&gt;timeout&lt;/code&gt; равно &lt;code&gt;TN_WAIT_INFINITE&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_sem_acquire &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_SEM &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;sem, 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;sem&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_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_DLT&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_SEM sem_test;
&amp;nbsp;
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_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://wiki.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;/div&gt;
&lt;!-- SECTION &quot;tn_sem_acquire()&quot; [12-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_create?rev=1209166029">
        <dc:format>text/html</dc:format>
        <dc:date>2008-04-26T03:27:09+03:00</dc:date>
        <title>tn_sem_create()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_create?rev=1209166029</link>
        <description>


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

&lt;p&gt;

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

&lt;p&gt;
Память для управляющей структуры &lt;code&gt;sem&lt;/code&gt; должна быть выделена до момента создания семафора. Память может быть выделена на этапе компиляции (объявление глобальной переменной типа &lt;code&gt;TN_SEM&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_sem_create&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_SEM &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;sem, TN_UWORD start_value, TN_UWORD max_val&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;sem&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;указатель на структуру семафора типа &lt;code&gt;TN_SEM&lt;/code&gt;. Структура должна быть создана до момента вызова функции, статически или динамически&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;start_value&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;начальное значения счетчика свободных ресурсов семафора. Если этот параметр равен 0, то семафор считается занятым на момент создания.&lt;/dd&gt;
&lt;dt&gt;&lt;span class='term'&gt; &lt;code&gt;max_val&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;максимальное значение счетчика свободных ресурсов семафора. Если этот параметр равен 1, то создается двоичный семафор.&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_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;strong&gt;Пример вызова:&lt;/strong&gt;  

&lt;/p&gt;
&lt;pre class=&quot;cpp code cpp&quot; style=&quot;font-family:monospace;&quot;&gt;TN_SEM sem_test;
&amp;nbsp;
tn_sem_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;sem_test, &lt;span class=&quot;nu0&quot;&gt;1&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;coMULTI&quot;&gt;/* создается свободный бинарный семафор */&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/sem/intro#сервисы_управления_семафорами&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sem:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_sem_create()&quot; [11-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_delete?rev=1209166762">
        <dc:format>text/html</dc:format>
        <dc:date>2008-04-26T03:39:22+03:00</dc:date>
        <title>tn_sem_delete()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_delete?rev=1209166762</link>
        <description>


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

&lt;p&gt;

Функция предназначена для удаления семафора. Поле &lt;code&gt;id_sem&lt;/code&gt; структуры &lt;code&gt;sem&lt;/code&gt; после выполнения сервиса устанавливается в 0. Все задачи, ожидающие семафор, выйдут из сервиса ожидания с кодом возврата &lt;code&gt;TERR_DLT&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_sem_delete &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_SEM &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;sem&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;sem&lt;/code&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;указатель на структуру семафора типа &lt;code&gt;TN_SEM&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;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_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_SEM sem_test;
&amp;nbsp;
tn_sem_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;sem_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://wiki.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;/div&gt;
&lt;!-- SECTION &quot;tn_sem_delete()&quot; [11-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_ipolling?rev=1209901092">
        <dc:format>text/html</dc:format>
        <dc:date>2008-05-04T15:38:12+03:00</dc:date>
        <title>tn_sem_ipolling()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_ipolling?rev=1209901092</link>
        <description>




&lt;h2&gt;&lt;a name=&quot;tn_sem_ipolling&quot; id=&quot;tn_sem_ipolling&quot;&gt;tn_sem_ipolling()&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_TIMEOUT&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_sem_ipolling &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_SEM &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;sem&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;sem&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_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;&lt;span class=&quot;kw4&quot;&gt;extern&lt;/span&gt; TN_SEM sem_test;
&amp;nbsp;
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;/* прерывание от таймера */&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;
    &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;tn_task_ipolling&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_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;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/sem/intro#сервисы_управления_семафорами&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sem:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_sem_ipolling()&quot; [13-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_isignal?rev=1209249947">
        <dc:format>text/html</dc:format>
        <dc:date>2008-04-27T02:45:47+03:00</dc:date>
        <title>tn_sem_isignal()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_isignal?rev=1209249947</link>
        <description>




&lt;h2&gt;&lt;a name=&quot;tn_sem_isignal&quot; id=&quot;tn_sem_isignal&quot;&gt;tn_sem_isignal()&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;
Если очередь задач ожидающих семафор пуста, и счетчик свободных ресурсов меньше максимального значения, то он увеличивается на единицу. Если счетчик свободных ресурсов равен максимальному значению, то он не увеличивается и сервис возвращает код &lt;code&gt;TERR_OVERFLOW&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_sem_isignal &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_SEM &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;sem&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;sem&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_OVERFLOW&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;external TN_SEM sem_test;
&amp;nbsp;
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;/* прерывание от таймера */&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_task_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_test&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;        &lt;span class=&quot;coMULTI&quot;&gt;/* освобождение семафора sem_test */&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/sem/intro#сервисы_управления_семафорами&quot; class=&quot;wikilink1&quot; title=&quot;tnkernel:ref:sem:intro&quot;&gt;К списку сервисов&lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;tn_sem_isignal()&quot; [12-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_polling?rev=1209249724">
        <dc:format>text/html</dc:format>
        <dc:date>2008-04-27T02:42:04+03:00</dc:date>
        <title>tn_sem_polling()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_polling?rev=1209249724</link>
        <description>


&lt;h2&gt;&lt;a name=&quot;tn_sem_polling&quot; id=&quot;tn_sem_polling&quot;&gt;tn_sem_polling()&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_TIMEOUT&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_sem_polling &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_SEM &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;sem&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;sem&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_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_SEM    sem_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_sem_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;sem_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://wiki.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;/div&gt;
&lt;!-- SECTION &quot;tn_sem_polling()&quot; [11-] --&gt;</description>
    </item>
    <item rdf:about="http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_signal?rev=1209248196">
        <dc:format>text/html</dc:format>
        <dc:date>2008-04-27T02:16:36+03:00</dc:date>
        <title>tn_sem_signal()</title>
        <link>http://wiki.pic24.ru/doku.php/tnkernel/ref/sem/tn_sem_signal?rev=1209248196</link>
        <description>


&lt;h2&gt;&lt;a name=&quot;tn_sem_signal&quot; id=&quot;tn_sem_signal&quot;&gt;tn_sem_signal()&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;
Если очередь задач ожидающих семафор пуста, и счетчик свободных ресурсов меньше максимального значения, то он увеличивается на единицу. Если счетчик свободных ресурсов равен максимальному значению, то он не увеличивается и сервис возвращает код &lt;code&gt;TERR_OVERFLOW&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_sem_signal &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;TN_SEM &lt;span class=&quot;sy2&quot;&gt;*&lt;/span&gt;sem&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;sem&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_OVERFLOW&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_SEM sem_test;
&amp;nbsp;
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_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://wiki.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;/div&gt;
&lt;!-- SECTION &quot;tn_sem_signal()&quot; [11-] --&gt;</description>
    </item>
</rdf:RDF>
