|
Использование битовых областей в 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 10 2010, 02:09
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Неужели эти несколько тактов так критичны, что Вы пускаетесь во все тяжкие?
Оставьте ассемблерные привычки, пишите на С. Регистры процессора, счётчик команд, указатель стека и регистр состояния - всё это забота компилятора, пусть он ими занимается. Установите в настройках проекта максимальный уровень оптимизации по скорости и больше не сокрушайтесь об эффективности, лучше потратить время на оптимизацию алгоритма на верхнем уровне, больше выиграете. Листинг, впрочем, иногда смотреть полезно.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Feb 10 2010, 11:44
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 11 2010, 10:03
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(IF_P @ Feb 10 2010, 13:44)  Мне уже приходилось по несколько дней искать "глюки" (Franklin, Keil). А потом оказывается, что это "глюк" компилятора. Приносите, показывайте. Тут на весь форум реальных глюков компилятора обнаруживается 2-3 за год, все остальные - от незнания стандарта писателем программы или его же нежелания прочесть документацию на компилятор. Нет, можно конечно предположить, что вы такой везучий и вам их (настоящих глюков) попалось значительно больше, но верится в это с трудом. "Код в студию!".
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
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
|
|
|
|
Сообщений в этой теме
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  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 Цитата(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
|
|
|