|
Использование битовых областей в IAR (ATMega128) |
|
|
|
Feb 9 2010, 14:21
|
Частый гость
 
Группа: Участник
Сообщений: 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(...); В другом случае при использовании локальных переменых в п/п. При входе в п/п мои р-ры сохранялись, а на их место определялись локальные переменные. Не выходя из этой п/п (т.е. не восстанавливая мои биты) я захожу в другую п/п, где использую указанные биты, которых там уже нет. И я, вроде, делаю все правильно и компилятор тоже. Как выйти из такой ситуации?. Не использовать р-ровый файл? А что использовать? Р-ры в/в? 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
|
|
|
|
|
 |
Ответов
|
Feb 9 2010, 16:52
|
Участник

Группа: Участник
Сообщений: 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(...); В другом случае при использовании локальных переменых в п/п. При входе в п/п мои р-ры сохранялись, а на их место определялись локальные переменные. Не выходя из этой п/п (т.е. не восстанавливая мои биты) я захожу в другую п/п, где использую указанные биты, которых там уже нет. И я, вроде, делаю все правильно и компилятор тоже. Как выйти из такой ситуации?. Не использовать р-ровый файл? А что использовать? Р-ры в/в? 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) здесь до лампады, как-бы гуру-супермодераторы не возмущались по этому поводу ;-)
|
|
|
|
|
Feb 10 2010, 00:11
|
Частый гость
 
Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772

|
Цитата(SergeyTT @ Feb 9 2010, 18:52)  Если вы хотите работать с анонимными битовыми полями,попробуйте вот это: // в хидере,например, flags.h,делаем объявление __no_init volatile union
...
flag_ESC = 0;
Компилятор создаст в ОЗУ переменную _A_flags Так я ведь в своем первом посте тоже привел пример битовой переменной, как элемента структуры и ее ассемблерную мнемонику. Только опустил описание самой структуры. Все это я использовал. Но не хотел размещать в RAM, т.к. это уже работа с байтами. При описании структуры в RAM получим: flag_ESC=1;LDI R30, 15 (дизассемб) LDI R31, 0 LD R16, Z ORI R16, 0x01 ST Z, R16 А при использовании р/р в/в (ADCH) уже совсем иначе: __no_init volatile bitfield Flag_W@0x25; #define Flag_W1 Flag_W.bit0 #define Flag_W2 Flag_W.bit1 Flag_W1=1; SBI 0x05, 0x00 Flag_W2=0; CBI 0x05, 0x01 Так что придется снова возвращаться к р-рам в/в. Только вот что делать, если в будущем придется задействовать эти р-ры?
|
|
|
|
|
Feb 10 2010, 03:33
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(IF_P @ Feb 10 2010, 04:11)  Так что придется снова возвращаться к р-рам в/в. Только вот что делать, если в будущем придется задействовать эти р-ры? В будущем (и настоящем) можно без проблем заменить на новую ATmega1281. В новых микроконтроллерах есть для этой цели отдельные General Purpose I/O Register 0/1/2.
|
|
|
|
Сообщений в этой теме
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 _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 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|