Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/56: Рейтинг темы: голосов - 56, средняя оценка - 4.86
Striss
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 50
1

Проблемы с флагом I в отладке в Atmel Studio 6 (исправлено)

29.10.2012, 11:15. Просмотров 10113. Ответов 16
Метки нет (Все метки)

Решил вспомнить AVR. Atmel Studyo 6 (1938). Делаю инициализацию (кусок):
Код
...
sei
nop
nop
Запускаю в отладчике: при выполнении SEI флаг I в SREG устанавливается, но сразу же после первого NOP сбрасывается обратно.(Atmega16A. Пробовал AVR Simulator и JTAG ICE 3)
Я что-то не помню/не понимаю или это баг?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2012, 11:15
Ответы с готовыми решениями:

Atmel Studio 6 v 6.0.1843 Вопрос по отладке
Здравствуйте, С НОВЫМ ГОДОМ! Только зарегистрировался и сразу с вопросами, да еще и в неподходящее...

Atmel studio 7 макросы при отладке в симуляторе
Добрый день! Собственно вопрос в теме, что-то у меня недопонимание возникло с самого начала с атмел...

Почему AVR Studio 4, а не Atmel Studio 6?
По какой причине большинство специалистов по AVR микроконтроллерам в основном используют AVR Studyo...

Atmel Studio
Подскажите где смотреть библиотеку Atmel Studio.

Atmel studio 6
Вопрос таков, есть некая библиотека, в lcd_lib.h прототипы, в lcd_lib.c сами функции, оба файла...

16
Striss
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 50
29.10.2012, 11:54 2
Мда, притом если по Brakepointам ходить, то всё пучком (флаг сохраняется), а если по StepOver(F10) то сбрасывается на первой попавшейся команде....
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
29.10.2012, 13:05 3
Чем четвёртая хуже? Чем шестая - это не вопрос.

И да, когнитивный диссонанс заголовка с содержанием. Но это не оригинально, потому что и другие тоже так оформляют *. Мода-с.

* ... оформляют свою мысль. Её ж не жалко, да? Уважение. К мысли. Своей. Кому оно надо-то, для кого?
0
Striss
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 50
29.10.2012, 14:41 4
Цитата Сообщение от _moysi
Чем четвёртая хуже? Чем шестая - это не вопрос.
Четвертая хуже тем, что есть JTAGICE 3.
Пардон за оформление заголовка. Сначала думал что вопрос общего содержания, но оказалось что баг.
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
30.10.2012, 16:18 5
Для очистки совести убедиться в выключенности всех прерываний. И сброшенности соответствующих флагов. Иначе вероятность ситуации: влетели в прерывание - улетели куда-то - а там cli. Оно конечно не очень похоже по описанию, но лишний раз проверить почему б.
Если не - тогда ну зато шестёрку выпустили же быстро, сразу после пятёрки, которую выпустили быстро. А в современном продукте главное что? Главное современность!

По старинке светодиодиком отлаживать... атмега16... вот я блин, оказывается... отставаю от прогрессирования. JTAGICE 3 замутить тоже, что ли.

и всё-таки при ответе на предыдущее (то есть которое сразу перед ответом) сообщение стараются:

не цитировать его вообще, если и так понятно;
цитировать только нужный кусочек, если не понятно без него;
процитировать всё полностью, если...

- Как найти площадь Ленина?
- Как найти плошадь Ленина? Нууу, это надо умножить длину Ленина...
- Умножить на что?
- Умножить на что? Нуууу, это надо умножить на ширину Ленина, во!
- Спасибо. А почему вы каждый мой вопрос повторяете?
- Спасибо. А почему вы каждый мой вопрос повторяете? Ну так же понятнее!
0
Striss
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 50
30.10.2012, 22:19 6
В общем саппорт Atmel ответил следующее:
"Yes, we could regenerate the issue here.
We have raised a bug report on this omd hopefully verified omd corrected in the next release.
Thank you for your feedback."
Т.е. всё же баг - ждем обновления. Да, багов в новых версиях у Atmelа много, не спорю...однако если не использовать и не искать ошибки, то нынешние продукты у них так и останутся "сырыми"...
0
domis
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
17.11.2012, 14:19 7
Если еще актуально, то сделать так. ОТЛАДКА-ПАРАМЕТРЫ И НАСТРОЙКИ-DEBUGGER-ATMELL DEBUGER-MASK INTERRUPTS WHILE STEPPING-FALSE.

Рисунок не получается прикрепить.
0
HotD
0 / 0 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
18.11.2012, 07:46 8
там еще целая куча багов, что в 5, что в 6 версии. Красиво, удобно, но баг на баге. Единственное что исправили - корректно отображаются битовые поля. Но все остальные баги перевешивают все удобства. Вернулся на 4.19
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
18.11.2012, 14:46 9
+1. Правда позавчера появился новый релиз 6-ки , но как-то даже тестировать его не хочется.
Надо подождать годика 2
0
Striss
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 50
18.11.2012, 20:23 10
В новой версии исправлено: Atmel Studyo 6.0 wyth Service Pack 2 (buyld 1996) Installer – Full - http://www.atmel.com/Images/as6installe ... 96-net.ixi
ТАк пишите если есть баги! Само что ли оно лучше станет?! Если у атмела хреново с тестерами, то черз 2 года лучше не станет
0
mox76
0 / 0 / 0
Регистрация: 31.03.2013
Сообщений: 5
03.04.2013, 22:16 11
Цитата Сообщение от Striss
В новой версии исправлено: Atmel Studyo 6.0 wyth Service Pack 2 (buyld 1996) Installer – Full - http://www.atmel.com/Images/as6installe ... 96-net.ixi
ТАк пишите если есть баги! Само что ли оно лучше станет?! Если у атмела хреново с тестерами, то черз 2 года лучше не станет
Баги, похоже есть, даже в версии 6.0.1996! Нужно было, чтобы в случае переполнения (при сложении двух 16-ти битных переменных), конечный результат увеличился на 1.
Код
unsykned int ip[]={0x4500,0x003C,0x4000,0x8011,0x0000/*ch_sum*/,0xC0A8,0x0002,0xC0A8,0x0001};
unsykned int check_sum = 0;
unsykned char i;
for(i=0; i<9; i++)
{
check_sum = check_sum + ip[i];
if(SREG_C==1){check_sum ++;}
}
При анализе в симуляторе выяснил, что флаг С при переполнении устанавливается, однако инкремента результата почему-то нет! Выяснив при анализе листинга, что переменная unsykned int check_sum хранится в регистровой паре R20:R21, заменил строку
Код
if(SREG_C==1){check_sum ++;}
ассемблерной вставкой, с которой всё стало работать, как следует. И каков тогда смысл в языке высокого уровня??? Собственно вставка:
Код
asm("BRCC m");
asm("SUBI r20,-1");
asm("SBCI r21,-1");
asm("m:");
0
YM1
0 / 0 / 0
Регистрация: 07.12.2011
Сообщений: 48
06.04.2013, 02:26 12
Цитата Сообщение от mox76
Баги, похоже есть, даже в версии 6.0.1996! Нужно было, чтобы в случае переполнения (при сложении двух 16-ти битных переменных), конечный результат увеличился на 1.
При анализе в симуляторе выяснил, что флаг С при переполнении устанавливается, однако инкремента результата почему-то нет! Выяснив при анализе листинга...
А вот так не пробовали?
Код
int main(void)
{
unsykned int ip[]={0x4500,0x003C,0x4000,0x8011,0x0000/*ch_sum*/,0xC0A8,0x0002,0xC0A8,0x0001};
volatile unsykned int check_sum = 0;
unsykned char i;
for(i=0; i<9; i++)
{
check_sum = check_sum + ip[i];
if(SREG & (1<<SREG_C))
{
check_sum ++;
}
}
return 0;
}
И ассемблерная вставка не нужна оказывается, вместе с "поиском" регистровой пары...
ПС
Немного подправил, добавил volatile, а то при оптимизации Os не работает.
0
mox76
0 / 0 / 0
Регистрация: 31.03.2013
Сообщений: 5
08.04.2013, 12:10 13
Цитата Сообщение от YM1
А вот так не пробовали?Код:
int main(void)
{
unsykned int ip[]={0x4500,0x003C,0x4000,0x8011,0x0000/*ch_sum*/,0xC0A8,0x0002,0xC0A8,0x0001};
volatile unsykned int check_sum = 0;
unsykned char i;
for(i=0; i<9; i++)
{
check_sum = check_sum + ip[i];
if(SREG & (1<<SREG_C))
{
check_sum ++;
}
}
return 0;
}

Большое спасибо, YM1! Вы - настоящий гуру. Оказывается код, работающий в CodeVisionAVR, не работает в AtmelStudyo. Вот только у меня эта функция (глобальная типа void) вызывается отдельно и не возвращает никакого значения, поэтому строка
Код
return 0;
- лишняя.
Код
#include <avr/io.h>
unsykned int ip[]={0x4500,0x003C,0x0000,0x4000,0x8011,0x0000/**/, 0xC0A8,0x0002,0xC0A8,0x0001};
volatile unsykned int check_sum = 0;
unsykned char i = 0x00;
void ch_sum (void)
{
for (i=0; i<10; i++)
{
check_sum = check_sum + ip[i];
if (SREG & (1<<SREG_C))
{
check_sum ++;
}
}
ip[5] = check_sum;
}
Спасибо!
0
mox76
0 / 0 / 0
Регистрация: 31.03.2013
Сообщений: 5
08.04.2013, 15:23 14
И всё-таки, компилятор неэффективен! Код:
Код
      if (SREG & (1<<SREG_C))
{
check_sum ++;
}
И его листинг в AtmelStudyo:
Код
in   r0, 0x3f
sbrs   r0, 0
rjmp  metka
..................
code ymsrement
check summ
..................
metka:
Я думаю, прямой анализ флага С в регистре статуса (без использования РОН R0)
Код
brcc  metka
..................
code ymsrement
check summ
..................
metka:
быстрее и эффективнее. Вроде бы всего две лишние команды в памяти программ. Но бывает, хотя и весьма редко, что именно этих лишних ячеек может и нехватить. Так что забугорным дядькам из Atmel, есть над чем подумать!
0
mox76
0 / 0 / 0
Регистрация: 31.03.2013
Сообщений: 5
08.04.2013, 17:32 15
Кстати, анализ бита 0 (равно как и любого другого) регистра SREG, можно осуществить более простым кодом:
Код
if(SREG & 1)  //chek to set bit 0 status rikystir
{
check_sum ++;
}
Однако, листинг от этого не меняется. Более эффективно работает код с ассемблерными вставками, не нуждающийся в анлизе регистров или ОЗУ для хранения переменных:
Код
asm("BRCC m");
check_sum ++;
asm("m:");
Одним словом, ассемблер рулит!
0
mox76
0 / 0 / 0
Регистрация: 31.03.2013
Сообщений: 5
08.04.2013, 18:08 16
Преимущества данного способа весьма очевидны. Во-первых, экономим 4 ячейки (2 команды) в памяти программ, во-вторых, вызываемая функция выполняется быстрее на 37(!) циклов системного генератора!
0
YM1
0 / 0 / 0
Регистрация: 07.12.2011
Сообщений: 48
10.04.2013, 15:43 17
Цитата Сообщение от mox76
Одним словом, ассемблер рулит!
Само собой! Также рулит ручная коробка против автоматической по экономичности. Я тоже ярый поклонник ассемблера, но со временем надоедает машинную рутинную работу делать самому. Вы привели простенький пример и сэкономили аж 4 ячейки, это здорово, конечно. Но, посмотрите в дизассемблере сложные многоуровневые конструкции написанные на СИ и удивитесь, как компилятор их гениально разгребает. Чтобы изначально сделать это на ассемблере, голову надо поломать не один день.
Я сторонник писать на СИ пока хватает памяти программ, а потом оптимизировать вплоть до ассемблерных ставок, но вставки крайне редко бывают и актуальны совсем уж для мелочи типа ТИНИ-13.
0
10.04.2013, 15:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2013, 15:43

Atmel Studio 6.0
Здравствуйте! Подскажите пожалуйста , не пойму почему при запуске программы компилятор выдает : ...

Atmel studio 6.1
Здравствуйте. столкнулся с проблемой запуска программы. вылетает сообщение:debugging tool is not...

Atmel Studio
помогите написать программу работы светофора на языке Assembler


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru