Перейти к содержанию

Оптимизация кода ATtiny13A, Atmel Studio 7


Tokes

Рекомендуемые сообщения

Здравствуйте! Есть код, в котором выход из бесконечного цикла подразумевается по установке одного из флагов, но при симуляции в этом месте затык - программа уходит в зацикливание и даже если принудительно поставить флаг в единицу в окошке Watch 1, никак не реагирует.

Флаг устанавливается в прерывании по переполнению таймера два раза, но если вызывать прерывание кликом мышки дважды - флаг устанавливается, но перехода не происходит всё равно:(

void wait_timer_start(){
	while(1){
		if (flag & (1 << KEY_BIT_DONE)){
			stop_timer();
			flag &= ~(1 << KEY_BIT_DONE);	// выключаем флаг окончания обработки бита
			break;			// прервать бесконечный цикл
		}
	}
}

Дизассемблер этого момента выглядит так:

		if (flag & (1 << KEY_BIT_DONE)){
00000043  LDS R24,0x0061		Load direct from data space 
00000045  SBRS R24,0		Skip if bit in register set 
00000046  RJMP PC-0x0000		Relative jump 
			stop_timer();
00000047  RCALL PC-0x000C		Relative call subroutine 
			flag &= ~(1 << KEY_BIT_DONE);	
00000048  LDS R24,0x0061		Load direct from data space 
0000004A  ANDI R24,0xFE		Logical AND with immediate 
0000004B  STS 0x0061,R24		Store direct to data space 
0000004D  RET 		Subroutine return 

По идее в строке 45 должна постоянно выполнятся проверка условия и в строке 46 возврат на 45, но в 46 строке идёт возврат на саму себя! Если я правильно всё понимаю. Это со включённой оптимизацией O1. Если оптимизацию выключить, то ассемблерный код превращается в:

void wait_timer_start(){
0000006F  PUSH R28		Push register on stack 
00000070  PUSH R29		Push register on stack 
00000071  IN R28,0x3D		In from I/O location 
00000072  CLR R29		Clear Register 
		if (flag & (1 << KEY_BIT_DONE)){
00000073  LDS R24,0x0061		Load direct from data space 
00000075  MOV R24,R24		Copy register 
00000076  LDI R25,0x00		Load immediate 
00000077  ANDI R24,0x01		Logical AND with immediate 
00000078  CLR R25		Clear Register 
00000079  OR R24,R25		Logical OR 
0000007A  BREQ PC+0x08		Branch if equal 
			stop_timer();
0000007B  RCALL PC-0x0029		Relative call subroutine 
			flag &= ~(1 << KEY_BIT_DONE);	
0000007C  LDS R24,0x0061		Load direct from data space 
0000007E  ANDI R24,0xFE		Logical AND with immediate 
0000007F  STS 0x0061,R24		Store direct to data space 
			break;			
00000081  RJMP PC+0x0002		Relative jump 
	}
00000082  RJMP PC-0x000F		Relative jump 
}
00000083  POP R29		Pop register from stack 
00000084  POP R28		Pop register from stack 
00000085  RET 		Subroutine return 

И всё отлично работает, но тогда не влазят задержки из библиотеки <util/delay.h>.

Почему так себя ведёт компилятор со включённой оптимизацией? Можно ли ему как-то помочь, чтобы он компилировал верный код?

Контроллер ATTiny13A, студия 7.

Изменено пользователем Tokes
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Забыл :(
Это была глобальная переменная. Добавил - всё заработало для приёмника, сейчас буду мучить передатчик. 
Пока вы отвечали прочёл пару статей про оптимизацию, но там общие фразы, на счёт volatile слышал много раз, но никогда не было нужны в использовании :(
Где подробнее почитать можно про оптимизацию?

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

@Геннадий , это понимание пришло, как только скомпилировал без оптимизации и получил сообщение о заполнении памяти в 150% :)

Открытыми остались вопросы  "Почему так себя ведёт компилятор со включённой оптимизацией?" и (или) " Где подробнее почитать можно про оптимизацию? ".

Ссылка на комментарий
Поделиться на другие сайты

Компилятор "пляшет" от библиотеки и оптимизировать может только решение, выполненное с ее применением. Придумать за Вас рациональное использование МК (его скудный запас ресурсов) компилятор не может, т.к. не умеет принимать решения самостоятельно.

Тут поможет только собственная голова.

Ссылка на комментарий
Поделиться на другие сайты

В 02.10.2016 в 20:34, Tokes сказал:

Открытыми остались вопросы  "Почему так себя ведёт компилятор со включённой оптимизацией?" и (или) " Где подробнее почитать можно про оптимизацию? ".

Одна из первых ссылок в выдаче гугла: https://tproger.ru/problems/what-is-the-purpose-of-the-keyword-volatile-in-c/

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
В 02.10.2016 в 20:31, Геннадий сказал:

Для таких малых чипов писАть лучше на Ассме.

Спорное утверждение. AVR-GCC вполне неплохо позволяет решать достаточно сложные задачи в комфортных условиях.

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Зачем тогда утверждать спорные вещи? В attiny13 прекрасно впихивается и диммер с дистанционным IR-управлением с любого пульта, и аналогичные "лампы настроения" и т.п., написанные на Си.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...