<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ReAl</title>
	<atom:link href="http://real.kiev.ua/feed/?langswitch_lang=ru" rel="self" type="application/rss+xml" />
	<link>http://real.kiev.ua</link>
	<description>.  ..  ..o .oO .oO       failed</description>
	<lastBuildDate>Thu, 17 May 2012 18:54:36 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Перехідник зі шлейфа на макетну плату.</title>
		<link>http://real.kiev.ua/2012/05/17/perehidnyk-zi-shlejfa-na-maketnu-platu/</link>
		<comments>http://real.kiev.ua/2012/05/17/perehidnyk-zi-shlejfa-na-maketnu-platu/#comments</comments>
		<pubDate>Thu, 17 May 2012 18:48:33 +0000</pubDate>
		<dc:creator>ReAl</dc:creator>
				<category><![CDATA[Некатегоризовано]]></category>
		<category><![CDATA[программатор]]></category>
		<category><![CDATA[Перехідник]]></category>

		<guid isPermaLink="false">http://real.kiev.ua/?p=1903</guid>
		<description><![CDATA[Знадобилося мені якось терміново підключити до плати з ATmega64 макетку, на якій перевірити один задум. Вільні лінії мікроконтролера було виведено на 16-контактні штирі, залишалося підключити шлейф до макетної плати. А сама макетка — куплена в Імраді SOLDERLESS BREADBOARD EIC-406 фірми E-CALL. Тобто не підпаятися (для того і бралося ж), потрібен перехідник. Звичайно, можна було б [...]]]></description>
			<content:encoded><![CDATA[<p>Знадобилося мені якось терміново підключити до плати з ATmega64 макетку, на якій перевірити один задум. Вільні лінії мікроконтролера було виведено на 16-контактні штирі, залишалося підключити шлейф до макетної плати. А сама макетка — куплена в Імраді <a class="linkext" href="http://www.ecall-elec.com.tw/solderless-1-2.htm#EIC-402">SOLDERLESS BREADBOARD EIC-406</a> фірми E-CALL. Тобто не підпаятися (для того і бралося ж), потрібен перехідник.</p>
<p>Звичайно, можна було б використати <a class="linkext" href="http://www.kktd.org.ua/index.php?item=product&#038;id=45">з’єднувач DIP на шлейф</a>. Та треба було «бігом», поки думка ворушиться, а до Нью-Паріса їхати зараз неблизько. Тому було знайдено шматочки макетки та штирі і мені швиденько запаяли ось такі перехідники:</p>
<p><center><img src="http://real.kiev.ua/wp-content/uploads/2012/05/adapter-1.jpg" alt="Перехідник, макетка та штирі." title="Перехідник, макетка та штирі." width="480" height="240" class="aligncenter size-full wp-image-1904" /></center></p>
<p>Все, що потрібно, було перевірено і на деякий час я про це забув. Аж тут раптом виявився потрібним аналогічний перехідник на шість контактів, підключити до макетки один з варіантів програматора. Причому вдома — а паяти самому ліньки <img src='http://real.kiev.ua/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Лінощі — двигун прогресу. Дуже швидко в голові промайнули розміри дворядних кутових штирів і з’ясувалося, що їх можна акуратно розігнути (показано різні стадії процесу):</p>
<p><center><img src="http://real.kiev.ua/wp-content/uploads/2012/05/adapter-2.jpg" alt="Стадії виготовлення перехідника з кутових штирів." title="Стадії виготовлення перехідника з кутових штирів." width="480" height="240" class="aligncenter size-full wp-image-1905" /></center></p>
<p>В результаті вийшли чудові перехідники:</p>
<p><center><img src="http://real.kiev.ua/wp-content/uploads/2012/05/adapter-3.jpg" alt="Готовий перехідник з кутових штирів." title="Готовий перехідник з кутових штирів." width="480" height="240" class="aligncenter size-full wp-image-1906" /></center></p>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/05/17/perehidnyk-zi-shlejfa-na-maketnu-platu/feed/?langswitch_lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Гриб у людному місці.</title>
		<link>http://real.kiev.ua/2012/05/17/hryb-u-lyudnomu-mistsi/</link>
		<comments>http://real.kiev.ua/2012/05/17/hryb-u-lyudnomu-mistsi/#comments</comments>
		<pubDate>Thu, 17 May 2012 03:55:11 +0000</pubDate>
		<dc:creator>ReAl</dc:creator>
				<category><![CDATA[Природа]]></category>
		<category><![CDATA[Гриби]]></category>

		<guid isPermaLink="false">http://real.kiev.ua/?p=1897</guid>
		<description><![CDATA[Печериць по Києву багато зустрічаю, вони як горобці — скрізь є. Інші гриби зустрічаються рідше. Про шіітаке я вже писав, а вчора по дорозі від (М) Берестейська до вул.Шутова (Імрад ) навпроти училища на смужці між тротуаром та стежкою через скверик побачив старого знайомого — сірчано-жовтого трутовика. Виріс він на старому, майже непомітному пеньку. Стан [...]]]></description>
			<content:encoded><![CDATA[<p>Печериць по Києву багато зустрічаю, вони як горобці — скрізь є. Інші гриби зустрічаються рідше.<br />
Про <a class="linkint" href="/?p=704">шіітаке</a> я вже писав, а вчора по дорозі від (М) Берестейська до вул.Шутова (Імрад <img src='http://real.kiev.ua/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ) навпроти училища на смужці між тротуаром та стежкою через скверик побачив старого знайомого — сірчано-жовтого трутовика.</p>
<p><center><img src="http://real.kiev.ua/wp-content/uploads/2012/05/trutovyk-20120516.jpg" alt="Трутовик сірчано-жовтий на пеньку." title="Трутовик сірчано-жовтий на пеньку." width="640" height="480" class="aligncenter size-full wp-image-1898" /></center></p>
<p>Виріс він на старому, майже непомітному пеньку. Стан — «якраз брати». Кінчики вже не «сопливі», серединка ще не надто волокниста та тверда. Було б це не поруч з проспектом зі жвавим рухом машин, а у лісі — неодмінно зрізав би.</p>
<p>Фото з мобільного телефона, вибачте за (не)якість. Невеликий світлий гриб на темному фоні «перебило» так, що ніяка корекція не допоможе.</p>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/05/17/hryb-u-lyudnomu-mistsi/feed/?langswitch_lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Літієві «батарейки» — як воно буває.</title>
		<link>http://real.kiev.ua/2012/04/30/litijevi-batarejky-—-yak-vono-buvaje/</link>
		<comments>http://real.kiev.ua/2012/04/30/litijevi-batarejky-—-yak-vono-buvaje/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 05:06:21 +0000</pubDate>
		<dc:creator>ReAl</dc:creator>
				<category><![CDATA[Некатегоризовано]]></category>

		<guid isPermaLink="false">http://real.kiev.ua/?p=1883</guid>
		<description><![CDATA[Таки ж весна і таки ж давно пора на велосипед. Проміж іншого треба було поставити літієві елементи CR2032 у велокомп’ютер та в його давач пульсу. Якраз незадовго до того я знайшов у завалах купку цих елементів. Провалялися років вісім чи десять. Ставлю одну у велокомп — наче працює. Ставлю другу у детектор пульсу — не [...]]]></description>
			<content:encoded><![CDATA[<p>Таки ж весна і таки ж давно пора на велосипед.<br />
Проміж іншого треба було поставити літієві елементи CR2032 у велокомп’ютер та в його давач пульсу. Якраз незадовго до того я знайшов у завалах купку цих елементів. Провалялися років вісім чи десять. Ставлю одну у велокомп — наче працює. Ставлю другу у детектор пульсу — не працює. Відклав, поставив наступну, поїхав.<br />
Все було нормально, доки пульс не перевищив межу. Комп жалібно пропищав і перевантажився. Не тягне батарейка.<br />
Вже вдома почав знову тасувати батарейки і вирішив, що заплутався.<br />
Ця щойно наче працювала к компі, гучно і радісно пищала (монітора поруч досить, щоб вважати, що мій пульс 250 ударів на хвилину), але не працює у детекторі пульсу.<br />
Та — навпаки — щойно працювала в детекторі, але комп з нею не встигає помітно пискнути.<br />
Інша не прауює ні там, ні там, але це можна зрозуміти.<br />
Відклав всі вбік, вишикував і почав по черзі перевіряти напругу холостого ходу та струм при навантаженні на 100 Ом, після чого перевіряти в приладах.</p>
<p>Після замірів стало все зрозуміло.</p>
<p>Ті, що давали напругу 2.88…2.92 В та струм 20..24 мА — працюють у велокомпові, не просідають. Для детектора пульсу, схоже, не вистачає напруги.</p>
<p>Ті, що давали напругу 3.1…3.15 В та струм 0.7-1.2 мА — працюють в детекторі пульсу. Навантаження (радіоканал) імпульсне з малим часом активності і гарний конденсатор виручає. Комп з ними перевантажується по кожній спробі пропищати.</p>
<p>З тими, що давали 2.5…2.7 В та струм 0.5-1 мА все зрозуміло — вони вже працюватимуть хіба як елементи енергоцентралі живлення «Зірки смерті» або як щити для вархаммерівських вояків.</p>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/04/30/litijevi-batarejky-—-yak-vono-buvaje/feed/?langswitch_lang=ru</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>AVReAl update &#8212; 1.28r10</title>
		<link>http://real.kiev.ua/2012/04/29/avreal-update-1-28r10/</link>
		<comments>http://real.kiev.ua/2012/04/29/avreal-update-1-28r10/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 10:23:47 +0000</pubDate>
		<dc:creator>ReAl</dc:creator>
				<category><![CDATA[Обновления]]></category>
		<category><![CDATA[AVR]]></category>
		<category><![CDATA[программатор]]></category>

		<guid isPermaLink="false">http://real.kiev.ua/?p=1874</guid>
		<description><![CDATA[Вышла новая версия програматора avreal &#8211; v1.28r10 (Sun 2012-04-29). Исправлена ошибка размера EEPROM для микроконтроллеров ATmega328, ATmega328P Добавлен синоним для микроконтроллера ATtiny84A]]></description>
			<content:encoded><![CDATA[<p>Вышла новая версия програматора avreal &#8211; <a class="linkint" href="/avreal/download#128R10">v1.28r10 (Sun 2012-04-29)</a>.</p>
<ul>
<li>Исправлена ошибка размера EEPROM для микроконтроллеров ATmega328, ATmega328P</li>
<li>Добавлен синоним для микроконтроллера ATtiny84A</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/04/29/avreal-update-1-28r10/feed/?langswitch_lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>scmRTOS 4.0 release</title>
		<link>http://real.kiev.ua/2012/04/09/scmrtos-4-0-release/</link>
		<comments>http://real.kiev.ua/2012/04/09/scmrtos-4-0-release/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 16:24:51 +0000</pubDate>
		<dc:creator>ReAl</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[AVR]]></category>
		<category><![CDATA[LPC17xx]]></category>
		<category><![CDATA[scmRTOS]]></category>
		<category><![CDATA[STM8]]></category>

		<guid isPermaLink="false">http://real.kiev.ua/?p=1853</guid>
		<description><![CDATA[4 апреля (2012.04.04) наконец-то вышла «официальная» версія 4.0 операцинной системы scmRTOS. После исправления известных ошибок предыдущая версия сохранена в ветке scmrtos/tags/3.11. Новая версия зафиксорована в scmrtos/tags/4.00 и продолжает развиваться в scmrtos/trunk. Что нового в scmRTOS 4.0 в сравнении с версией 3.11: Вместо byte, word, dword используются типы uint8_t, uint16_t, uint32_t из stdint.h. В некоторых случаях [...]]]></description>
			<content:encoded><![CDATA[<p>4 апреля (2012.04.04) наконец-то вышла «официальная» версія 4.0 операцинной системы scmRTOS. </p>
<p>После исправления известных ошибок предыдущая версия сохранена в ветке <a class="linkext" href="http://scmrtos.svn.sourceforge.net/viewvc/scmrtos/tags/3.11/">scmrtos/tags/3.11</a>.</p>
<p>Новая версия зафиксорована в <a class="linkext" href="http://scmrtos.svn.sourceforge.net/viewvc/scmrtos/tags/4.00/">scmrtos/tags/4.00</a> и продолжает развиваться в <a class="linkext" href="http://scmrtos.svn.sourceforge.net/viewvc/scmrtos/trunk/">scmrtos/trunk</a>.</p>
<p><span id="more-1853"></span></p>
<p><a class="linkext" href="http://scmrtos.sourceforge.net/What%27s_new_in_v4.00">Что нового в scmRTOS 4.0</a> в сравнении с версией 3.11:</p>
<ul>
<li>Вместо <code class="codecolorer c default"><span class="c">byte</span></code>, <code class="codecolorer c default"><span class="c">word</span></code>, <code class="codecolorer c default"><span class="c">dword</span></code> используются типы <code class="codecolorer c default"><span class="c"><span style="color: #993333;">uint8_t</span></span></code>, <code class="codecolorer c default"><span class="c"><span style="color: #993333;">uint16_t</span></span></code>, <code class="codecolorer c default"><span class="c"><span style="color: #993333;">uint32_t</span></span></code> из <code class="codecolorer text default"><span class="text">stdint.h</span></code>. В некоторых случаях используется тип <code class="codecolorer c default"><span class="c"><span style="color: #993333;">uint_fast8_t</span></span></code> для оптимальной компиляции на разных архитектурах.</li>
<li>Изменено соглашение об именовании функций и переменных. Это изменение требует некоторых действий при переходе на новую версию (см. ниже).</li>
<li>Изменена структура каталогов примеров репозитория и имён архивов на <a class="linkext" href="http://sourceforge.net/projects/scmrtos/files/scmrtos/scmRTOS%204.00/">странице загрузки scmRTOS</a>. Теперь используется путь <code class="codecolorer text default"><span class="text">архитектура/компилятор/линейка_микроконтроллеров</span></code>.</li>
<li>Добавлена возможность перезапустить процесс.</li>
<li>Добавлена поддержка профилирования и отладки програм:
<ul>
<li>определение остатка свободного места на стеках процессов,</li>
<li>измерение времени работы процессов,</li>
<li>возможность узнать адрес объекта синхронизации, ожидаемого процессом.</li>
</ul>
</li>
<li>Добавлен пример 4-Debug для демонстрации части этих возможностей.</li>
<li>Добавлен класс TKernelAgent &#8212; механизм расширений ОС (собственно, профилирование и сделано как пример такого расширения).</li>
<li>Изменена иерархия классов ОС. Все сервисы ОС теперь есть потомками класса TService, который есть потомком класса TKernelAgent. Пользователь может создавать свои собственные сервисы.</li>
<li>Добавлен порт для STM8/IAR и примеры для STM8S.</li>
<li>В порт CortexM3/GCC добавлены примеры 1-EventFlag и 4-Debug для микроконтроллеров LPC17XX.</li>
<li>В портах AVR/GCC и AVR/IAR для микроконтроллеров <a class="linkext" href="http://www.atmel.com/products/microcontrollers/avr/megaAVR.aspx">megaAVR</a> добавлена поддержка кристаллов с памятью программ более 128 килобайт (ATmega256x).</li>
<li>Из порта CortexM3/IAR убрано примеры для LPC17XX (ввиду отсутствия желающих их сопровождать). Участники проекта работают если и с IAR, то с STM32, а если уж с LPC17XX, то с GCC.</li>
<li>Порт Fujitsu MB91 больше не поддерживается.</li>
<li>Порт ARM7/IAR на данный момент не поддерживается. Он, как и порт Fujitsu MB91, оставлен в ветке 3.11 но эти порты вошли в 4.0 и в текущую ветку разработки.</li>
</ul>
<p>Для облегчения <a class="linkext" href="http://scmrtos.sourceforge.net/Migration_Guide">перехода с scmRTOS 3.xx на 4.xx</a> создан файл <code class="codecolorer text default"><span class="text">scmRTOS_310_compat.h</span></code>, который делает синонимы для старых типов данних с использованием типов из <code class="codecolorer text default"><span class="text">stdint.h</span></code> и включает в исходных текстах ОС режим совместимости. В этом режиме создауются inline функции-адаптеры двух типов:</p>
<ul>
<li>Для кода пользователя: адаптеры перехода от старых к новым именам, например, от <code class="codecolorer c default"><span class="c">Sleep<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> к <code class="codecolorer c default"><span class="c">sleep<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> в новом коде ОС.</li>
<li>Для кода ОС: адаптеры перехода от новых к старым именам, например, от <code class="codecolorer c default"><span class="c">system_timer_user_hook<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> к <code class="codecolorer c default"><span class="c">SystemTimerUserHook<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> в старом коде пользователя.</li>
</ul>
<p>Благодаря функциям-адаптерам ядра в старом коде следует лишь заменить имена функций процессов <code class="codecolorer c default"><span class="c">Exec<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> на <code class="codecolorer c default"><span class="c">еxec<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> и старый проект будет продолжать работать.</p>
<p>Файл <code class="codecolorer text default"><span class="text">scmRTOS_310_compat.h</span></code> нужно включить в начале <code class="codecolorer text default"><span class="text">scmRTOS_CONFIG.h</span></code> проекта. Также необходимо добавить определения для двух типов — счётчика системных тиков ОС <code class="codecolorer c default"><span class="c">tick_count_t</span></code> и типа времени таймаута <code class="codecolorer c default"><span class="c">timeout_t</span></code>.</p>
<p>В качестве примера такого перехода можно посмотреть примеры 3-Channel в портах <a class="linkext" href="http://scmrtos.svn.sourceforge.net/viewvc/scmrtos/trunk/Samples/AVR/GCC/MEGA/3-Channel/">AVR/GCC/MEGA</a> и <a class="linkext" href="http://scmrtos.svn.sourceforge.net/viewvc/scmrtos/trunk/Samples/AVR/IAR/MEGA/3-Channel/">AVR/IAR/MEGA</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/04/09/scmrtos-4-0-release/feed/?langswitch_lang=ru</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Конкурс «зроби робота».</title>
		<link>http://real.kiev.ua/2012/03/26/konkurs-zroby-robota/</link>
		<comments>http://real.kiev.ua/2012/03/26/konkurs-zroby-robota/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 15:15:23 +0000</pubDate>
		<dc:creator>ReAl</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Конкурс]]></category>
		<category><![CDATA[Програмування]]></category>
		<category><![CDATA[Робот]]></category>

		<guid isPermaLink="false">http://real.kiev.ua/?p=1837</guid>
		<description><![CDATA[На сайті Linux.org.ua оголошено конкурс по створенню робота. Робот повинен працювати автономно, електроніка робота має керуватися зі звукового виходу мобільного телефону. Тобто програма має сидіти в телефоні і видавати команди та, можливо, і приймати якісь сигнали зворотнього зв’язку, через звуковий канал. Думаю, можна використати щось стандартне на зразок DTMF. Конкретні умови (які, можливо, ще не [...]]]></description>
			<content:encoded><![CDATA[<p>На сайті Linux.org.ua оголошено <a class="linkext" href="http://linux.org.ua/cgi-bin/yabb/YaBB.pl?num=1332159620">конкурс по створенню робота</a>.</p>
<p>Робот повинен працювати автономно, електроніка робота має керуватися зі звукового виходу мобільного телефону.<br />
Тобто програма має сидіти в телефоні і видавати команди та, можливо, і приймати якісь сигнали зворотнього зв’язку, через звуковий канал. Думаю, можна використати щось стандартне на зразок DTMF.</p>
<p>Конкретні умови (які, можливо, ще не остаточні) та посилання на приклади дивіться у вказаній вище темі на форумі.</p>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/03/26/konkurs-zroby-robota/feed/?langswitch_lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LPC175x and LPC176x Standard Peripheral Firmware Driver Library</title>
		<link>http://real.kiev.ua/2012/02/15/lpc175x-and-lpc176x-standard-peripheral-firmware-driver-library/</link>
		<comments>http://real.kiev.ua/2012/02/15/lpc175x-and-lpc176x-standard-peripheral-firmware-driver-library/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 00:10:38 +0000</pubDate>
		<dc:creator>ReAl</dc:creator>
				<category><![CDATA[Програмування]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[LPC17xx]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[volatile]]></category>

		<guid isPermaLink="false">http://real.kiev.ua/?p=1751</guid>
		<description><![CDATA[Взяв я трохи поколупати платку з мікроконтролером LPC1768. Спробував використати стандартну бібліотеку lpc17xx cmsis driver library, щоб трохи менше думати. Звісно, документацію на мікроконтролер все одно читати треба. Але здалося простіше викликати функцію для налаштування потрібної периферії, передавши їй кілька парметрів, ніж самому уважно комбінувати ті параметри в кілька регістрів. Та ще й, можливо, про [...]]]></description>
			<content:encoded><![CDATA[<p>Взяв я трохи поколупати платку з мікроконтролером LPC1768.<br />
Спробував використати стандартну бібліотеку <a class="linkext" href="http://ics.nxp.com/support/documents/microcontrollers/zip/lpc17xx.cmsis.driver.library.zip">lpc17xx cmsis driver library</a>, щоб трохи менше думати. Звісно, документацію на мікроконтролер все одно читати треба. Але здалося простіше викликати функцію для налаштування потрібної периферії, передавши їй кілька парметрів, ніж самому уважно комбінувати ті параметри в кілька регістрів. Та ще й, можливо, про порядок запису треба буде думати.</p>
<p>З часів інтелівського ApBUILDER-а — програми для генерації коду ініціалізації для MCS-51, MCS-196, … — я всю роботу з периферією завжди робив вручну. Тобто, я і до цього робив вручну, а тим ApBUILDER-ом спробував і відмовився. І знову лише вручну. Читаєш собі документацію на потрібний модуль та й потихеньку пишеш всі ці маски/зсуви. Константи для них у файлах від компілятора чи виробника мікроконтролерів є — і то добре.<br />
А тут — на тобі… Вирішив полінуватися…</p>
<p><span id="more-1751"></span></p>
<p>Про всяк випадок спочатку глянув, як воно компілюється та скільки займає місця. Додав до проекту весь каталог <code class="codecolorer text default"><span class="text">Drivers/source</span></code>, закоментував у <code class="codecolorer text default"><span class="text">makefile</span></code> рядок, який просить лінкера викидати код, що не викликається (точніше, секції, на які нема посилань)</p>
<div class="codecolorer-container make default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="make codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339900; font-style: italic;"># &nbsp; LD_FLAGS&nbsp; &nbsp; += -Wl,--gc-sections</span></div></div>
<p>і запустив компіляцію.</p>
<p>Почалося з того, що половина файлів бібліотеки відмовилися компілюватися, бо вони включають файл <code class="codecolorer text default"><span class="text">lpc17xx.h</span></code>, а в комплекті йде файл <code class="codecolorer text default"><span class="text">LPC17xx.h</span></code>. Різниця в регістрі літер може десь і неважлива, але не для gcc в Linux. Та це було поремонтувати неважко, я просто додав в каталог проекту файл <code class="codecolorer text default"><span class="text">lpc17xx.h</span></code> з таким вмістом:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">// XXX: частина файлів стандартної бібіліотеки периферії хоче LPC17xx.h,</span><br />
<span style="color: #666666; font-style: italic;">// частина — lpc17xx.h. Поки-що так, щоб не патчити бібліотеку</span><br />
<span style="color: #339933;">#pragma once</span><br />
<span style="color: #339933;">#include &quot;LPC17xx.h&quot;</span></div></div>
<p>Після цього все зібралося. Розмір коду під сорок кілобайт за «зручності» бачити було незвично, але ж флеша пів мегабайта, хай вже. Може воно там купу корисної роботи робить, я ж ще детально не дивився.</p>
<p>А от кілька десятків попереджень компілятора в дусі</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">./LPC17xx/Drivers/source/lpc17xx_gpdma.c:240:11: warning:<br />
&nbsp; cast discards ‘__attribute__((const))’ qualifier from pointer target type [-Wcast-qual]<br />
./LPC17xx/Drivers/source/lpc17xx_rtc.c:736:9: warning:<br />
&nbsp; cast discards ‘__attribute__((noreturn))’ qualifier from pointer target type [-Wcast-qual]<br />
./LPC17xx/Drivers/source/lpc17xx_rtc.c:758:2: warning:<br />
&nbsp; comparison is always true due to limited range of data type [-Wtype-limits]</div></div>
<p>трохи налякали. За такими попередженнями іноді ховаються дуже неприємні помилки.</p>
<p>З останнім, про «comparison is always true» виявилося просто. Бібліотека має купу макросів для перевірки аргументів функцій на припустимий діапазон. Місцями аргументи оголошено як беззнакові цілі, а макрос перевіряє діапазон так:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">/* Macro check RTC GPREG type */</span><br />
<span style="color: #339933;">#define PARAM_RTC_GPREG_CH(n) &nbsp; ((n&gt;=0) &amp;&amp; (n&lt;=4))</span></div></div>
<p>На перше порівнювання компілятор і видає попередження. Нічого наче страшного, все працюватиме, але купа таких попереджень засмічує лог компілятора.</p>
<p>Місцями стоять зовсім незрозумілі приведення типів стоять. Наприклад, тут аргумент функції має кваліфікатор const, а для локальної змінної він знімається явним приведенням. При тому, що по цьому вказівникові однак дані лише читаються:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333;">void</span> UARTPuts<span style="color: #009900;">&#40;</span>LPC_UART_TypeDef <span style="color: #339933;">*</span>UARTx<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
<span style="display:block;background-color:#ffff66">&nbsp; &nbsp; <span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span>s <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> str<span style="color: #339933;">;</span><br /></span>&nbsp; &nbsp; <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>s<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span></div></div>
<p>Більш за все, початковий код виглядав так:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333;">void</span> UARTPuts<span style="color: #009900;">&#40;</span>LPC_UART_TypeDef <span style="color: #339933;">*</span>UARTx<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
<span style="display:block;background-color:#ffff66">&nbsp; &nbsp; <span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span>s <span style="color: #339933;">=</span> str<span style="color: #339933;">;</span><br /></span>&nbsp; &nbsp; <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>s<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span></div></div>
<p>Вказівник <code class="codecolorer c default"><span class="c"><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>str</span></code> дає можливість передати у функцію як масив <code class="codecolorer c default"><span class="c"><span style="color: #993333;">char</span></span></code>, так і масив <code class="codecolorer c default"><span class="c"><span style="color: #993333;">uint8_t</span></span></code> без приведення у точці виклику. Але для циклу передачі байтів необхідно мати вказівник на конкретний тип, тому заведено локальну змінну типу <code class="codecolorer c default"><span class="c"><span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span></span></code>. Про <code class="codecolorer c default"><span class="c"><span style="color: #993333;">const</span></span></code> для цього вказівника автор забув. Отримав від компілятора попередження, що при ініціалізації змінної <code class="codecolorer c default"><span class="c">s</span></code> автоматичним приведенням відкидається кваліфікатор для об’єкта, на який вона вказуватиме:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">warning: initialization discards qualifiers from pointer target type</div></div>
<p>При компіляції в режимі C++ тут взагалі буде помилка:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">error: invalid conversion from ‘const void*’ to ‘char*’</div></div>
<p>На простому рівні діагностики явне «ручне» приведення <code class="codecolorer c default"><span class="c"><span style="color: #009900;">&#40;</span><span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span></span></code> зняло авторові коду попередження. Замів сміття під килимочок і заспокоївся. У мене ж код компілювався з ключем <code class="codecolorer text default"><span class="text">-Wcast-qual</span></code>:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; -Wcast-qual &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Warn about casts which discard qualifiers</div></div>
<p>Тобто і під килимочом сміття теж буде видно.</p>
<p>Проста правка — визначення вказівника потрібного типу — робить код коректним:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333;">void</span> UARTPuts<span style="color: #009900;">&#40;</span>LPC_UART_TypeDef <span style="color: #339933;">*</span>UARTx<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
<span style="display:block;background-color:#ffff66">&nbsp; &nbsp; <span style="color: #993333;">const</span> <span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span>s <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">uint8_t</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>str<span style="color: #339933;">;</span></span></div></div>
<p>&nbsp;</p>
<p>В іншому місці ще веселіше:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">/**</span><br />
<span style="color: #808080; font-style: italic;">&nbsp;* @brief Lookup Table of GPDMA Channel Number matched with</span><br />
<span style="color: #808080; font-style: italic;">&nbsp;* GPDMA channel pointer</span><br />
<span style="color: #808080; font-style: italic;">&nbsp;*/</span><br />
<span style="display:block;background-color:#ffff66"><span style="color: #993333;">const</span> LPC_GPDMACH_TypeDef <span style="color: #339933;">*</span> pGPDMACh<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br /></span>&nbsp; &nbsp; &nbsp; &nbsp; LPC_GPDMACH0<span style="color: #339933;">,</span> &nbsp; <span style="color: #666666; font-style: italic;">// GPDMA Channel 0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LPC_GPDMACH1<span style="color: #339933;">,</span> &nbsp; <span style="color: #666666; font-style: italic;">// GPDMA Channel 1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LPC_GPDMACH2<span style="color: #339933;">,</span> &nbsp; <span style="color: #666666; font-style: italic;">// GPDMA Channel 2</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LPC_GPDMACH3<span style="color: #339933;">,</span> &nbsp; <span style="color: #666666; font-style: italic;">// GPDMA Channel 3</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LPC_GPDMACH4<span style="color: #339933;">,</span> &nbsp; <span style="color: #666666; font-style: italic;">// GPDMA Channel 4</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LPC_GPDMACH5<span style="color: #339933;">,</span> &nbsp; <span style="color: #666666; font-style: italic;">// GPDMA Channel 5</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LPC_GPDMACH6<span style="color: #339933;">,</span> &nbsp; <span style="color: #666666; font-style: italic;">// GPDMA Channel 6</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LPC_GPDMACH7&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// GPDMA Channel 7</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></div></div>
<p>Тут визначається неконстантний масив вказівників на константні об’єкти типу <code class="codecolorer c default"><span class="c">LPC_GPDMACH_TypeDef</span></code>. Звісно, масив розміщено в оперативній пам’яті. 32 байти туди, 32 байти сюди — хто їх на 64 кілобайтах помітить?<br />
Але далі у функції по вказівнику, вибраному з таблиці, йде модифікація об’єкта. Щоб компілятор дав це зробити, автор додав приведення вказівника зі зняттям кваліфікатора:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Status GPDMA_Setup<span style="color: #009900;">&#40;</span>GPDMA_Channel_CFG_Type <span style="color: #339933;">*</span>GPDMAChannelConfig<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
<span style="display:block;background-color:#ffff66">&nbsp; &nbsp; LPC_GPDMACH_TypeDef <span style="color: #339933;">*</span>pDMAch<span style="color: #339933;">;</span><br /></span>&nbsp; ...<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Get Channel pointer</span><br />
<span style="display:block;background-color:#ffff66">&nbsp; &nbsp; pDMAch <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>LPC_GPDMACH_TypeDef <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> pGPDMACh<span style="color: #009900;">&#91;</span>GPDMAChannelConfig<span style="color: #339933;">-&gt;</span>ChannelNum<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br /></span>&nbsp; ...<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Clear DMA configure</span><br />
&nbsp; &nbsp; pDMAch<span style="color: #339933;">-&gt;</span>DMACCControl <span style="color: #339933;">=</span> <span style="color: #208080;">0x00</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pDMAch<span style="color: #339933;">-&gt;</span>DMACCConfig <span style="color: #339933;">=</span> <span style="color: #208080;">0x00</span><span style="color: #339933;">;</span></div></div>
<p>Знову помилку попереднього коду замасковано приведенням типу в наступному.</p>
<p>А треба ж було лишень правильно описати масив:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="display:block;background-color:#ffff66">LPC_GPDMACH_TypeDef <span style="color: #339933;">*</span> <span style="color: #993333;">const</span> pGPDMACh<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br /></span>&nbsp; &nbsp; &nbsp; &nbsp; LPC_GPDMACH0<span style="color: #339933;">,</span> &nbsp; <span style="color: #666666; font-style: italic;">// GPDMA Channel 0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LPC_GPDMACH1<span style="color: #339933;">,</span> &nbsp; <span style="color: #666666; font-style: italic;">// GPDMA Channel 1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LPC_GPDMACH2<span style="color: #339933;">,</span> &nbsp; <span style="color: #666666; font-style: italic;">// GPDMA Channel 2</span><br />
&nbsp; ...</div></div>
<p>Тепер ми маємо константний масив (ляже у флеш) вказівників на неконстантні об’єкти. Ніякого приведення типу у функції робити вже не треба.</p>
<p>Ще одне місце, тут вже знімається кваліфікатор <code class="codecolorer c default"><span class="c"><span style="color: #993333;">volatile</span></span></code>:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333;">static</span> <span style="color: #993333;">void</span> set_PinFunc <span style="color: #009900;">&#40;</span> <span style="color: #993333;">uint8_t</span> portnum<span style="color: #339933;">,</span> <span style="color: #993333;">uint8_t</span> pinnum<span style="color: #339933;">,</span> <span style="color: #993333;">uint8_t</span> funcnum<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">uint32_t</span> pinnum_t <span style="color: #339933;">=</span> pinnum<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">uint32_t</span> pinselreg_idx <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> portnum<span style="color: #339933;">;</span><br />
<span style="display:block;background-color:#ffff66">&nbsp; &nbsp; <span style="color: #993333;">uint32_t</span> <span style="color: #339933;">*</span>pPinCon <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">uint32_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>LPC_PINCON<span style="color: #339933;">-&gt;</span>PINSEL0<span style="color: #339933;">;</span><br /></span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>pinnum_t <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pinnum_t <span style="color: #339933;">-=</span> <span style="color: #0000dd;">16</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pinselreg_idx<span style="color: #339933;">++;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">uint32_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>pPinCon <span style="color: #339933;">+</span> pinselreg_idx<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;=</span> ~<span style="color: #009900;">&#40;</span>0x03UL <span style="color: #339933;">&lt;&lt;</span> <span style="color: #009900;">&#40;</span>pinnum_t <span style="color: #339933;">*</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">uint32_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>pPinCon <span style="color: #339933;">+</span> pinselreg_idx<span style="color: #009900;">&#41;</span> <span style="color: #339933;">|=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">uint32_t</span><span style="color: #009900;">&#41;</span>funcnum<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #009900;">&#40;</span>pinnum_t <span style="color: #339933;">*</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Для звертання до потрібного регістра зі структури береться вказівник на перший з однотипних регістрів, до нього додається індекс, по отриманому вказівникові проводиться запис.<br />
Але тип <code class="codecolorer c default"><span class="c">LPC_PINCON_TypeDef</span></code> має біля всіх полів модифікатор <code class="codecolorer text default"><span class="text">__IO</span></code> (макрос, що замінюється на <code class="codecolorer c default"><span class="c"><span style="color: #993333;">volatile</span></span></code>). Вказівник <code class="codecolorer c default"><span class="c">pPinCon</span></code> такого кваліфікатора не має. Попередження компілятора знову сховані за явним приведенням замість того, щоб відразу оголосити потрібний тип вказівника. І таких місць в бібліотеці багатенько.</p>
<p>Дану конкретну функцію я переписав так:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333;">static</span> <span style="color: #993333;">void</span> set_PinFunc <span style="color: #009900;">&#40;</span><span style="color: #993333;">uint8_t</span> portnum<span style="color: #339933;">,</span> <span style="color: #993333;">uint8_t</span> pinnum<span style="color: #339933;">,</span> <span style="color: #993333;">uint8_t</span> funcnum<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">uint32_t</span> pinbits <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> pinnum<span style="color: #339933;">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// 2 bits per pin</span><br />
&nbsp; &nbsp; __IO <span style="color: #993333;">uint32_t</span> <span style="color: #339933;">*</span>pPinCon <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>LPC_PINCON<span style="color: #339933;">-&gt;</span>PINSEL0 <span style="color: #339933;">+</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> portnum<span style="color: #339933;">;</span> &nbsp;<span style="color: #666666; font-style: italic;">// 2 regs per port</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>pinbits <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">32</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pinbits <span style="color: #339933;">-=</span> <span style="color: #0000dd;">32</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pPinCon<span style="color: #339933;">++;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #339933;">*</span>pPinCon <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>pPinCon <span style="color: #339933;">&amp;</span> ~<span style="color: #009900;">&#40;</span>0x03UL <span style="color: #339933;">&lt;&lt;</span> pinbits<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">uint32_t</span><span style="color: #009900;">&#41;</span>funcnum <span style="color: #339933;">&lt;&lt;</span> pinbits<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Використав той же модифікатор <code class="codecolorer c default"><span class="c">__IO</span></code>, яким позначено регістри <code class="codecolorer c default"><span class="c">PINSELx</span></code>. Ну і просто дещо скоротив запис, не змінивши функціонал.<br />
Все одно це мені не подобається, бо тут нема перевірки на припустимі значення всіх трьох аргументів. Якщо задати занадто великі числа, то будуть попсовані як мінімум біти режиму інших виводів процесора. А можна і до зовсім іншої периферії дістати. Якщо вже робити перевірку аргументів, як це зроблено в інших файлах бібліотеки, то і тут треба б.</p>
<p>Я вважаю, що чим жорсткіші перевірки робитиме компілятор і чим менше при цьому попереджень — тим краще. Менше шансів отримати проблеми при редагуванні коду чи зміні версії компілятора. Тому так старанно і передивлявся бібліотеку. І ще дивитимуся.</p>
<p>p.s. Мало не забув. Прикладаю файл з моїм патчем до бібліотеки <strong>LPC175x and LPC176x CMSIS-Compliant Standard Peripheral Firmware Driver Library (GNU, Keil, IAR) (Jun 21, 2011)</strong>, яка на даний момент знаходиться на сторінці <a class="linkext" href="http://ics.nxp.com/support/documents/microcontrollers/">підтримки мікроконтролерів NXP</a>.<br />
Купу повідомлень про порівнювання беззнакової змінної на невід’ємність не вичищав, бо для цього треба правити ще й відповідні макроси в h-файлах, глибше та уважніше копати. А я вже вирішив, що цю бібліотеку використовувати не буду, візьму лише h-файли, як джерело описів структур регістрів та констант номерв/масок бітів. Та й ті по дорозі перевіряттиму.<br />
Тож лише вичистив попередження про приведення типів. Та й то — більше з дослідницькою метою.</p>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/02/15/lpc175x-and-lpc176x-standard-peripheral-firmware-driver-library/feed/?langswitch_lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Розвернувся вітер</title>
		<link>http://real.kiev.ua/2012/02/12/rozvernuvsya-viter/</link>
		<comments>http://real.kiev.ua/2012/02/12/rozvernuvsya-viter/#comments</comments>
		<pubDate>Sun, 12 Feb 2012 18:54:34 +0000</pubDate>
		<dc:creator>ReAl</dc:creator>
				<category><![CDATA[Некатегоризовано]]></category>
		<category><![CDATA[Погода]]></category>

		<guid isPermaLink="false">http://real.kiev.ua/?p=1813</guid>
		<description><![CDATA[Це крім того, що просто морози вдарили. Офісний будинок не так, щоб зовсім на горі, але на підвищенні. П’ятий поверх. При ремонті десь хтось щось нахалтурив, пластикові вікна неправильно змонтували, &#8230; Ось результат: Термопара лежить на робочому столі (не на моєму, а на вільному, який найдалі від вікна). Це хвилин через десять після того, як [...]]]></description>
			<content:encoded><![CDATA[<p>Це крім того, що просто морози вдарили.<br />
Офісний будинок не так, щоб зовсім на горі, але на підвищенні. П’ятий поверх. При ремонті десь хтось щось нахалтурив, пластикові вікна неправильно змонтували, &#8230;<br />
Ось результат:</p>
<p><center><img src="http://real.kiev.ua/wp-content/uploads/2012/02/DSC00011.jpg" alt="Покази термопари в лабораторії" title="Покази термопари в лабораторії" width="256" height="255" class="aligncenter size-full wp-image-1814" /></center></p>
<p>Термопара лежить на робочому столі (не на моєму, а на вільному, який найдалі від вікна).<br />
Це хвилин через десять після того, як я вчора вранці на роботу прийшов. Спочатку взагалі вісім з копійками градусів показував.<br />
Потім я ввімкнув тепловентилятор і через півтори-дві години температура стабілізувалася на рівні трохи більше сімнадцяти градусів. То нормально, інакше довелося б знімати джемпера. Я й тепловентилятор на кіловаті залишив, досить того.</p>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/02/12/rozvernuvsya-viter/feed/?langswitch_lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Купити писачка</title>
		<link>http://real.kiev.ua/2012/02/07/kupyty-pysachka/</link>
		<comments>http://real.kiev.ua/2012/02/07/kupyty-pysachka/#comments</comments>
		<pubDate>Tue, 07 Feb 2012 10:46:55 +0000</pubDate>
		<dc:creator>ReAl</dc:creator>
				<category><![CDATA[Творчество]]></category>
		<category><![CDATA[Писачки]]></category>

		<guid isPermaLink="false">http://real.kiev.ua/?p=1793</guid>
		<description><![CDATA[Раніше я вже описав, навіть з відеоуроком, як можна самому зробити писачок. У мене під рукою були всі матеріали, від тонких мідних листочків до вже готових круглих паличок (зі старого дитячого ліжечка) та інструменти. І мені було легше і цікавіше зробити їх, ніж десь купляти. Але не всі хочуть і можуть зробити писачок самостійно, що [...]]]></description>
			<content:encoded><![CDATA[<p>Раніше я вже описав, навіть з відеоуроком, як можна самому <a class="linkint" href="/2011/04/19/pysachok/">зробити писачок.</a></p>
<p>У мене під рукою були всі матеріали, від тонких мідних листочків до вже готових круглих паличок (зі старого дитячого ліжечка) та інструменти. І мені було легше і цікавіше зробити їх, ніж десь купляти.<br />
Але не всі хочуть і можуть зробити писачок самостійно, що видно хоча б з логів сайту.<br />
<span id="more-1793"></span><br />
Одне з місць в Києві, де можна купити писачок, це кіоск художніх матеріалів в підземному станції метро Палац «Україна». Практично в центрі міста.</p>
<p>Зараз там є ось такі писачки:</p>
<p><center><img class="aligncenter size-full wp-image-1805" title="Писачки з кіоску біля станції метро «Палац Україна»" src="http://real.kiev.ua/wp-content/uploads/2012/02/I4520.jpg" alt="Писачки з кіоску біля станції метро «Палац Україна»" width="480" height="480" /></center></p>
<p>Класичну конструкцію покращено, додано металевого кожушка на паличку в місці закріплення конуса. Крім захисту від обгоряння ручки припаяний до конуса кожушок довше триматиме тепло.</p>
<p>Станом на початок лютого ціна на ці писачки була 25 гривень. Минулого року вибір був більший. Сподіваюся, ближче до Великодня з’являться і інші види.<br />
Можливо, десь на Петрівці і можна купити дешевше, але тут може бути простіше. І просто я не знаю інших місць <img src='http://real.kiev.ua/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Кіоск художніх матеріалів (N4) розміщено  в підземному переході від станції метро Палац «Україна» на протилежний від палацу бік вулиці «Велика Васильківська», між «мобілкоторгувальним» та «кавоварним»:</p>
<p><center><img class="aligncenter size-full wp-image-1806" title="Кіоск, в якому можна купити писачки." src="http://real.kiev.ua/wp-content/uploads/2012/02/I4519.jpg" alt="Кіоск, в якому можна купити писачки." width="640" height="480" /></center></p>
<p>Там є ще акрилові фарби, пластика і подібне. Зі слів сина — не дорожче, ніж на Петрівці.</p>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/02/07/kupyty-pysachka/feed/?langswitch_lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AVReAl/Linux и права администратора</title>
		<link>http://real.kiev.ua/2012/02/06/avreallinux-ta-prava-administratora/</link>
		<comments>http://real.kiev.ua/2012/02/06/avreallinux-ta-prava-administratora/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 21:17:14 +0000</pubDate>
		<dc:creator>ReAl</dc:creator>
				<category><![CDATA[USB-FTDI]]></category>
		<category><![CDATA[FT2232*]]></category>
		<category><![CDATA[FT232H]]></category>
		<category><![CDATA[FT4232H]]></category>
		<category><![CDATA[FTDI]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MPSSE]]></category>
		<category><![CDATA[udev]]></category>
		<category><![CDATA[USB]]></category>
		<category><![CDATA[программатор]]></category>

		<guid isPermaLink="false">http://real.kiev.ua/?p=1768</guid>
		<description><![CDATA[Изначально AVReAl/Linux работал с LPT напрямую, командами процессора для обращения к портам I/O. Для этого avreal должен запускаться с правами администратора. Позже была дописана поддержка работы с устройствами /dev/parport, для доступа к которым достаточно включить пользователя в группу lp. Всё это описано в публикации AVReAl и LPT в Linux. Когда в программу добавилась поддержка работы [...]]]></description>
			<content:encoded><![CDATA[<p>Изначально AVReAl/Linux работал с LPT напрямую, командами процессора для обращения к портам I/O. Для этого avreal должен запускаться с правами администратора. Позже была дописана поддержка работы с устройствами <code class="codecolorer text default"><span class="text">/dev/parport</span></code>, для доступа к которым достаточно включить пользователя в группу <code class="codecolorer text default"><span class="text">lp</span></code>. Всё это описано в публикации <a class="linkint" href="/2011/01/03/avreal-and-lpt-in-linux/">AVReAl и LPT в Linux.</a></p>
<p>Когда в программу добавилась поддержка работы с <a class="linkint" href="/2012/01/05/avreal-and-mpsse/">FTDI MPSSE</a>, я заметил, что без прав рута не выходит соединиться с микросхемой FT2232. Но у меня на компьютере все версии AVReAl работают от имени администратора, так как время от времени делается проверка работы с прямым доступом к LPT. Поэтому и с FT2232 всё работает и я не копал глубже.</p>
<p>Наконец-то решил разобраться с этим вопросом. Как это часто бывает, достаточно было немного почитать.</p>
<p>Для того, чтобы работать с микросхемами FTDI без привелегий администратора, нужно в каталог <code class="codecolorer text default"><span class="text">/etc/udev/rules.d/</span></code> записать файл с именем, например <code class="codecolorer text default"><span class="text">55-ftdi.rules</span></code>, такого содержания:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># FTDI-based devices</span><br />
<span style="color: #666666; font-style: italic;">#</span><br />
<span style="color: #666666; font-style: italic;"># FTDI vid=0403</span><br />
<span style="color: #666666; font-style: italic;"># FT2232, FT2232H: pid=6010</span><br />
<span style="color: #666666; font-style: italic;"># FT4232H:&nbsp; pid=6011</span><br />
<span style="color: #666666; font-style: italic;"># FT232H: &nbsp; pid=6014</span><br />
<span style="color: #007800;">SUBSYSTEM</span>==<span style="color: #ff0000;">&quot;usb&quot;</span>, ATTRS<span style="color: #7a0874; font-weight: bold;">&#123;</span>idVendor<span style="color: #7a0874; font-weight: bold;">&#125;</span>==<span style="color: #ff0000;">&quot;0403&quot;</span>, ATTRS<span style="color: #7a0874; font-weight: bold;">&#123;</span>idProduct<span style="color: #7a0874; font-weight: bold;">&#125;</span>==<span style="color: #ff0000;">&quot;6010|6011|6014&quot;</span>, <span style="color: #007800;">OWNER</span>=<span style="color: #ff0000;">&quot;root&quot;</span>, <span style="color: #007800;">GROUP</span>=<span style="color: #ff0000;">&quot;root&quot;</span>, <span style="color: #007800;">MODE</span>=<span style="color: #ff0000;">&quot;0666&quot;</span></div></div>
<p>Эти правила рассчитаны на микросхмему FTDI, которой не заменены vid/pid по умолчанию. Если используется адаптер с другими vid/pid, нужно добавить соответствующую строку в файл.</p>
<p>Пакет <a class="linkext" href="http://openocd.sourceforge.net/">OpenOCD</a> содержит файл правил для всех адаптеров, который он поддерживает. При использовании AVReAl с адаптером на микросхеме FTDI из этого списка можно просто перенести файл правил OpenOCD в каталог <code class="codecolorer text default"><span class="text">/etc/udev/rules.d/</span></code>. В правилах OpenOCD использовано <code class="codecolorer bash default"><span class="bash"><span style="color: #007800;">GROUP</span>=<span style="color: #ff0000;">&quot;plugdev&quot;</span>, <span style="color: #007800;">MODE</span>=<span style="color: #ff0000;">&quot;0664&quot;</span></span></code>. Но я не вижу разницы между этими двумя вариантами на «десктопе», где все пользователи по умолчанию включены в группу plugdev, чтобы они могли подключать USB-флешки и переносные диски.</p>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/02/06/avreallinux-ta-prava-administratora/feed/?langswitch_lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

