Урок №1 (Устанавливаем Winavr)




НазваниеУрок №1 (Устанавливаем Winavr)
страница1/6
Дата публикации20.03.2013
Размер0.76 Mb.
ТипУрок
odtdocs.ru > Информатика > Урок
  1   2   3   4   5   6
Программирование на WinAVR Си

зарядного устройства (ZU v1.7) на AT Mega32.
Вступление.

Несмотря на то, что тема раскрыта не полностью (слишком большой замах), в статье вы найдете ответы на многие вопросы, а на остальные вопросы ответят сами исходники программы.

Данная статья адресована тем энтузиастам, которые решились собрать ZU v1.7 (универсальное зарядное устройство), описанное на http://avrcpp.narod.ru Главной задачей этой статьи является простыми словами объяснить разработку программ для микропроцессоров на WinAVR Си и прийти к выводу, что многое, что кажется сложным и запутанным, всего лишь - стремление максимально просто достичь желаемого результата.

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

Набив многочисленные шишки и истратив много времени на поиски, я хочу рассказать, как я себе представляю программирование. Я надеюсь, что стремление ничего не упустить и остаться понятным, не слишком раздуло статью. Некоторая доля философских рассуждений немного отвлечет и расслабит читателя для лучшего запоминания.
^ Урок №1 (Устанавливаем WinAVR)

WinAvr – одна из самых лучших программ для программирования процессоров Atmel. И вот мои доказательства на момент написания статьи:


  1. Это бесплатный компилятор Си, Си++, распространяемый по лицензии GNU. И это наиглавнейший плюс, для программистов, желающих не нарушать лицензионное законодательство. «Embedded IAR C++ for AVR» стоит запредельно высоко для самодельщиков >$1000. Про остальные компиляторы точно не скажу $150 - $300, но проблема с ними не в цене, а в возможности их приобрести.

  2. Скорость скомпилированной программы находится почти на уровне лучших компиляторов.

  3. Размер скомпилированной программы вполне приемлемый.

  4. Явных, непреодолимых ошибок не обнаружено.

  5. В программе имеется своя оболочка – текстовый редактор «Programmers Notepad 2» из которого можно компилировать и прошивать процессоры, например для программатора PonyProg.

  6. Данная программа написана на WinAVR-20071221rc1. В более поздней версии оптимизация по размеру сделана хуже.

  7. Этот компилятор продолжает совершенствоваться.


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

  1. Закачиваем установочный файл с сайта WinAvr.

  2. После установки запускаем «c:\winavr\pn\pn.exe» это редактор с возможностью компилирования и прошивки.

  3. Редактор необходимо настроить на компилятор и утилиту прошивки AVRDUDE, добавив в него несколько команд:

  • ОЧИСТКА: Tools => Options => Ветка Tools => Выбрать в списке: С/С++ => ADD => Name=CLEAR; Command= C:\WinAVR\utils\bin\make.exe; Folder=%d; Parameters=clean

  • КОМПИЛЯЦИЯ: Tools => Options => Ветка Tools => Выбрать в списке: С/С++ => ADD => Name=COMPIL; Command= C:\WinAVR\utils\bin\make.exe; Folder=%d; Parameters=all

  • ПРОГРАММИРОВАНИЕ: Tools => Options => Ветка Tools => Выбрать в списке: С/С++ => ADD => Name=BURN; Command= C:\WinAVR\utils\bin\make.exe; Folder=%d; Parameters=program

  1. В папке с исходниками ЗУ есть «Makefile». В любом проекте WinAvr должен быть такой файл. Обратите внимание на следующие параметры:

    • F_CPU = 16000000 - тактовая частота

    • FORMAT = ihex - формат файла прошивки

    • TARGET = main - название файла прошивки

    • OPT = s - оптимизация по всему

    • AVRDUDE_PROGRAMMER = ponyser - подключен программатор PonyProg через COM-порт. Еще раз напоминаю используйте только честный COM с материнских плат и не используйте переходники USB to COM

    • AVRDUDE_PORT = com1 - номер COM-порта

    • AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex

    • AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep

  2. Остальные настройки «Makefile» без особой надобности не трогайте!

  3. Для запуска редактирования проекта ЗУ необходимо запустить «c:\winavr\pn\pn.exe zu.pnproj».

  4. Для того чтобы скомпилировать проект необходимо сначала выполнить команду Tools => CLEAR затем Tools => COMPIL

  5. Чтобы прошить ЗУ новой скомпилированной прошивкой через программатор PonyProg, разведенный на цифровой схеме ЗУ, надо выполнить команду: Tools => BURN. К сожалению, мне не удалось прошить фузы (биты конфигурации процессора) из WinAvr, а без них работать не будет, поэтому сначала надо на программе от PonyProg прошить фузы, а потом уже шить программу на WinAvr.


Теперь у нас есть язык программирования. Теперь мы можем писать программы для процессоров AT MEGA.
^ Урок №2 (общий взгляд):

Мы сделали зарядное устройство с процессором, но без прошивки оно работать не будет. Процессор должен знать как и в какой последовательности нужно заряжать аккумуляторы различных типов. Для написания микропрограммы необходимо в общих чертах представлять себе как работает процессор. Это позволит нам выбрать язык программирования и аккуратно его использовать. Нужно сформулировать принцип действия нашего ЗУ: сколько времени тратится на различные операции. Что главное, что второстепенное. Нужно знать порядок значений, скоростей, времени выполнения различных операций.

Общую картину все время держим в голове и каждое принятое решение прикладываем к картине на предмет совместимости. Это позволит нам избежать противоречивых решений и излишней работы, ведущей в тупик. Но конечно же бывает всякое. Учесть все и не наделать ошибок — это сложная задача.

ATMEGA32 - это не просто микросхема, это целый компьютер в одном флаконе. Внутри него есть основные составляющие любого компьютера:

а) Процессор, АЛУ (исполнитель программы)

б) Память (хранилище программы) ОЗУ=Оперативное Запоминающее Устройство, ПЗУ=Постоянное Запоминающее Устройство

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

а) считывают данные из памяти (или портов ввода/вывода) в процессор

б) выполняют арифметические действия

в) записывают результат в память (или порты ввода/вывода)
Мы люди имеем представление обо всем в виде образов, многие образы обозначены словами, слова состоят из букв. Буквы перенумерованы. Например 128 это "А", 129 это "Б" и т.д. Если мы посчитаем сколько знаков, включая буквы большие и маленькие, знаки препинания, цифры и английские буквы и всякие простенькие знакосимволы, словом все, что может понадобиться, то выйдет около 250 штук. Выходит весь мир и все объекты в нем можно закодировать числами.

В десятичной системе десять цифр, а в двоичной две - 0 и 1. И двоичная и десятичная система отражают одну действительность, они представляют количество или номер по порядку. Каждая система представляет по своему, но имеет ввиду один и тот же смысл. Двоичная система более близка схемотехнике, потому что 0 и 1 можно представить как 0 вольт и +5 вольт на ножках микросхем.

Во всех компьютерах мира на ножках процессоров, микросхем памяти, различных драйверов, северном и южном мосте вашего компьютера, внутри всех микросхем в ячейках памяти, внутри процессора в регистрах и логических схемах происходит одно и тоже событие — меняется напряжение: то ноль, то +5в (или какое либо другое постоянное напряжение). Так живет программа внутри компьютера, внутри мобильного телефона, внутри принтера, факса, ксерокса, в DVD проигрывателе, в интернет сетях, в спутниковом оборудовании, во всех цифровых системах. Именно так и работает компьютер. Именно так компьютер создает картину мира - в виде цифр 0 и 1, собранных в числа, которыми закодированы все объекты мира.

Реальность это изменение напряжений в ячейках памяти. То что мы видим на экране компьютера — это иллюзия.

То что мы видим вокруг себя и чувствуем — это иллюзия, реальность — это взаимодействие частиц, которые даже не являются твердыми шариками, а являются вероятностной энергетической волной или искажением структуры вакуума, пространства и времени.
Урок №3 (Языки программирования)

Все языки программирования суть одно и тоже - передать исполнителю (процессору) кратко, однозначно, понятно то, что необходимо делать.

Теперь рассмотрим это утверждение с разных сторон. Программы существуют с доисторических времен. Программы зашиты на генном уровне в каждой клетке, у всех животных и у человека. Инстинкты - это и есть программы (BIOS человека). Мы на 99.9 процентов запрограммированы и действуем по программе. Практически все, что делает человек делается по аналогии, как научили родители, школа, институт, двор, бандитская шайка, кружок творчества, реклама, инструкция по применению. Почти все мои знания внедрены в меня обществом. Хотя у каждого есть иллюзия, что знания свои и что они абсолютно верны. У меня есть причины подозревать, что большая половина моих знаний и мнений ошибочна. Но эти знания общеприняты, что несколько успокаивает.

Однажды я задумался: А что собственно сделал (придумал) лично я? И не смог сходу ответить на этот вопрос. Идеи я взял в интернете, способы спросил у знающих людей и в книжках прочитал. Что такого сделал я? Перекомпоновал чужие идеи-программы, состыковал в другой последовательности, сделал несколько выборов что лучше что хуже - вот и все мое творчество, остальное только работа и напряжение по перебору и подгонке.

Выходит удел любого человека делать правильный выбор и прикладывать усилия. Результат - это подарок мира. Результат однозначно не зависит от меня. Я захотел играть на скрипке, в доску расшибся, но не смог, нет у меня слуха. Выходит результат не может быть оценкой меня и моих способностей. Наивысшая оценка меня как личности - это оценка правильности моего выбора и оценка вложенных усилий. Не смотря на то, что многие люди достигают задуманного результата, нельзя считать, что это их достижение. Доказательство очень простое: представим что Солнца нету и вот никто и не может получить вообще никакого результата.

Каждый процессор «понимает» только свой язык (язык машинных кодов), поэтому программа будет написана только на этом языке. Процессоры INTEL8086 (IBM XT), Z80 (ZX SPECTRUM), MOTOROLA 6502 (APPLE или АГАТ) каждый понимают только свои машинные коды, потому что устройство процессоров разное.

Для того чтобы человеку было удобнее понимать язык машинных кодов, каждому коду поставлена в соответствие команда/слово или аббревиатура, содержащие краткий смысл команды. Такое улучшение понимания машинных кодов называется ассемблер. Никто не пишет программы на машинных кодах, это очень не удобно, но есть ограниченное количество людей, которые пишут на ассемблере.

Ассемблер и машинные коды это почти одно и тоже. Одна команда ассемблера эквивалентна 1-3 машинным кодам. Язык ассемблера это самый простой и самый сложный язык на свете, это тот язык который не исчезнет, пока существуют процессоры. На ассемблере писать очень сложно в смысле воплощения общей идеи программы в элементарные команды, и одновременно очень легко в смысле понимания самих команд (элементарнее этих команд ничего не бывает).

Видов команд ассемблера как правило бывает очень мало: команды чтения и записи в память, команды чтения и записи в порты ввода вывода, команды стека (работа со сдвиговой памятью), команды безусловных и условных переходов, арифметические команды.

Вот как выглядит ассемблер (не пытайтесь понять и не ищите смысла это просто пример):




Писать программу на ассемблере это все равно что объяснять человеку какие мышцы (а их от 200 до 500 в зависимости от способа подсчета) надо напрячь а какие расслабить для совершения ходьбы.

Язык Си более высокого уровня. На нем гораздо легче и понятнее писать программы. Язык Си может все, что может ассемблер. Язык Си почти такой же быстрый как и ассемблер. За 20 лет программирования на Си я так и не исчерпал всех его возможностей и многого по прежнему не знаю. Я считаю, что оптимальное программирование это знание ассемблера в общих чертах и работа на Си.

Все остальные языки очень разные (например: fortran, pl1, basic, algol, cobol, refal, pascal, php, lisp, html, perl, prolog, java, sql). Некоторые языки удобны для интернета, некоторые для математики, некоторые для баз данных, некоторые языки служат для написания компиляторов. Но все эти языки в конечном счете создают программу на машинных кодах, которую выполняет процессор. Компиляторы (преобразователи в машинный код) многих из вышеуказанных языков написаны на Си. Язык Си может все, он универсален.

^ Урок №4 (Структура программы на Си)

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

Все программы на Си должны иметь приблизительно такой вид:



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

Откроем исходники программы и попробуем разобраться что к чему. Есть ли там этот стиль? Где главная программа? Где подпрограммы? Какие правила для написания подпрограмм?

Вот она программа для записи в микропроцессор, написанная на языке Си (содержимое файла main.cpp из исходников Здесь):




Теперь я постараюсь объяснить каждую букву в этом тексте.

#include - подключает к моему файлу (вставляет весь файл io.h вместо этой строки) необходимые мне описания и функции из комплекта поставки WinAVR. Это очень удобно. Мне не надо писать свои стандартные подпрограммы, т. к. я могу воспользоваться оными из файла io.h. Угловые скобки говорят о том что файл надо искать в том месте куда установился WinAVR в подкаталоге avr.

#include и все что начинается на "#" это команды препроцессора, т.е. команды которые выполняются перед компиляцией программы. Перед компиляцией в текст программы добавляется содержимое всех включаемых файлов. Если бы я сам добавил все эти файлы, то программа разрослась бы и было бы трудно все это листать и понимать, а так это, всего лишь, одна строка. Эта команда является реализацией принципа - "Разбей сложное на много простых (логически обособленных) частей".

#include "util.h" и #include "util.cpp" - это мои файлы с описателями и функциями (полезные подпрограммы — утилиты, один раз написаны и используются мной для разных проектов). Двойные кавычки указывают компилятору, что файлы надо искать в той же папке где находится главный файл программы main.cpp. Расширение ".cpp" говорит о том, что внутри файла лежат подпрограммы на языке Си. Расширение ".h" говорит, что там лежат описания переменных и функций. В принципе, компилятору все равно что лежит внутри файлов и он это не отслеживает, но это нужно мне.

Есть еще одна широко используемая команда препроцессора: #define aaa bbb. Эта команда перед компиляцией обыскивает весь файл программы ниже этой команды и меняет aaa на bbb. Это тоже очень удобная команда, которую я использую для улучшения читаемости текста. Вместо сложного выражения в тексте программы просто ставлю какое-нибудь понятное слово, а перед компиляцией оно заменяется на сложное выражение.

Все команды препроцессора включая #include и #define напрямую никак не отражаются в конечной программе на машинных кодах, они просто меняют текст программы перед компиляцией. Сами слова #include и #define это жестко зафиксированные слова в Си. Их никак иначе нельзя использовать. Есть и много других слов которые жестко зафиксированы.

После компиляции Си программы получается файл main.hex это файл с машинными кодами. Как там все устроено нас не волнует. Важно только то, что у нас есть главная программа main(), которая запустится сразу после включения ЗУ или после нажатия на кнопку RESET, если у вас такая есть.

До сего момента я все время путался с названиями: программа, подпрограмма, функция. По большому счету это одно и тоже. В Си принято использовать слово функция.

Попробуем сформулировать определение как можно проще. Функция это подпрограмма. Внутрь функции можно передавать параметры. После окончания функция может возвращать одно вычисленное значение. Приведем несколько примеров:

Пример 1: wdt_reset(); - это вызов функции сброса сторожевой собаки. Внутри процессора ATMega32 есть специальный счетчик - «собака». В зависимости от настроек приблизительно раз в 2 секунды он перезапускает процессор. Если этот счетчик не сбрасывать, то процессор будет каждые 2 секунды перезапускаться. Этот механизм предусмотрен разработчиками ATMEL для предотвращения зависания программы. Всякое бывает, может компилятор глючит, может сама программа с ошибками, может железо процессора не работает от перегрева или радиации, но программы иногда зависают. В этот момент могут происходить непредсказуемые события, ЗУ может само себя спалить. Если программа зависла, то она не проходит основной цикл и не сбрасывает собаку, и тогда процессор перезапустится. Все процессы в ЗУ инициализируются как будто вы только что включили ЗУ. Конечно, надо искать ошибку и не допускать произвольных перезагрузок. И все же сторожевая собака должна быть.

Возвращаемся к функциям. Данная конкретная функция wdt_reset(); не получает ни каких параметров (поэтому внутри скобок ничего нет) и ничего не возвращает, поэтому результат работы функции не присваивается никакой переменной.

Чтобы иметь право вызвать на выполнение эту функцию, надо чтобы ее текст был где-то выше вызова описан. Эта функция была написана внутри библиотек функций компилятора WinAVR, т.е. досталась нам готовенькой, и, чтобы мы могли ее вызвать, мы должны сказать компилятору, что это за функция. Для этого надо в начале нашего файла подключить файл описателей включающий в себя описание функций собаки #include . В этом файле описана эта функция и ее местонахождение в исходниках или представлен полный ее текст.

Пример 2: x=sin(5); sin - это функция, которая получает параметр 5 и возвращает результат в переменную x.

Пример 3: int main(void){} main - это функция которая не имеет параметров. Об этом говорит слово void или пусто внутри круглых скобок. main возвращает как результат целое число об этом говорит слово int (специальное слово для описания типов переменных). Функция main вызывается один раз прямо там где написано ее тело, поэтому в программе больше нигде не встречается слово main.

Каждая функция, использованная в нашей программе, либо написана нами лично и помещена где-то в тексте (выше или ниже вызова) или заимствована из библиотеки стандартных функций WinAVR. Если тело функции ниже вызова, то выше вызова надо ее кратко описать (сообщить ее название, параметры и возвращаемое значение). Если вы в тексте программы увидели слово из английских букв и цифр (первая обязательно буква или "_") и сразу после него круглые скобки, знайте это функция.
Процессор - исполнитель программ на машинных кодах, работает как рабочий, действующий по плану работ. Он выполняет все по порядку слева направо и сверху вниз. Читает одну команду и выполняет, читает другую и выполняет. Это относится к нашему процессору ATMega32. Этот процессор не имеет никаких параллельных потоков выполнения. Существует одна точка текущего выполнения - один поток выполнения.

Только некоторые счетчики, COM-порт и АЦП работают сами по себе - аппаратно. Вспоминаем, что ATMega32 это маленький компьютер в одной микросхеме (в одном чипе). Внутри него есть сам процессор-исполнитель, ОЗУ, ПЗУ, порты ввода вывода, счетчики, АЦП, COM-порт и все это перевязано шинами данных, адреса и управления.

Вот как работает процессор (на этот механизм мы повлиять не можем он строго зашит и является личностью и характером процессора):

      1. Пользователь включил питание.

      2. Процессор ожил, но спит и видит сон: беспорядочно переключаются биты.

      3. Процессор увидел, что питание достигло уровня >95% от стандартного.

      4. Процессор пропустил тактовый генератор на схему исполнения команд, заодно инициализировал несколько системных регистров. Один из них адрес текущей точки выполнения команд.

      5. Процессор начал выполнять команды, вытаскивая их по одной по порядку начиная с ячейки памяти с адресом ноль (или как там у него принято)

      6. Наш процессор «^ Advanced RISC Architecture», что означает, что почти все команды выполняются за один такт частоты. Один такт - 1/16 000 000 секунды.

      7. При выполнении одного такта почти параллельно делаются следующие операции:

  • Процессор выставляет адрес на шину адреса (для адресации 64 кБ необходимо 16 проводов в шине, т.е. шина адреса 16-ти битная)

  • Процессор выставляет управляющую команду на шину управления (шина управления 3-6 проводов: чтение/запись, запрос ОЗУ, запрос ПЗУ, запрос FLASH, запрос портов ввода вывода, прерывания). Команда например: «Память дай данные с адреса который выставлен на шине адреса».

  • Память дала данные на шину данных (8 проводов, т.е. 8-ми битная) и дернула за шину управления "данные готовы".

  • Процессор взял данные. В данных лежала команда для исполнения. К этой команде возможно нужны еще несколько байтов (по 8 бит считываний из памяти). Если это так, то процессор их дочитал.

  • Процессор выполнил команду (это могла быть команда сложения или записи или перехода это тоже целая серия работ с шинами данных, управления и адреса)

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


Так работает железо. Все достаточно однообразно. Внешне мы смотрим фильм или слушаем музыку, а в кочегарке кто-то выполняет одни и те же команды чтения, записи и сложения. Например, чтоб нарисовать точку на экране, процессор в видеопамять записывает код цвета точки, разбитый на спектральные составляющие красного, синего и зеленого по байту на каждый параметр. 3 байта нужно для зажигания одной точки, а зажечь надо 1280х1024 точек и перерисовывать их 50 раз в секунду. Чтобы сыграть мелодию на динамике, надо на катушку, оттягивающую мембрану динамика, подавать величину оттяга от 0-255 (1 байт) с частотой 44 000 раз в секунду. Все команды суть одно и тоже - это чтение запись и арифметика значений в ячейках памяти, а в это время пользователь видит ролик через интернет или общается с другой страной по Skype.

Создатели Си спрятали от нас всю рутину программирования на ассемблере и машинных кодах и предложили обобщенный интерфейс более приближенный к инженерному смыслу. Мы будем работать с «температурой и давлением», а не с движением множества хаотичных атомов. И все же, полностью полагаться на возможности Си мы не будем. Вот если бы мы программировали на intel i7 920, то конечно, все изыски Си в нашем распоряжении, но т.к. мы программируем для ATMega32, нам приходится искать золотую середину, что взять от Си, а что сделать самим. Мы слишком скованы ограниченной памятью и быстродействием. Мы возьмем от Си только самое необходимое.

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

Компилятор оптимизирует код по быстродействию и/или по размеру. Не все версии компиляторов работают одинаково. Придется выбирать нужный проводя сравнения производительности.

Итак мы знаем, что программа - это последовательность действий для процессора. Программа должна предусмотреть все возможные ситуации в которые попадает наше ЗУ и должна содержать инструкции что делать процессору и как выпутаться с честью. А если пользователь отцепит аккумулятор во время зарядки?! А если пользователь закоротит зарядку?! А если пользователь забудет зарядку включенной и уедет в отпуск?! А если аккумулятор перегреется и сожжет квартиру?!

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

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

Для освоения языка Си необходимо узнать мнемонику языка (характерные слова и символы для записи программы). Все языки высокого уровня суть одно и тоже и отличаются только мнемоникой. Все языки программирования (до нынешних времен многоядерности) подразумевали один поток исполнения команд, как человек, работа, дом, работа, дом, магазин, если есть деньги - ресторан, отпуск, больница, работа, дом. Поток выполнения команд перескакивает то туда то сюда в зависимости от условий жизни, попадает в циклы работа дом и в конце концов смерть - окончание действия программы.

Программа металась туда сюда что-то делала, но смысла в своих действиях не видела. Смысл виден, если вырваться за пределы программы. Аккумулятор зарядился, был вставлен в самолет, который оторвался от земли. Также и со смыслом жизни человека.

Итак все программы - это условия, переходы и циклы, а между ними вызовы функций. Вот и все программирование. Итак классические операторы условия и циклов:



Во всех циклах и switch допускается использование оператора break; Этот оператор досрочно завершает работу цикла. В циклах while и for можно использовать оператор continue; Этот оператор завершает выполнение текущего прохода цикла и переводит программу на выполнение следующего.
^ Урок №5 (Переменные)

Теперь, когда приблизительно ясно что такое процессор, что такое язык, что такое ход выполнения программы, т.е. есть общий взгляд на картину, начинаем приближаться и рассматривать ее более детально. Где-то выше мы отмечали, что всему в мире можно присвоить код и этот код можно хранить в памяти компьютера в виде напряжений в ячейках памяти, которые устроены как конденсатор (заряжен/не заряжен) или как триггер защелка из 6-ти транзисторов (который имеет 2 устойчивых состояния) или это домен (маленький магнит) в магнитном слое на винчестере/дискетке/ленте или это изменение свойств вещества компакт диска или это дырка в перфокарте как это было на заре цивилизации.

Итак всё вышеперечисленное - это 1 бит информации - да/нет, инь/янь, /+5в, дырка/недырка, север/юг магнита, мужчина/женщина, нолик/единичка, день/ночь, порядок/хаос. Всего 2 состояния, поэтому и двоичная система исчисления.
В двоичной системе всего две цифры 0 и 1. В двоичной системе нет цифры 2, но есть число 2 и оно записывается так: 10.

В десятичной системе исчисления 10 цифр: 0,1,2,3,4,5,6,7,8,9 и тоже нету цифры 10, но есть число 10 и записывается оно: 10.

В шестнадцатеричной системе исчисления 16 цифр: 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f и тоже нет цифры 16, но есть число 16 и записывается оно: 10
Теперь сделаем важное замечание: при попытке записать число в разных системах исчисления, количество предметов не меняется, меняется способ записи. Меняется вид, но смысл остается тот же. В тексте программы мы будем записывать абсолютный смысл числа предметов разными цифрами, имея ввиду одно и тоже количество.

Если вам надо перевести какое то число из одного вида исчисления в другой, воспользуйтесь калькулятором Windows (в настройках указать вид-инженерный).
Если мы говорим про ноги процессора, то нам удобнее двоичный вид.

Если мы говорим про целые числа предметов, то нам удобнее десятичный вид.

Если мы говорим про большие адреса или большие двоичные числа, то удобнее 16-теричный вид.
16-теричная и двоичная система очень похожи и удобны в преобразовании из одной в другую. Двоичная система очень громоздкая, 16-теричная — компактная.
Исторически сложилось что первые нормальные процессоры были 8-битными. Это значит что в одной ячейке информации параллельно хранились 8 битов информации и это значит, что шина данных между процессором и памятью состояла из 8ми проводов. Запрашивая данные из ячейки памяти процессор получал одновременно 8 битов. Современные компьютеры доросли до 64 битной шины данных процессоров, а в графических картах уже используются шины данных до 256 бит.
8 битов информации могут хранить в себе число от 00000000 до 11111111 или в десятичной от 0 до 255 или в шестнадцатеричной от 00 до ff.
Процессор ATMega32 это 8 битный процессор, значит все вышесказанное относится к нам.
С данными разобрались, теперь адрес. Если данные это содержимое ящичка, то адрес это номер ящичка по порядку. И то и другое есть число. И то и другое записывается в 2,10,16-теричном исчислении. Данные хранятся в ящичках — в ячейках памяти, адрес нигде не хранится. Адрес — это последовательные номера ячеек. Ячейки находятся в микросхеме памяти и физически располагаются по порядку. Зная адрес мы можем найти ту самую ячейку. Но адрес можно превратить в данные, записав его в ячейку.

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





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

Хотите писать программу с календарными датами, числами с плавающей точкой, с большими целыми числами - выкручивайтесь как хотите. Это ваши проблемы. Компьютер устроен так и не иначе.

Вот мы и будем выкручиваться как хотим, но в соответствии с международными стандартами.

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

Некоторые компиляторы неСи не требуют описания переменных, тогда они сами догадываются о типе из текста программы или во время работы программы меняют тип, но это излишние затраты памяти и быстродействия, а это произвол и нам это не подходит.

Наш компилятор предсказуем, отсебятину не несет, делает строго то что мы просим и требует от нас исчерпывающей однозначно понимаемой информации. В противном случае компилятор сигнализирует о неполноте программы.
Урок №6 (Типы переменных)


Название

Размер

Значение

Комментарий

bool

1 bit

0 или 1

Правда или ложь. Используется для логических конструкций.

char

1 byte =

8 bit

от -128

до +127

маленькое целое число или код буквы . Классический вариант.

unsigned char

1 byte =

8 bit

от 0

до 255

маленькое целое беззнаковое число или код буквы. Классический вариант.

BYTE

1 byte =

8 bit

от 0

до 255

Все то же самое что и в предыдущей строке только записывать удобнее.

int

2 byte =

16 bit

от -32768

до +32767

Целое знаковое число.

unsigned int

2 byte =

16 bit

от 0

до 65536

Целое без знаковое число.

WORD

2 byte =

16 bit

от 0

до 65536

Все то же самое что и в предыдущей строке только записывать удобнее.

short или

short int

1 byte =

8 bit

от -128

до +127

маленькое целое число или код буквы . Классический вариант.

long или

long int

4 byte =

32 bit

от -2147483648

до +2147483647

Целое знаковое число.

float

4 byte =

32 bit




Числа с плавающей точкой

double

8 byte =

64 bit




Числа с плавающей точкой для точных вычислений

long double

10 byte =

80 bit




Числа с плавающей точкой для очень точных вычислений
  1   2   3   4   5   6

Добавить документ в свой блог или на сайт

Похожие:

Программа, не имеющая аналогов
Вместо сервера Microsoft Exchange устанавливаем набор бесплатных программ без потери какой-либо функциональности, при этом Groupware-компонент...

Урок русского языка в 3 классе. Тема: Обобщение знаний о правописании разделительныхЪиЬ знаков
Сегодня у нас необычный урок, урок- путешествие. Мы поплывём на корабле «Знаток» по океану Знаний. Куда мы поплывём, вы узнаете,...

Проект на тему: «Современный урок русского языка»
Что такое современный урок? Важнее содержание или форма проведения урока? Может ли быть технология в образовании? Что придает современность...

Subject: Устанавливаем во Freebsd связку Squid + squidGuard + с-icap
Отсюда возникает насущная необходимость для руководства предприятия направлять подобного рода "веб-деятельность" своих сотрудников...

Приёмы и способы измерения параметров активных точек в диагностических целях по методу Фолля
Проводим тщательную стерилизацию электродов. В зависимости от степени доверия, одеваем на левую руку хирургическую или хлопчатобумажную...

Тезисы работы “Детская фантазия”
Этот урок обобщающий, проводится после усвоения учащимися определенных навыков работы с простейшим графическим редактором «gimp»,...

Урок «Изящной словесности.»
Этот урок надолго останется в вашей памяти, а ваша речь станет грамотнее, красивее, эмоциональнее

Урок на тему: Что проверяем в корне? (Обобщающий урок)
Текинский филиал муниципального образовательного учреждения Сампурская средняя общеобразовательная школа

Муниципальное образовательное учреждение Пятисотенная средняя общеобразовательная школа
«Урок гражданина», «Урок гражданственности», посвящённый 1150-летию Российской государственности

Урок с использованием икт по неорганической химии по теме «Серная кислота»
Тип урока: урок комбинированный (повторение + изложение познавательных сведений + закрепление)

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
odtdocs.ru
Главная страница