Как работает ЦПУ (CPU) AVR

👁 70 просмотров

Очень значимо понимание работы ЦПУ (Центральное Процессорное Устройство) для понимания и хорошего освоения языка ассемблера. ЦПУ читает инструкции (берет инструкцию) из программной памяти (FLASH – память), транслирует его во внутренние выполняемые шаги и выполняет ее. В AVR каждая инструкция имеет длину в 16 бит внутри FLASH – памяти и читаются оттуда за один шаг (за один такт тактового генератора). Если проследить весь этап работы ЦПУ, то это будет выглядеть вот так:

  • команда читается(первый шаг);
  • транслируется(второй шаг);
  • читается числа из программной памяти в регистры R0 и R1, подставляя на входы АЛУ(третий шаг);
  • суммирует их(четвертый шаг);
  • записывает результат в регистр R0(пятый шаг).

Регистры представляют из себя простые 8 – битные хранилища, которыми может управлять АЛУ, читая или записывая из них информацию. Пример кодирования инструкции продемонстрирован на нижеуказанном примере

Операции ЦПУ Код (binary) Код (hex)
Отправка ЦПУ в спячку 1001.0101.1000.1000 9588
Суммировать значения в регистрах R1 и R0 0000.1100.0000.0001 0C01
Вычесть значение регистра R1 из значения регистра R0 0001.1000.0000.0001 1801
Записать константу 170 в регистр R16 1110.1010.0000.1010 EA0A
Умножить значение регистра R3 со значением регистра R2 и записать значение в регистр R1 (MSB) и
R0 (LSB)
1001.1100.0011.0010 9C32

Итак, если ЦПУ читает число 9588 из FLASH – памяти, то ЦПУ больше не делает выборку инструкции. После каждой выборки счетчик команд увеличивается а единицу. Счетчик команд – это специальный регистр, который недоступен пользователю для записи, в нем храниться номер текущей команды в памяти программы. Он необходимо для создания условных и безусловных переходов внутри программы в пределах все области программной памяти.
Когда ЦПУ читает 0C01, то R0 и R1 суммируются и результат записывается в регистр R0. Данная операция продемонстрирована на рисунке
avr-hardware-how-toworkavr-cpu1.    Сперва читается инструкция с размером в 16 битное слово из памяти FLASH и транслируется в выполняемый шаг;
2.    Следующий шаг соединяет регистры R0 и R1 со входами АЛУ и АЛУ суммирует их содержимое;
3.    Далее результат записывается обратно в регистр R0.

Когда ЦПУ читает 9C23 из FLASH, то регистры R3 и R2 перемножаются и результат перезаписывается в R1(верхний 8 бит) и R0(нижний 8 бит). Если АЛУ не оборудован на аппаратном уровне устройством перемножения (как в ATtiny13), то с числом 9C23 ничего не делается.
В принципе ЦПУ может выполнить 65.536(16 – битных) различных инструкций из-за двухбайтовой системы команды во FLASH-памяти.
Когда записываем 170, то он должен быть записан в определенный регистр. Записываемое число в регистр может быть в пределах от 0 до 255 и может быть записан в любой регистр между R16 и R31.

 

 

Аппаратная часть микроконтроллеров AVR

👁 79 просмотров

Что имеет аппаратная часть и что может с ассемблером? Ассемблер позволяет нам через код управлять и получить контроль на ресурсами процессора. Ресурсы представлены такими компонентами, как:

  • центральное процессорное устройство (ЦПУ) и его математические «прислуги», арифметические и логические устройства(АЛУ);
  • различные устройства хранения информации (внутренний и внешний RAM и EEPROM – памяти);
  • регистры, которые контролируют порты ввода и вывода, таймеры, АЦП – конверторы и другие функциональные устройства.

Доступность через ассемблер – это значит прямо доступный и не через драйверы или интерфейсы, которых предоставляет операционные системы. Это значит, что вы контролируете последовательный интерфейс или АЦП без каких –либо промежуточных прослоек между вашим кодом и аппаратной частью микроконтроллера.

Зачем учить ассемблер для AVR

👁 98 просмотров

Ассемблер или другие языки? Xто выбрать? Почему я должен выучить еще один язык, если уже выучил другие языки? Лучший ответ — это следующий аргумент: когда вы знаете английский и живете во Франции и общаетесь там на английском, то чувство неудобства общения никогда вас не покинет. Это потому что во Франции первоочередным и приоритетным будет является французский язык, на котором вас поймут где угодно в пределах страны.

Замечание! Данный курс по программированию микроконтроллеров не распространяется на процессоры ПК с операционными системами Linux/ Windows/Mac, не распространяется на обучение программирование сложных систем на подобие Ethernet, а отвечает только требованиям, которые необходимы для начинающих программировать на языке ассемблер без каких-либо языков высокого уровня.

Много разработчиков, имеющих большой опыт программирования для AVR и которые используют высокоуровневые языки(C/C++. Basic, Pascal…) в повседневной их работе рекомендует начинающим учить AVR на основе языка ассемблер. Причинами этого, чаще всего, являются следующие случаи:

  • если требуется легко анализировать возникающие ошибки;
  • если программа выполняется по другому, чем заранее проектировалась и ожидалась;
  • если высокоуровневый язык не поддерживает управление или команды для какой-то аппаратной части микроконтроллера;
  • если в программе есть критические ко времени выполнения места, где требуется быстрота выполнения.

все необходимости должны решиться после изучения и понимания языка ассемблер. Это даст хорошее понимание того, во что переводиться код высокоуровневого языка после компиляции.
Без знания ассемблерного языка будет трудно понимать принципиальные особенности работы микроконтроллера.

Краткий и легкий

Инструкции языка ассемблера переводятся один в один в инструкции машинного языка. Процессору нужно только выполнять то, что вы хотите от него и то что необходимо для выполнения задачи. При этом, в коде не генерируются дополнительные циклы, ненужные функции, которые могли бы увеличить размер кода. Эта проблема актуальна при трансляции с языка высокого уровня в язык ассемблера в процессе компиляции. Если вы пишете программу для микроконтроллера с низкой памятью и с маломощными характеристиками, то лучшим решением для написания кода является ассемблер, который займет меньше места и выполниться быстро, давая возможность легко выявлять ошибки.

Быстрый и скоростной

Потому что выполняется только необходимый код шаг за шагом, за счет чего программа выполняется очень быстро. Продолжительность каждого шага известна и, обычно, он равен одному такту тактового резонатора. Критические ко времени программы, такие как измерители сигналов времен без аппаратного таймера, которые должны выполняться превосходно, должны быть написаны на ассемблера. Если у вас программа не прихотлива при выполнении ко времени и чип остается в 99% времени в режиме ожидания, то код можно написать на любом языке, на котором вы хотите.

Легок ли ассемблер в изучении?

Ассемблер очень сложен и не так легок в понимании, как другие, высокоуровневые языки. Изучение языка ассемблер для какой-либо типа процессора начинается с понимания базовых принципов архитектуры чипа и языковых диалектов. Одним словом – принцип и грамматика ассемблера одинаковы везде для любого процессора, но язык может отличаться грамматикой написания и диалектикой команд, отсутствием или присутствием команд той или иной операции. Высокоуровневые языки часто не позволяют использовать специальные функции микроконтроллера, так как они могут быть не реализованы для микроконтроллера и выходом из этой ситуации может быть использование вставка в код в высокоуровневый код ассемблерных вставок, чтобы использовать эту функцию.
Ассемблер очень хорош, если вы создаете программу в пределах 100 линий кода. Некоторые программы требуют до нескольких тысяч линий кода и для его оптимизации требуется много работы. То, что можно сделать нескольким линиями кода на языке высокого уровня на ассемблере идентичный код может быть написан десятками линий, но в то же время высокоуровневый язык более прожорлив к памяти, так как после компиляции программы инструкции языка высокого уровня транслируются в несколько инструкций языка ассемблера и дальше переводиться в машинный код, состоящий из единиц и нулей. Первый шаг в освоении для любого языка сложен, но после нескольких недель упорного самообучения можно уже осознанно программировать. Некоторые инструкции кода ассемблера можно понять через месяцы обучения программированию – это нормально.

 

 

Установка FreeBSD 10.X и настройка установщика пакетов и портов

👁 43 просмотров

Вопрос:
Так, как же установить FreeBSD 10.X  и настроить установщик — pkg команду?
Ответ:
Никак! Снеси это ГОВНО и больше не прикасайся, если хочешь сохранить время и нервы 🙂 !

Замечание. Если вы были обижены этой новостью, то берете веревку, мыло, открываете дверь ванной, завязываете веревку к люстре, смазав мылом, делаете на другом конец ошейник и наслаждаетесь…Так мир избавиться от извращенцев 🙂

Вызов кода C# из JavaScript

👁 143 просмотров

При разработке JavaScript — приложений на платформе .NET очень часто, даже не очень, а требуется использовать JavaScript — функции вызова кода C#. Так как JavaScript не умеет пользоваться файловой системой не может работать с БД, то нам необходим код C#, который подгрузит данные из файла, запишет в файл, почитает и перезапишет данные в БД, обработает методами .NET данные и т.д.
Есть 2 похода того, как это сделать:

  • использовать специальный метод JS window.external, который будет содержать метод, определяемый в классе COM — объекта;
  • использовать ASP.NET страницы или любого другого серверного языка и подгрузить их через Ajax — запросы.

В данном посте рассмотрим первый вариант. Ниже представлен класс, который мы определяем , как видимый COM — объект

 

namespace MyApp
{
    [ComVisible(true)] //Устанавливаем как видимый COM
    public class ScriptClass
    {
        public ScriptClass()
        {
        }
        //Данный метод будем вызывать из JS
        public void readFile()
        {
            MessageBox.Show("File Reading!");
        }
    }
}

Далее нужно установить параметры для браузера, который мы используем в проекте

WebBrowser webBrowser = new WebBrowser(); 
webBrowser.ObjectForScripting = new ScriptClass(); 
webBrowser.Navigate("http://websofter.ru/");

Теперь, чтобы запустить данный код из JS, нам надо написать в обработчике такой код

window.external.readFile();

Использование JavaScript в WebBrowser .NET/C#

👁 336 просмотров

При использовании JavaScript в .NET объекте WebBrowser нужно учитывать некоторые ньюансы, связанные с загрузкой страницы. Для того, чтобы выполнить какой-то JavaScript — код необходимо проверить загрузку страницы. Простое решение — это использование в C# специального слушателя события — WebBrowser.DocumentCompleted, который вызывается, когда страница полностью загружена.

Пример вызовава JavaScript — кода из C#

Ниже дан пример его использования. Пусть у нас есть HTML сраница index.html со следующим JavaScript — методом, который определен в head

<script>
	function runScript(){
		alert("Hello World!");
	}
</script>

Тогда вызов данного метода через C# будет выглядеть вот так

public MyForm()
{
//...
//Сначала определяем новое событие для браузера и передаем имя обработчика
            string appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
            webBrowser.Url = new Uri(Path.Combine(appDir, @"pages\index.html"));
  webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(runWebScripts);
}

//Далее, в классе определяем новый обработчик
void runWebScripts(object sender, WebBrowserDocumentCompletedEventArgs e)
{
   webBrowser.Document.InvokeScript("runScript", new object[] { });
}

 Пример создания JavaScript — кода и его запуска из C#

Теперь посмотрим как создать новый элемент в DOM через C# и создать в нем код JavaScript

public MyForm()
{
//...
//Сначала определяем новое событие для браузера и передаем имя обработчика
            string appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
            webBrowser.Url = new Uri(Path.Combine(appDir, @"pages\index.html"));
  webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(runWebScripts);
}

//Далее, в классе определяем новый обработчик
void runWebScripts(object sender, WebBrowserDocumentCompletedEventArgs e)
{

            HtmlDocument doc = webBrowser.Document;
            HtmlElement head = doc.GetElementsByTagName("head")[0];
            HtmlElement s = doc.CreateElement("script");
            s.SetAttribute("text", "function sayHello() { alert('hello'); }");
            head.AppendChild(s);
            webBrowser.Document.InvokeScript("sayHello");

}

Мы добаляем в тег head новый элемент script и устанавливаем в качестве его атрибута text JavaScript — код и далее вызываем этот код с помощью метода InvokeScript

Подключение jQuery в WebBrowser через C# в виде гиперссылки

Давайте посмотрим, как использовать библиотеку jQuery в своем проекте на C#. Для этого нам необходимо создать новый элемент script и передать в атрибут src значение ссылки, для примера подключим библиотеку из стандартной ссылки Google

public MyForm()
{
//...
//Сначала определяем новое событие для браузера и передаем имя обработчика
            string appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
            webBrowser.Url = new Uri(Path.Combine(appDir, @"pages\index.html"));
  webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(runWebScripts);
}
//Далее, в классе определяем новый обработчик
void runWebScripts(object sender, WebBrowserDocumentCompletedEventArgs e)
{
            //Получаем доступ к тегу head
            HtmlDocument doc = webBrowser.Document;
            HtmlElement head = doc.GetElementsByTagName("head")[0];

            //Подключаем библиотеку
            HtmlElement jQuery = doc.CreateElement("script");
            jQuery.SetAttribute("src", "http://code.jquery.com/jquery-latest.min.js");
            head.AppendChild(jQuery);
            
            //Далее запускаем код, содержащий jQuery
            HtmlElement script = doc.CreateElement("script");
            script.SetAttribute("text", "function setRedColor() { $('body').css({ 'background-color': 'red' }); }");
            head.AppendChild(script);

            //Вызываем метод, содержащий код jQuery
            webBrowser.Document.InvokeScript("setRedColor");

}

Подобным образом можно подключить не только jQuery библиотеку, но и любой удаленный JavaScript файл.

Подключение jQuery в WebBrowser через C# из локального хранилища

Если нам необходимо подгрузить jQuery или любой JavaScript — файл локально, то тут необходимо учитывать некоторые особенности, связанные с jQuery, так как при локальном подключении у вас может выскочить ошибка такого рода: Object doesn’t support property or method ‘defineProperty’, который означает: Объект не поддерживает свойство или метод ‘defineProperty’. Что непонятно, так это то, что при подключении через удаленную гиперссылку эта ошибка не выводиться и браузер работает нормально. Данная ошибка актуальная для версий IE 10 — 11 и выше, возможно. В IE он поддерживается, а в IE 8 — ограниченно. Решением данной проблемы является использование тегов для переключения браузера в режимы совместимости с ранними версиями. Подробно про это написано в официальной статье Microsoft «Specifying legacy document modes»

Из данной статьи следует, что для совместимости нужно использовать мета — тег

<meta http-equiv="x-ua-compatible" content="IE=edge" />

Запись атрибута content дает указание на то, с какой версией IE следует иметь совместимость. В нашем случае, данная запись эквивалентна использованию типа документа HTML5 и совместимости с другими браузерами. Это заставит Internet Explorer работать в режиме последней поддерживаемой спецификации документа. Значение «IE=edge» является наиболее полезным для регулярного поддерживания веб-сайтов, которые отрабатываются на совместимость между несколькими браузерами, в том числе Internet Explorer.
Данный тег совместимости необходимо в начале тега head в документе.

Итак, теперь, собственно сам код подключения. HTML документ будет таким

 

...
<head>
    <meta http-equiv="x-ua-compatible" content="IE=edge" />
</head>
...

C# — код будет таким

HtmlDocument doc = wbTestEditor.Document;
HtmlElement head = doc.GetElementsByTagName("head")[0];
HtmlElement s = doc.CreateElement("script");
s.SetAttribute("src", Environment.CurrentDirectory + @"\pages\js\jquery-2.1.3.min.js");
head.AppendChild(s);

Свойство Environment.CurrentDirectory содержит корневую папку запускаемой программы, а @ нужен для обработки слэшей в нормальном виде, чтобы не писать как \\. Environment.CurrentDirectory — это тоже самое, если бы мы писали как Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase), но в коротком виде.

Часть 1. Java EE. Интеграция Tomcat 8 и NetBeans 8.2 и создание проекта Hello World

👁 525 просмотров

Java EE(Java Platform, Enterprise Edition) — это платформа и набор спецификаций языка Java для серверных проектов на уровне средних и крупных предприятий.

Основное назначение данной платформы — это реализация процессов сетевого обмена информацией через Интернет. Это свободная платформа со свободными программными и инструментальными средствами разработки.

В данной статье будет подробно описано как создать свой первый проект на платформе Java EE.

Что потребуется?

Нам потребуются для этого 3 шага:

  • установить требуемое ПО;
  • интегрировать скачанное ПО;
  • создать проект и развернуть на сервере.

Установка требуемого ПО

Нам потребуется скачать и установить следующий перечень ПО:

  • Tomcat 8 — сервер для запуска проекта Java EE;
  • IDE NetBeans — для создания и развертывания проекта Java EE;
  • Дополнительные модули для NetBeans для поддержки создания проектов JavaME.

tomcay-logo-imgTomcat 8 скачивается с официального сайта Apache. Есть разные варианты установки, это инсталлятор с пошаговой установкой и  архив программы, не требующий инсталляции. Мы скачаем инсталлятор и проследуем подсказкам. После скачивания запускаем инсталлятор, жмем «Next», далее соглашаемся с лицензией и жмем «I Agree» и появится окно

tomcay-inst-next-choose-components

Оставляем все по умолчанию. Если кратко, то «Host Manager» — это менеджер проектов, который помогает развертывать и удалять проекты с сервера Tomcat через браузер. Нам он не нужен, не будем устанавливать, также, и примеры, пример мы сами создадим. Жмем «Next»

tomcay-inst-next-configВ данном окне нам необходимо придумать логин и пароль для нашего сервера, а в пункте «Roles» задать роли для пользователя. По умолчанию там стоит manager-gui и мы добавляем к нему, через запятые, еще две роли: manager-script и manager-admin. Они нам будут необходимы при интеграции с NetBeans, остальное оставляем как есть и жмем «Next» появится окно выбора папки Java -машины, если Tomcat нашел эту папку,  у меня она находится по пути «C:\Program Files\Java\jre1.8.0_45», то оставляем, если нет, то выбираем. Жмем «Next» и выйдет окно выбора папки установки, я оставил по умолчанию «C:\Program Files\Apache Software Foundation\Tomcat 8.0». Жмем «Next» и пойдет процесс установки

tomcay-inst-next-finish

После окончания оставляем галочку «Run Apache Tomcat» для запуска, а с «Show Readme» снимаем, жмем «Finish» и начнется запуск сервера. Мы можем в любой момент остановить и запустить сервер через Monitor Tomcat, который будет доступен трее в процессе запуска

tomcay-inst-next-tree

Если сервер запущен, то на значке будет зеленый треугольник, а если остановлен — красный. Если мы вышли из монитора нажав на пункт Exit, то сможем заново запустить через «Пуск» в категории «Apache Tomcat 8.0 Tomcat8»

tomcat-monitor-app-puskНа данный момент с Tomcat закончили. Переходим к следующей программе.

 

netbeans-logo-img

IDE NetBeans скачиваем с официального сайта NetBeans. При скачивании выбираем PHP — конфигурации с минимальным количеством модулей, остальные мы сам установим

netbeans-download-confПосле скачивания запускаем инсталлятор и следуем подсказкам, оставляя все по умолчанию, если у вас нет других требований.

Все, программы мы установили. Теперь запускаем NetBeans и устанавливаем необходимые модeли для разработки проектов Java EE. Для этого заходим в пункт меню «Tools» > «Plugins»

netbeans-tools-pluginИ в открывшмся диалоговом окне, в раскладке доступных модулей «Available Plugins» выбираем все модули с с категориями Java EE и Java WEB and EE

netbeans-tools-plugins-selectЖмем «Install», соглашаемся со всеми лицензиями и подтверждаем установки. После окончания NetBeans предложит перезагрузиться -соглашаемся и все, мы можем, теперь, через меню создавать стандартные проекты Java EE.

Интеграция Tomcat и Netbeans

В NetBeans, для того, чтобы посмотреть текущие активные серверы, нам необходимо открыть вкладку сервисов. Для этого переходим в пункт меню «Window» > «Services»

service-windowПосле этого откроется новая вкладка сервисов, где в пункте «Servers» мы увидим наш активный сервер Tomcat

nb-active-serversПри при попытке развернуть пункт «Web Applications» выйдет диалоговое окно, которое потребует с нас логин и пароль. Вводим логин и пароль, которые мы устанавливали в процессе установки Tomcat

nb-active-servers-depl-appsи мы увидим все текущие, развернутые, проекты, которые есть у нас на сервере.

На этом все, интеграция закончена. Далее создаем проект Java EE «Hello World».

Создаем проект  развертываем на сервере

Идем в меню «File» > «New Project…»

choose-new-proj-typeВыбираем тип проекта из категории «Java Web» > «Web Application» и жмем «Next»

type-np-tomcat-proj-nameЗадаем имя проекта и жмем «Next»

type-np-tomcat-proj-serverВыбираем наш сервер, версию Java EE и жмем «Finish», так как фреймфорки мы не будем использовать для нашего простого примера.

Структура проекта состоит из нескольких папок

np-tomcat-hw-projВ папке «Web Pages» будут храниться фронтенд — файлы: html, JavaScript, CSS…в папке «META-INF» могут храниться дополнительные библиотеки, в папке «WEB-INF» могут храниться файлы конфигурации. При развертывании проекта сюда, обычно добавляется конфигурационный файл web.xml с дополнительными параметрами обработки запросов. Папке «Source Packages» буде наш Java EE — код, который будет обрабатывать запросы.

Давайте добавим новый пакет «helloworld» с классом «HelloWorld.java» в папке исходников «Source Packages». Кода класса дан ниже

 

package helloworld;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
/**
 *
 * @author admin
 */
public class HelloWorld extends HttpServlet {
  public void doGet (HttpServletRequest req,
                     HttpServletResponse res)
    throws ServletException, IOException
  {
    PrintWriter out = res.getWriter();//Создаем поток вывода
    out.println("<html>");
        out.println("<head>");
            out.println("<title>");
                out.println("Hello World Page");//Заголовок страницы
            out.println("</title>");
        out.println("</head>");
    out.println("<body>");
        out.println("<center>");
            out.println("Hello, world!");//Выводим видимую чсть HTML
        out.println("</center>");
    out.println("</body>");
    out.println("</html>");
    out.close();//Закрываем поток вывода
  }
}

В папку «META-INF» добавляем фал конфигурации web.xml со следующим содержимым

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http:/java.sun.com/dtd/web-app_2_3.dtd">
    <welcome-file-list>
        <welcome-file>
            index.html
        </welcome-file>
    </welcome-file-list>
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>helloworld.HelloWorld</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello

Данный код сообщит нашему серверу, чтобы при обращении к странице http://localhost:8080/hello/ у нас был выполнен Java — код из класса HelloWorld.java.
Давайте, изменим и код файла index.html для наглядности перепишем его содержимое так

<!DOCTYPE html>
<html>
    <head>
        <title>Hello World!</title>
        <meta charset="UTF-8">
       <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <div>It is the "Hello World" Java EE project!</div>
    </body>
</html>

index.html будет запрошен по умолчанию при обращении к странице через обычный адрес http://localhost:8080/HelloWorld/, так как мы задали это правило через web.xml. В итоге наш проект получится вот таким

nb-tomcat-ready-project
Проект готов, нам осталось его построить, развернуть и запустить. Для этого наводим мышкой на имя проекта и ЛКМ

nb-tomcat-ready-build-depl-runвыбираем сначала пункт «Build», потом «Deploy», что значит «Развернуть», потом «Run» и среда запустит страницу в браузере через адрес http://localhost:8080/HelloWorld/. По умолчанию у нас запуститься index.html, так как мы еще задали еще одну страницу http://localhost:8080/HelloWorld/hello/ через web.xml, который обрабатывает созданный нами класс, то давайте взглянем и на ее результат

nb-tomcat-ready-class-resКак видим, все отлично работает и код Java запускается через наш сервер, выводя HTML — код в виде страницы.

Дистрибутив сервлета «*.war» и развертывание вне среды NetBeans

Выше мы описали как развернуть проект внутри среды IDE NetBeans, это удобно в процессе проектирования, но что, ели нам требует закинуть на сервер Tomcat уже готовый проект? Давайте рассмотрим это поподробнее. Когда мы строим проект через команду «Build», то NetBeans создает конечный файл — дистрибутив, который является законченной реализацией проекта. Данный дистрибутив доступен в 2-х видах в 2-х папках проекта, это:

  • HelloWorld\build\web;
  • HelloWorld\dist.

В папке «HelloWorld\build\web» проект находиться в разархивированном виде. Это уже рабочий сервлет(так называются программы Java EE), который можно уже закинуть на сервер, а в папке «HelloWorld\dist» дистрибутив находиться в виде «HelloWorld.war». Формат «*.war» — это обычный «*.zip» формат и можно открыть архиватором и внутри него будет тоже самое, что и в папке HelloWorld\build\web. Для запуска на сервере можно использовать оба, но в архиве используют когда запускают сервлет на удаленном сервере, так как это удобно, когда весь сайт закачивают одним архивом.

Давайте развернем дистрибутив на наш сервер вне среды и чтобы наш проект был доступен не через адрес http://localhost:8080/HelloWorld/, а через адрес http://localhost/. Для этого переходим в корневую папку Tomcat и в папку готовых сервлетов «C:\Program Files\Apache Software Foundation\Tomcat 8.0\webapps» в данной папке у нас будут подпапки

nb-tomcat-apps-dirДанные папки — это развернутые приложения(сервлеты) по умолчанию. Особо следует выделить папку ROOT. Данная папка содержит приложение, котрое буде запускаться по умолчанию, т.е. по адресу http://localhost:8080/   и мы должны наш дистрибутив закинуть туда, удалив ее содержимое. После того, как мы закинули содержимое дистрибутива нам необходимо указать серверу Tomcat на необходимость обрабатывать запросы через порт 80, а не через 8080. Это даст нам возможность обращаться к хосту по адресу http://localhost/ для этого открываем файл server.xml в папке «C:\Program Files\Apache Software Foundation\Tomcat 8.0\conf»  и заменяем порт 8080 на 80 в

    <Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

и не забываем перезапустить сервер Tomcat, чтобы изменения в конфигурациях порта вступили в силу, а то проект не запустится. После всех описанных операций мы можем зайти на наш сайт теперь по адресу http://localhost/

nb-tomcat-depl-proj-localhostНа этом запуск примера закончена! 🙂

LangZilla — интерактивный переводчик для сайта

👁 92 просмотров

Каждому разработчику сайта приходилось иметь дело с локализацией сайта, чтобы каждый пользователь, когда заходит на страницу, сайт автоматически перенаправлял его на ту версию языка, на котором привык общаться клиент. Есть много способов это сделать:

  • можно сделать копию сайта в разных папках www.domen.com/ru и www.domen.com/en и т.д.;
  • можно использовать api переводчика от Google Translate;
  • можно использовать код на JavaScript и определять страну и язык самостоятельно при помощи свойства window.navigator.languages на JavaScript;
  • наконец, можно использовать готовое и быстрое решение — LangZilla.

Описание

LangZilla — это бесплатный JavaScript автопереводчик сайтов, с возможностью расширять языковую базу при помощи языковых файлов.

Что может LangZilla? Вот ее функции:

  • автоматически определять страну клиента и дает ему его перевод;
  • возможность определять любой язык при помощи json — файлов;
  • возможность переводить внутри тегов HTML;
  • возможность переводить слова в атрибутах тегов;
  • возможность перевести часть текста внутри до содержимого в теге;
  • возможность перевести текст после содержимого в теге;
  • возможность запустить пользовательский кода, определив функцию обратного вызова;
  • возможность использовать в переводе теги HTML;
  • возможность определять собственные пути к картам перевода и определять для них иконки.

Использование

Чтобы быстро использовать плагин, необходимо скачать архив, в папке src будут все исходные файлы плагина:

  • папка loc содержит все файлы перевода, которые вы захотите добавить. Причем, имя файла должно соответствовать коду языка;
  • папка images содержит ресурсы плагина, такие как иконки языков и т.д.;
  • файл langzilla.js — основной файл плагина, его необходимо подключить к нашей странице, где требуется перевод.

Итак, давайте поподробнее. После разархивирования в корневую папку сайта подключаем  файлы jQuery и langzilla.js к той странице, на которой требуется перевод

 


<script src="js/jquery-2.1.4.min.js"></script>
<script src="src/langzilla.js"></script>

Далее нам необходимо создать карты языка в формате .json и переместить их в папке loc, откуда их будет читать наш плагин перевода. Название карты языка должно соответствовать кодовому определению языка в формате, который определен для свойства window.navigator.languages, данный формат языков для браузеров опеределен по стандарту RFC 4646. Примеры валидных языковых кодов включают «en», «EN-US», «FR«, «es-ES», «ru-RU» и т.д. Некоторые можно посмотреть здесь. После того, как языковую карту создали и дали ему валидное имя, соответствующее кодовому названию языка, нам необходимо написать код запуска с регистрированными языковыми картами. Простейший код будет выглядеть вот так:

jQuery(function(){
    $("body").createLang({//определяем тег, в которую добавятся кнокпки
        locals:{
            "en-US":"src/images/en.png",//подключаем и регистрируем для языка иконку кнопки
            "ru-RU":"src/images/ru.png"//подключаем и регистрируем для языка иконку кнопки
        },
        locPath: "src/loc/"//указываем путь к папке языковых карт
    });
});

Теперь нам необходимо заполнить языковые карты. Допустим мы создали языковые карты ru-RU.json для русского языка и en-US.json — для английского языка. Запись в языковых картах поизводиться в формате JSON, ниже представлены примеры заполнения для русского

{
    "lzTitle": "LangZilla|Русский",
    "lzMenuHome": "Главная",
    "lzMenuBlog": "Блог",
    "lzMenuGallery": "Галерея",
    "lzMenuAbout": "О нас",
    "lzMenuContact": "Контакты",
    "lzMenuItem1": "Проектируем для WEB и дизайн",
    "lzMenuItem2": "Проектируем для гаджетов",
    "lzMenuItem3": "Проектируем для ПК",
    "lzMenuItem4": "Проектируем для микроэлектроники",
    "lzTextAboutAppend": "Вы можете использовать и изменять наш плагин для личного и коммерческого использования.[:]append",
    "lzTextAboutPrepend": "Бесплатный плагин перевода от [:]prepend",
    "lzImageEnRU": "images/langzilla-ru.png[:]attr=src",
    "lzHeaderPopularPost": "Популярные посты",
    "lzHeaderCategories": "Категории",
    "lzHeadDef": "Заголовок текста",
    "lzHeadReadMore": "Читать далее",
    "lzHeadNext": "дальше"
    
}

и для английского

{
    "lzTitle": "LangZilla|English",
    "lzMenuHome": "Home",
    "lzMenuBlog": "Blog",
    "lzMenuGallery": "Gallery",
    "lzMenuAbout": "About",
    "lzMenuContact": "Contact",
    "lzMenuItem1": "We develop for WEB and Design",
    "lzMenuItem2": "We develop for Phones",
    "lzMenuItem3": "We develop for PC",
    "lzMenuItem4": "We develop for Microelectronic",
    "lzTextAboutAppend": "You can use and modify the our plugin for both personal and commercial use.[:]append",
    "lzTextAboutPrepend": "Free translate plugin by [:]prepend",
    "lzImageEnRU": "images/langzilla-en.png[:]attr=src",
    "lzHeaderPopularPost": "Popular Post",
    "lzHeaderCategories": "Categories",
    "lzHeadDef": "Text Heading",
    "lzHeadReadMore": "Read more",
    "lzHeadNext": "next"
}

Названия переменных «lzTitle», «lzMenuHome», «lzMenuBlog», … произвольные и они должны быть одинаковы во всех языковых картах, в данном случае, и для ru-RU.json и en-EN.json иначе вы не получите перевод.

Далее, нам необходимо заставить выполнить перевод по нажатии на кнопок, которые автоматически появятся, по умолчанию, в верхнем правом углу страницы, к которой подключен LangZilla — плагин

langzilla-btn-imgДля этого нужно создавать или добавлять классы к тегам, в которых есть содержимое, требующий перевода. Названия глассов соответствуют названиям переменных в языковых картов, например для переменно «lzMenuHome» класс будет написан как class = «lzMenuHome» и т.д. Пример этого показан ниже

<div class="menu">
	<ul>
		<li><a class="lzMenuHome" href="index.html"><!--Home--></a></li>
		<li><a class="lzMenuBlog" href="#"><!--Blog--></a></li>
		<li><a class="lzMenuGallery" href="#"><!--Gallery--></a></li>
		<li><a class="lzMenuAbout" href="#"><!--About--></a></li>
		<li><a class="lzMenuContact" href="#"><!--Contact--></a></li>
	</ul>
</div>

Готовый результат можно посмотреть на странице плагина.

Фильтры действий

Фильтры действий — это дополнительное указание для плагина как обработать данный текст перевода внутри тега. Все фильтры действий записываются после текста перевода через разделитель [:]. На данный момент существует следующий список фильтров действий:

  • [:]prepend — добавляет текст перевода перед содержимым внутри тега;
  • [:]append — добавляет текст перевода  после содержимого тега;
  • [:]html — добавляет текст перевода внутрь тега, удаляя содержимое. Данный фильтр применяется по умолчанию, если не указаны выше описанные фильтры принудительно;
  • [:]attr=attributeName — добавляет текст перевода в качестве значения атрибута;

Как вы заметили, данные фильтры идентичны с методами jQuery и выполняют похожие действия.

Дополнительные параметры LangZilla

LangZilla имеет дополнительные параметры для гибкой настройки. Ниже представлен весь список этих параметров:

  • position — определяет поведение кнопок на странице и соответствует CSS значениям position. По умолчанию кнопки находятся на верхнем правом углу и этот параметр установлен как «absolute»;
  • top — расстояние до кнопок с верхней части страницы в пикселях. По умолчанию равен 0;
  • right — расстояние до кнопок от правой стороны страницы. По умолчанию равен значению 80;
  • locals — параметр для регистрации языковых карт и определения для них кнопок. При использовании данный параметр должен быть определен;
  • locPath — путь к языковым картам относительно страницы, к которому подключен плагин. По умолчанию содержит значение «langzilla/loc/»;
  • callBack — функция обратного вызова. Если требуется использовать пользовательский код, который бы выполнялся при каждой смене языка, то можно смело ею пользоваться.

Это все, описание окончено. Удачного пользования!

 

Особенности использования AVR на практике

👁 51 просмотров

Этот пост для тех, кто при изучении, будет использовать реальное устройство, а не программный симулятор для просмотра результата кодирования.
При использовании реального устройства могут возникнуть ряд вопросов и проблем, что может привести к неработоспособности микроконтроллера, поэтому понимание всех подводных камней практического использования микроконтроллера – немаловажно.

Вопросы потребления тока
Ток, потребляемый микроконтроллером AVR, в среднем, варьирует в пределах 5 – 15 мА, без учета внешних устройств, которые запитываются от ножек микроконтроллер. Потребляемый ток, во многом, может зависеть от тактовой частоты генератора, от напряжения питания. Диаграммы зависимостей уже вычислены для всех моделей и можно посмотреть в даташите микроконтроллера. Ниже представлена диаграмма зависмости тока некоторых моделей Mega

avr-mhz-voltage-depend

Как видно из диаграммы, графики линейные и показывают, что чем выше тактовая частота генератора, тем увеличивает потребляемый ток, это дает понимание того, что, если наше устройство запитывается от автономного источника тока, то следует заранее заботиться о том, чтобы оптимально выбрать тактовый генератор и если не критично для скорости выполнения, то достаточно выбрать генератор в 1МГц.
Другое дело – уменьшить потребляемое напряжение насколько это позволяют внешние устройства, которые управляются микроконтроллером, так как, если судить по графику, то видно, что чем больше напряжение, то тем больше увеличивается и потребляемый ток, а линейность графиков дает повод предполагать о быстром, пропорциональном увеличении тока при меньшем увеличении напряжения.

Внешние дополнительные резисторы
Почти каждый вывод микроконтроллера AVR имеет встроенный внутренний Pul App (подтягивающий) резистор, который необходим для реализации кнопок, но иногда, в критических случаях, нужен и внешний резистор 2 – 5 кОм, а если критично еще и к потреблению энергии, то уже нужно увеличить сопротивление до 10 – 20 кОм. Данную процедуру используют, обычно, к выводу RESET и при прошивке микроконтроллера через выводы MISO и MOSI. Если не предпринимать эти меры, то высока вероятность, что будут срабатываться ложные внешние прерывания, возможен самопроизвольный перезапуск микроконтроллера, а при больших помехах возможна порча и самой программы.

Помехозащищенность
Микроконтроллеры AVR хорошо защищены по линии «земли», но плохо переносят помехи на шине питания. Поэтому не будет лишним, если добавить керамический конденсатор, порядка 0.1 – 0.5 мкФ и нужно беспокоиться о стабильном напряжении в блоках сетевых адаптеров, если через них запитывается устройство.

Разновидности в семействе AVR

👁 63 просмотров

Подсемейства

Семейство AVR можно подразделить на 5 основных подсемейства:

  • Classic – старые модели семейства, которые уже сняты с производства;
  • Tiny – модель с небольшой памятью и периферией, является заменой последней модели Classic AT90S2313;
  • Mega – модель с максимальными возможностями;
  • XMEGA – модели с повышенным быстродействием низким потреблением электричества;
  • AVR32 – модели для высоконагруженных и высокоскоростных устройств.
    Модели Tiny сохраняют преемственность от моделей Classic, причем, на аппаратном уровне обе модели, Tiny и Mega, могут быть совместимы с семейством Classic при установке специального бита совместимости.

Модели Tiny предназначены для более простых и дешевых устройств, так как имеют диапазон Flash – памяти 1 – 8 Кб и размешаются, в основном, в корпусах с 8 – 20 выводами, кроме модели ATtiny28. Кроме того, подсемейство данной модели имеет модель ATtiny2313, который сохраняет преемственность самой удачной версии модели подсемейства Classic – AT90S2313.
Модели Mega предназначены для более производительных устройств, так как содержат в себе Flash – память объемом 8 – 256 Кб, а корпус может иметь 28 – 100 выводов, также и внутренняя периферия у моделей Mega более богата и все это сказывается на цену моделей данного подсемейства – они дороже, чем Tiny.
Выше перечислены основные семейства, но следует учитывать что в каждом подсемействе есть и специализированные модели:

  • AT90USBxxxx – для специализированной разработки устройств связи с интерфейсом USB;
  • AT90CANxxx — для специализированной разработки устройств связи с интерфейсом CAN;
  • ATMega329 – для специализированной разработки устройств с использованием ЖК – дисплеев;
  • с беспроводным интерфейсом ZigBee для предприятий и сфер торговли;
  • с режимом picoPower, которые работают на сверх малых напряжениях – от 1.8 В. Такие модели маркируются добавлением буквы «P» в конец записи модификации;
  • с режимом выдержки высоких температур – версии Automotive.

Модели XMEGA могут иметь низкое потребление в пределах 1.8 – 3.6 и при тактовой частоте генератора 32 МГц. Данные модели имеют продвинутые возможности, такие как работа в автономном режиме, когда ядро отключается, а остальные части работают, могут иметь продвинутый режим picoPower и встроенные модули криптографии.
Модели AVR32 имеют 32 – х битную архитектуру и предназначены для высоконагруженных и высокоскоростных устройств, которые требуют проигрывание потокового видео или распознавание образов в реальном времени.

Типы корпусов

Корпуса микроконтроллеров могут иметь различные формы в зависимости от внешних характеристик устройств, так как на начинку это не влияет.

img-avr-corpuse-typesПо своей разновидности, корпуса стандартизированы и могут маркироваться как:

  • PDIP – большой корпус с выступающими выводами. На плате монтируется через сверление отверстий для ножек;
  • TQFP – как правило, ножки выступают через все стоны корпуса, а на плате монтируется как SMD – компонент;
  • SOIC – версия PDIP – корпуса, но на плате монтируется как SMD – компонент;
  • QFN – монтируется как SMD –компонент, а ножки не выступают и представляют из себя металлические полоски с нижней стороны корпуса для прямого спаивания на плате к дорожкам.

При радиолюбительских поделках и в отладочных целях удобно пользоваться микроконтроллерами в PDIP корпусе в виду удобства пайки.

Модификации

Также, семейство может отличаться модификациями:

  • буква L на корпусе может означать о расширенном диапазоне питания в пределах 2.7 – 5.5 В;
  • отсутствие данной буквы означает верхний диапазон 4.5 – 5.5 В.

Микроконтроллеры версии L менее быстродействующие, а верхний диапазон , как правило, ограничен 8 МГц, когда как обычные версии могут работать в диапазона 16 МГц – 20 МГц.