Rst7 5 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба Кстати, а в ИАРе return внутри for() как себя чувствует? В смысле внутри {}? Как обычный return. Т.е. тут он не восстановит состояние SREG. В гнусе хитрый костыль для этого есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба Кстати, а в ИАРе return внутри for() как себя чувствует? А что с ним может стать? Но вообще это дурной стиль. лучше break; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба лучше break; Конкретно в такой критической секции, изготовленной из for, нужен continue Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба тут он не восстановит состояние SREG Ну, это понятно. При всей красоте ATOMIC_BLOCK, всегда надо помнить, из чего он сделан :) Я даже инициализацию требухи в начале main() пишу не иначе как ATOMIC_BLOCK(ATOMIC_FORCEON), с явным нежеланием отказываться от этой фичи в дальнейшем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба всегда надо помнить, из чего он сделан В гнусе есть специальный костыль - суть плюсовый деструктор переменной. Вот он и пользуется в гнусевом атомике. Можно из такого блока выходить чем угодно, хоть return, хоть break, хоть goto (не уверен). longjump - нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба Можно из такого блока выходить чем угодно... хоть 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> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kirill2004 0 25 октября, 2009 Опубликовано 25 октября, 2009 (изменено) · Жалоба Посоветуйте книжку для НАЧИНАЮЩЕГО(чайника):smile3046: по Си-программированию для микроконтроллеров. Можно на английском или немецком. Самое главное, чтобы матерьял объснялся хорошо. Зарание всех благодарю за помощь :santa2: Изменено 25 октября, 2009 пользователем Kirill24 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chief_olimp 0 25 октября, 2009 Опубликовано 25 октября, 2009 (изменено) · Жалоба Шпак Ю.А. Программирование на языке С для AVR и PIC микроконтроллеров. МК-Пресс, Киев, 2006, 400стр. ил. Часть 1 Часть 2 Ссылка отсюда Неполохой help по avr-libc Это все для среды WINAVR если речь идет про AVR. Вообще WINAVR посложнее будет чем к примеру CV, но в нем меньше закрытости кода что ли, за счет меньшего количества готовых функций. Отсюда большая гибкость но это уже совсем другой вопрос. Удачи в освоении Изменено 25 октября, 2009 пользователем chief_olimp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kurtis 0 25 октября, 2009 Опубликовано 25 октября, 2009 · Жалоба Си-программированию для микроконтроллеров Программирование на С для МК ничем принципиально не отличается от программирования для больших ПК. Мне очень понравился Герберт Шилдт "Полный справочник по С". Можно на английском или немецком. Книги ищите в торрентах. Например поищите здесь по запросу embedded. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smac 0 25 октября, 2009 Опубликовано 25 октября, 2009 · Жалоба Посоветуйте ... Как начинающий посоветую Кернигана и Ричи - учиться можно на ПК, а параллельно программить для МК, читая доки к выбранному компилятору. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arm123 0 9 ноября, 2009 Опубликовано 9 ноября, 2009 (изменено) · Жалоба У меня такой вопрос: к примеру есть функция с такой конструкцией: какие-то действия if( условие ) { *** } else { *** } В одной ветке мне нужна для работы локальная переменная, к примеру count, а для другого не нужно. Как лучше обьявлять эту переменную? Вот так: какие-то действия if( условие ) { uint32_t count; *** } else { *** } млм же предпочительнее все-таки так: uint32_t count; какие-то действия if( условие ) { *** (тут count используется) } else { *** (тут count не используется) } Спасибо. Изменено 9 ноября, 2009 пользователем arm123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 9 ноября, 2009 Опубликовано 9 ноября, 2009 · Жалоба Г.Саттер, А.Александреску "Стандарты программирования на С++. 101 правило и рекомендации" : правило 18 - Объявляйте переменные как можно локальнее. Переменных должно быть как можно меньше, а время их жизни - как можно короче. Подробно в книге на стр. 47 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 9 ноября, 2009 Опубликовано 9 ноября, 2009 · Жалоба Дык в топике вроде речь идет о С? И если компилятор не поддерживает С99,то тогда без вариантов.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arm123 0 9 ноября, 2009 Опубликовано 9 ноября, 2009 · Жалоба Я пользуюсь компилятором IAR. Сдесь вроде поддерживает :) раз уж локально можно обьявлять где угодно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 9 ноября, 2009 Опубликовано 9 ноября, 2009 · Жалоба И не забыть про реентабельность(переносимость) кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться