<?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=en" 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>en</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[Uncategorized]]></category>
		<category><![CDATA[programmer]]></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=en</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[Nature]]></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=en</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[Uncategorized]]></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=en</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[Updates]]></category>
		<category><![CDATA[AVR]]></category>
		<category><![CDATA[programmer]]></category>

		<guid isPermaLink="false">http://real.kiev.ua/?p=1874</guid>
		<description><![CDATA[avreal v1.28r10 (Sun 2012-04-29) has been released. Error in EEPROM size for ATmega328, ATmega328P &#8212; fixed. Alias for ATtiny84A added.]]></description>
			<content:encoded><![CDATA[<p>avreal <a class="linkint" href="/avreal/download#128R10">v1.28r10 (Sun 2012-04-29)</a> has been released.</p>
<ul>
<li>Error in EEPROM size for ATmega328, ATmega328P &#8212; fixed.</li>
<li>Alias for ATtiny84A added.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/04/29/avreal-update-1-28r10/feed/?langswitch_lang=en</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[News]]></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[At April, 4 (04.04.2012) scmRTOS 4.0 has been released. Previous version (3.10 + fixes for known bugs) is saved in scmrtos/tags/3.11. New version is fixed in scmrtos/tags/4.00 and will be developed further in scmrtos/trunk. Waht&#8217;s new in scmRTOS 4.0 over version 3.11: Type aliases byte, word, dword replaced by uint8_t, uint16_t, uint32_t from stdint.h. In [...]]]></description>
			<content:encoded><![CDATA[<p>At April, 4 (04.04.2012) scmRTOS 4.0 has been released.</p>
<p>Previous version (3.10 + fixes for known bugs) is saved in <a class="linkext" href="http://scmrtos.svn.sourceforge.net/viewvc/scmrtos/tags/3.11/">scmrtos/tags/3.11</a>.</p>
<p>New version is fixed in <a class="linkext" href="http://scmrtos.svn.sourceforge.net/viewvc/scmrtos/tags/4.00/">scmrtos/tags/4.00</a> and will be developed further in <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">Waht&#8217;s new in scmRTOS 4.0</a>  over version 3.11:</p>
<ul>
<li>Type aliases <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> replaced by <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> from <code class="codecolorer text default"><span class="text">stdint.h</span></code>. In some cases &#8220;fast&#8221; types like <code class="codecolorer c default"><span class="c"><span style="color: #993333;">uint_fast8_t</span></span></code> used for optimal compilation. <code class="codecolorer text default"><span class="text">stdint.h</span></code> header included in <code class="codecolorer text default"><span class="text">scmRTOS.h</span></code></li>
<li>New naming conventions. The user has to rename appropriate functions and type names in his code for using 3.xx-style sources with new OS (see below).</li>
<li><code class="codecolorer text default"><span class="text">architecture/compiler/family</span></code> hierarchy now used for samples&#8217;s repository directories and archive names on <a class="linkext" href="http://sourceforge.net/projects/scmrtos/files/scmrtos/scmRTOS%204.00/">scmRTOS download page</a>.</li>
<li>Process restart functionality added.</li>
<li>Program debug and profiling features added:
<ul>
<li>determining the amount of process&#8217;s free stack space,</li>
<li>profiling of process execution time,</li>
<li>determining the address of service object that the process is waiting for.</li>
</ul>
</li>
<li>4-Debug sample is added for new features demonstration.</li>
<li>Class TKernelAgent and OS extensions mechanism. Class TProfiler as extension example.</li>
<li>OS class hierarchy changed. All OS services are descendents of the class TService which is descendant of the class TKernelAgent. OS user is able to create it&#8217;s own services.</li>
<li>STM8/IAR port and STM8/IAR/STM8S samples added.</li>
<li>CortexM3/GCC/LPC17xx samples 1-EventFlag and 4-Debug added.</li>
<li>Support for devices with more than 128K flash (ATmega256x) added in AVR/GCC and AVR/IAR ports for <a class="linkext" href="http://www.atmel.com/products/microcontrollers/avr/megaAVR.aspx">megaAVR</a>.</li>
<li>CortexM3/IAR examples removed from OS because a lack of contributors.</li>
<li>Fujitsu MB91 port no longer supported.</li>
<li>ARM7/IAR port is currently not supported.</li>
</ul>
<p>To simplify the <a class="linkext" href="http://scmrtos.sourceforge.net/Migration_Guide">scmRTOS 3.xx to 4.xx migration process</a> the special header file is offered: <code class="codecolorer text default"><span class="text">scmRTOS_310_compat.h</span></code>. The file contains some aliases for old type names and enables compatibility mode in all OS sources. In compatibility mode two types of inline adapter functions defined:</p>
<ul>
<li>For user code: from old-style names to new-style names like from <code class="codecolorer c default"><span class="c">Sleep<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> to <code class="codecolorer c default"><span class="c">sleep<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> in new OS code.</li>
<li>For OS code: from new-style names to old-style names like from <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> to <code class="codecolorer c default"><span class="c">SystemTimerUserHook<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> in old user&#8217;s code.</li>
</ul>
<p>Because of the adapter functions the user just should change process&#8217;s <code class="codecolorer c default"><span class="c">Exec<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> function name to <code class="codecolorer c default"><span class="c">еxec<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> and old code will work.</p>
<p><code class="codecolorer text default"><span class="text">scmRTOS_310_compat.h</span></code> must be included in project-level configuration file <code class="codecolorer text default"><span class="text">scmRTOS_CONFIG.h</span></code>. Also, add there two typedef definitions &#8212; for system tick counter <code class="codecolorer c default"><span class="c">tick_count_t</span></code> and for timeouts and sleep time <code class="codecolorer c default"><span class="c">timeout_t</span></code>.</p>
<p>See 3-Channel sample in <a class="linkext" href="http://scmrtos.svn.sourceforge.net/viewvc/scmrtos/trunk/Samples/AVR/GCC/MEGA/3-Channel/">AVR/GCC</a> and <a class="linkext" href="http://scmrtos.svn.sourceforge.net/viewvc/scmrtos/trunk/Samples/AVR/IAR/MEGA/3-Channel/">AVR/IAR</a> ports as example of using scmRTOS v3.xx oriented code with scmRTOS v4.00 in compatibility mode.</p>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/04/09/scmrtos-4-0-release/feed/?langswitch_lang=en</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[News]]></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=en</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=en</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[Uncategorized]]></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=en</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[Creative Work]]></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=en</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AVReAl/Linux and root privileges</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[programmer]]></category>

		<guid isPermaLink="false">http://real.kiev.ua/?p=1768</guid>
		<description><![CDATA[Originally AVReAl/Linux worked with LPT directly, by processor in/out instructions. This method requires root privileges. Later /dev/parport support was added. It is enough to add a user in lp group for this access method. Both ways are described in AVReAl and LPT in Linux post. Then FTDI MPSSE support was added. I noticed that without [...]]]></description>
			<content:encoded><![CDATA[<p>Originally AVReAl/Linux worked with LPT directly, by processor in/out instructions. This method requires root privileges. Later <code class="codecolorer text default"><span class="text">/dev/parport</span></code> support was added. It is enough to add a user in <code class="codecolorer text default"><span class="text">lp</span></code> group for this access method. Both ways are described in <a class="linkint" href="/2011/01/03/avreal-and-lpt-in-linux/">AVReAl and LPT in Linux</a> post.</p>
<p>Then <a class="linkint" href="/2012/01/05/avreal-and-mpsse/">FTDI MPSSE</a> support was added. I noticed that without administrator rights the program can&#8217;t connect to FT2232 chip. But all AVReAl versions on my PC run with root priveleges because it is required for LPT direct acces testing. So, the program works fine with FTDI chips and I had no need to dig deeper.</p>
<p>Finally I decided to investigate the matter. As often happens, to do right you just stop and spend a little time to read and think.</p>
<p>To work with FTDI-based programmers without root priveleges add a file named, for example <code class="codecolorer text default"><span class="text">55-ftdi.rules</span></code> to directory <code class="codecolorer text default"><span class="text">/etc/udev/rules.d/</span></code>. The file must have the following content:</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>You need not reboot. It is enough to reconnet the programming adapter.</p>
<p>The rules use default vid/pid for FTDI chips. If you use an adapter with different vid/pid, add appropriate line into the file. </p>
<p><a class="linkext" href="http://openocd.sourceforge.net/">OpenOCD</a> contains a file with rules for all adapters supported by this program. If FTDI-based adapter listed in the file is used with AVReAl, you can simply copy the file into <code class="codecolorer text default"><span class="text">/etc/udev/rules.d/</span></code> directory. OpenOCD rules use <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>. As for me it is no difference between this two variants for desktop PC because all users are already included in plugdev group.</p>
<p>Of course, you must have administrator rights to create the file. After that you will be able to work with AVReAl without root privileges.</p>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/02/06/avreallinux-ta-prava-administratora/feed/?langswitch_lang=en</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

