реклама на сайте
подробности

 
 
> Использование битовых областей в IAR (ATMega128)
IF_P
сообщение Feb 9 2010, 14:21
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Перешел на ATMega128 после 51-го. Не нашел здесь битового пространства. Т.е. либо использовать регистровый файл, либо р-ры I/O 0-1F. С р-рами в/в я уже обжегся, использовав бит аппаратного прерывания. Хотя в документации написано, что данный бит программно R/W.
Начал использовать общие р-ры 8-13:

__no_init bitfield FLAG_2@0x08;
#define flag_wait FLAG_2.bit0
#define flag_ESC FLAG_2.bit1
#define flag_in FLAG_2.bit2

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

retrurn atoi(...);

В другом случае при использовании локальных переменых в п/п. При входе в п/п мои р-ры сохранялись, а на их место определялись локальные переменные. Не выходя из этой п/п (т.е. не восстанавливая мои биты) я захожу в другую п/п, где использую указанные биты, которых там уже нет.
И я, вроде, делаю все правильно и компилятор тоже.
Как выйти из такой ситуации?. Не использовать р-ровый файл? А что использовать? Р-ры в/в? crying.gif
RAM не хотелось бы использовать, а то при каждой установке/сбросе выполняется аж 5 команд:

str.bitOne=1;

LDI R30, LOW(str)
LDI R31, (str) >> 8
LD R16, Z
ORI R16, 0x01
ST Z, R16

Кто что может посоветовать? IAR только начал изучать. Может есть какие настройки, чтобы избежать подобных ситуаций?

Сообщение отредактировал IF_P - Feb 9 2010, 14:25
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SSerge
сообщение Feb 10 2010, 02:09
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Неужели эти несколько тактов так критичны, что Вы пускаетесь во все тяжкие?

Оставьте ассемблерные привычки, пишите на С.
Регистры процессора, счётчик команд, указатель стека и регистр состояния - всё это забота компилятора, пусть он ими занимается.
Установите в настройках проекта максимальный уровень оптимизации по скорости и больше не сокрушайтесь об эффективности, лучше потратить время на оптимизацию алгоритма на верхнем уровне, больше выиграете.
Листинг, впрочем, иногда смотреть полезно.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
IF_P
сообщение Feb 10 2010, 11:44
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Цитата(SSerge @ Feb 10 2010, 04:09) *
Неужели эти несколько тактов так критичны, что Вы пускаетесь во все тяжкие?
...
Оставьте ассемблерные привычки, пишите на С.
...
Листинг, впрочем, иногда смотреть полезно.

Так ведь и речь идет о С. На ассемблере этих проблем нет. И именно из листинга я и привел ассемблерную мнемонику С-шных команд.
Что касается "несколько тактов", то у меня около 10 байт битовых переменных, которые активно используются (установка, сброс, анализ).
В даном случае для меня абсолютно не критично ни количество тактов, ни размер памяти. Вопрос был в том, чтобы разобраться с использованием битов.

А что касается оптимизации компилятором, то я считаю,что лучше самому продумать, по возможности, все варианты оптимизации и до и во время написания программы, чем полагаться на компилятор. Ведь компиляторы тоже пишут люди и они ошибаются. Мне уже приходилось по несколько дней искать "глюки" (Franklin, Keil). А потом оказывается, что это "глюк" компилятора. И абсолютно правильно написанный код приходится переписывать под компилятор.
У каждого свой подход к программированию. "Делай как можно лучше. А оно все равно будет хуже". Так меня еще в детстве мать учила. А если делать кое-как, то результат может быть плачевным. Я не претендую на истину, но каждому свое.
Спасибо всем за советы.

To alux:

Только General Purpose I/O Register 0 находится в бит-адресуемой области. Остальные за ее пределами (0x1F).
Так что по битовым опрециям AVR уступает 8051.


Цитата(SergeyTT @ Feb 9 2010, 18:52) *
Многократное объявление переменной в разных программных модулях(#include flags.h) здесь до лампады,

Для этих целей я обычно использую extern:

extern bit Enable_Display; // CS для дешифратора LCD P1.0
extern bit DISPLAY_E;

Это для Keil 51-го. Хотя там тоже были проблемы с их использованием
http://electronix.ru/forum/index.php?showt...st&p=525347

Для AVR и IAR пока не сталкивался.

Сообщение отредактировал IF_P - Feb 10 2010, 11:49
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 10 2010, 20:04
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(IF_P @ Feb 10 2010, 14:44) *
Так ведь и речь идет о С. На ассемблере этих проблем нет. И именно из листинга я и привел ассемблерную мнемонику С-шных команд.
Что касается "несколько тактов", то у меня около 10 байт битовых переменных, которые активно используются (установка, сброс, анализ).
В даном случае для меня абсолютно не критично ни количество тактов, ни размер памяти. Вопрос был в том, чтобы разобраться с использованием битов.


Тогда не понимаю в чём проблема. Используйте узаконенные в Си операции.
Код
struct
{
uint32_t
                  Master :1,
                  LoadActivCom :1,
                  Str : 3,
....
                  gEnd:1;
} Flag;
....

if(Flag.Master) ....
....

Flag.Master = 1; // а хотите TRUE
...
Flag.Master = Flag.gEnd; Flag.Str = 5;


Чем не устраивает, или я чего-то не понимаю?

Хотя я, в последнее время использую для этих целей байты.
========
Кстати о atxmega.
Есть битовое поле и в ATMEGA88(48/168).


The ATmega48/88/168 contains three General Purpose I/O Registers. These registers
can be used for storing any information, and they are particularly useful for storing global
variables and Status Flags. General Purpose I/O Registers within the address range
0x00 - 0x1F are directly bit-accessible using the SBI, CBI, SBIS, and SBIC instructions.

PS: Если речь идет об атомарности доступа, то тут есть проблемы не только с битами, но и с любыми интегральными типами. Для x51, например, с int16/32, и т.д. Решение - запрет прерываний.
Работа с битами на уровне МК, в общем то, не хуже.
Go to the top of the page
 
+Quote Post
IF_P
сообщение Feb 11 2010, 10:30
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Цитата(SasaVitebsk @ Feb 10 2010, 22:04) *
Тогда не понимаю в чём проблема. Используйте узаконенные в Си операции.

Чем не устраивает, или я чего-то не понимаю?

Да я это все давно использую. Только заглянув в листинг я увидел, что для установки/сброса одного бита выполняется целый ряд команд, котрые я и указал в первом посте. Привожу еще раз:

str.bitOne=1; - установка бита в структуре str

а это ассемблерная мнемоника этой же команды:

LDI R30, LOW(str)
LDI R31, (str) >> 8
LD R16, Z
ORI R16, 0x01
ST Z, R16

Т.е. , вместо одной команды SBI, CBI,... выполняется целых 5. Вот я и начал разбираться. В 51-м для этих целей существует битовое поле. Аналогичное я начал искать здесь. Оказывается AVR этим не богат. Битовые операции поддерживают только р-ры в/в с адресами 0x0-0x1F. А для своих нужд здесь ничего нет. И даже из указанных вами General Purpose I/O Registers только один находится в бит-адресуемом пространстве. К двум другим обращение будет идти указанным выше способом 5 команд). Так что, имеем то, что имеем wassat.gif
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 11 2010, 11:16
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(IF_P @ Feb 11 2010, 14:30) *
для установки/сброса одного бита выполняется целый ряд команд

Если так страшен целый ряд команд в этом месте, то для этого флага можно использовать один байт.
Сколько таких важных флагов в программе? На три байта насобирали?
Ну будет на 21 байт больше. Об этом спорим? Не хватает?
Или хватает, и нужны "шашечки"?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 11 2010, 22:57
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Dog Pawlowa @ Feb 11 2010, 14:16) *
Если так страшен целый ряд команд в этом месте, то для этого флага можно использовать один байт.
Сколько таких важных флагов в программе? На три байта насобирали?
Ну будет на 21 байт больше. Об этом спорим?

+100.
Мне кажется, постепенно все к этому и приходят. Я, к примеру уже пришёл.
Надо давить в себе скрягу. smile.gif
Если реально просмотреть проекты, то памяти, в последнее время, вполне хватает. Но если даже её требуется много, то всё равно, как правило байты, потраченные на флаги, существенно не влияют на общую картину.

Цитата
Зачем плодить непереносимый код - не понимаю.

+1000.
Даже используя 51, я бы скорее всего отказался от спец конструкций. Другое дело если бы компилятор сам справился.

На мой взгляд, надо постепенно менять мышление. Исходить из задачи - выбирать микропроцеесор - писать, задумываясь о результате, но не вылизывая каждую строчку. Стоимость разработки складывается также и из времени разработки. Чем быстрее завершаешь проект - тем быстрее изделие увидет покупателя. А это определяется переносимостью и возможностью развития. То есть универсальность - очень важная составляющая.

Тут выбирал МК для одного проекта. Так получается разница м/у STM32F105V и 107 практически стирается. А во втором MAC. Казалось бы дорогостоющая переферия. Я уже не говорю, что эта stm32f105 дешевле at90can128 c двумя CAN контроллерами, а stm32f103 (с одним CAN) - значительно дешевле. Кристаллы не сопоставимы по функционалу и производительности. И, похоже, процесс развития в этой области всё ускоряется. То есть переход с камня на камень дальше будет происходить всё чаще.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- IF_P   Использование битовых областей в IAR (ATMega128)   Feb 9 2010, 14:21
- - Stanislav_S   Для начала почитайте - AVR035: Efficient C Coding ...   Feb 9 2010, 14:32
- - V_G   Я переходил с 51 на Мегу где-то лет 7-8 назад. Про...   Feb 9 2010, 14:58
- - SergeyTT   Цитата(IF_P @ Feb 9 2010, 16:21) Перешел ...   Feb 9 2010, 16:52
|- - IF_P   Цитата(SergeyTT @ Feb 9 2010, 18:52) Если...   Feb 10 2010, 00:11
||- - alux   Цитата(IF_P @ Feb 10 2010, 04:11) Так что...   Feb 10 2010, 03:33
|- - _Pasha   Цитата(SergeyTT @ Feb 9 2010, 19:52) Мног...   Feb 10 2010, 05:09
|- - IF_P   Цитата(SergeyTT @ Feb 9 2010, 19:52) * Многократно...   Feb 11 2010, 17:08
|||- - demiurg_spb   Цитата(Dog Pawlowa @ Feb 11 2010, 14:16) ...   Feb 13 2010, 09:41
||- - _Pasha   Цитата(IF_P @ Feb 11 2010, 13:30) str.bit...   Feb 11 2010, 21:34
|- - _Pasha   Цитата(IF_P @ Feb 10 2010, 15:44) А что к...   Feb 10 2010, 21:39
|- - Сергей Борщ   Цитата(IF_P @ Feb 10 2010, 13:44) Мне уже...   Feb 11 2010, 10:03
|- - IF_P   Цитата(Сергей Борщ @ Feb 11 2010, 12:03) ...   Feb 11 2010, 11:53
|- - Dog Pawlowa   Цитата(IF_P @ Feb 11 2010, 15:53) А если ...   Feb 11 2010, 13:31
|- - IF_P   Цитата(Dog Pawlowa @ Feb 11 2010, 15:31) ...   Feb 11 2010, 15:12
|- - Dog Pawlowa   Цитата(IF_P @ Feb 11 2010, 19:12) Я так п...   Feb 11 2010, 17:59
- - V_G   На ассемблере для регистрового файла есть битовые ...   Feb 10 2010, 06:51
- - Dog Pawlowa   Цитата(IF_P @ Feb 9 2010, 17:21) Кто что ...   Feb 10 2010, 07:18
- - SasaVitebsk   Если у вас такая задача, то кто вам мешает использ...   Feb 11 2010, 21:25


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 22:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01479 секунд с 7
ELECTRONIX ©2004-2016