Записки сумасшедшего

Сегодня ехал в троллейбусе и от нефиг делать восстановил в памяти примерный ход моих мыслей при составлении программы работы драйвера IIC-Slave

Под катом бессвязный мыслепоток программиста ассемблерщика в период создания проги. Рекомендуется к ознакомлению программистам никогда не писавшим на ассемблере. =) Ну и всем желающим заглянуть мне в мозги в период творческого ража… В конце есть мини словарик :) Гуманитарии могут просто приколоться по бреду, не пытаясь вникнуть в смысл :) Местами нецензурно

…Такс, ждем бита скл, кидаем сда в С, крутим кумулятор влева…так. битик мы замутили.. .скл… скл… ждём когда скл отпустит, считаем битики, циклимся. Опа, кажись работает. Замечательно! Хм как все просто. Такс, а если у нас стоп? а нет у нас стопа! и нафиг он нам не нужен! Или нужен? Пусть нужен. типо стандарт. Так круче. *страшная мысль* Оппа… а ведь команда это 24 такта *перед глазами воображение рисует страшную картину распределения высоких и низких уровней на шинах SDA и SCL*, а если вдруг, проверив скл, во время выполнения команды перехода изменится сда, а мы этого не спалим? Там же целых 24 такта проц не пойми что делает!!! ААА!!! Черт, мы же прозеваем стоп! *страшная мысль №2* а если будет жуткая помеха, вот такая!*воображение рисует жуткий цифровой срач на шинах SDA/SCL* !!! Мы же застрянем в этом условии! Повиснем нахрен… Повииииснеееем!!! Мать! Черт, жопа! *далее много и нецензурно* Что делать!! АА, что делать! Блин, Аааа аАААаа *жестокий тупняк минут на 5, бьется головой о стол, подрывается написать в жалобный пост о помощи* Что делать!!! Нет, должен быть выход! О! Точно! От висняка нас спасёт СОБАКА! Натравлю ка я её на прерывание! Вачдог!!! ЫЫ!! Вачдог!!! ФАС!!!*при слове watchdog dlinyjDlinyj начинает истерично ржать* Факин щит! у 2051 нет вачдога. Бля, как быть? Таймер! Нужен таймер! Сцуко, у таймера своей работы хватает! Он же ШИМом занят, черт… *озорная мысля* А не переписать ли оба канала ШИМ на один таймер вместо двух? *ленивая мысля* К черту, нее… Нахер! этож гимор, частота рухнет, он и так не более 10кГц дёргается. Неее нихочу. Таймер холосый, не сцы, я тебя никому ниатдам! Я никому не позволю своими грязными лапами лапать твои прерывания. *светлая мысль* Нам нужен флаг! Флаг нас спасёт! Флаг поставим таймером! ТАдаМ!!! *яростно начинает добавлять в обработчик прерывания таймера условие* так если мы вышли на таймер от нулевого инта ,то забиваем на шим и скачем делать вачдог. Тадам! Черт, сраное условие ,теперь обработчик таймера 0 длинней таймера 1 на 4 команды. Мать перемать! *разумная мысль* но ведь шиму на это насрать! *эстетичная мысль* Но ведь это нихера некрасиво! Нопы! Нам нужны НОПЫ!!! NOP NOP NOP NOP *жадная мысль* Сука! целых четыре байта ПЗУ просрал зазря! А вдруг не хватит!!! Переделывай давай! *светлая мысль* ТочнО! Нах нам обработчик! Нах нам левый флаг! За флаг сканает флаг прерывания таймера! Тадам! Сэкономили целых 10 байт, выгадали целых 180 тактов, да ещё зажмотили один битовый флаг! УРА! *эстетичная мысль* Блин. А Шим то все равно перекосило! Один зубчик теряешь при каждом вызове IIC *разумная мысль* ЭТО ШИМ! ЕМУ ПОХ! *эстетичная мысль, обиженно* Ну хоть второй то шим выключить, и этот остановить. *разумная мысль* Нах? *эстетичная мысль* Для красоты, тебе что, жалко? *разумная мысль, пожимая плечами* Да нет, пжалуста.. добавляет CLR TR1 CLR TR0.*параноидальная мысль* А нас не перебьют? Кто же знает что ты там еще напишешь? *Стратегическая мысль* Да ты чо!!! Все путем *прогон под дебаггером* А чего у меня прерывание таймера не срабатывает? М? Разрешение есть…. ААА!!! Мать твою!!! Приоритеты прерываний!!! *напевает на мотив гимна гитлеровской Германии* Инт ноль… Инт ноль убер алиес… Врёёшь!!! Не возмешь!!! Инт ноль капут! Гордо взмывает флаг над рейхстагом в регистре приорететов прерываний… *Совершенно жуткая мысль* АААААААААААААААА!!! Время!!! ТАКТЫ!!! ТАКТЫ!!! НЕ УСПЕЮ!!! *посчитал пальчиком команды* эмм… 10 штук. эээ… 24MHz кварц, 12 тактов на команду… так так так… 24 на 12 = 2Мгц эквивалентного RISC процессора… по такту на команду… так так так… 2Мгц на 100Кгц… дает 20 команд.. у нас пока всего 10, а проверку стопа я в 4ре команды уложу… хух… укладываюсь … нормально *разумная мысль* А нах нам 100КГц? один хрен мастер не даст такую частоту, кисо куку? *понты* СТАНДАРТ! ХУЛЕ! И вообще! Что мы чё, лохи чтоль? *разумная мысль* Да какой нах стандарт? У тя прерывание дергается третей линией! И вообще твоя система что хоти то и городи! *понты* Неее СТАНДАРТ! И ПОНТ! ДА БУДЕТ ТАК! Клева! Работает… вроде бы… *Ужасная мысль* ААААААА!!! А памяти тебе хватит!!! Посмотри сколько кода! А у тебя ещё обработчик шаговика не напиииисаааан, а если добавить ещё и опрос датчиков и своих мозгов? Куда пихать будем?? ААА??? ну ка! *быстренько скомпилил* эээмм… всего кода на 450 байт. Еще осталось 1598 байт ПЗУ. Не сцать! Все путём. Места в памяти ещё жопой ешь! Сюда при желании влезет и искусственный интеллект, а также стадион и казино с блэк джеком и шюхами!!! *физиологическая мысль* ээйй чуваааак… а пожрать? *все хором* НАХУЙ!

…АУ! Братья по разуму! Кодеры! Ну как? Ведь так оно, да? ;)

Краткий глоссарий, для тех кто хотел, но не вкурил

  • СКЛ, СДА (SCL, SDA) линии шины данных типа IIC (она же I2C) разработанной для передачи инфы внутри схемы от одной микрухи к другой. Скорость шины от 0 до 100Кбит/сек. У меня по IIC связаны между собой разные процессоры робота.
  • СТОП и СТАРТ — определённые последовательности высоких (1) и низких (0) уровней на шинах SDA, SCL документированы в протоколе IIC
  • NOP самая простая команда любого процессора. Почему самая простая? Потому что не делает НИХРЕНА! совершенно. Просто занимает свой байт в памяти и сжирает свои 12 тактов процессорного времени. Юзается для выравнивания кода или временных интервалов.
  • Таймер — блок процессора, после заданной задержки выдаёт прерывание. Включается установкой бита TR, выключается сбросом этого бита.
  • Прерывание — Получив его, процессор бросает все дела и начинает выполнять код заложенный в обработчике прерывания.
  • ШИМ — Широтно импульсная модуляция. Метод, позволяющий задавать аналоговый сигнал цифровым выходом, посредством регулировки длительности высоких (1) и низких (0) уровней напряжения на шине, потом проинтегрировав это дело можно получить аналоговый сигнал. Пример: 1: ||||||||_|||||||||_|||||||| 2: ____|||____|||____ Напряжение сигнала 1 будет после интегрирования явно выше напряжения 2, где преобладает низкий уровень.
  • ПЗУ — постоянное запоминающее устройство. В моем процессоре (на самом деле это микроконтроллер) памяти 2КБ, ОЗУ 128 байт.
  • Кварц — кварцевый резонатор, им у меня задаётся частота тактов. На одну команду уходит от 12 до 24 тактов в зависимости от типа команды.

Запись опубликована в рубрике Компьютерное, Электроника с метками , , . Добавьте в закладки постоянную ссылку.

31 комментарий: Записки сумасшедшего

  1. http://www.hooey.ru/ говорит:

    Гениальный боевик! Последняя реплика тоже порадовала. Ну хоть спектакль ставь!

  2. TiN говорит:

    А на сях 4 команды в камне с аппаратным I2C. Да, да, да, летят в меня помидоры,неразумно , неоптимально,некрасиво. А кого колышет, когда нынче mega128 4 бакса стоит? Или ARM64 — 4,5 бакса. :-D

    • DI HALT говорит:

      Ну ну. У меня поток. Расходы на детали и изготовление 100р, цена готового изделия 550р. Разница идет мне в карман. Зажимаю каждую копейку, каждый резистор. Так что между 12р за кристал без всего 4мя баксами за мегу 128 невьебенная. Когда дело касается хотя бы сотен штук…

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

    • DI HALT говорит:

      Ну и не говоря про трудоемкость монтажа (цена запайки 20 соика и ткфп 144 отличается разительно) и габариты платы, где зажимается каждый миллиметр, чтобы сэкономить на текстолите.

  3. TiN говорит:

    Все верно. Только с точностью до наоборот. Подобный подход можно оправдывает когда тебе пофигу за сколько дней ты получишь готовый дивайс, и пофигу сколько ты заплатишь разработчику. А когда делаешь дивайс за бабло заказчика — то поставить мегу128 (кстати в MLF корпусе 100ног, она меньше чем SOIW-20 у той же 2313) и через неделю сдать работающий дивайс куда важнее. А насчет пайки — что соик, что tqfp, что MLF — одно движение феном или один прогрев в печи. Так что не надо демагогии :) Нет, я не спорю, есть приложения где надо каждый такт считать. Только они явно не на 2313 делаются ;)

    • DI HALT говорит:

      Опять же есть разный уровень производства. Мой мелкосерийка, монтаж делается не профи (по сути дела это набор студентов я им разве что паяльники СТ-96 выдал), но зато почти даром (заказ на производтве обойдется в порядок дешевле, при моих объёмах). Я и заказчик и разработчик в одном лице. Мне поручили решить проблему, обещав скупать девайс до цены определенного уровня. Я ее решил :)

      А почему бы не 2313? Я вот его сейчас забиваю байтик к байтику. Плюс у меня есть весьма низкий потолок цены — все что выше уже не выгодно мне, т.к есть почти готовое решение, мне же надо перебить цену. Вот и выходит, что ставится самая дешевая Тини (на данный момент это 2313) и байтик к байтику филигранно программируется.

  4. TiN говорит:

    P.S. когда я делаю себе дивайс за свое бабло, я часто ставлю чип вдвое больший чем нужно, и еще дополнительной рассыпухи накидаю, памяти там, плиску, просто чтобы было на чем потом попрактиковаться, поизучать работу разных алгоритмов. Мне не жалко для обучения бабла, святое дело это :) Peace..
    Ну и попробуй попиши на ASM под что-нибудь серъезнее чем 8bit AVR/PIC, ARM7/9 например хотя-бы.

    P.P.S. чтоб не показаться голословным: http://foto.ixbt.com/?id=album:9515 ;-)

    • DI HALT говорит:

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

    • DI HALT говорит:

      Кста, а чо это за хрень? А то по фоткам не понятно назначение девайса

  5. DI HALT говорит:

    Вообще программный ииц писался для уже готового дейвайса на АТ89С2051 коих было наклепано уже 100 штук и вдруг через год эксплуатирования потребовалось подключить к ним еще и шняжку на ииц. Вот и пришлось извращаться.

    Сейчас я на Тини2313 программно реализую второй уарт, т.к. ближаийший проц с двумя уартами это мега 162, что явно избыточно как по цене так и по ресурсам.

  6. Vic говорит:

    Atmega 8 стоит 60 рябчиков. У нее есть аппаратный ICC, 8 кил памяти, до хрена ОЗУ. Есть АЦП, компаратор, UART. Чудный кристалл. Рекомендую.

  7. Vic говорит:

    Повтор. Ошибся, написав ICC.
    Atmega 8 стоит 60 рябчиков. У нее есть аппаратный IIC, 8 кил памяти, до хрена ОЗУ. Есть АЦП, компаратор, UART. Чудный кристалл. Рекомендую.

  8. lbip говорит:

    жжошь! :)))
    так и вспомнились аналогичные камни, когда свой обработчик i2c писал пот atmel 2313 :))
    Но там собака живёт, там хорошо…

  9. masterMushi говорит:

    Посмеялся от души. да, низкоуровневое мышление доводит порой и до стука головой о стену. Будучи студентом шел через сессии по правилу Трипль Зет — 3з — Забыл Забил Запил. Евстественно стал вопрос о сдаче лаб. Всего 13 штук все на АСМе под ДОС. Дабы не заморачиваться с каждой в отдельности решил написать гаму Питон. И написал. Для красоты пришлось и нопы по тактам распихивать и удлиннять строки чтобы получились заветные 1024 байта. Единственное что стырил из чужого кода — генератор случайных цыфр отдекомпилил из старой демки с горящей пентаграммой.

    • Петр говорит:

      Помню исходники borland pascal лопатил дабы на асме x86 горящее чудо написать, брал именно генератор псевдослучайных чисел. И, ведь, комовская фигня получилась, малобайтная. А сейчас — пхп, перл, си, сипипи. Время утекает…

    • DI HALT говорит:

      Горящая пентаграмма? Это тот шедевр в 128 байтах кода??? Если он, то дааа.. рулезная дема. Я ее всю от и до по байтикам разобрал и написал на ее движке свою демку открытку, где на экране выдается горящими буквами поздравление (текст на дофига экранов), а в конце нихуевый фейрверк. Правда фейрверк похож больше на взрыв химзавода, ну да ладно :)

  10. Nick говорит:

    Стандарт есть святое, а «эстетическая мысль» обычно сводится к попытке избежать будущих проблем (проблем совершенно неизвестного пока еще генеза!) путем соблюдения некоей «красивой» общей структуры, которая на первый взгляд вроде блажь, но на практике слегка уменьшает число сюрпризов и «не слегка» облегчает их поиск. Так что все логично…
    Жаль, что силы+время+потребность так редко сходятся вместе…

  11. marge говорит:

    …с блэк джеком и шюхами!!!…. (^_^) Бендер ворева! :)

  12. aleksej_27 говорит:

    Приветствую!
    А как бы про програмный уарт на 2313 подробнее услышать?:)

  13. Красиво.

    Как я рад, что программлю на высоком уровне, и ЦЕЛЫХ 10 БАЙТОВ экономить не нужно. )))

    (Хотя в свое время с ассемблером позаморачивался.)

  14. smartcoder говорит:

    Точно-точно! Как знакомо :)

  15. rapxaker говорит:

    От брата кодера брату кодеру, у меня мысли почти такие же. Щас читал и ржал…. С СЕБЯ! Респект одним словом.

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

  17. EXILIM говорит:

    DI HALT, извини за афиширование твоих мыслей начинающего:
    «Записки сумасшедшего»! на другом сайте: http://www.phreaker.us/forum/showthread.php?t=12585
    Исповедь человека, который уже хорошее разбирается в программировании, но далее делайте вывод, каждый для себя

Добавить комментарий