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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

Mr.Denis писал(а):Подскажите как понимать эту конструкцию:
while (!( SCS &0x00000040));
Если я правильно понимаю, то цикл висит до тех пор пока в регистре scs этот бит не будет равен 1?
да, цикл ожидания установки бита в регистре
Mr.Denis писал(а):И еще не совсем понятно как работает вот эта конструкция:
while( PLLSTAT & 0x000);
если PLLSTAT не объявлено как volatile, то вероятнее всего эта строчка будет выброшена компилятором за ненадобностью. в противном случае будет тупое обращение на чтение к регистру PLLSTAT - никакого цикла не будет.
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

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

Сообщение AI_Disable »

Mr.Denis писал(а): while (!( SCS &0x00000040));
Если я правильно понимаю, то цикл висит до тех пор пока в регистре scs этот бит не будет равен 1?

Ага, этот 6-й бит, если быть точнее.
Mr.Denis писал(а):И еще не совсем понятно как работает вот эта конструкция:
while( PLLSTAT & 0x000);

А никак не работает условие цикла всегда ложно.
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

DX168B писал(а):Сразу скажу, что конструкция не работала. Почему, уже разобрался сам.
Спасибо за "помощь".....
Да не за что
Сам разобрался, значит помощь была не нужна :)
А если серьезно то я вообще даже не увидел где у вас там в коде объявление массива buff[32]
Хотя нет сейчас увидел, но конструкция вашего объявления shunt мне непонятна.
В поисках истины человек развивается.
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

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

Сообщение Mr.Denis »

Ребята спасибо за ответы!)))
Скажите, если переделать условия так: while(!(PLLSTAT & 0x000));
Тогда получается что цыкал висит до тех пор пока не будет равен 0?

А что ждет эта конструкция: while(!PLLSTAT_bit.PLOCK);
Везит в цикле пока бит PLLSTAT_bit.PLOCK не станет 1?
STM32F4 Discovery + KEIL + Windows 7
Реклама
Эиком - электронные компоненты и радиодетали
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

Мои извинения за оффтоп.
Читаю некоторые посты и диву даюсь. Неужели вопрошающие здесь когда-то посещали школу?
Бывают, безусловно у людей ошибки, но не до такой же степени....
И это в теме, где изучают языки! А своего родного знать не обязательно?
Комментировать не нужно, отвечать тоже, нет вопросов.
Примите этот пост как крик души. Глаза режет подобная безграмотность.
Еще раз извините...
С уважением,
Виктор.
Реклама
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

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

while(!PLLSTAT_bit.PLOCK);

Вообще-то именно так и должно быть, ждать пока PLL стабилизируется.
Реклама
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

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

Сообщение Mr.Denis »

А если записать вот так:
while(!(PLLSTAT & 0x02000000));
По идеи получается тоже самое что и while(!PLLSTAT_bit.PLOCK); PLOCK это 26 бит.
То есть что первое, что и второе условия ждут 1(единицу). Правильно?
STM32F4 Discovery + KEIL + Windows 7
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение 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
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

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

Сообщение Mr.Denis »

BorisSPB
Спасибо вам за помощь!
А откуда вы узнали про IAR?
Я так понимаю что вы догодались что я ARM изучаю?)))
STM32F4 Discovery + KEIL + Windows 7
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

Я сам IARом пользуюсь. И примерно такой код у меня для LPC2103.
Только у LPC210x PLOCK это 10 бит, а у LPC23xx PLOCK это 26 бит.
Еще хочу уточнить. Разное написание условия приводит к различию в коде только при низкой оптимизации, при высокой сбалансированной оптимизации получается один и тот же короткий код. Конечно лучше писать понятный код используя имеющиеся определения и избегать "магических" чисел.
Аватара пользователя
Барсук
Открыл глаза
Сообщения: 64
Зарегистрирован: Сб апр 24, 2010 08:48:05
Откуда: Новосибирск

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

Сообщение Барсук »

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

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

const uint8_t* My_image [] PROGMEM ={
                                     gImage_usb,
                                     gImage_ok };

вопрос как вычислить размер массива допустим gImage_usb с помощью My_image
Я НЕ суслик, Я БАРСУК
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение 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
обясните пожалуйста в чем тут прикол :))
Tell Me The Truth
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

ведь 75/29=2.5862
.5862*29=17
75-29*2=17
А у Вас сколько получилось ?
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

у меня получилось .5862
ядумал что опрератор % вычисляет ОСТАТОК от деления...... 75 % 29=0.5862
а почему вы делаете так .5862*29=17 :dont_know:
Tell Me The Truth
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Срочно учить математику 5 :facepalm:
http://ru.wikipedia.org/wiki/%C4%E5%EB% ... 2%EA%EE%EC
Деление c остатком (деление по модулю, нахождение остатка от деления, остаток от деления) — арифметическая операция, результатом которой является два целых числа: неполное частное и остаток от деления целого числа на другое целое число.

Остаток - это то, что осталось неделимым. Т.е. 58 разделилось на 29, получилось 2. А 17 осталось неделимым...
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

FreshMan писал(а):у меня получилось .5862

Это дробная часть результата, а не остаток :facepalm:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

да понял я уже , понял...... :oops:
Tell Me The Truth
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

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

Конечно не будет совсем понятна. Я ведь только кусочек класса выложил. А именно, проблемное место. Фишка была в том, что я обращался к массиву и к его элементам через указатель и меня постоянно это беспокоило "Что-то не так, не надёжно это... если массив разбросается по памяти, то каюк.."
Проблему решил использованием класса CStringA. Во время дебага, я заметил, что массив почему-то стал фрагментироваться после приёма данных (наверное, идиоццкая реализация функции чтения с порта или где-то мой косяк :oops: ) С использованием CStringA, я отдал этот буфер на съедение компилятору. Вроде как, теперь всё работает корректно и мне стало проще разгребать все эти данные.
Ну и ещё одна проблема была в ошибочных настройках таймаутов по приёму данных и кривость программы в девайсе, который эти данные шлёт. По протоколу, пакеты должны были разделяться таймаутами не менее 10мс, а девайс слал разорванные пакеты с различными таймаутами и в итоге, эти пакеты не проходили на целостность. Напарнику пришлось ещё раз объяснить про работу протокола, вместе с ним изучить его прошивку и подправить его код.
Сейчас все проблемы решены. :)
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

можна ли записать данный код по компактней ?

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

if (mode==0) x++;
if(x>=5) x=0;
Tell Me The Truth
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

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

Сообщение AI_Disable »

FreshMan писал(а):можна ли записать данный код по компактней ?

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

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

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

Вернуться в «Разные вопросы по МК»