фон-нейман
Apr. 1st, 2017 06:25 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
А эта ваша ородруина (точнее клон digispark на attiny85, но IDE там используется ардуинное) меня удивила. Я как-то не привык, что бывают компьютеры с не фон-неймановской архитектурой (а если и бывают, что это может вдруг оказаться моей, а не компилятора, проблемой), а тут вдруг. "Фон-Нейман", если что, это когда код и данные выполняются из одной памяти, а "Гарвардская архитектура" (это которая не фон-нейман), соответственно, когда данные и код "не могут быть смешаны".
Короче, я как-то привык, что байт кода и байт данных - это одинаковые по "цене" байты. И что если нужно для какого-то массива данных проделать какое-то действие (в моём случае "массив" - это положения ножек-глазиков-лампочек монстра, а "действие" - собственно дрыгание и мигание), то надо собрать массив элементов данных в "массив[элементов]" данных, и в цикле делать "действие(массив[элемент++])". Потому что можно, конечно, массив в массив не собирать, а написать много строчек вида "действие(данные1); действие(данные2); ... действие(данныеN);", но данные при этом один фиг окажутся внутри кода, плюс добавится много повторяющихся операций по засовыванию их в регистры/стек/whatever для передачи "действию" и вызов "действия", поэтому байтов в сумме понадобится больше, а зачем.
У attiny85 - 512 байт оперативной памяти "для переменных", и 8кб флэша (доступно около 6кб, остальное под бутлоадер) "для кода". Массив данных целиком ложится в оперативную память, в результате при 10 байтах на элемент и с учётом оверхеда на всё остальное, у меня получилось максимум 44 строчки-действия, дальше память заканчивалась.
А если делать через "действие(данные1); ... действие(данныеN);" - расходуемая оперативная память не изменяется, и хотя на каждое действие в результате расходуется больше памяти - это "память кода", которой у нас более чем в 10 раз больше, поэтому и действий можно упихать больше. При этом дело не в том, что "память кода" - типа read-only, а в переменные можно писать: волшебные слова типа const ничего не изменили, массив по прежнему ложился в оперативку. Видимо, данные в "памяти кода" реально нельзя адресовать как переменные, только использовать как операнды команд. Отдельно, кстати, непривычно что процессор похоже выполняет программу прямо из флэша - переписывание в "shadow RAM" как-то привычнее. Хотя, флэш там мелкий, может быть его можно адресовать быстро и "в лоб", а не как в флэш-карточках.
Впрочем, я уложился в 42 действия, так что пока некритично :-) Но забавно.

Короче, я как-то привык, что байт кода и байт данных - это одинаковые по "цене" байты. И что если нужно для какого-то массива данных проделать какое-то действие (в моём случае "массив" - это положения ножек-глазиков-лампочек монстра, а "действие" - собственно дрыгание и мигание), то надо собрать массив элементов данных в "массив[элементов]" данных, и в цикле делать "действие(массив[элемент++])". Потому что можно, конечно, массив в массив не собирать, а написать много строчек вида "действие(данные1); действие(данные2); ... действие(данныеN);", но данные при этом один фиг окажутся внутри кода, плюс добавится много повторяющихся операций по засовыванию их в регистры/стек/whatever для передачи "действию" и вызов "действия", поэтому байтов в сумме понадобится больше, а зачем.
У attiny85 - 512 байт оперативной памяти "для переменных", и 8кб флэша (доступно около 6кб, остальное под бутлоадер) "для кода". Массив данных целиком ложится в оперативную память, в результате при 10 байтах на элемент и с учётом оверхеда на всё остальное, у меня получилось максимум 44 строчки-действия, дальше память заканчивалась.
А если делать через "действие(данные1); ... действие(данныеN);" - расходуемая оперативная память не изменяется, и хотя на каждое действие в результате расходуется больше памяти - это "память кода", которой у нас более чем в 10 раз больше, поэтому и действий можно упихать больше. При этом дело не в том, что "память кода" - типа read-only, а в переменные можно писать: волшебные слова типа const ничего не изменили, массив по прежнему ложился в оперативку. Видимо, данные в "памяти кода" реально нельзя адресовать как переменные, только использовать как операнды команд. Отдельно, кстати, непривычно что процессор похоже выполняет программу прямо из флэша - переписывание в "shadow RAM" как-то привычнее. Хотя, флэш там мелкий, может быть его можно адресовать быстро и "в лоб", а не как в флэш-карточках.
Впрочем, я уложился в 42 действия, так что пока некритично :-) Но забавно.

(no subject)
Date: 2017-04-01 03:33 pm (UTC)Подозреваю (сам с ардуиной не), что для RO данных надо явно прописывать сегмент.
(no subject)
Date: 2017-04-01 03:38 pm (UTC)(извинити за неровный потчерк, писалось "на один раз").
...соответственно, замена
struct pt { int delay; int led1; int led2; int m1; int m2; }
scr[] = {
...на
struct pt { const int delay; const int led1; const int led2; const int m1; const int m2; };
const struct pt scr[] = {
Ничего не изменила. А куда ещё можно запихать const - я не придумал.
(no subject)
Date: 2017-04-01 05:46 pm (UTC)(no subject)
Date: 2017-04-01 03:49 pm (UTC)Подозреваю (сам с ардуиной не), что для RO данных надо явно прописывать сегмент.
(no subject)
Date: 2017-04-01 04:59 pm (UTC)Да, 512 байт ОЗУ и от 2х до 8 КБ флота.
(no subject)
Date: 2017-04-01 05:25 pm (UTC)(no subject)
Date: 2017-04-01 05:43 pm (UTC)http://www.nongnu.org/avr-libc/user-manual/pgmspace.html
(no subject)
Date: 2017-04-01 05:45 pm (UTC)(no subject)
Date: 2017-04-01 05:44 pm (UTC)(no subject)
Date: 2017-04-01 05:55 pm (UTC)Видимо, разные компиляторы.
(no subject)
Date: 2017-04-01 07:05 pm (UTC)(no subject)
Date: 2017-04-01 07:18 pm (UTC)(no subject)
Date: 2017-04-01 07:09 pm (UTC)(no subject)
Date: 2017-04-01 05:56 pm (UTC)И изделия получались вполне себе приличные, много чего до сих пор в производстве находится. :)
(no subject)
Date: 2017-04-02 09:47 am (UTC)