реклама на сайте
подробности

 
 
7 страниц V  « < 3 4 5 6 7 >  
Reply to this topicStart new topic
> Вопросы по изучению Си
Rst7
сообщение Mar 13 2009, 08:19
Сообщение #61


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



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


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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 13 2009, 08:20
Сообщение #62


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(_Pasha @ Mar 13 2009, 11:15) *
Кстати, а в ИАРе return внутри for() как себя чувствует?

А что с ним может стать?
Но вообще это дурной стиль.
лучше break;


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 13 2009, 08:23
Сообщение #63


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
лучше break;


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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 13 2009, 08:29
Сообщение #64


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Rst7 @ Mar 13 2009, 12:19) *
тут он не восстановит состояние SREG

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

Я даже инициализацию требухи в начале main() пишу не иначе как ATOMIC_BLOCK(ATOMIC_FORCEON), с явным нежеланием отказываться от этой фичи в дальнейшем.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 13 2009, 08:33
Сообщение #65


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



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


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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 13 2009, 08:50
Сообщение #66


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Rst7 @ Mar 13 2009, 12:33) *
Можно из такого блока выходить чем угодно... хоть goto (не уверен)


Проверил - можно. smile.gif
Текст для проверки:
Код
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;
}

Листинг
CODE

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>
Go to the top of the page
 
+Quote Post
Kirill24
сообщение Oct 25 2009, 11:57
Сообщение #67





Группа: Участник
Сообщений: 8
Регистрация: 11-10-09
Пользователь №: 52 859



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

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

Сообщение отредактировал Kirill24 - Oct 25 2009, 12:03
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение Oct 25 2009, 14:17
Сообщение #68


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



Шпак Ю.А.
Программирование на языке С для AVR и PIC микроконтроллеров.
МК-Пресс, Киев, 2006, 400стр. ил.
Часть 1
Часть 2
Ссылка отсюда
Неполохой help по avr-libc
Это все для среды WINAVR если речь идет про AVR. Вообще WINAVR посложнее будет чем к примеру CV, но в нем меньше закрытости кода что ли, за счет меньшего количества готовых функций. Отсюда большая гибкость но это уже совсем другой вопрос. Удачи в освоении

Сообщение отредактировал chief_olimp - Oct 25 2009, 14:22
Go to the top of the page
 
+Quote Post
kurtis
сообщение Oct 25 2009, 18:11
Сообщение #69


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



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

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

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

Книги ищите в торрентах. Например поищите здесь по запросу embedded.
Go to the top of the page
 
+Quote Post
smac
сообщение Oct 25 2009, 21:23
Сообщение #70


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(Kirill24 @ Oct 25 2009, 14:57) *
Посоветуйте ...

Как начинающий посоветую Кернигана и Ричи - учиться можно на ПК, а параллельно программить для МК, читая доки к выбранному компилятору.
Go to the top of the page
 
+Quote Post
arm123
сообщение Nov 9 2009, 11:41
Сообщение #71


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 22-10-09
Пользователь №: 53 141



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

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


В одной ветке мне нужна для работы локальная переменная, к примеру count, а для другого не нужно. Как лучше обьявлять эту переменную?
Вот так:
Код
какие-то действия
if( условие )
{
   uint32_t count;
   ***
}
else
{
  ***
}


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


Спасибо.

Сообщение отредактировал arm123 - Nov 9 2009, 11:42
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 9 2009, 11:58
Сообщение #72


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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

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

Подробно в книге на стр. 47
Go to the top of the page
 
+Quote Post
WHALE
сообщение Nov 9 2009, 13:02
Сообщение #73


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



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


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
arm123
сообщение Nov 9 2009, 14:05
Сообщение #74


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 22-10-09
Пользователь №: 53 141



Я пользуюсь компилятором IAR. Сдесь вроде поддерживает smile.gif раз уж локально можно обьявлять где угодно
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Nov 9 2009, 14:33
Сообщение #75


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



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


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post

7 страниц V  « < 3 4 5 6 7 >
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 01:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016