Далеко ли до достижения дзена?

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

До волновых функций еще прозревать и прозревать.

Тут много ломают копий про то, как “правильно” смотреть на МК:

  • как на абстракцию ЯП высокого уровня?
  • как на адреса и регистры?

Нет верного ответа. По мере погружения в предмет, проходишь либо вверх либо вниз по этим ступеням.
Вверх - для тех, кто пришел из жутких пиков с ассемблером. Вниз - для тех, кто пришел из Веба и баз данных.
Моё мнение - “пик”-овский подход сейчас вреден более, чем “пхп”-шный. Не стоит заострять внимание на адресах и регистрах. Причина - очень много ресурсов в МК сейчас, и нет мотивации к их экономии.
Но очень полезно, все таки помнить, что именно стоит за абстракциями ЯПВУ. Не гнаться за экономией байтов и тактов постоянно, но и не забывать, что МК != ПК.

1 лайк

Могу поделиться своими мыслями о том, когда Вы достигнете дзена.

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

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

Это, знаете, как с дедом Морозом. В детстве я считал, что есть волшебный мужик. Потом понял, что никакого волшебного мужика нет. А годам к пятидесяти вдруг поймал себя на мысли, что Дед Мороз – то есть и самый настоящий. И то, что бороду прицепил сосед Вася – неважно, это техническая сторона вопроса, несущественная деталь. Но когда он её нацепит и начинает поздравлять, а мы – принимать поздравления, начинается самое настоящее волшебство и приходит самый настоящий Дед Мороз. Или, вот многие считают, что Бог есть, но при этом все понимают никакой «мужик на облаке не сидит», т.е. он есть, но не в изначальном детском понимании.

P.S.
Когда мне приходится писать на ассемблере, а всегда смотрю, какие ассемблеры есть для интересующего меня процессора и выбираю такие, в которых есть структуры и прочие вкусности. Например, для любимых AVR есть AVRASM и GNUAssembler – я пользуюсь исключительно вторым, потому, что там есть и структуры, и строки, и макросы, и выравнивания и до хрена чего. Мне это реально нужно и мне плохо без этого. Прикиньте как смешно было, когда какой-то крендель на Амперке попытался меня «авторитетно поставить на место», заявив, что я обкурился, и никаких структур в ассемблере нет и быть не может :slight_smile:

5 лайков

людЯм свойственно заблуждаться )))

1 лайк

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

8 лайков

Ага, меня помню закидали помидорами когда я микросхемы слово сказал вместо дискретной логики :crazy_face:
А транзисторы так вообще другая вселенная для многих.

Все есть , храни его память , машина Тьюринга :slight_smile:

Здается мне настоящий дзен это когда твое отношение определяется задачей как когда смотришь фильм по телеку: хочешь увлечься сюжеотм-видишь образы, хочешь настроить картинку - видишь пиксели…

:slight_smile:
И жизни нет, лишь череда биохимических реакций…материализация абстракций - инструмент развития цивилизации.

Евгений, а в Ардуино код этот второй ассемблер встраивается?
(ой, чувствую, наверно полную чушь спрашиваю… ну если так не отвечайте… но вопрос удалять не стану. Мне плевать на репутацию Ж)

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

Блин, Вы же видели ту нашу дискуссию на Амперке, даже участвовали. Я там полный пример привёл, который нормально работает на avr’овских ардуинах.

Кидаете в папку скетча два файла: .ino и .S (именно .S — не .s), компилируете, грузите и любуетесь.

Файл .ino
#define printVar(x) do { Serial.print(#x "="); Serial.print(x); } while (false)

struct TwoNumbers {
    uint8_t numberA;
    uint8_t numberB;
};

extern "C"  uint8_t getSum(const TwoNumbers * const);

void setup(void) {
    Serial.begin(9600);
    TwoNumbers tn = { 13, 12 };
    printVar(getSum(& tn));
}

void loop(void) {
    delay(100500);
}
Файл .S
;
; Определяем структуру TwoNumbers
;
.struct 0
    TwoNumbers:
        TwoNumbers.numberA: .space 1
        TwoNumbers.numberB: .space 1
; конец определения struct TwoNumbers
;

.section .text
.global getSum

;
;    Прототип функции
; uint8_t getSumAsm(const TwoNumbers * const twoN );
;
getSum:
    movw	r30, r24    ; параметр - указатель на структуру -> Z
    ldd	r24, Z + TwoNumbers.numberA ; numberA -> r24
    ldd	r23, Z + TwoNumbers.numberB ; numberB -> r23
    add	r24, r23    ; складываем и возвращаем в регистре 24
    ret
;

Можно ассемблерный текст и покороче написать (некоторые считают, что второй вариант понятнее).

Другой вариант файла .S
;
; Определяем структуру TwoNumbers
;
.struct 0
    TwoNumbers:
        numberA: .space 1
        numberB: .space 1
; конец определения struct TwoNumbers
;

.section .text
.global getSum

;
;    Прототип функции
; uint8_t getSumAsm(const TwoNumbers * const twoN );
;
getSum:
    movw    r30, r24    ; параметр - указатель на структуру TwoNumbers -> Z
    ldd    r24, Z + numberA ; numberA -> r24
    ldd    r23, Z + numberB ; numberB -> r23
    add     r24, r23    ; складываем и возвращаем
    ret
;

Второй вариант предполагает, что имена “numberA” и "numberB " уникальны - их нет, например, в других структурах.

1 лайк

Сорри, что напряг - я “той дискуссии” даже не помню. Прошла мимо сознания.

Спасибо за разъяснение. Хотя я, наверно, и его через неделю забуду :frowning:

Это и есть дзен - наблюдать за возникающими на форуме постами, не фиксируясь на них и сразу забывая.
То же самое, что сидеть у реки и смотреть на закруживаемые течением листья.

2 лайка

Блин, ну вот нет более нелогичного текста, чем ассемблер.
Вот хотя бы пример из сообщения Петровича:

    movw    r30, r24    ; параметр - указатель на структуру TwoNumbers -> Z
    ldd    r24, Z + numberA ; numberA -> r24
    ldd    r23, Z + numberB ; numberB -> r23
    add     r24, r23    ; складываем и возвращаем
    ret
;

Комментарии построчно:

Первая строка - movw r30, r24 Почему r30 ? Почему r24 ??Чем это определяется? Один из этих регистров, судя по комментарию, должен содержать указатель на структуру. Как указатель туда попал?

ldd r24, Z + numberA - Откуда взялась Z ? Эта переменная НИГДЕ не определена ранее!

R24, R25 - это следует из описания того, как C/C++ передают параметры в функцию.
R30, R31 это индексная пара Z.

это как-то следует из показанных выше кодов(если можно, то укажите откуда именно) или это просто надо знать? Типа 30 и 31 регистр вместе называются Z ?

Ок, пусть указатель на структуру лежит в Z. А как он туда попал?

26-27 X 28-29 Y 30-31 Z да надо знать

Первый параметр передаётся в 24 регистре если один байт, 24-25 если два байта (как раз наш случай) …

movw пересылает слово из 24,25 (переданный указатель) в Z (30,31)

Спасибо
Ок, пусть указатель на структуру лежит в Z. А как он туда попал?