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

Вопросы по изучению Си

Кстати, а в ИАРе return внутри for() как себя чувствует?

 

В смысле внутри {}? Как обычный return. Т.е. тут он не восстановит состояние SREG. В гнусе хитрый костыль для этого есть.

Поделиться сообщением


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

Кстати, а в ИАРе return внутри for() как себя чувствует?

А что с ним может стать?

Но вообще это дурной стиль.

лучше break;

Поделиться сообщением


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

лучше break;

 

Конкретно в такой критической секции, изготовленной из for, нужен continue

Поделиться сообщением


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

тут он не восстановит состояние SREG

Ну, это понятно. При всей красоте ATOMIC_BLOCK, всегда надо помнить, из чего он сделан :)

 

Я даже инициализацию требухи в начале main() пишу не иначе как ATOMIC_BLOCK(ATOMIC_FORCEON), с явным нежеланием отказываться от этой фичи в дальнейшем.

Поделиться сообщением


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

всегда надо помнить, из чего он сделан

 

В гнусе есть специальный костыль - суть плюсовый деструктор переменной. Вот он и пользуется в гнусевом атомике. Можно из такого блока выходить чем угодно, хоть return, хоть break, хоть goto (не уверен). longjump - нельзя.

Поделиться сообщением


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

Можно из такого блока выходить чем угодно... хоть goto (не уверен)

 

Проверил - можно. :)

Текст для проверки:

volatile int ff;

int main (void) __attribute__((OS_main));

int main (void)
{
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
DDRB = 1;
if(ff) goto aaa;
PORTB=1;
}
ff += 41*DDRB;
aaa:
for(uint8_t j=0; j<3;j++)
{
ff += pgm_read_byte(&(BCD[j]));
}


return 0;
}

Листинг

00000070 <main>:

int main (void) __attribute__((OS_main));

int main (void)
{
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
 70:	2f b7       	in	r18, 0x3f	; 63
   return 1;
}

static __inline__ uint8_t __iCliRetVal(void)
{
   cli();
 72:	f8 94       	cli
{
DDRB = 1;
 74:	31 e0       	ldi	r19, 0x01	; 1
 76:	34 b9       	out	0x04, r19	; 4
if(ff) goto aaa;
 78:	80 91 08 01 	lds	r24, 0x0108
 7c:	90 91 09 01 	lds	r25, 0x0109
 80:	89 2b       	or	r24, r25
 82:	09 f0       	breq	.+2      	; 0x86 <main+0x16>
 84:	39 c0       	rjmp	.+114    	; 0xf8 <main+0x88>
PORTB=1;
 86:	35 b9       	out	0x05, r19	; 5
   (void)__s;
}

static __inline__ void __iRestore(const  uint8_t *__s)
{
   SREG = *__s;
 88:	2f bf       	out	0x3f, r18	; 63
}
ff += 41*DDRB;
 8a:	80 91 08 01 	lds	r24, 0x0108
 8e:	90 91 09 01 	lds	r25, 0x0109
 92:	24 b1       	in	r18, 0x04	; 4
 94:	49 e2       	ldi	r20, 0x29	; 41
 96:	24 9f       	mul	r18, r20
 98:	90 01       	movw	r18, r0
 9a:	11 24       	eor	r1, r1
 9c:	28 0f       	add	r18, r24
 9e:	39 1f       	adc	r19, r25
 a0:	30 93 09 01 	sts	0x0109, r19
 a4:	20 93 08 01 	sts	0x0108, r18
aaa:
for(uint8_t j=0; j<3;j++)
{
ff += pgm_read_byte(&(BCD[j]));
 a8:	80 91 08 01 	lds	r24, 0x0108
 ac:	90 91 09 01 	lds	r25, 0x0109
 b0:	e4 e3       	ldi	r30, 0x34	; 52
 b2:	f0 e0       	ldi	r31, 0x00	; 0
 b4:	24 91       	lpm	r18, Z+
 b6:	82 0f       	add	r24, r18
 b8:	91 1d       	adc	r25, r1
 ba:	90 93 09 01 	sts	0x0109, r25
 be:	80 93 08 01 	sts	0x0108, r24
 c2:	80 91 08 01 	lds	r24, 0x0108
 c6:	90 91 09 01 	lds	r25, 0x0109
 ca:	31 96       	adiw	r30, 0x01	; 1
 cc:	24 91       	lpm	r18, Z+
 ce:	82 0f       	add	r24, r18
 d0:	91 1d       	adc	r25, r1
 d2:	90 93 09 01 	sts	0x0109, r25
 d6:	80 93 08 01 	sts	0x0108, r24
 da:	80 91 08 01 	lds	r24, 0x0108
 de:	90 91 09 01 	lds	r25, 0x0109
 e2:	31 96       	adiw	r30, 0x01	; 1
 e4:	e4 91       	lpm	r30, Z+
 e6:	8e 0f       	add	r24, r30
 e8:	91 1d       	adc	r25, r1
 ea:	90 93 09 01 	sts	0x0109, r25
 ee:	80 93 08 01 	sts	0x0108, r24
}


return 0;
}
 f2:	80 e0       	ldi	r24, 0x00	; 0
 f4:	90 e0       	ldi	r25, 0x00	; 0
 f6:	08 95       	ret
 f8:	2f bf       	out	0x3f, r18	; 63
   __asm__ volatile ("" ::: "memory");
 fa:	d6 cf       	rjmp	.-84     	; 0xa8 <main+0x38>

Поделиться сообщением


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

Посоветуйте книжку для НАЧИНАЮЩЕГО(чайника):smile3046: по Си-программированию для микроконтроллеров. Можно на английском или немецком. Самое главное, чтобы матерьял объснялся хорошо.

 

Зарание всех благодарю за помощь :santa2:

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

Поделиться сообщением


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

Шпак Ю.А.

Программирование на языке С для AVR и PIC микроконтроллеров.

МК-Пресс, Киев, 2006, 400стр. ил.

Часть 1

Часть 2

Ссылка отсюда

Неполохой help по avr-libc

Это все для среды WINAVR если речь идет про AVR. Вообще WINAVR посложнее будет чем к примеру CV, но в нем меньше закрытости кода что ли, за счет меньшего количества готовых функций. Отсюда большая гибкость но это уже совсем другой вопрос. Удачи в освоении

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

Поделиться сообщением


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

Си-программированию для микроконтроллеров

Программирование на С для МК ничем принципиально не отличается от программирования для больших ПК. Мне очень понравился Герберт Шилдт "Полный справочник по С".

 

Можно на английском или немецком.

Книги ищите в торрентах. Например поищите здесь по запросу embedded.

Поделиться сообщением


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

Посоветуйте ...

Как начинающий посоветую Кернигана и Ричи - учиться можно на ПК, а параллельно программить для МК, читая доки к выбранному компилятору.

Поделиться сообщением


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

У меня такой вопрос:

к примеру есть функция с такой конструкцией:

 

какие-то действия
if( условие )
{
   ***
}
else
{
  ***
}

 

В одной ветке мне нужна для работы локальная переменная, к примеру count, а для другого не нужно. Как лучше обьявлять эту переменную?

Вот так:

какие-то действия
if( условие )
{
   uint32_t count;
   ***
}
else
{
  ***
}

 

млм же предпочительнее все-таки так:

uint32_t count;
какие-то действия
if( условие )
{
   *** (тут count используется)
}
else
{
  *** (тут count не используется)
}

 

Спасибо.

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

Поделиться сообщением


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

Г.Саттер, А.Александреску "Стандарты программирования на С++. 101 правило и рекомендации" :

 

правило 18 - Объявляйте переменные как можно локальнее. Переменных должно быть как можно меньше, а время их жизни - как можно короче.

 

Подробно в книге на стр. 47

Поделиться сообщением


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

Дык в топике вроде речь идет о С? И если компилятор не поддерживает С99,то тогда без вариантов..

Поделиться сообщением


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

Я пользуюсь компилятором IAR. Сдесь вроде поддерживает :) раз уж локально можно обьявлять где угодно

Поделиться сообщением


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

И не забыть про реентабельность(переносимость) кода.

Поделиться сообщением


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...