<?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>Блог НТЦ Метротек &#187; cortex-m3</title>
	<atom:link href="http://blog.metrotek.spb.ru/tag/cortex-m3/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.metrotek.spb.ru</link>
	<description>блог разработчиков</description>
	<lastBuildDate>Sat, 21 Jan 2012 12:36:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>USB сеть на Cortex-M3</title>
		<link>http://blog.metrotek.spb.ru/2011/07/07/usb-set-na-cortex-m3/</link>
		<comments>http://blog.metrotek.spb.ru/2011/07/07/usb-set-na-cortex-m3/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 06:35:42 +0000</pubDate>
		<dc:creator>Николай Замотаев</dc:creator>
				<category><![CDATA[b5]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[софт]]></category>
		<category><![CDATA[cortex-m3]]></category>
		<category><![CDATA[ethernet]]></category>
		<category><![CDATA[usb]]></category>
		<category><![CDATA[круто]]></category>

		<guid isPermaLink="false">http://blog.metrotek.spb.ru/?p=2849</guid>
		<description><![CDATA[В процессе разработки наших мега-дивайсов возник вопрос о реализации захвата пакетов с карты и использования ip-utils (ping/traceroute и тд) с карты.  Из нескольких возможных вариантов, было решено пойти средствами операционной системы и реализовать в дополнение к основному последовательному интерфейсу ещё и два сетевых (по количеству ethernet-портов модуля b5-gbe, для которого мы сейчас пишем софт). Такой [...]]]></description>
			<content:encoded><![CDATA[<p>В процессе разработки наших мега-дивайсов возник вопрос о реализации захвата пакетов с карты и использования ip-utils (ping/traceroute и тд) с карты.  Из нескольких возможных вариантов, было решено пойти средствами операционной системы и реализовать в дополнение к основному последовательному интерфейсу ещё и два сетевых <span id="more-2849"></span>(по количеству ethernet-портов модуля b5-gbe, для которого мы сейчас пишем софт).</p>
<p>Такой подход позволяет использовать стандартные средства ping и traceroute.</p>
<p>Для реализации сетевого интерфейса (как собственно и консоли карты) использовался любимый нами USB-шный класс CDC (Communication Device Class). В этот класс входят подклассы позволяющие реализовать интерфейсы к телефонным линиям, модемы и сетевые карты (проводные и беспроводные). Большим плюсом использования стандартного класса USB-устройства, является отсутствие необходимости писать драйвера (в Linux/*nix, Windows всё равно требует хотя бы .inf файл).</p>
<p>Так вот сетевых устройств в классе CDC может быть несколько видов. Это подклассы ECM,EEM, NCM и вариации на тему ACM (вместе с rndis), которые так любит windows. Устройства отличаются степенью поддержки операционной системы, степенью документированности и некоторыми другими особенностями.</p>
<p>Итак:</p>
<ul>
<li>Rndis &#8212; нестандартная вариация на тему ACM. Вообще-то подкласс ACM &#8212; это последовательный порт или модем, но microsoft, традиционно наплевав на все имеющиеся стандарты создала собственный. Rndis, по своей сути, представляет собой реализацию ndis API поверх usb. Используется microsoft-ом и в КПК под windows mobile для синхронизации и связи с компьютером. Так как этот класс не полностью документирован, да и не стандартен &#8212; это не наш путь.</li>
<li>ECM &#8212; Ethernet Control Model &#8212; это реализация сетевой карты (в стандарте есть поддержка проверка состояния линка, мак-адрес карты хранится в дескрипторе и тд). Данный стандарт требует двух интерфейсов: для передачи данных и управляющего. За терминологией обращаться на <a href="http://usb.org">usb.org</a> или сюда: <a href="http://www.beyondlogic.org/usbnutshell/usb1.shtml">http://www.beyondlogic.org/usbnutshell/usb1.shtml</a>. Вторая ссылка намного короче и более просто расписана :).</li>
<li>EEM &#8212; это Ethernet Emulation Model &#8212; в этом случае USB используется исключительно как транспорт ethernet пакетов. Состояние линка не передаётся, скорость не настраивается и так далее. Зато интерфейс просто и для него нужно только 2 endpoint-а.</li>
</ul>
<p>Отсюда мы и подходим к выбору варианта сетевого интерфейса. Тут всё оказалось совсем просто &#8212; для реализации ECM нам просто не хватило доступных endpoint-ов в контроллере. Так что выбор остановился на EEM. Даже с ним, доступные 6 endpoint-ов, разделились полностью, и пришлось слегка обмануть реализацию консоли, указав в дескрипторе несуществующий endpoint.</p>
<p>Так вот, в stm32f105 есть 6 доступных endpoint-ов, не считая нулевого (по 3 IN и OUT). В итоге хватает впритык и резерва не остаётся. Для ECM уже endpoint-ов не хватает, так как под эту модель требуется по 3 endpoint-а на интерфейс.</p>
<p>Передача данных в модели EEM, или как же это заставить работать&#8230;.</p>
<p>Для того, чтобы сетевое устройство с классом EEM зарегистрировалось в системе, достаточно правильно написать USB дескриптор. Создаётся интерфейс состоящий из двух bulk endpoint-ов, одного IN и одного OUT, ему приписывается класс CDC (0&#215;02), подкласс EEM (0x0c), и протокол EEM (0&#215;07). На этом все тонкости и заканчиваются. Пакеты в EEM передаются как есть, в виде ethernet фреймов, с дописанным в начале двухбайтным заголовком.</p>
<p>Выглядит он так:</p>
<table border="1">
<tbody>
<tr>
<td style="text-align: center" colspan="3">Биты</td>
</tr>
<tr>
<td>15</td>
<td>14</td>
<td>13-0</td>
</tr>
<tr>
<td>Команда/данные</td>
<td>CRC &#8212; используется или  fake</td>
<td>Длина кадра</td>
</tr>
</tbody>
</table>
<p>Пятнадцатый бит определяет &#8212; является ли этот кадр данными идущими в интерфейс или служебной командой EEM. Всего есть 6 команд, из которых обязательными являются только Echo и Echo response. (Хотя как выяснилось, линуксовый драйвер, даже без реализации разбора этих команд вполне нормально работает).</p>
<p>Четырнадцатый бит определяет, используется ли реальный подсчёт CRC, или на месте CRC передаётся последовательносьт 0xdeadbeef.</p>
<p>Оставшиеся биты кодируют длину фрейма следующего за этими двумя байтами заголовка.</p>
<p>После реализации разбора заголовков, приём и передача заработали без проблем, за исключением того, что USB-шная библиотека от ST не позволяет реализовать USB-transfer длинее чем размер FIFO в stm32, а ethernet пакеты в EEM нельзя разбивать между transfer-ами.<br />
Таким образом, сейчас реализован приём и передача пакетов до 254 байт длиной. Пропускная способность не измерялась.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.metrotek.spb.ru/2011/07/07/usb-set-na-cortex-m3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>О бедном WIZnet&#8217;e замолвите слово</title>
		<link>http://blog.metrotek.spb.ru/2011/03/28/o-bednom-wiznet-e-zamolvite-slovo/</link>
		<comments>http://blog.metrotek.spb.ru/2011/03/28/o-bednom-wiznet-e-zamolvite-slovo/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 17:43:01 +0000</pubDate>
		<dc:creator>Николай Замотаев</dc:creator>
				<category><![CDATA[интересное]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[cortex-m3]]></category>
		<category><![CDATA[ethernet]]></category>
		<category><![CDATA[железо]]></category>
		<category><![CDATA[круто]]></category>

		<guid isPermaLink="false">http://blog.metrotek.spb.ru/?p=2677</guid>
		<description><![CDATA[В процессе разработки одного из проектов у нас возникла задача передать поток данных 2Mbit/s через Ethernet в виде udp-потока. Так как сроки были ограничены, развести плату &#171;под задачу&#187; с нормальным ethernet-контроллером, оказалось невозможным. В результате, за основу была взята уже имеющаяся карта от прибора Беркут-ММТ c установленным на борту контроллером WIZnet W5100. Этот контроллер уже [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.wiznet.co.kr/Sub_Modules/en/product/Product_Detail.asp?cate1=5&#038;cate2=7&#038;cate3=26&#038;pid=1011"><br />
<img src="http://blog.metrotek.spb.ru/wp-content/uploads/2011/03/wiznet.jpg" alt="" title="wiznet" width="140" height="140" class="alignleft size-full wp-image-2700" /></a> В процессе разработки одного из проектов у нас возникла задача передать поток данных 2Mbit/s через Ethernet в виде udp-потока. Так как сроки были ограничены, развести плату &#171;под задачу&#187; с нормальным ethernet-контроллером, оказалось невозможным. В результате, за основу была взята уже имеющаяся карта от прибора <a href="http://metrotek.spb.ru/b4.html">Беркут-ММТ</a> c установленным на борту контроллером <a href="http://www.wiznet.co.kr/Sub_Modules/en/product/Product_Detail.asp?cate1=5&#038;cate2=7&#038;cate3=26&#038;pid=1011">WIZnet W5100</a>. Этот контроллер уже применялся в других проектах и ничто не предвещало беды&#8230;<span id="more-2677"></span></p>
<p>Тут следует рассмотреть, что же из себя представляет контроллер WIZnet  W5100. В далёкие времена, когда контроллеры были 8-битными, памяти было мало, а реализация TCP/IP требовалась, появились микросхемы реализующие аппаратно стек TCP/IP. Вроде бы хорошая вещь и, например, для дистанционного управления устройством вполне подходит, позволяя не задумываться о тонкостях протокола TCP/IP, но у всего есть свои ограничения. О том нужны ли такие контроллеры сейчас, при наличии свободно распространяемых IP-стеков для микроконтроллеров и больших объёмах памяти &#8212; вопрос спорный и, возможно, заслуживающий отдельной статьи.</p>
<p>И тут мы подходим к тому, что же у нас пошло не так. W5100 можно подключить по трём возможным интерфейсам: двум разновидностям параллельного и по SPI. В нашем случае, для экономии выводов контроллера и упрощения подключения, wiznet подключили по SPI. О производительности в тот момент просто не задумывались, так как сразу использовать его планировалось только для дистанционного управления.</p>
<p>Когда же возникла потребность прогнать через wiznet 2Мбит/с данных, этот вопрос встал в полный рост. И тут в дело вступили ограничения чипа. Как оказалось, максимальная тактовая частота по SPI для wiznet была ограничена 14-ю мегагерцами. Это не было бы проблемой, если бы wiznet поддерживал burst режим и позволял гнать данные непрерывным потоком. Но тут в дело вступило ещё одно ограничение интерфейса SPI у wiznet&#8217;а &#8212; каждая SPI транзакция у него должна состоять ровно из 4-х байт и содержать код операции, два байта адреса и один байт данных. То есть, на каждый байт полезной нагрузки требовалось передавать 3 байта дополнительных данных. И это &#8212; не считая управляющих транзакций, которые передаются по той же схеме. Максимальная пропускная способность, которую мы считали равной 14Мбит/с, оказалась в 4 (!!!) раза меньше и оказалась 3.5Мбит/с.</p>
<p>Второй проблемой оказался SPI-контроллер в процессоре <a href="http://st.com">STM32</a> &#8212; делители частоты в нём могут быть только степенью 2. В результате на максимальной тактовой частоте процессора, которую мы использовали до того времени, частота шины к wiznet&#8217;у оказалась только 9 мегагерц.</p>
<p>Помимо проблемы передачи данных к wiznet&#8217;у так же требовалось эти данные получить из контроллера линии E1. К счастью, решение, использованное для чтения данных из E1, поддерживало burst-режим передачи данных. Попытки получить максимальную возможную скорость передачи к wiznet&#8217;у привели к использованию следующей схемы передачи данных:</p>
<ol>
<li> Из E1 данные вытягиваются по SPI с помощью контроллера DMA, встроенного в процессор STM32. Так как посылки имеют большую длину, DMA работает с высокой эффективностью и накладные расходы невелики.</li>
<li>Данные в wiznet передаются без использования DMA или прерываний, так как это резко снижает производительность на коротких посылках в связи с высокими накладными расходами.</li>
<li>Для получения возможности одновременной передачи данных в wiznet и приёма данных с линии E1 введена двойная буферизация.</li>
<li>Основное ограничение по времени &#8212; это передача данных в wiznet, в связи с тем, что приём данных из E1 практически не требует процессорного времени.</li>
</ol>
<p>В результате всех этих исследования мы пришли к следующим выводам:</p>
<ol>
<li> Иногда целесообразном снизить тактовую частоту процессора с целью повышения производительности передачи данных по внешним интерфейсам.</li>
<li>DMA у контроллера STM32 эффективно можно использовать только при достаточно длинных транзакциях. Для случая коротких (4 байта ) транзакций потери в скорости слишком велики.</li>
</ol>
<p>В итоге мы смогли получить требуемые 2Мбит/с с небольшим резервом, используемым для целей удалённого управления, а так же как &#171;запас прочности&#187;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.metrotek.spb.ru/2011/03/28/o-bednom-wiznet-e-zamolvite-slovo/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Загружаем прошивку в Stm32f105 по USB</title>
		<link>http://blog.metrotek.spb.ru/2010/04/14/zagruzhaem-proshivku-v-stm32f105-po-usb/</link>
		<comments>http://blog.metrotek.spb.ru/2010/04/14/zagruzhaem-proshivku-v-stm32f105-po-usb/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 05:55:58 +0000</pubDate>
		<dc:creator>Николай Замотаев</dc:creator>
				<category><![CDATA[b4]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[cortex-m3]]></category>
		<category><![CDATA[usb]]></category>

		<guid isPermaLink="false">http://blog.metrotek.spb.ru/?p=1875</guid>
		<description><![CDATA[После того, как фирма Atmel подкачала со сроками поставок процессоров Sam3U встал вопрос о выборе нового процессора. Выбор пал на семейство процессоров stm32f10x от фирмы ST Microelectronics, а конкретно&#160;&#8212; на процессор stm32f105. Одним из особенностей этого процессора является то, что он может загружать в себя прошивку через USB-интерфейс по протоколу DFU (используя собственный загрузчик, находящийся [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.metrotek.spb.ru/wp-content/uploads/2010/03/stm32f105.jpg"><img src="http://blog.metrotek.spb.ru/wp-content/uploads/2010/03/stm32f105-150x150.jpg" alt="Отладочная плата" title="debug board for stm32f105" width="150" height="150" class="alignleft size-thumbnail wp-image-1892" /></a> После того, как фирма <a href="http://atmel.com">Atmel</a> подкачала со сроками поставок процессоров <a href="http://www.atmel.com/sam3u">Sam3U</a> встал вопрос о выборе нового процессора. Выбор пал на семейство процессоров stm32f10x от фирмы <a href="http://www.st.com">ST Microelectronics</a>, а конкретно&nbsp;&mdash; на процессор <a href="http://www.st.com/stonline/stappl/productcatalog/app?path=/comp/stcom/PcStComOPNTableView.onTheClickOfOPNLink&amp;code=223272">stm32f105</a>. Одним из особенностей этого процессора является то, что он может загружать в себя прошивку через USB-интерфейс по протоколу DFU (используя собственный загрузчик, находящийся в ROM).</p>
<p><a href="http://wiki.openmoko.org/wiki/USB_DFU">DFU</a>&nbsp;&mdash; или Device Firmware Upgrade&nbsp;&mdash;  это протокол для обновления прошивок по USB. Главные его преимущества в том, что он определён спецификацией USB и в том, что он достаточно прост. Вот только реализация этого протокола от <a href="http://www.st.com">ST</a> оказалась не совсем стандартной. В результате вместо того, чтобы использовать готовую утилиту из проекта <a href="http://www.openmoko.org">OpenMoko</a> (dfu-util), её пришлось переписывать.</p>
<p>Утилита умеет загружать прошивку в RAM и FLASH, и запускать её на исполнение.</p>
<p>Ах, да, самое главное  &#8212; исходники лежат <a href="http://metrotek.spb.ru/files/sources/dfu-util-stm32f10.tar.bz2">здесь</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.metrotek.spb.ru/2010/04/14/zagruzhaem-proshivku-v-stm32f105-po-usb/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>FreeRTOS на Sam3u</title>
		<link>http://blog.metrotek.spb.ru/2010/03/10/freertos-na-sam3u/</link>
		<comments>http://blog.metrotek.spb.ru/2010/03/10/freertos-na-sam3u/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 05:47:02 +0000</pubDate>
		<dc:creator>Артём Двинин</dc:creator>
				<category><![CDATA[интересное]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[софт]]></category>
		<category><![CDATA[cortex-m3]]></category>
		<category><![CDATA[embedded]]></category>

		<guid isPermaLink="false">http://blog.metrotek.spb.ru/?p=1852</guid>
		<description><![CDATA[Решили мы как-то попробовать какой-нибудь микроконтроллер, для замены устаревающих Avr&#8217;ов, выбор пал на SAM3U.  В качестве теста выступила демонстрационная программа от операционной системы FreeRTOS . А что из этого вышло можно прочитать в статье FreeRTOS на Sam3u.]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.metrotek.spb.ru/wp-content/uploads/2010/03/Sam3U-loupe22.jpg"><img class="alignleft size-full wp-image-1862" src="http://blog.metrotek.spb.ru/wp-content/uploads/2010/03/Sam3U-loupe22.jpg" alt="" width="200" height="150" /></a> Решили мы как-то попробовать какой-нибудь микроконтроллер, для замены устаревающих Avr&#8217;ов, выбор пал на <a title="http://www.atmel.com/products/AT91/sam3landing.asp?family_id=605" rel="nofollow" href="http://www.atmel.com/products/AT91/sam3landing.asp?family_id=605">SAM3U</a>.  В качестве теста выступила демонстрационная программа от операционной системы <a title="http://www.freertos.org" rel="nofollow" href="http://www.freertos.org/">FreeRTOS </a>. А что из этого вышло можно прочитать в статье <a title="FreeRTOS на Sam3u" href="http://wiki.metrotek.spb.ru/wiki/FreeRTOS_%D0%BD%D0%B0_Sam3u">FreeRTOS на Sam3u.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.metrotek.spb.ru/2010/03/10/freertos-na-sam3u/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

