взять и уебать

Oct 22, 2014 15:43

P4OUT &= ~R_B+~R_G; // сброс триггеров

Это из профессиональной железки, прошедшей сертификацию. Почему у нас падают спутники, я не удивляюсь.

Leave a comment

display_none October 22 2014, 13:45:00 UTC
Верно-ли я понимаю что товарищ пытается обнулить в P4OUT биты, поднятые в R_B и R_G?
Ну тоесть P4OUT & (~R_B) & (~R_G) ?

Reply

mbr October 22 2014, 13:47:12 UTC
Да.

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

Reply

display_none October 22 2014, 18:27:58 UTC
А что, прёмочных тестов там не было?)

Все же мне странно предположить что человек не понимал двоинчную арифметику до степени 'совсем'.
Как же он остальное написал?

Reply

mbr October 23 2014, 04:34:10 UTC
Там дальше был просто ад и израиль. Использовался soft float. При этом промежуточные константы были в интах, поэтому поплыли результаты. В итоге вполне годную в теории математику подгоняли мейджиками тупо по диапазону значений.

Дальше веселее - из-за soft float, вероятно, заканчивалась память. И автор перешел на ассемблер вообще без понятия о процедурах - одна точка входа и порядка 50 кб кода с метками исключительно вида "jjjj1a". Думаю, проще в бинарном коде разобраться, чем в этом высере. При этом с его талантами мне крайне сомнительно, что он смог родить код эффективнее компилятора. Зато читабельность упала до нуля.

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

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

Reply

aterentiev October 22 2014, 14:57:26 UTC
a может, товарищ пытается обнулить в P4OUT все биты, кроме обнуленных в R_B и R_G? при значениях (констант? макросов?) R_B и R_G с одним единственным сброшенным битом (остальные установлены) код предсказуем на 100% при условии, что R_B и R_G не равны друг другу

Reply

sontar October 22 2014, 15:06:54 UTC
т.е. хранит битовые маски в инвертированном виде? это тоже wtf

Reply

aterentiev October 22 2014, 15:09:06 UTC
угу, отрицательная логика

Reply

qehgt October 22 2014, 15:36:12 UTC
у автора кода может быть своя логика - например, R_G означает "reverse G". Вот так вот ему показалось удобным.

Reply

sontar October 22 2014, 15:42:00 UTC
версия, что автор кода предпочитает экзотические методы программирования и успешно ими пользуется, не подтверждается фактами

Reply

qehgt October 22 2014, 16:11:14 UTC
Ну, да - по крупицам собирать надо, что же хочет поведать нам топик-стартер.

Reply

display_none October 22 2014, 18:42:59 UTC
Может быть в 99% случаев он пишет в другой порт, а там железка напротив ждет ноля в бите, соответствующем триггеру.

А мысли про define были отвергнуты с ремаркой "да ну, ради одного случая".

Хотя конечно это не выглядит правдой.

Reply

display_none October 22 2014, 18:38:33 UTC
Вот кстати да. Скорее всего каждый бит байта в порту P4OUT означает один триггер.
А следовательно они точно не равны друг другу, и если они реверсные у них точно сброшен один бит.

Но в таком случае коммент должен быть "сбросить всё кроме триггеров".
Кроме того я спрашивал топикстартера о задаче, он подтвердил что задача именно сбросить битики из этих констант.

Reply

ximaera October 22 2014, 20:59:55 UTC
Это в любом случае WTF, потому что выглядит как WTF. Даже в описанном вами случае -- что мешало побитовое "или" использовать, чтобы у следующего программиста инфаркта не было?

Reply


Leave a comment

Up