Главная страница
Навигация по странице:

  • ===================================== Справочник по программированию «Bascom-8051» ==

  • ===================================== Справочник по программированию «Bascom-8051» == 31. Ошибки и неприятности Bascom

  • ===================================== Справочник по программированию «Bascom-8051» == 32. Некоторые советы по созданию больших программ

  • Справочник по программировани BASCOM-8051 (М.Л. Кулиш, 2001). Справочник по программированию bascom8051 Краснодар 2001


    Скачать 6.61 Mb.
    НазваниеСправочник по программированию bascom8051 Краснодар 2001
    АнкорСправочник по программировани BASCOM-8051 (М.Л. Кулиш, 2001).pdf
    Дата26.04.2017
    Размер6.61 Mb.
    Формат файлаpdf
    Имя файлаСправочник по программировани BASCOM-8051 (М.Л. Кулиш, 2001).pdf
    ТипСправочник
    #5699
    КатегорияПромышленность. Энергетика
    страница22 из 25
    1   ...   17   18   19   20   21   22   23   24   25
    ===================================== Справочник по программированию «Bascom-8051» == б) на последовательный интерфейс (или другой) – при подаче неправильных или искаженных команд, загрузке неправильных данных, подаче слишком длинных сообщений, подаче команд с малым интервалом; в) на аналоговую часть устройства, управляемого процессором, - при подаче сигналов перегрузки, возникновении неисправности, разрыве обратной связи; г) при порче данных в энергонезависимой памяти; д) при нарушении протокола связи с другим процессором, при полном пропадании связи; е) при возникновении аварийных ситуаций (перегрев, переполнение, отключение питания).
    В результате практического тестирования определяются меры по улучшению работы программы
    (переназначение функций кнопок, коррекция текста сообщений, изменение формата выводимых данных, учет реальных временных соотношений, приспособление к форме имеющихся сигналов, учет динамических свойств регулируемых объектов). Все выявленные ошибки и упущения (уточнения) обязательно протоколируются (просто записываются в виде списка с указанием условий возникновения). Это необходимо ввиду обычного временного разрыва между операциями проверки (обнаружения ошибки) и коррекцией программы. После исправления программы тестируется снова, и так до тех пор, пока не будут достигнуты необходимые качества и надежность работы.
    При отладке программы все временные вставки обязательно выделяйте в тексте программы, чтобы не забыть убрать их в окончательной версии. После завершения отладки необходимо еще раз просмотреть текст программы, убрать все лишнее (метки, отладочные вставки, неудачные варианты операций) и дописать недостающие комментарии, Законченная программа сопровождается необходимыми атрибутами (номером версии) и архивируется (в том числе на резервном носителе).
    Теперь рассмотрим основные приемы, которые рекомендуется применять при отладки программ Bascom: а) применение циклической конструкции для проверки операции преобразования при множественном значении исходных данных. Данная конструкция удобна при отладке функциональных модулей.
    DO
    INPUT “Input value A” , _A
    INPUT “Input value B” , _B
    Это место отлаживаемой или проверяемой программы, использующей введенные значения
    PRINT “C=” ; _C ‘посмотреть результат
    LOOP б) применение цикла для отладки программы, воспроизводящей данные или сигналы, например, АЦП
    DO
    Это место отлаживаемой или проверяемой программы
    PRINT “C=” ; _C ‘печать результата операции
    ‘или, если имеется индикатор применять следующие строки
    CLS 'очистить LCD
    LCD C ‘вывести результат
    LOOP в) применение цикла с переменным параметром для отладки программы управления объектом, например,
    ЦАП.
    DO
    FOR V = 10 TO 100
    Это место отлаживаемой или проверяемой программы, зависимой от V
    NEXT
    LOOP г) установка аппаратного маркера для синхронизации осциллографа, применяемого для наблюдения за отлаживаемым процессом или формированием временной диаграммы.
    RESET P1.1 : SET P1.1 ‘формируем импульс синхронизации (запуска осциллографа)
    Это место отлаживаемой или проверяемой программы, формирующей временной процесс д) выключение или обход не нужных в данный момент участков программы. Для этого перед компиляцией ненужные участки делаются комментарием (символом “ ‘ “) или обходятся оператором GOTO метка; е) запуск программы естественным путем (с нулевого адреса) применяется, когда система уже построена и работает. Далее отлаживаются вновь добавленные фрагменты. После того, когда очередной фрагмент полностью проверен и выполняет необходимые действия, добавляется новый. Это самый удобный способ отладки программ потому, что ориентирован на получение конечного результата. Он не требует глубокого “копания” во внутренних регистрах процессора, а проверка работы программы ведется в условиях реального времени; ж) иммитация внешних событий установкой признаков этих событий и подстановкой соответствующих данных. Это программа воспринимает как появление настоящих данных и начинает процесс обработки, в составе которого и участвуют отлаживаемые фрагменты.
    =============================================================================
    30-2

    ===================================== Справочник по программированию «Bascom-8051» ==
    SET B_NEW_DATA : ADC_DATA = 4000 ‘так имитируем появление данных АЦП и) использования программы эмулятора терминала для отладки программ, взаимодействующих через
    COM-порт. Выбор текстового протокола связи с другими участниками интерфейса значительно облегчают задачу отладки. Для этого, достаточно обеспечить лишь аппаратное подключение отлаживаемого процессора с персональным компьютером. Легко отлаживать программы, действующие через последовательный порт, используя и симулятор-отладчик Bascom, имеющий встроенную функцию и программного, и аппаратного эмуляторов терминала. Если еще говорить о полезных функциях отладчика Bascom, нужно упомянуть о наличии программных эмуляторов символьного дисплея и EEPROM (модели AT89S8252), которые также существенно расширяют возможности отладки.
    Относительно использования аппаратных средств (эмуляторов) для отладки программ, созданных с помощью Bascom, можно сказать следующее: а) отсутствуют ограничения на использование выходных файлов (HEX- и BIN-форматов) Bascom в эмуляторах других типов (не упомянутых в списке, поддерживаемых средой Bascom); б) структура текста программы Bascom такова, что самым рациональным является режим отладки путем запуска программы с нулевого адреса. Это позволяет использовать даже самые простые эмуляторы; в) сложные эмуляторы, обеспечивающие просмотр содержимого внутренних регистров при отладке программ Bascom, напротив, неэффективны и избыточны, так как, все равно, не обеспечивают режим построчной отладки, ассемблерный листинг Bascom не выдает. К тому же, они обладают массой недостатков, главные из которых, невозможность работы на предельной тактовой частоте, небезупречная поддержка аппаратных функций процессора, генерация помех на линиях эмулируемых портов в пошаговом режиме, невозможность полноценной отладки программ для процессоров старших моделей, высокая стоимость и низкая надежность; г) для решения различных задач требуются и различные типы эмулятором, отличающиеся как по типу поддерживаемых процессоров, так и по составу используемых ресурсов. В одних случаях удобным оказывается наличие прямой связи портов TxD и RxD отлаживаемого процессора с COM-портом компьютера, в других случаях необходимо предоставить все ресурсы отлаживаемой программе или обеспечить возможность выполнения шинных операций (для сообщения с внешней памятью); д) вследствие того, что Bascom обеспечивает быстрое получение работающей программы, то он очень удобен при создании программ для самых современных моделей процессоров, выполняемых в плоских корпусах, присоединяемых только пайкой, имеющих внутреннюю Flash-память (электрически перепрограммируемую) и режимы внутрисхемной загрузки (по последовательному интерфейсу). Применять традиционные эмуляторы в таких случаях неудобно и их может заменить программирующий адаптер (трех- , четырех или пятипроводный).
    Однако, вследствие того, что процесс перепрограммирования небыстрый (занимает 15 - 30 секунд), то для отладки таких программ рекомендуется применять комплексный подход. При этом, вначале необходимо применять отладку независимых программных модулей другими способами и только на завершающей этапе переходить к отладке в процессоре в составе объекта. Схема устройства (повторяем еще), в которой используется перепрограммирование впаянного процессора, также должна быть приспособлена для этого.
    =============================================================================
    30-3

    ===================================== Справочник по программированию «Bascom-8051» ==
    31. Ошибки и неприятности Bascom
    1 Директивы $BAUD и $CRYSTAL активизируется только при использовании команд PRINT, INPUT.
    Внимание! Если в тексте программы не применяются операторы PRINT, INPUT, то инициализация не выполняется - в таймер не загружается значение коэффициента деления, не инициализируются регистры SCON и
    PCON (см. соотв. раздел).
    2 Внутри программной конструкции IF .. End If не допускается использование оператора Return:
    Правильно:
    Неправильно:
    If Tmp = 0 Then
    Goto Lcd_pe
    End If

    Lcd_pe: Return
    If Tmp = 0 Then
    Return
    End If

    При наличии записи Return происходит нарушение баланса стека и программа зависает. Компилятор сообщений о такой ошибке не дает.
    3 Функция Fusing работает правильно, если размер буфера, в который помещается отформатированное число (в формате с плавающей точкой), несколько больше, чем число знаков результата. По крайней мере, требуется длина буфера равная сумме: максимальное количество чисел целой части + максимальное количество чисел дробной части + десятичная точка + знак полярности (минус для отрицательных чисел). В примерах Bascom не зря рекомендуется применять буфер (символьную переменную) длиной 16 байт. В других случаях суммирования двух символьных переменных нужно использовать буфер длиной не менее суммы максимальной длины первой переменной + длина буфера, содержащего вторую переменную. Может быть это и не так – проверьте сами!
    4 При использовании функции Fusing нужно так строить программу, чтобы не приходилось выводить числа, которые не могут быть представлены в назначенном формате. Лучше если они будут не больше и не меньше чем нужно. Проверяйте, что будете преобразовывать и, как получается во всем диапазоне преобразуемых чисел. Применяйте директиву $NONAN.
    5 Другая неприятность функции Fusing заключается в том, что при отрицательной полярности преобразуемого числа знак минус входит в результат форматирования, таким образом, одно и тоже значение положительной и отрицательной полярности выглядит по разному. Существует два способа борьбы с этим явлением: либо делать все числа на входе в преобразование положительными, а знак обрабатывать отдельно, или применять различные форматы для чисел разной полярности (для отрицательных чисел на один знак слева больше).
    6 Еще одна неприятность функции Fusing связана с тем, что лишние нули слева отбрасываются (вместо значения “003.45” при маске “###.##” мы получаем “3.45”). Бороться с этим можно только, контролируя длину результата и дописывая недостающие нули. В обновленной версии (1.0.0.19 и старше) этот недостаток исправлен введением дополнительных лидирующих нулей. Добавлена функция округления.
    7 При сборке символьной переменной из нескольких частей возможен случай, когда, принимающая данные переменная, будет перекрыта по длине и следующая за ней переменная будет испорчена. Это происходит потому, что программа копирует не содержимое переменной источника, которое не столь велико, как вы рассчитываете, а всю переменную, такой длины, как она была объявлена. Бороться с этим можно только увеличением длины переменной, принимающей символьные данные. Необходимую степень запаса по длине можно определить, наблюдая в отладчике за количеством испорченных ячеек. При этом, нужно иметь в виду, что при выводе длина символьного значения числовой переменной может меняться в значительных пределах (зависит от значения преобразуемого числа). Также нужно учитывать, что длина внутреннего буфера Bascom, в котором формируется символьное значение числа, может достигать 16 при выводе значения переменной типа Single. Если за принимающей данные переменной располагается стек, то неизбежен фатальный результат этой ошибки компилятора.
    8
    Длина строки исходного текста программы не должна превышать 255 символов, а реально получается даже меньше. Попытки превзойти ее приводят к фатальному сбою компилятора. Более того, это не дает возможность записать в одну строку некоторые необходимые вещи. Например, вывод текстового сообщения без символов ВК ПС:
    =============================================================================
    31-1

    ===================================== Справочник по программированию «Bascom-8051» ==
    Printbin &H42 ; &H41 ; &H42 ; &H43 ; &H44 ; &H45 ; &H46 … ; &H4A ; &H4B
    Или формирование длинной строковой переменной:
    Out_buf = "S" + Str(rang) + "L" +Str(udac) + "T" … + Chr(13) + Chr(10)
    9
    Выполняя операцию вычисления (очевидно, какие-то другие тоже), можно назначить в качестве приемника данных любой регистр (любую переменную). Однако если длина приемника не совпадает с длиной результата, могут возникнуть неприятности. Например, операция, дающая двухбайтовый результат, будучи записана в переменную типа Long, модифицирует только два младший байта, а старшие разряды останутся без изменения. Ниже приведено два примера, дающие различные результаты. В первом примере имеется очевидная ошибка, которую компилятор не обнаруживает, и, наверно, не должен обнаруживать.
    Dim Byt As Byte, Byt1 As Byte, Wrd As Word , Wrd1 As Word , Lng As Long
    Byt = 10 : Byt1 = 15 : Wrd = &H1234 'назначим числа
    Wrd = Byt * Byt1 'произведение запишем в двухбайтное число
    Printhex Wrd 'результат Wrd = 1296h - только в младших разрядах
    Wrd = 16 : Wrd1 = 32 : Lng = &h12345678
    Lng = Wrd * Wrd1 'произведение запишем в четырехбайтное число
    Printhex Lng 'результат Lng = 12340200h – снова в младших разрядах
    Во втором примере получаем правильный результат за счет приема результата операции в регистр, длина которого соответствует длине выдаваемых данных, и добавлении операции преобразования переменных.
    Byt = 10 : Byt1 = 15 : Wrd = &H1234 'назначим числа
    Byt = Byt * Byt1 'произведение запишем в однобайтное число
    Wrd = Byt : Printhex Wrd 'результат Wrd = 0096h - правильный
    Wrd = 16 : Wrd1 = 32 : Lng = &h12345678
    Wrd = Wrd * Wrd1 'произведение запишем в двухбайтное число
    Printhex Lng 'результат Lng = 00000200h – снова правильно
    Тем не менее, даже это, безусловно, вредное явление можно иногда использовать и с пользой.
    10
    Длина результата арифметических операций Bascom равна длине операндов (если они одного типа), что очень неудобно при необходимости выполнения операций целочисленного умножения, например, 16 на 16 разрядов, когда желательно получить 32-разрядный результат. Чтобы получить полноценный результат (32 разряда), приходится умножение выполнять в 32-разрядных регистрах (переменных). В итоге, время вычисления произведения увеличивается в десятки раз. Можно применять несколько облегченный вариант – использовать, хотя бы один операнда, равный по длине требуемому результату, как в приведенном ниже примере.
    Wrd = 50 : Lng = 2000 'один из операндов возмем четырехбайтным
    L ng = Wrd * Lng 'произведение запишем в четырехбайтное число
    Printhex Lng 'результат Lng = 100000 11
    Не все операторы Bascom могут работать с индексированными переменными, определенными как элементы массива. При этом компилятор не выдает никаких сообщений. Собственно говоря, операторы работают, но только с первым элементом, адрес которого совпадает с адресом массива. Чтобы обеспечить возможность работы с любым элементом массива следует применять промежуточный буфер, куда выгружать данные из массива перед обработкой или помещать после обработки и перед записью в массив. Например, оператор SWAP
    Ar(1), Ar(3) работает неправильно, поэтому вместо него следует записывать строку из трех операторов: Temp =
    Ar(1) : Ar(1) = Ar(3) : Ar(3) = Temp. Подобное решение, на самом деле, не увеличивает размер получаемого кода, т.к. внутри операторов, работающих с массивами, делают аналогичные пересылки.
    12
    В секции, определеной оператором DATA, константы (числа) и символьные значения адресов (метки) невозможно записать в виде символического имени. Нужно записывать только цифры. Главная неприятность этого заключается в том, что компилятор не дает сообщения об ошибке, а вместо ожидаемых значений записывает нули.
    13 Имеется ошибка в библиотеке оператора LOOKUP при считывании четырехбайтного числа из таблицы. Как только индекс (смещение по таблице) превышает 63(3FH), начинается проявляться ошибка (неверно вычисляется адрес расположения константы из-за того, что умножение смещения на четыре делается неправильно). В Последних версиях похоже устранено.
    =============================================================================
    31-2

    ===================================== Справочник по программированию «Bascom-8051» ==
    14 Символ двоеточия (“ : ”) недопустим в комментариях. Если такое случается, компилятор дает сообщения о несуществующих ошибках и начинает искать метки с символами, расположенными в одной строке до знака двоеточия. А также символы ”<”, “>” и ключевые слова, обозначающие некоторые логические операции.
    Справедливости ради нужно сказать, что в последних версиях (начиная с 1.20) ошибок стало намного меньше, а фатальных незамечено вообще.
    =============================================================================
    31-3

    ===================================== Справочник по программированию «Bascom-8051» ==
    32. Некоторые советы по созданию больших программ
    Как любой язык высокого уровня, Bascom ориентирован на получение как можно больше действий в исполняемом коде при минимальном объеме исходного текста. И на самом деле, Bascom является подходящим инструментом для создания больших программ. Теперь определим понятие «большая программа». Таковой следует считать программу, использующую большое количество ресурсов (памяти, встроенной и внешней периферии), работающей с большим количеством программных и физических объектов, имеющей несколько независимых состояний или функций и выполняющая множество действий. Большая программа, как правило, отличается размером кода, не помещающегося в память команд стандартных моделей микроконтроллеров (8051 и
    8052). Ниже будут приведены советы по созданию оптимального кода «больших программ», оптимального с точки зрения экономии ресурсом микроконтроллера. Эти советы будут не менее полезны и при разработке кода для «маленьких» процессоров, например AT89C2051.
    Приблизительный размер кода можно определить по объему исходного текста. Начиная с третьего- четвертого килобайта каждые 50 строк исходного текста (около 70 операторов), не считая пустых строк и строк с метками и комментариями, дают один килобайт исполняемого кода.
    1   ...   17   18   19   20   21   22   23   24   25


    написать администратору сайта