Mr.Denis писал(а):Подскажите как понимать эту конструкцию:
while (!( SCS &0x00000040));
Если я правильно понимаю, то цикл висит до тех пор пока в регистре scs этот бит не будет равен 1?
да, цикл ожидания установки бита в регистре
Mr.Denis писал(а):И еще не совсем понятно как работает вот эта конструкция:
while( PLLSTAT & 0x000);
если PLLSTAT не объявлено как volatile, то вероятнее всего эта строчка будет выброшена компилятором за ненадобностью. в противном случае будет тупое обращение на чтение к регистру PLLSTAT - никакого цикла не будет.
битва с дураками проиграна, победители торжествуют. слава победителям!
DX168B писал(а):
Сразу скажу, что конструкция не работала. Почему, уже разобрался сам.
Спасибо за "помощь".....
Да не за что
Сам разобрался, значит помощь была не нужна
А если серьезно то я вообще даже не увидел где у вас там в коде объявление массива buff[32]
Хотя нет сейчас увидел, но конструкция вашего объявления shunt мне непонятна.
Ребята спасибо за ответы!)))
Скажите, если переделать условия так: while(!(PLLSTAT & 0x000));
Тогда получается что цыкал висит до тех пор пока не будет равен 0?
А что ждет эта конструкция: while(!PLLSTAT_bit.PLOCK);
Везит в цикле пока бит PLLSTAT_bit.PLOCK не станет 1?
Мои извинения за оффтоп.
Читаю некоторые посты и диву даюсь. Неужели вопрошающие здесь когда-то посещали школу?
Бывают, безусловно у людей ошибки, но не до такой же степени....
И это в теме, где изучают языки! А своего родного знать не обязательно?
Комментировать не нужно, отвечать тоже, нет вопросов.
Примите этот пост как крик души. Глаза режет подобная безграмотность.
Еще раз извините...
А если записать вот так:
while(!(PLLSTAT & 0x02000000));
По идеи получается тоже самое что и while(!PLLSTAT_bit.PLOCK); PLOCK это 26 бит.
То есть что первое, что и второе условия ждут 1(единицу). Правильно?
Я сам IARом пользуюсь. И примерно такой код у меня для LPC2103.
Только у LPC210x PLOCK это 10 бит, а у LPC23xx PLOCK это 26 бит.
Еще хочу уточнить. Разное написание условия приводит к различию в коде только при низкой оптимизации, при высокой сбалансированной оптимизации получается один и тот же короткий код. Конечно лучше писать понятный код используя имеющиеся определения и избегать "магических" чисел.
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
обясните пожалуйста в чем тут прикол
Деление c остатком (деление по модулю, нахождение остатка от деления, остаток от деления) — арифметическая операция, результатом которой является два целых числа: неполное частное и остаток от деления целого числа на другое целое число.
Остаток - это то, что осталось неделимым. Т.е. 58 разделилось на 29, получилось 2. А 17 осталось неделимым...
vitalik_1984 писал(а):
Сам разобрался, значит помощь была не нужна
А если серьезно то я вообще даже не увидел где у вас там в коде объявление массива buff[32]
Хотя нет сейчас увидел, но конструкция вашего объявления shunt мне непонятна.
Конечно не будет совсем понятна. Я ведь только кусочек класса выложил. А именно, проблемное место. Фишка была в том, что я обращался к массиву и к его элементам через указатель и меня постоянно это беспокоило "Что-то не так, не надёжно это... если массив разбросается по памяти, то каюк.."
Проблему решил использованием класса CStringA. Во время дебага, я заметил, что массив почему-то стал фрагментироваться после приёма данных (наверное, идиоццкая реализация функции чтения с порта или где-то мой косяк ) С использованием CStringA, я отдал этот буфер на съедение компилятору. Вроде как, теперь всё работает корректно и мне стало проще разгребать все эти данные.
Ну и ещё одна проблема была в ошибочных настройках таймаутов по приёму данных и кривость программы в девайсе, который эти данные шлёт. По протоколу, пакеты должны были разделяться таймаутами не менее 10мс, а девайс слал разорванные пакеты с различными таймаутами и в итоге, эти пакеты не проходили на целостность. Напарнику пришлось ещё раз объяснить про работу протокола, вместе с ним изучить его прошивку и подправить его код.
Сейчас все проблемы решены.
I am DX168B and this is my favourite forum on internet!