|
Использование битовых областей в IAR (ATMega128) |
|
|
|
Feb 11 2010, 11:16
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(IF_P @ Feb 11 2010, 14:30)  для установки/сброса одного бита выполняется целый ряд команд Если так страшен целый ряд команд в этом месте, то для этого флага можно использовать один байт. Сколько таких важных флагов в программе? На три байта насобирали? Ну будет на 21 байт больше. Об этом спорим? Не хватает? Или хватает, и нужны "шашечки"?
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Feb 11 2010, 11:53
|
Частый гость
 
Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772

|
Цитата(Сергей Борщ @ Feb 11 2010, 12:03)  Приносите, показывайте. "Код в студию!". Это было на 51-м, с которым сейчас не работаю. Хотя я помню, где это было, но точный пример не смогу привести, т.к. исправил программу и не обращался на форум. Могу только описать. if (....проверялось 5-6 условий...) { ...a=1; } Смотрю в симуляторе. Выполняются все условия. Симулятор выходит на оператор a=1 и после его выполнения a=0 ??? Когда начал разбираться с ассемблерным кодом, то увидел, что компилятор "забыл" обнулить р-р DPTR (есть такой в 51-м) перед его использование , что и привело к такому результату. Решил проблему заменой одного длинного условного оператор двумя короткими. Условный оператор был похожим на: if ((rejym_start==2 && rej__rab==3) || (rejym_start==2 && rej__rab==5) || (rejym_start==3 && rej_H_A==0)) { Эта часть программы была проверена и работала. Когда добавил одно условие в условный оператор, получил неработоспособный код. О моей ошибке речи быть не может, т.к. выполняется оператор присваивания a=1; с результатом =0; В следующий раз постараюсь сохранить подобные "глюки". Цитата(Dog Pawlowa @ Feb 11 2010, 13:16)  Если так страшен целый ряд команд в этом месте, то для этого флага можно использовать один байт. Сколько таких важных флагов в программе? На три байта насобирали? Ну будет на 21 байт больше. Об этом спорим? Не хватает? Или хватает, и нужны "шашечки"? На десять байт насобирал. Но не об этом речь. Я уже писал, что хотел разобраться ( см. пост №11). И понял, что операций с битами здесь нет (за исключением р-ров 0-0x1F). Есть операций с байтами. Вот и все. А если под "шашечками" вы подразумеваете уровень активности, то посмотрите на дату регистрации. За это время можно было уже... (если бы это было целью).
Сообщение отредактировал IF_P - Feb 11 2010, 12:15
|
|
|
|
|
Feb 11 2010, 15:12
|
Частый гость
 
Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772

|
Цитата(Dog Pawlowa @ Feb 11 2010, 15:31)   если это упрек много пишущим, то у них своя правда - написать фигню, получить по мозгам, и вовремя исправиться. Вы лишили себя возможности ускоренной корректировки собственных действий. Я привык во всем разбираться, А "делай так, потому, что так нужно" - это не для меня. Потом снова будут возникать какие-то дурацкие вопросы. А так вот сейчас разобрался с битами, посмотрел листиниги и сделал вывод, что буду использовать вместо бит в основном байты. Получается и код эффективнее и быстродействие выше. Я ведь с AVR (да и с IAR) только начал работать, потому и хочется разобраться до конца, чтоб не наступать в будущем на те же грабли. P.S. А упрекать я никого и не собирался. Я так понял, что меня упрекнули в подобных писаниях. Может я и ошибся. Тогда прошу извинить.
Сообщение отредактировал IF_P - Feb 11 2010, 15:16
|
|
|
|
|
Feb 11 2010, 17:08
|
Частый гость
 
Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772

|
Цитата(SergeyTT @ Feb 9 2010, 19:52) * Многократное объявление переменной в разных программных модулях(#include flags.h) здесь до лампады, Цитата(_Pasha @ Feb 10 2010, 07:09)  Если Вы самоубийца, то зачем тянуть за собой остальную компанию? Вот сейчас попробовал сделать, как рекомендовал SergeyTT. Выделил глобальные флаги в отдельный хидер, подцепил его к двум файлам, скомпилил. Вроде все нормально - проверил по листнгу. Так в чем здесь может быть проблема?
|
|
|
|
|
Feb 11 2010, 17:59
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(IF_P @ Feb 11 2010, 19:12)  Я так понял, что меня упрекнули в подобных писаниях. Наверное, я дал повод. И Вы простите за некоторую эмоциональность. Увы, жизнь так устроена, что если во всем очень тщательно разбираться, ничего не удается сделать. Иногда нужно делать, не разбираясь самому, на основе советов  Интуиция может подсказать, что совет по использованию битовых областей не очень удачный, а может и нет.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Feb 11 2010, 21:34
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(IF_P @ Feb 11 2010, 13:30)  str.bitOne=1; - установка бита в структуре str
а это ассемблерная мнемоника этой же команды:
LDI R30, LOW(str) LDI R31, (str) >> 8 LD R16, Z ORI R16, 0x01 ST Z, R16 Если Вам уже надоели разговоры ни о чем, то: 1. Расскажите, что это за структура. Если volatile, то чему удивляетесь? 2. Не совсем понятна причина, по которой взрослые дяди зацикливаются на битовых полях. Например, многоэтажный матюк if(()||()||(()&&()&&()) не потянет за собой в область статических переменных ни единого бита, использование конструкций типа Код uint_fast8_t work=0; do { if(conditional_expression1) break; .......................... if(conditional_expressionN) break; work = 1; } while(0); if(work){do_something} Это Вам не булева алгебра, все можно навернуть так, что в сумме получается эффективнее работы с флагами В конце концов Код extern uint8_t reg[]; if(reg[0] > 0x80) // check bit 7 if(((reg[0] ^ reg[1])&0xE0) == 0xE0) //проверили 3 бита на изменение Интересно, сколько будет булевый процессор считать это. И особенно обидно, что нету косвенной адресации бит
|
|
|
|
|
Feb 11 2010, 22:57
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Dog Pawlowa @ Feb 11 2010, 14:16)  Если так страшен целый ряд команд в этом месте, то для этого флага можно использовать один байт. Сколько таких важных флагов в программе? На три байта насобирали? Ну будет на 21 байт больше. Об этом спорим? +100. Мне кажется, постепенно все к этому и приходят. Я, к примеру уже пришёл. Надо давить в себе скрягу.  Если реально просмотреть проекты, то памяти, в последнее время, вполне хватает. Но если даже её требуется много, то всё равно, как правило байты, потраченные на флаги, существенно не влияют на общую картину. Цитата Зачем плодить непереносимый код - не понимаю. +1000. Даже используя 51, я бы скорее всего отказался от спец конструкций. Другое дело если бы компилятор сам справился. На мой взгляд, надо постепенно менять мышление. Исходить из задачи - выбирать микропроцеесор - писать, задумываясь о результате, но не вылизывая каждую строчку. Стоимость разработки складывается также и из времени разработки. Чем быстрее завершаешь проект - тем быстрее изделие увидет покупателя. А это определяется переносимостью и возможностью развития. То есть универсальность - очень важная составляющая. Тут выбирал МК для одного проекта. Так получается разница м/у STM32F105V и 107 практически стирается. А во втором MAC. Казалось бы дорогостоющая переферия. Я уже не говорю, что эта stm32f105 дешевле at90can128 c двумя CAN контроллерами, а stm32f103 (с одним CAN) - значительно дешевле. Кристаллы не сопоставимы по функционалу и производительности. И, похоже, процесс развития в этой области всё ускоряется. То есть переход с камня на камень дальше будет происходить всё чаще.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|