Микроконтроллеры | Ликбез по С для микроконтроллеров PIC |
|
---|---|---|
Тело цикла можно бы переписать вот так: ... Дело в том, что при операциях "по месту" (типа |=, >>= и т.д.) компилятор обязан сгенерировать код таким образом, чтобы после окончания выполнения каждого такого оператора в gCRCPIC оказалось то, что требуется по смыслу операции. Это, как минимум, три лишних movwf CRCPIC. Если выбран достаточно высокий уровень оптимизации кода, компилятор, не исключено, что эти лишние команды выкинет, но это далеко не факт. Конструкция ... & 0x01 вместо bit_test более универсальна, хотя код будет немножко длиннее (что, впрочем, тоже не факт - AVR GCC, например, такие ситуации легко распознает, и заменяет их на команды проверки бита). Условие цикла можно было бы переписать вот так: ... В этом случае может оказаться, что компилятор не будет явно проверять результат на равенство нулю, а сразу после вычитания воспользуется битами регистра состояния (впрочем, это тоже не факт). Я бы переписал весь этот кусок вот в таком виде: for (iCounter = 8; iCounter--; lDATABYTE >>= 1) Код, может быть, получился бы не самый оптимальный, но был бы более логичен - циклы while традиционно применяют тогда, когда момент окончания цикла достаточно непредсказуем, а в нашей-то ситуации он всегда выполняется ровно 8 раз Впрочем, близко к сердцу сказанное не принимайте - кто-нибудь другой запишет этот кусок совсем по-третьему, и также найдет убедительные аргументы в обоснование своего выбора В программировании правильны любые способы, кроме неправильных |
|
|
Спасибо за инфу, буду размышлять дальше... Генерируемый компилятором ассемблерный листинг я внимательно просматриваю и по возможности использую для оптимизации своего кода на С. Попробую разные варианты, сравню. Тем временем здесь ещё что-либо подскажут, надеюсь. |
|
|
picmaniac Смею предположить, что 99% опытных программистов на Си написали бы код, идентичный предложенному выше chav1961. Хорошие современные компиляторы настолько хитры, что попытка их перехитрить, часто кончается прямо противоположным ожидаемому результатом (хотя это скорее "большим" компьютерам относится, многие "микроконтроллерные" компиляторы весьма убогие). Ещё совет -- не злоупотребляйте глобальными переменными, это значительно усложняет восприятие программы. |
|
|
caddr: Неблагодарное занятие это ... оглядываться на ассемблерный листинг -- весь смысл использования высокоуровневых языков пропадает Всё равно полезно посмотреть. Не оглядываться, а посмотреть и принять к сведению. А то поначалу явные ляпсусы у меня бывают, которые для любого компилятора можно лучше сделать, и в листинге я их вижу. Да и интересно к тому ж. Я уже несколько интересных заметок для себя сделал. А объявить функцию как unsigned char мысль была, но так мне показалось лучше на этом этапе. Тут я ещё подумаю. |
|
|
Прошу небольшого совета. Есть некая функция: Сама подпрограмма делает следующее: проверяет установлен ли нужный байт и в положительном случае устанавливает максимальную яркость (переменная=255) или "нулевая" яркость (переменная=0). |
|
|
Сергей К Разберитесь с двумя вещами: PS. Запись двоичных чисел в виде 0b является отклонением от стандарта языка Си (не всеми компиляторами поддерживается). |
|
|
Сергей, к сказанному caddr можно только добавить, что опция #opt Вам бы и не помогла. Дело в том, что в условии if-ов есть константные выражения (в двух первых фактически ...&& TRUE, а в остальных - фактически ...&& FALSE). Если хочется,чтобы if-ы остались, надо отключать не уровень оптимизации, а вычисление булевых выражений по "короткой" схеме |
|
|
Спасибо! Разобрался и исправил обе ошибки! Все заработало! |
|
|
Подскажите пожалуйста кто в курсе! Установил последние версии PIC C и MPLABa, все прекрасно, но Хотелось бы понять как отлаживать код в редакторе PIC C если это возможно. И как активировать нормальную отладку в MPLAB. |
|
|
|
||
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2024 |