Здравствуйте, мыщъх, Вы писали:
PD>> Почему я не хочу С в качестве начального языка обучения — уже писал в предыдущем топике. М>си это паскаль со скобками. кстати, именно микроконтроллеры позволяют обойти отсутствие поддержки строк в си. там нам не нужны строки. точнее, не сильно нужны.
PD>>Насчет микроконтроллеров (независимо от языка) — я против, потому что это весьма специфическая область, М>что в ней специфического? >это как раз винда и линух специфические области с точки зрения студента, который уже пишет для веб и курит понятия событийно-ориентированного программирования и stateless. а программа на паскале (си, питоне) обычно представляет упорядоченную последовательность... как, собственно, и само определение алгоритма. разрыв шаблона и взрыв мозга.
Совсем не обязательно при начальном обучении давать событийно-ориентированное программирование. Консольные программы есть и в Windows, и в Linux.
PD>> и при программировании для них не избежать решений, не носящих универсальный характер, М>например? базовый ввод-вывод у нас есть из коробки. это чтение запись в последовательный порт, который можно смотреть терминалом. специфических расширений компилятора не используется. программа собирается и заливается на микроконтроллер по щелчку мыши.
М>привести хотя бы пару примеров решений "не носящих универсальных характер", плз.
Ну хотя бы проблемы с ограниченным объемом АП. Этого порой достаточно для того, чтобы применять всякие хитрости, которые лучше бы не применять. Я непосредственно с микропроцессорами не работал, но досовскме проблемы с сегментами в 64 К помню, и huge указатели тоже помню, и не надо их больше.
PD>> Напоминаю, я по-прежнему веду речь о начальном этапе. Начальное обучение должно PD>> быть как можно меньше привязано к специфическим особенностям среды исполнения. М>блин. я помню как в трту (таганрогский радик) нам сначала схематично рисовали эвм. вы тоже ее рисуете? надо же объяснить людям что это такое, верно? вот ЦП, вот память, вот перефирия (шина и порты). такая простая модель. и микроконтроллер ей соответствует чуть больше чем полностью. разве что память там внутри. но это ж мелочь. главное, что вот они ПОРТЫ.
Я не рисую. Объяснить про память можно, порты в первоначальном курсе совсем не нужно затрагивать.
М>а меня знакомые студенты постоянно просят объяснить как так по одним и тем же адресам памяти в разных процессах разные данные. приходится совсем все упрощать и говорить: вас же не удивляет, что у двух массивов по одному и тому же индексу разные данные? забудьте про память. вас обманули. указатель это как индекс, то... указатель. но и индекс тоже. это идекс в таблице которую руками не трогать. тем более, что она там не одна...
Они после такого объяснения что-то понимают ?
Не надо тут упрощать. Надо просто объяснить разницу между физической и виртуальной памятью и немного рассказать про механизм трансляции адреса. Но это не в начальном курсе.
М>ну и как работает видео-карта и как она ложиться на схему ЭВМ -- это тоже встречает непонимание. слишком много слоев абстракций. слишком сложно все это. объяснить, что консоль это точно такое же графическое окно, только это консоль -- сложно. объяснить графический вывод еще сложнее. а вот если подцепить к микроконтроллеру небольшой графический дисплей, то там все понятно. можно зажигать точки. из точек составлять отрезки. из отрезков -- графические примитивы.
А это в начальном курсе вообще лишнее. Есть дисплей, на него строки выводятся с помощью printf/cout/writeln. Для начала вполне хватит. А потом будет курс по устройству всего на нижнем уровне, там и объяснить.
В общем, всему свое время. Начальный курс программирования базируется на изучении языка, алгоритмов и исполняется в той среде программирования, которую выбрали , без погружения внутрь. Остальное потом, вот там можно и пдробности привести.
Здравствуйте, мыщъх, Вы писали:
М>Почему бы не использовать для обучения Си и микроконтроллеры? Микроконтроллеры превращаются в микрокомпьютеры минут за пять времени прямо на макетнике и поддерживают цифровые и аналоговые входы/выходы.
А почему бы сначала не задуматься о конечных целях, о том, чему мы именно хотим обучить своих учеников. Какие мы ставим перед собой цели разрабатывая эту учебную программу. И какие именно достоинства и недостатки у нее по сравнению с существующими программами обучения.
Здравствуйте, мыщъх, Вы писали:
EP>>Там точно такое же по сути "волшебство" — каким-то "магическим" образом заливается прошивка, М>почему "магическим"? тем более, что способов заливки вообще-то множество.
Потому что я воткнул МК в программатор, запустил "волшебную" программу, указал прошивку, нажал кнопку — и она "магическим" образом зашилась в МК.
Конечно можно открыть datasheet МК, посмотреть возможные способы заливки, используемые при этом ноги и протоколы, прочитать документацию программатора и его "волшебной" программы — тогда "магия" исчезнет. Но пока это всё не разобрано на винтики — это такая же "магия"/абстракция как и загрузка исполняемого файла.
М>а вот вы, сударь, можете объяснить как происходит загрузка exe файла?
Загрузчик отображает секции из файла в виртуальную память, ищет и загружает необходимые динамические библиотеки, ликует их и фиксит адреса по таблицам релокации.
М>желательно с порядком иницилизации dll, который вообще-то недокументированный и не совпадает с порядком их загрузки. к тому же в точку входа exe файла управление может вообще не приходить, а исключение, выброшенное из _некоторых_ (скажите мне каких) функций поглощается осью и равносильно return, что позволяет вместо return прямо из серидины цикла обращаться по null-поинтеру и мы выйдем из функции. вот это -- настоящая магия.
Вот когда я лет десять назад боролся с упаковщиками, находил OEP, фиксил таблицы импорта — знание подобных деталей было полезным и даже необходимым. Но с тех пор я занимаюсь в основном прикладным программированием и вполне могу это всё использовать как чёрный магический ящик, точно также как и программатор из примера выше
EP>> используются "высокоуровневые" библиотеки (пусть и вшитые в железо) UART, SPI, etс. М>побойтесь бога. сейчас везде USB.
Соединить две микросхемы внутри платы можно и по SPI.
М>оно гораздо проще для понимания на уровне проводов.
Сударь, вы лучше попытайтесь объяснить эту "магию" которую предлагаете использовать — на уровне протокола, а не проводов.
EP>>В обсуждаемом выше микроконтроллерном примере LED Cube 3x3x3 я использовал готовый/железный IO UART (который "магическим" образом выдавал мне готовые байты), EP>>а не дёргал лапки Rx/Tx вручную — чем эта IO "магия" лучше IO "магии" типа cstdio или iostream? М>разумеется, это магия. но я предлагал обойтись без нее. у микроконтроллера есть нога. на ней написано, что это порт 1. в этот порт можно записать 1 или 0. светодиод горит или нет. а вот нога 2. в нее можно записать от 0 до 255. светодиод горит с разной яркостью. а вот нога 3. к ней можно подключить переменный резистор, читать значение и посылать его в последовательный порт, отображая значение в окне терминала на компе. согласен, что это уже магия. но это все-таки не iostream. это все-таки проще. уровней абстракции меньше.
Не вижу разницы в том сколько у нас под ногами этажей абстракции (опять же, в контексте начального обучения).
Какая разница — на двадцатом мы этаже, или на десятом?
Под ногами у нас тот же самый пол (интерфейс), и мы ходим по нему, а не по голой земле. Причём особо не задумываясь почему этот пол и здание нас выдерживают, какого типа несущие конструкции, какие там сечения и какая была расчётная схема.
EP>> Чем "магия" заливки прошивки в МК лучше "магии" загрузки ELF/PE? (в контексте начального обучения программированию) М>прошивку можно посмотреть в виде hex-дампа.
ELF/PE тоже можно. И для начинающих программистов это будут такие же буквы/циферки, в которые магическим образом превратился их код на C.
С чего вдруг hex-dump прошивки станет тёплым и ламповым, а hex-dump .exe нет?
М>и там не будет ничего "лишнего". и она будет мааааленькой.
Как это не будет? Был код на C, компилятор прожевал его и выплюнул бинарник. И вот смотрит студент на hex-dump — и видит что его C кода тут нет, assembler он ещё не знает (мы про первоначальное обучение говорим, да?), вместо кода какая-то абракадабра
М>кто-то из форумчан сказал, что людей, испорченных интерактивными отладчиками, ничего не исправит.
А какая аргументация против отладчиков? Я использую и интерактивные отладчики и отладочную печать, а иногда даже исправляю чужой код без возможности его скомпилировать и запустить. Не вижу проблемы в интерактивных отладчиках — это всего лишь инструмент
Даже если брать RE — OllyDdg и SoftICE — вполне себе интерактивные.
Я даже больше скажу, интерактивный отладчик сильно помогает при начальном обучении программированию — позволяет пощупать в живом исполнении как работают те или иные структуры control-flow.
М>в этом смысле микроконтроллеры дают нам шанс. хотя в принципе есть эмуляторы и "свинья грязь найдет" (с).
Какой шанс? Как я уже говорил ранее, в микроконтроллерах возможна такая же интерактивная отладка, без всяких эмуляторов, прям в железе, через какой-нибудь JTAG http://www.youtube.com/watch?v=s3XwevmvImA
М>но почему бы не показать отладочную "печать" на светодиодах, отобрав даже возможность записи в последовательный порт? тем более, что на начальном этапе алгоритмы простые.
Зачем? ЕМНИП даже в программируемых калькуляторах типа Электроника МК-52, МК-85 была пошаговая отладка.
Наоборот, я считаю что отладчик даёт хорошее интуитивное представление о том как работает программа.
М>ЗЫ. а видели горящие глаза того, кто сам собрал тетрис? (почти без помощи). у людей сразу появляется интерес и мотивация. М>потому что у них есть то, что во-первых, они могут хачить и перехачить на свой манер, а во-вторых такого нет ни у кого.
У меня загорелись глаза после того как я написал простейший калькулятор на Pascal'е. Для меня это было так круто, что я записал его на дискету и всем показывал при первой возможности.
Простейшего консольного IO на writeln/readln оказалось более чем достаточно для пробуждения интереса.
М>тетрис на микрухе с напрямую подключенной матрицей светодиодов (микруха тянет) и четырьмя кнопками прямо на хлебной плате -- это с гордостью показывают друзьям в программировании не шарящих. а запрограммировать достойный тетрис на компе... увы. это слишком сложно. в смысле чтобы тетрис был конкурентоспособным.
Во-первых, неужели этот тетрис действительно был конкурентоспособным? Были ли хотя бы удобные кнопки и корпус?
Во-вторых, почему обязательно делать конкурентоспособный тетрис прям с первых шагов?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Насчет микроконтроллеров (независимо от языка) — я против, потому что это весьма специфическая область, и при программировании для них не избежать решений, не носящих универсальный характер, а специфических именно для этой области даже при при изучении базовых принципов программирования.
Это не обучение микроконтроллеров -- это работа с железом "побилже", т.е. не где-то там в пластиковом корпусе,
а в руке. Написал программу, залил, воткнул светодиод -- работает. Можно генератор каких-нибудь звуков (нот) написать.
Важно то, что ты работаешь с железом, лучше понимаешь как работает железо. Разница между микроконтроллером и компьютером
колоссальна, но базовые принципы у них одни и те же.
Здравствуйте, DemonsInside, Вы писали:
DI>А почему бы сначала не задуматься о конечных целях, о том, чему мы именно хотим обучить своих учеников. Какие мы ставим перед собой цели разрабатывая эту учебную программу. И какие именно достоинства и недостатки у нее по сравнению с существующими программами обучения.
Пощупать железо руками, а не слушать сухие лекции, что есть процессор, есть память и т.д.
People who are really serious about software should make their own hardware.
У буржуев можно подсмотреть как они к этому подходят (впрочем, ты, мыщъх, ссылки эти наверное видел) -- https://www.edx.org/course/embedded-systems-shape-world-utaustinx-ut-6-02x#.VSJaQOEYPGx
Мне лично ооочень нравиться митовский 6.004 -- там люди действительно начинают с транзисторов, потом gat'ы и выше, выше...
У меня всегда была интуиция, что без довольно детального понимания того как работает железо, приличным программистом не стать.
А программистом на managed языках вдвойне надо понимать железо, поскольку оно от них фактически скрыто.
Здравствуйте, Sharov, Вы писали:
S>Это не обучение микроконтроллеров -- это работа с железом "побилже", т.е. не где-то там в пластиковом корпусе, S>а в руке.
Это ты видишь что получается "поближе", потому что знаешь что уровней абстракции намного меньше, знаешь что это за уровни.
А для только начинающего программировать студента нет разницы сколько там уровней абстракции, в обоих случаях он будет общаться с полностью чёрным ящиком и его абстрактным интерфейсом — что при работе с МК, что с stdio
S>Написал программу, залил, воткнул светодиод -- работает.
От написанной программы до горящего светодиода код на C проходит через тысячи, а то и миллионы софтовых и железных вызовов подпрограмм, о которых начинающий программист не имеет никакого представления
EP>От написанной программы до горящего светодиода код на C проходит через тысячи, а то и миллионы софтовых и железных вызовов подпрограмм, о которых начинающий программист не имеет никакого представления
Ну так в ходе обучения и получит представление об. Т.е. это не путь с верху вниз, а с низу вверх.
Здравствуйте, Sharov, Вы писали:
EP>>От написанной программы до горящего светодиода код на C проходит через тысячи, а то и миллионы софтовых и железных вызовов подпрограмм, о которых начинающий программист не имеет никакого представления S>Ну так в ходе обучения и получит представление об. Т.е. это не путь с верху вниз, а с низу вверх.
Во-первых, то есть ты предлагаешь изучать все уровни снизу вверх, прям с самого начала изучения программирования? То есть устройство микроконтроллеров вплоть до вентилей, протокол USB (по которому будет заливаться прошивка), код программатора, компилятор C, устройство и драйвера компьютера на котором вводится код, растеризацию шрифтов которыми этот код выводится на экран и т.д. и т.п., и только потом начинать программировать?
Во-вторых, микроконтроллеры с кодом на C это никакой не низ, кроличья нора намного глубже. Почему это нужно останавливаться на микроконтроллерах, а не например на Altair 8800, где машинные коды вводятся вручную по битам прямо в память?
Или почему тогда не собирать компьютер вручную на транзисторах?
В-третьих, программы это алгоритмы плюс структуры данных, зачем в начальное обучение дистиллированному программированию вводить какие-то лишние и отвлекающие моменты типа возни с проводами, проблем с железом и использования совершенно незнакомых девайсов? Что это даст?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, Sharov, Вы писали:
EP>>>От написанной программы до горящего светодиода код на C проходит через тысячи, а то и миллионы софтовых и железных вызовов подпрограмм, о которых начинающий программист не имеет никакого представления S>>Ну так в ходе обучения и получит представление об. Т.е. это не путь с верху вниз, а с низу вверх.
EP>Во-первых, то есть ты предлагаешь изучать все уровни снизу вверх, прям с самого начала изучения программирования? То есть устройство микроконтроллеров вплоть до вентилей, протокол USB (по которому будет заливаться прошивка), код программатора, компилятор C, устройство и драйвера компьютера на котором вводится код, растеризацию шрифтов которыми этот код выводится на экран и т.д. и т.п., и только потом начинать программировать?
За все время обучения в приличном вузе все это в той или иной степени детальности проходится.
EP>Во-вторых, микроконтроллеры с кодом на C это никакой не низ, кроличья нора намного глубже. Почему это нужно останавливаться на микроконтроллерах, а не например на Altair 8800, где машинные коды вводятся вручную по битам прямо в память? EP>Image: images EP>Или почему тогда не собирать компьютер вручную на транзисторах?
Так и делают, смотрите митовский курс (я дал ссылку выше). И кстати вот, буквально недавно -- http://habrahabr.ru/post/254879/
EP>В-третьих, программы это алгоритмы плюс структуры данных, зачем в начальное обучение дистиллированному программированию вводить какие-то лишние и отвлекающие моменты типа возни с проводами, проблем с железом и использования совершенно незнакомых девайсов? Что это даст?
Согласен. Вероятно с нуля это давать не надо. Но включить в курс для инженера-программиста следует, даже если он потом будет
все время на js писать. И не просто включить, а достаточно основательно. Шоб руками и на транзисторах!
Здравствуйте, Sharov, Вы писали:
S>За все время обучения в приличном вузе все это в той или иной степени детальности проходится.
Вот именно что за время, а не с самого начала "снизу вверх".
EP>>Во-вторых, микроконтроллеры с кодом на C это никакой не низ, кроличья нора намного глубже. Почему это нужно останавливаться на микроконтроллерах, а не например на Altair 8800, где машинные коды вводятся вручную по битам прямо в память? EP>>Image: images EP>>Или почему тогда не собирать компьютер вручную на транзисторах? S>Так и делают, смотрите митовский курс (я дал ссылку выше).
Computer programming course in any language with exposure to variables, arithmetic, logic, loops, and functions. High school physics course covering current, voltage, resistance, and power.
О чём собственно и речь
S>Согласен. Вероятно с нуля это давать не надо. Но включить в курс для инженера-программиста следует, даже если он потом будет S>все время на js писать. И не просто включить, а достаточно основательно. Шоб руками и на транзисторах!
Я только за такое включение, как минимум в виде спец-курса.
Но не вижу преимуществ программирования МК при начальном обучении программированию.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Я только за такое включение, как минимум в виде спец-курса. EP>Но не вижу преимуществ программирования МК при начальном обучении программированию.
Согласен, для начала надо будет что-нибудь попроще.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, Sharov, Вы писали:
EP> Я только за такое включение, как минимум в виде спец-курса. EP> Но не вижу преимуществ программирования МК при начальном обучении программированию.
после того как студентам показали микроконтроллер и объяснили как его программировать, они (на моем опыте) единогласно постановили: "какая же гадость эта ваша заливная рыба" (с). рыба это пюсюк или макбук. потому что микроконтроллер легко стыкуется с тучей железа. разные датчики, сенсоры... очень легко считывать показания прямым чтением портов. на писюках этого нет и управление железом на писюках это уже спецкурс.
именно доступность оборудования, легко стыкующегося с МК, и легкость управления этим оборудованием позволяет на МК творить чудеса даже на самом начальном этапе изучения программирования.
с машинами состояний при программировании МК сталкиваются очень рано. самый простой пример: у нас есть одна кнопка и один светодид. нажимаем (с отпусканием) один раз -- светодиод загорается (потухает). при этом студенты сразу видят, что (как и на писюках) реагировать можно как в момент нажатия, так и в момент отпускания конпки. чуть-чуть более сложная задача: это когда у нас светодиодов два (или три) и они загораются один за другим. чуть-чуть более сложная задача -- добавить кнопку сброса состояния. чуть-чуть более сложная задача -- добавить автоповтор. чуть-чуть более сложная задача -- заменить светодиоды на 7 сегментный индикатор, на котором очень-очень быстро мелькают цифры от 1 до 6, а нажатие кнопки останавливает процесс. типа генератор случайный чисел аля подкинуть кубик.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Программирование микроконтроллеров без (хотя бы базового) знания цифровой схемотехники — это профанация. Хотя бы для понимания, зачем нужны три состояния для вывода микроконтроллера, что такое дребезг контактов и как с ним бороться и т.п. Поэтому логично начинать с курса цифровой схемотехники и азов аналоговой.
PS. Мы все еще об обучении программированию?
Здравствуйте, Sharov, Вы писали:
S>Важно то, что ты работаешь с железом, лучше понимаешь как работает железо. Разница между микроконтроллером и компьютером S>колоссальна, но базовые принципы у них одни и те же.
кроме физических размеров, ВООБЩЕ НЕТ РАЗНИЦЫ. от слова совсем.
Здравствуйте, мыщъх, Вы писали:
М>я так и читаю в качесвте факультатива в нашем колхозе. только не на старших курсах. не уверен, что у людей после этого появляется понимание как работает эвм, но вот мотивация появляется точно. и у нас совместно появляются идеи в стиле: а что есть майку на спине усеять множеством микроскопических светодиодов и отображать на ней рекламу, скажем?
А интересно, сколько планируется платить владельцу такой майки, чтоб он ее носил? Ибо я вообще не могу понять мотивацию того, кто согласится надеть такую майку.
Здравствуйте, Stanislaw K, Вы писали:
S>>Важно то, что ты работаешь с железом, лучше понимаешь как работает железо. Разница между микроконтроллером и компьютером S>>колоссальна, но базовые принципы у них одни и те же.
SK>кроме физических размеров, ВООБЩЕ НЕТ РАЗНИЦЫ. от слова совсем.
В принципах функционирования разницы нет, а в возможностях есть.
Здравствуйте, Sharov, Вы писали:
S>>>Важно то, что ты работаешь с железом, лучше понимаешь как работает железо. Разница между микроконтроллером и компьютером S>>>колоссальна, но базовые принципы у них одни и те же. SK>>кроме физических размеров, ВООБЩЕ НЕТ РАЗНИЦЫ. от слова совсем.
S>В принципах функционирования разницы нет, а в возможностях есть.
Здравствуйте, Stanislaw K, Вы писали:
SK>Здравствуйте, Sharov, Вы писали:
S>>>>Важно то, что ты работаешь с железом, лучше понимаешь как работает железо. Разница между микроконтроллером и компьютером S>>>>колоссальна, но базовые принципы у них одни и те же. SK>>>кроме физических размеров, ВООБЩЕ НЕТ РАЗНИЦЫ. от слова совсем.
S>>В принципах функционирования разницы нет, а в возможностях есть.
SK>например?
Надо сравнитвать i7 и процессор какого-нибудь ардуино?
Процессор и там и тут, ISA может быть даже совпадает, но производительность мягко говоря отличается.