Страница 1 из 2

ФИШКИ программирования.

Добавлено: Ср апр 16, 2014 15:12:43
ИС-пытатель
В одной из тем пошел разговор об интересных и полезных фишках программирования. Решил стартануть новый топик на эту тему. В основном, он касается ассемблера, но чем черт не шутит, мож кто и на СИ чего интересное подкинет. ;)

И вот первая ФИШКА:

Неиспользуемые регистры переферии можно удобно пользовать под хранение переменных. Особенно битовых.

ПОЕХАЛИ! ;)

Re: ФИШКИ программирования.

Добавлено: Ср апр 16, 2014 15:31:11
Flasher
Неиспользуемые -это какие? Reserved биты? Первый совет позволяет переименовать тему в фишки говнопрограммирования.

Re: ФИШКИ программирования.

Добавлено: Ср апр 16, 2014 15:33:51
Engineer_Keen
Не те, которые reserved, а те, которые "нормальные", но в конкретной программе не используются. Кстати, хотя и пишут в даташите что reserved использовать нельзя, а кто-нибудь пробовал в них писать, читать?
Кажись была похожая тема...
А, во, нашел http://radiokot.ru/forum/viewtopic.php?f=62&t=78185

Re: ФИШКИ программирования.

Добавлено: Ср апр 16, 2014 15:34:30
ИС-пытатель
Для Flasher. Это, например, таймер ты не используешь в программе, значит можно, к примеру, в его регистре сравнения или счетчике хранить переменную. Если Вы пишете говнокод - ЭТО ПОЛНОСТЬЮ ВАШИ ПРОБЛЕМЫ.

Re: ФИШКИ программирования.

Добавлено: Ср апр 16, 2014 15:38:09
ploop

Re: ФИШКИ программирования.

Добавлено: Ср апр 16, 2014 15:39:50
ИС-пытатель
Там как-то все растянуто до уровня алгоритмов. и конкретных реализаций. А хотелось бы что-то более краткое и четкое. Наподобие справочника. Но тут, наверное такого не получится... Очень у нас уж КОТы общительные.... ))

Re: ФИШКИ программирования.

Добавлено: Ср апр 16, 2014 15:41:29
Flasher
Памяти не хватает? Или регистрового файла? Зачем эти цирки?

Re: ФИШКИ программирования.

Добавлено: Ср апр 16, 2014 15:43:23
ИС-пытатель
мля.......

http://radiokot.ru/forum/viewtopic.php? ... 1#p1987521

Загрузка значения из памяти - 2 такта. Из перифирийного регистра - 1 такт. +удобные команды sbis, sbic и т.д. А регистровый файл тоже не бесконечный
в даташите что reserved использовать нельзя, а кто-нибудь пробовал в них писать, читать?
пробовал. некоторые не пишутся. некоторые пишутся и просто ни на что не влияют.

Re: ФИШКИ программирования.

Добавлено: Ср апр 16, 2014 16:45:52
ARV
к подобным фишкам надо относиться примерно в таком ключе: тонущий хватается и за соломинку.

в нормальном режиме до этого опускаться не следует. крайне мало приложений, где действительно надо экономить каждый такт и каждый байт ОЗУ с байтом flash. но если вдруг в attiny10 не влезает MP3-плейер и как раз 1-2 байт не хватает - подход приемлем :)))

Re: ФИШКИ программирования.

Добавлено: Ср апр 16, 2014 16:49:13
ИС-пытатель
Ну, это как раз для подобных ситуаций. )) Иногда бывает необходимо выполнить какой-то кусок кода максимально быстро. Вот тут поможет ассемблерная вставка с подобного рода оптимизацией.

Re: ФИШКИ программирования.

Добавлено: Пт апр 18, 2014 11:06:36
BOB51
ИС-пытатель писал(а): Загрузка значения из памяти - 2 такта. Из перифирийного регистра - 1 такт. +удобные команды sbis, sbic и т.д. А регистровый файл тоже не бесконечный
Во - первых: sbis, sbic действительны исключительно для участка РСФ 0x00-0x1F, а там не так уж и много "свободно-безопасных" регистров подобных GPIOR0-GPIOR2 у ATtiny2313.
Во-вторых: структура ядра AVR как раз и ориентирована на "работу через память" а не на работу внутри регистрового файла. (Для того, кстати, и частота работы выбрана максимальной.)
Да и операция LD тоже вроде 1-цикловая - чем Вас файл ОЗУ не устраивает?
При "поодтяжке" данных из внешнего источника или обработке массива все равно одним циклом не обойтись.
Ежли уж охота "на полную" использовать возможности регистрового файла и ОЗУ то берите за основу PIC24.
:beer:

Re: ФИШКИ программирования.

Добавлено: Пт апр 18, 2014 11:25:49
ИС-пытатель
LD - 2 clocks. К тому же, можно и в сях это использовать. Потому что СИ по умолчанию в памяти все размещает, а можно через дефаулт определить переменную в регистр и писать-читать из регистра.

Re: ФИШКИ программирования.

Добавлено: Пт апр 18, 2014 12:14:34
BOB51
ИС-пытатель писал(а):LD - 2 clocks. К тому же, можно и в сях это использовать. Потому что СИ по умолчанию в памяти все размещает, а можно через дефаулт определить переменную в регистр и писать-читать из регистра.
Смотри систему команд: - 2 цикла это в случае обмена по регистр-указателю с последующим изменением оного(постинкремент/преддекремент), а так -1 цикл. Но ведь далее при обработке массива данных все равно потребуется указатель модифицировать.
8)

Re: ФИШКИ программирования.

Добавлено: Пт апр 18, 2014 12:22:55
ИС-пытатель
Смотрю в 8535 и в 2313. только LDI 1 такт. Но тут k=0..255. Остальные LD/ST по 2. Речь не идет о массиве. ) Речь об отдельных переменных. К тому же IAR-овские компиляторы успешно пользуют данный прием. Это как еще один довод в пользу него. )

Re: ФИШКИ программирования.

Добавлено: Пт апр 18, 2014 13:53:43
BOB51
Смотри doc0856I–AVR–07/10 ( 8-bit AVR Instruction Set )
страницы 87,88,89.

"Words: 1 (2 bytes)
Cycles: (i) 1(2)
(ii) 2
(iii) 3(2)
Cycles XMEGA: (i) 1(1)
(ii) 1(1)
(iii) 2(1)
Notes: 1. IF the LD instruction is accessing internal SRAM, one extra cycle is inserted.
2. LD instruction can load data from program memory since the flash is memory mapped. Loading data from the data memory
takes 1 clock cycle, and loading from the program memory takes 2 clock cycles. But if an interrupt occur (before the last
clock cycle) no additional clock cycles is necessary when loading from the program memory. Hence, the instruction takes
only 1 clock cycle to execute.
LD instruction with pre-decrement can load data from program memory since the flash is memory mapped. Loading data
from the data memory takes 2 clock cycles, and loading from the program memory takes 3 clock cycles. But if an interrupt
occur (before the last clock cycle) no additional clock cycles is necessary when loading from the program memory. Hence,
the instruction takes only 1 clock cycle to execute."
:beer:

Вопрос только где у атмеля "схитрили" в даташитах или в базовом материале? :wink:

Re: ФИШКИ программирования.

Добавлено: Пт апр 18, 2014 14:50:44
ИС-пытатель
Переведите, пожалуйста, дословно, а то что-то я затрудняюсь. Как-то коряво написано. При чем там флеш-память? :shock:

Re: ФИШКИ программирования.

Добавлено: Пт апр 18, 2014 15:16:32
BOB51
Если смотреть фирменное описание команд, то к простому LD Rd,(X) относится индекс (i) и (i) прим.2
Поскольку LD могут применяться и для отображения ПЗУ как участка ОЗУ (это серия tiny10 и подобные) то загрузка из обычного ОЗУ выполняется за 1 цикл, а загрузка из ПЗУ отображаемого в области ОЗУ за 2 цикла.

Re: ФИШКИ программирования.

Добавлено: Пт апр 18, 2014 15:34:05
ИС-пытатель
Там еще что-то про прерывания между загрузками..
И вот это напрягает:
Cycles: (i) 1(2)
(ii) 2
(iii) 3(2)
И первый пункт не совсе понятен, хоть и для XMega

Все-таки, если Вас не затруднит, не могли бы дословно?

Re: ФИШКИ программирования.

Добавлено: Пт апр 18, 2014 15:46:13
BOB51
Это случай если имело место прерывание в момент выполнения многоцикловой команды - смотри нюансы прерываний. 8)
И вообще-то там аж три странички с самого начала читать надо.
Вот отсюда:
http://www.atmel.com/Images/doc0856.pdf
Честно говоря в те дебри особо не лазил, но подвохов ожидать можно весьма значительных.
Как вот в этом зловредном проектике (кстати тоже обработчик массивов из ПЗУ):
http://radiokot.ru/forum/viewtopic.php? ... 0%BE%D0%BC
8)
Кстати... в хелпе по авр-студии также указаны 2 цикла и "дифференциация штанов" относительно xmega(но относительно авр ассемблер1 - под аврасм2 только про отличия), те же два цикла и в даташитах на МК. А вот в doc0856.pdf - 1 цикл, без указания на принадлежность к какой-либо "семье". :)

Re: ФИШКИ программирования.

Добавлено: Пт апр 18, 2014 17:30:28
ИС-пытатель
BOB51 писал(а):Как вот в этом зловредном проектике
Зря Вы мне это показали... )))) Я ж теперь спать не буду, пока не расковыряю все на винтики... ))) А так хотелось на выходных выспаться... )