Страница 84 из 386

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт апр 12, 2012 19:34:16
Мастер Ломастер
Mr.Denis писал(а):Подскажите как понимать эту конструкцию:
while (!( SCS &0x00000040));
Если я правильно понимаю, то цикл висит до тех пор пока в регистре scs этот бит не будет равен 1?
да, цикл ожидания установки бита в регистре
Mr.Denis писал(а):И еще не совсем понятно как работает вот эта конструкция:
while( PLLSTAT & 0x000);
если PLLSTAT не объявлено как volatile, то вероятнее всего эта строчка будет выброшена компилятором за ненадобностью. в противном случае будет тупое обращение на чтение к регистру PLLSTAT - никакого цикла не будет.

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт апр 12, 2012 19:37:02
AI_Disable
Mr.Denis писал(а): while (!( SCS &0x00000040));
Если я правильно понимаю, то цикл висит до тех пор пока в регистре scs этот бит не будет равен 1?
Ага, этот 6-й бит, если быть точнее.
Mr.Denis писал(а):И еще не совсем понятно как работает вот эта конструкция:
while( PLLSTAT & 0x000);
А никак не работает условие цикла всегда ложно.

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт апр 12, 2012 19:48:02
vitalik_1984
DX168B писал(а): Сразу скажу, что конструкция не работала. Почему, уже разобрался сам.
Спасибо за "помощь".....
Да не за что
Сам разобрался, значит помощь была не нужна :)
А если серьезно то я вообще даже не увидел где у вас там в коде объявление массива buff[32]
Хотя нет сейчас увидел, но конструкция вашего объявления shunt мне непонятна.

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт апр 12, 2012 19:54:09
Mr.Denis
Ребята спасибо за ответы!)))
Скажите, если переделать условия так: while(!(PLLSTAT & 0x000));
Тогда получается что цыкал висит до тех пор пока не будет равен 0?

А что ждет эта конструкция: while(!PLLSTAT_bit.PLOCK);
Везит в цикле пока бит PLLSTAT_bit.PLOCK не станет 1?

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт апр 12, 2012 20:07:28
ut1wpr
Мои извинения за оффтоп.
Читаю некоторые посты и диву даюсь. Неужели вопрошающие здесь когда-то посещали школу?
Бывают, безусловно у людей ошибки, но не до такой же степени....
И это в теме, где изучают языки! А своего родного знать не обязательно?
Комментировать не нужно, отвечать тоже, нет вопросов.
Примите этот пост как крик души. Глаза режет подобная безграмотность.
Еще раз извините...

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт апр 12, 2012 20:08:15
BorisSPB

Код: Выделить всё

while(!PLLSTAT_bit.PLOCK);
Вообще-то именно так и должно быть, ждать пока PLL стабилизируется.

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт апр 12, 2012 20:21:37
Mr.Denis
А если записать вот так:
while(!(PLLSTAT & 0x02000000));
По идеи получается тоже самое что и while(!PLLSTAT_bit.PLOCK); PLOCK это 26 бит.
То есть что первое, что и второе условия ждут 1(единицу). Правильно?

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт апр 12, 2012 20:47:37
BorisSPB

Код: Выделить всё

while(!(PLLSTAT & 0x02000000));
Так даже лучше. По крайней мере IAR в этом случае генерит более короткий код.

Код: Выделить всё

  while(!(PLLSTAT & 0x02000000));
??FreqInit_1:
        0x3f8: 0xe59f036c     LDR       R0, ??DataTable4_9      ; PLLSTAT
        0x3fc: 0xe5900000     LDR       R0, [R0]
        0x400: 0xe3100780     TST       R0, #33554432           ; 0x2000000
        0x404: 0x0afffffb     BEQ       ??FreqInit_1            ; 0x3f8
А в первом случае:

Код: Выделить всё

 while(!PLLSTAT_bit.PLOCK);
??FreqInit_0:
        0x3dc: 0xe59f0388     LDR       R0, ??DataTable4_9      ; PLLSTAT
        0x3e0: 0xe5900000     LDR       R0, [R0]
        0x3e4: 0xe3a01001     MOV       R1, #1
        0x3e8: 0xe0110520     ANDS      R0, R1, R0, LSR #10
        0x3ec: 0xe21000ff     ANDS      R0, R0, #255            ; 0xff
        0x3f0: 0xe3500000     CMP       R0, #0
        0x3f4: 0x0afffff8     BEQ       ??FreqInit_0            ; 0x3dc

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт апр 12, 2012 20:52:29
Mr.Denis
BorisSPB
Спасибо вам за помощь!
А откуда вы узнали про IAR?
Я так понимаю что вы догодались что я ARM изучаю?)))

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт апр 12, 2012 20:57:21
BorisSPB
Я сам IARом пользуюсь. И примерно такой код у меня для LPC2103.
Только у LPC210x PLOCK это 10 бит, а у LPC23xx PLOCK это 26 бит.
Еще хочу уточнить. Разное написание условия приводит к различию в коде только при низкой оптимизации, при высокой сбалансированной оптимизации получается один и тот же короткий код. Конечно лучше писать понятный код используя имеющиеся определения и избегать "магических" чисел.

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт апр 17, 2012 10:09:28
Барсук
Всем доброго времени суток
помогите разобраться, а то у самого уже мозг вскипел и на простом зациклился
есть массив указателей на другие массивы

Код: Выделить всё

const uint8_t* My_image [] PROGMEM ={
                                     gImage_usb,
                                     gImage_ok };
вопрос как вычислить размер массива допустим gImage_usb с помощью My_image

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт апр 17, 2012 19:58:20
FreshMan
есть такой пример
x + y // сложение
x - y // вычитание
x * y // умножение
x / y /* деление.

Если числа целые результат - целое число с отброшенной дробной частью - не округленное !

т.е. если в результате деления на калькуляторе получается 6.23411 или 6.94 то результат будет просто целое число 6 - запомните !

Если числа с плавающей точкой, то есть float или double и записываются с точкой и числом после точки, то и результат будет число с плавающей точкой без отбрасывания дробной части
131.9739 / 6.18 даст 21.355 */

x % y // вычислить остаток от деления нацело

// примеры:

5 / 2 // даст 2

5 % 2 // даст 1

75 / 29 // даст 2

75 % 29 // даст 17

непонятна вот эта операция: 75 % 29 // даст 17 :dont_know:
ведь 75/29=2.5862
обясните пожалуйста в чем тут прикол :))

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт апр 17, 2012 20:00:22
Аlex
ведь 75/29=2.5862
.5862*29=17
75-29*2=17
А у Вас сколько получилось ?

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт апр 17, 2012 20:28:57
FreshMan
у меня получилось .5862
ядумал что опрератор % вычисляет ОСТАТОК от деления...... 75 % 29=0.5862
а почему вы делаете так .5862*29=17 :dont_know:

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт апр 17, 2012 20:31:54
Аlex
Срочно учить математику 5 :facepalm:
http://ru.wikipedia.org/wiki/%C4%E5%EB% ... 2%EA%EE%EC
Деление c остатком (деление по модулю, нахождение остатка от деления, остаток от деления) — арифметическая операция, результатом которой является два целых числа: неполное частное и остаток от деления целого числа на другое целое число.
Остаток - это то, что осталось неделимым. Т.е. 58 разделилось на 29, получилось 2. А 17 осталось неделимым...

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср апр 18, 2012 08:36:35
Gudd-Head
FreshMan писал(а):у меня получилось .5862
Это дробная часть результата, а не остаток :facepalm:

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср апр 18, 2012 16:57:12
FreshMan
да понял я уже , понял...... :oops:

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт апр 19, 2012 12:36:53
DX168B
vitalik_1984 писал(а): Сам разобрался, значит помощь была не нужна :)
А если серьезно то я вообще даже не увидел где у вас там в коде объявление массива buff[32]
Хотя нет сейчас увидел, но конструкция вашего объявления shunt мне непонятна.
Конечно не будет совсем понятна. Я ведь только кусочек класса выложил. А именно, проблемное место. Фишка была в том, что я обращался к массиву и к его элементам через указатель и меня постоянно это беспокоило "Что-то не так, не надёжно это... если массив разбросается по памяти, то каюк.."
Проблему решил использованием класса CStringA. Во время дебага, я заметил, что массив почему-то стал фрагментироваться после приёма данных (наверное, идиоццкая реализация функции чтения с порта или где-то мой косяк :oops: ) С использованием CStringA, я отдал этот буфер на съедение компилятору. Вроде как, теперь всё работает корректно и мне стало проще разгребать все эти данные.
Ну и ещё одна проблема была в ошибочных настройках таймаутов по приёму данных и кривость программы в девайсе, который эти данные шлёт. По протоколу, пакеты должны были разделяться таймаутами не менее 10мс, а девайс слал разорванные пакеты с различными таймаутами и в итоге, эти пакеты не проходили на целостность. Напарнику пришлось ещё раз объяснить про работу протокола, вместе с ним изучить его прошивку и подправить его код.
Сейчас все проблемы решены. :)

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт апр 19, 2012 17:19:41
FreshMan
можна ли записать данный код по компактней ?

Код: Выделить всё

if (mode==0) x++;
if(x>=5) x=0;

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт апр 19, 2012 17:25:07
AI_Disable
FreshMan писал(а):можна ли записать данный код по компактней ?

Код: Выделить всё

if (mode==0) x++;
if(x>=5) x=0;
Да
if(!mode && ++x>=5) x=0;
Прим. При условии, что это единственное место, где изменяется x