Страница 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
Вообще-то именно так и должно быть, ждать пока 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
Так даже лучше. По крайней мере 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
ведь 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

Re: Вопросы по С/С++ (СИ)
Добавлено: Вт апр 17, 2012 20:31:54
Аlex
Срочно учить математику 5
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
Это дробная часть результата, а не остаток

Re: Вопросы по С/С++ (СИ)
Добавлено: Ср апр 18, 2012 16:57:12
FreshMan
да понял я уже , понял......

Re: Вопросы по С/С++ (СИ)
Добавлено: Чт апр 19, 2012 12:36:53
DX168B
vitalik_1984 писал(а):
Сам разобрался, значит помощь была не нужна

А если серьезно то я вообще даже не увидел где у вас там в коде объявление массива buff[32]
Хотя нет сейчас увидел, но конструкция вашего объявления shunt мне непонятна.
Конечно не будет совсем понятна. Я ведь только кусочек класса выложил. А именно, проблемное место. Фишка была в том, что я обращался к массиву и к его элементам через указатель и меня постоянно это беспокоило "Что-то не так, не надёжно это... если массив разбросается по памяти, то каюк.."
Проблему решил использованием класса CStringA. Во время дебага, я заметил, что массив почему-то стал фрагментироваться после приёма данных (наверное, идиоццкая реализация функции чтения с порта или где-то мой косяк

) С использованием CStringA, я отдал этот буфер на съедение компилятору. Вроде как, теперь всё работает корректно и мне стало проще разгребать все эти данные.
Ну и ещё одна проблема была в ошибочных настройках таймаутов по приёму данных и кривость программы в девайсе, который эти данные шлёт. По протоколу, пакеты должны были разделяться таймаутами не менее 10мс, а девайс слал разорванные пакеты с различными таймаутами и в итоге, эти пакеты не проходили на целостность. Напарнику пришлось ещё раз объяснить про работу протокола, вместе с ним изучить его прошивку и подправить его код.
Сейчас все проблемы решены.

Re: Вопросы по С/С++ (СИ)
Добавлено: Чт апр 19, 2012 17:19:41
FreshMan
можна ли записать данный код по компактней ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт апр 19, 2012 17:25:07
AI_Disable
FreshMan писал(а):можна ли записать данный код по компактней ?
Да
if(!mode && ++x>=5) x=0;
Прим. При условии, что это единственное место, где изменяется x