<?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=uk" 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>uk</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=uk</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=uk</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=uk</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=uk</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> для оптимальної компіляції на різних архітектурах. Файл <code class="codecolorer text default"><span class="text">stdint.h</span></code> включено в <code class="codecolorer text default"><span class="text">scmRTOS.h</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>
<hr width="25%" align="left">
<p>З наявних недоліків — на wiki проекту відсутні сторінки для STM8. Це моя провина і я її (поступово) виправлятиму.</p>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/04/09/scmrtos-4-0-release/feed/?langswitch_lang=uk</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=uk</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=uk</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=uk</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=uk</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 напряму, командами процесора для доступу до портів вводу/виводу. Для цього потрібні права адміністратора і avreal встановлюється з параметрами власника та групи root та піднятим SUID-бітом. Пізніше було дописано підтримку роботи з пристроями /dev/parport, для доступу до яких достатньо включити користувача в групу lp. Все це описано у публікації [...]]]></description>
			<content:encoded><![CDATA[<p>Від самого початку AVReAl/Linux працював з LPT напряму, командами процесора для доступу до портів вводу/виводу. Для цього потрібні права адміністратора і avreal встановлюється з параметрами власника та групи root та піднятим SUID-бітом. Пізніше було дописано підтримку роботи з пристроями <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>Якщо програматор було підключено, його слід відключити та знову підключити до комп’ютера. Перезавантажуватися непотрібно.</p>
<p>Правила написано з розрахунку на мікросхему FTDI, якій записом в конфігураційній EEPROM не замінено 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>
<p>Звісно, щоб записати цей файл, права адміністратора знадобляться. Але після цього AVReAl працюватиме від імені будь-якого користувача.</p>
]]></content:encoded>
			<wfw:commentRss>http://real.kiev.ua/2012/02/06/avreallinux-ta-prava-administratora/feed/?langswitch_lang=uk</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

