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

 
 
> Использование битовых областей в 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
Ответов
SergeyTT
сообщение Feb 9 2010, 16:52
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 3-07-06
Из: Харьков
Пользователь №: 18 533



Цитата(IF_P @ Feb 9 2010, 16:21) *
Перешел на 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 только начал изучать. Может есть какие настройки, чтобы избежать подобных ситуаций?


Если вы хотите работать с анонимными битовыми полями,попробуйте вот это:
// в хидере,например, flags.h,делаем объявление
__no_init volatile union
{
unsigned char flags;
struct
{
unsigned char flag_wait :1;
unsigned char flag_ESC :1;
unsigned char flag_in :1;
};
}@<здесь пропишите адрес ОЗУ,где будет храниться этот юнион,например,начальный адрес свободного ОЗУ,по вкусу>;

Далее инклудите этот хидер в модули,где есть обращение к нужным флажкам,и спокойно работаете с ними,например:

if(flag_wait)
flag_ESC = 0;
else
flag_in = 1;

Компилятор создаст в ОЗУ переменную _A_flags и будет дергать биты командами установки/сброса конкретного бита.

Многократное объявление переменной в разных программных модулях(#include flags.h) здесь до лампады,
как-бы гуру-супермодераторы не возмущались по этому поводу ;-)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 10 2010, 05:09
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

Если Вы самоубийца, то зачем тянуть за собой остальную компанию?
Go to the top of the page
 
+Quote Post
IF_P
сообщение Feb 11 2010, 17:08
Сообщение #4


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

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



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

Цитата(_Pasha @ Feb 10 2010, 07:09) *
Если Вы самоубийца, то зачем тянуть за собой остальную компанию?

Вот сейчас попробовал сделать, как рекомендовал SergeyTT. Выделил глобальные флаги в отдельный хидер, подцепил его к двум файлам, скомпилил. Вроде все нормально - проверил по листнгу.

Так в чем здесь может быть проблема?
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
|- - 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
- - SSerge   Неужели эти несколько тактов так критичны, что Вы ...   Feb 10 2010, 02:09
|- - IF_P   Цитата(SSerge @ Feb 10 2010, 04:09) Неуже...   Feb 10 2010, 11:44
|- - SasaVitebsk   Цитата(IF_P @ Feb 10 2010, 14:44) Так вед...   Feb 10 2010, 20:04
||- - IF_P   Цитата(SasaVitebsk @ Feb 10 2010, 22:04) ...   Feb 11 2010, 10:30
||- - Dog Pawlowa   Цитата(IF_P @ Feb 11 2010, 14:30) для уст...   Feb 11 2010, 11:16
|||- - SasaVitebsk   Цитата(Dog Pawlowa @ Feb 11 2010, 14:16) ...   Feb 11 2010, 22:57
|||- - 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 - 02:12
Рейтинг@Mail.ru


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