Справочник по программировани BASCOM-8051 (М.Л. Кулиш, 2001). Справочник по программированию bascom8051 Краснодар 2001
Скачать 6.61 Mb.
|
===================================== Справочник по программированию «Bascom-8051» == Dim K1 As Const 4 'с плавающей точкой Dim K2 As Const 8 'определим их Dim K3 As Const 12 'расположение в EEPROM Dim K4 As Const 16 'каждая константа занимает Dim K5 As Const 20 'по 4 байта Dim K6 As Const 24 Dim K7 As Const 28 Dim End_dae As Const 31 'последний адрес блока констант Dim Csum As Const 32 'регистр контрольной суммы Dim End_eep As Const 32 'последний адрес всего блока Dim N_cs As Const A5 'нормальное значение контрольной суммы 'необходимые переменные Dim Nm As Byte , Tmp As Byte , Sum As Byte , Sng As Single 'запишем блок данных в EEPROM иэ таблицы For Nm = 0 To 7 Sng = Lookup(nm , Dvs) : Tmp = Lookup(nm , Dva) 'данные и адрес Writeeeprom Sng , Tmp Next 'вычислим контрольную сумму блока констант Sum = 0 For Nm = 0 To End_dae 'суммируем значение каждого байта блока данных Readeeprom Tmp , Nm : Sum = Sum + Tmp Next Sum = N_cs - Sum 'вычислим дополнение до нормального значения Writeeeprom Sum , Csum 'запишем дополнение 'перед считыванием данных проверим исправность всего записанного блока Sum = 0 'вычислим контрольную сумму всего блока For Nm = 0 To End_eep Readeeprom Tmp , Nm : Sum = Sum + Tmp Next If Sum <> N_cs Then 'проверим: совпадает с нормальным значением? Print "Error EEPROM!" 'если нет, как-то проиндицируем End If 'посмотрим, что получилось For Nm = 0 To 7 Tmp = Lookup(nm , Dva) : Readeeprom Sng , Tmp Print Tmp ; "-" ; Nm ; "-" ; Sng Next 'таблица адресов констант Dva: 'Data K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 'так компилятор не понимает Data 0 , 4 , 8 , 12 , 16 , 20 , 24 , 28 'нужно записывать только цифры 'таблица инициализируемых значений Dvs: Data 1.1! , 1.2! , 1.3! , 1.4! , 1.5! , 1.6! , 1.7! , 1.8! Необходимость применения средств защиты сохраняемых данных бесспорна, т.к. вероятность повреждения одного байта EEPROM без принятия аппаратных средств достаточно велика и составляет около 0.000001 (в сумме - 0.002 для EEPROM емкостью 2 Кбайта). Применение аппаратных средств снижает вероятность сбоев на три-четыре порядка. Однако, они не исключаются совсем, например, при выключении питания в момент записи. Для защиты от сбоев следует применять и программные средства защиты данных. Очень эффективным средством защиты данных является применение двух дублирующих блоков данных. Использование больше двух дублирующих блоков не имеет практического смысла, т.к. вероятность выхода из строя микросхемы с записанными данными выше, чем у продублированных данных (далее нужно дублировать микросхемы памяти). Двойное дублирование блоков данных широко применяется в измерительной технике для хранения калибровочных коэффициентов, и показало исключительную надежность. Перечислим основные моменты организации дублированной энергонезависимой памяти: а) оба блока должны быть одинаковыми и содержать собственные регистры контрольной суммы; б) запись данных в блоки производится последовательно - вначале данные и контрольная сумма в один блок, а потом другой. Причем, после записи первого блока делается пауза, на время не меньше чем время разряда конденсаторов в цепи питания микроконтроллера. Последнее исключает повреждение обоих блоком при выключении питания в момент их модификации; в) при считывании данные берутся из блока с правильной контрольной суммой; г) при необходимости неисправный блок может быть восстановлен. ============================================================================= 28-2 ===================================== Справочник по программированию «Bascom-8051» == И последнее, для устройств с повышенными требованиями к надежности хранения данных следует применять внешнюю энергонезависимую память, как и при использовании микроконтроллеров других типов (не имеющих EEPROM). Наиболее удобны для этого микросхемы с последовательным доступом серий 24Cxx или 93Cxx, имеющие соответственно I2C- и SPI-интерфейсы, средства для работы с которыми, в Bascom также доступны. ============================================================================= 28-3 ===================================== Справочник по программированию «Bascom-8051» == 29. Стиль надежного программирования с помощью Bascom При программировании рекомендуется использовать простые и надежные программные конструкции, т.к. в сложных конструкциях, при экзотическом сочетании типов переменных, имеется большая вероятность совершить собственную ошибку или получить ошибку при компиляции. Последнее обусловлено возможностью ошибок в редко применяемых, а следовательно и мало проверенных операторах или сочетаниях параметров. Кроме того, работу часто употребляемых операторов легче представлять и проще не допускать ошибок. Всегда нужно помнить, что отсутствие ошибок при компиляции не является признаком безошибочной и работоспособной программы. Это лишь признак отсутствия грубых ошибок. Безошибочная компиляция всего лишь означает: а) все операторы записаны правильно и содержат все необходимые параметры; б) все используемые переменные определены; в) найдены все метки, на которые имеются ссылки; г) согласованно применены парные операторы. В скомпилированной программе могут оставаться различные ошибки программиста. Перечислим основные: а) логические ошибки, неправильное представление о взаимодействии частей программы, в результате, наличие временных или аппаратные конфликтов периферии и т.п.; б) механические ошибки - пропуск операторов или наличие лишних операторов; б) неверная запись числового значения, имени (номера) линии порта; в) неверное определение модели процессора или других параметров настройки компилятора; г) неправильная инициализация системы прерывания; д) несбалансированность стека; е) отсутствие инициализации переменных при запуске программы, обеспечивающей нормальное вхождение в стационарный режим работы; ж) неправильное понимание или применение операторов Bascom. Могут также иметь место ошибки компилятора: а) внутренние ошибки библиотеки компилятора, причем ошибки не явные, а обусловленные неблагоприятным сочетанием каких-то параметров или операторов. Однако, считать, что неправильная работа программы, есть следствие неверной компиляции нужно в последнюю очередь; б) применения оператора с параметрами (переменными), не соответствующими размерности результата. Компилятор часто не определяет это как ошибку. Наиболее фатальный характер для работы программы имеет превышение длины переменных. В некоторых случаях неверная строка текста программы вообще не компилируется без всякого сообщения; в) неудобная (или неудачная) реализация некоторых операторов Bascom, не позволяющая выполнять одни и те же операции в основной программе и в прерывании. Имеются в виду операторы, использующие регистры, не сохраняемые в прерываниях. Стиль программирования программы средствами Bascom практически полностью соответствует программированию на ассемблере, т.е. все исполняется строго в порядке записи операторов. Внутреннее содержание библиотек Bascom также соответствует привычной организации программ, написанных на ассемблере. В результате, получаемый скомпилированный код по содержанию, практически, такой же, как при программировании на ассемблере. При тщательной оптимизации программы, полученные с помощью Bascom, имеют размер и время исполнения близкое к ассемблерной. Имеющаяся при этом избыточность обусловлена тем, что компилятор Bascom почти все операции выполняет в своих внутренних регистрах и занимает дополнительные ресурсы на их загрузку и выгрузку. Чтобы добиться более компактного кода, необходимо принимать ряд мер, многие из которых применимы и к программам, написанным на любом языке программирования. Перечислим эти меры: а) повторяющиеся участки программы необходимо оформлять в виде подпрограмм. Похожие подпрограммы также стараться объединять, реализуя различия между ними созданием разных точек входа или выхода; б) сокращать количество используемых в программе операторов и функций. Это уменьшит размер библиотеки (набора подпрограмм), подключаемой к исполняемому коду; в) сокращать количество и длину текстовых сообщений; г) стараться не применять операции сравнения текстовых строк. Лучше построить программу на других принципах управления алгоритмом; д) применять табличные методы считывания и загрузки с помощью операторов LOOKUP и LOOKUPSTR; е) применять табличные методы передачи управления, действующих в зависимости от значения параметра, с помощью операторов выбора SELECT CASE x или ON x GOTO (GOSUB), и меньше использовать операторы проверки условий (IF … THEN …); ж) применять ассемблерные вставки там, где они обеспечивают очевидный выигрыш; ============================================================================= 29-1 ===================================== Справочник по программированию «Bascom-8051» == и) использовать в сложных программных конструкциях (циклах и проверки условий) короткие переменные (одно- и двухбайтные); к) применять возможно более простые программные конструкции. Лучше две простых вместо одной сложной. Количество используемых в программе переменных также входит в понятие стиля надежного программирования. Всегда нужно стремиться к их сокращению потому, что когда переменных становится слишком много, то, все равно, приходится идти на усложнение программы для экономии пространства оперативной памяти. Очень хорошие результаты дает прием использования для хранения промежуточных результатов специальных переменных (локальных). Во всех примерах, показанных здесь, этот прием используется. Bascom предлагает средства определения и стирания (оператором ERASE) временных (локальных) переменных. Однако этой возможностью лучше не пользоваться, т.к. эффективность ее невысока. Компилятор устанавливает указатель стека сразу на максимальное значение, освобождая место и тем переменным, которые будут определены позже. После уничтожения временных переменных указатель стека не возвращается компилятором ниже (да и не имеет права этого делать). Таким образом, делать переопределение переменных в программе больше одного-двух раз практически не удастся. Единственная польза от такого переопределения переменных состоит только в возможности изменения распределения зарезервированного пространства между переменными разного типа. Минимальное время исполнения программы и объем полученного кода совершенно мало зависит от краткости записи операций. В большей степени это функция размерности используемых переменных и сложности совершаемых действий. Bascom позволяет достаточно широко варьировать операторами для достижения одного и того же результата. Этим обязательно нужно пользоваться, оптимизируя программу по времени исполнения или размеру исполняемого кода. Структура программы должна базироваться на функционально законченных блоках или модулях, неважно как оформленных (процедурах, программах и подпрограммах) и содержащих не более 50 операторов. Каждый блок или функциональный модуль должен выполнять одно сложное действие, и быть, легко обозримым, быстро понимаемым и хорошо откомментированным. Функциональный блок должен использовать и передавать для дальнейшей обработки минимальное количество данных, в как можно более компактном и стандартном виде. Собственно говоря, место в программе, где данные имеют осмысленный вид или наиболее удобны для передачи, и является естественным местом разделения на функциональные модули. Еще один признак функционального блока - один вход и один выход. Для управления работой программы (изменения естественного хода выполнения операторов) достаточно и следует использовать только семь конструкций: а) переход к метке (оператор GOTO); б) вызов процедуры или подпрограммы (операторы CALL, GOSUB); в) неполную альтернативу (конструкция IF … THEN … ) с пропуском участка программа и полную - с выбором одного из двух действий (IF … THEN … ELSE / IFELSE … ); г) множественное ветвление (с помощью конструкций SELECT CASE … или ON … GOTO или ON … GOSUB); д) цикл «ПОКА» (конструкция WHILE … WEND); е) цикл «ДО» (конструкция DO … LOOP UNTIL …); ж) цикл с изменяемым параметром (FOR … TO/DOWNTO … NEXT). Функционально структурированной программа выполняется не для улучшения ее работы или оптимизации производительности – это, в большей степени, метод организации и оптимизации процесса программирования. Ведь очевидно, что если убрать комментарии и лишние команды CALL и RET, структурированная программа будет мало отличаться от неструктурированной. Модули структурированной программы впоследствии могут использоваться в других программы неоднократно, в готовом виде или с небольшими доработками. Метод структурного программирования сокращает сроки получения программного продукта за счет накопление программного задела, обеспечивает создание больших и очень больших программ с разделением задач между несколькими исполнителями. Таким образом, применение метода структурного программирования положительно сказывается на качестве и надежности создаваемых программ, т.к. дает возможность быстрее выявлять ошибки и использовать лучшие готовые решения. Структурирование программы это и метод программирования и способ форматирования текста программы. При создании функционального программного элемента добиваются его независимости и законченности, а при оформлении текста программы используют приемы разделения функциональных элементов, например, с помощью отступов строк от левого края листа. Применяются и элементы вертикального разделения. Несмотря на то, что Бейсик допускает записывать несколько операторов в одной строке, операторы разных функциональных элементов нужно располагать в отдельных строках. ============================================================================= 29-2 ===================================== Справочник по программированию «Bascom-8051» == 30. Отладка программ Bascom Способ отладки программ Bascom, в принципе, мало отличается от методов отладки программ, написанных другим способом. Чтобы отладка программы быля успешной и эффективной, нужно на этапе проектирования устройства с микроконтроллером заложить в его схему некоторую избыточность, которая позволит потом осуществить этот процесс. В число мер, обеспечивающих процесс отладки, входят: а) возможность электрического подключения эмулятора; б) программная совместимость применяемой модели процессора с имеющимеся симулятором или эмулятором; в) соместимость файлов данных, выдаваемых компилятором, и понимаемых средствами программной или аппаратной отладки; г) наличие в схеме проектируемого устройства элементов для внутрисхемного программирования микроконтроллеров с корпусах, которые могут только впаиваться (SOIC, TQFP и т.п.). Можно рекомендовать определеный порядок отладки программ, обусловленный особенностями Bascom. Отладка может и должна начинаться после написания первых строк программы. Bascom дает такую возможность, генерируя работоспособный код, практически, для любых логически незавершенных фрагментов. Рекомендуемый порядок написания и отладки программы выглядит следующим образом: а) вначале пишутся и отлаживаются отдельные самые важные, для разрабатываемой программы, фрагменты функциональной обработки данных. Это относится к вычислительным программам или программам обработки данных, использующих значительные ресурсы. Для отладки этих программ лучше использовать построчный отладчик Bascom. При отладке в текст можно и нужно встраивать временные операторы задания начальных условий и вывода промежуточных результатов, пробовать применять различные варианты реализации алгоритма работы. На этом этапе лучше всего применять дисассемблирование полученного кода для определения оптимальности работы отдельных операторов или функций, и объема, используемых ими регистров. Последнее особенно важно при программировании, например, прерываний. После достижения желаемых результатов анализируется объем использованных ресурсов памяти, время исполнения (отладчик показывает его) и принимается решение об использовании отлаженного фрагмента в основной программе; б) построить скелет программы, содержащий конфигурирование всех внутренних и внешних устройств процессора, системы прерывания, систем ввода-вывода и отображения данных. Функциональное наполнение программы на этом этапе должно быть минимальным. Используя аппаратный отладчик или эмулятор (в программном симуляторе это вряд ли удастся), оживите скелет программы. Должны заработать все таймеры и прерывания, которые в дальнейшем планируется использовать. Подключение аппаратных ресурсов, по мере отладки программы, также может быть поэтапным. Для облегчения отладки на данном этапе, временно добавляйте в программу операторы задания начальных условий и выдачи каких-либо сигналов (синхронизации или “маркеров”), сопровождающих работу аппаратных устройств. При необходимости в программу также временно добавляются операторы, обеспечивающие работу отладочного процессора (если он отличается от рабочего). Только убедившись, что система работает нормально и все подключенные к процессору устройства функционируют так, как требуется, приступайте к следующему этапу; в) постепенно начинайте заполнять скелет программы функциональными модулями, отлаженными на первом этапе, и другими, не столь принципиальными. Проверка работы программы должна проводится каждый раз при введении в действие новой функции, чтобы ошибки не накапливались и можно было точнее определить момент появления ошибки. Первыми вводятся и отлаживаются программные модули, взаимодействующие с наибольшим количеством других программных модулей (или наиболее используемые), например, индикации, клавиатуры, последовательного интерфейса, интерфейсов АЦП и ЦАП. На данном этапе очень важно так, организовать работу и строить структуру программы, чтобы к отлаженным частям программы уже не возвращаться (это тоже элемент структурного программирования). Данный этап разработки программы можно считать законченным, когда все устройства функционируют правильно и обеспечивается работа конвейра передачи данных; г) следующий этап отладки - добавление в программу операций глубокой обработки данных, например, цифровой калибровки, сохранение и восстановление данных в EEPROM. Чаще всего, именно на данном этапе обнаруживается, что внутренние ресурсы процессора исчерпаны и необходимо принимать меры по более рациональному их использованию; д) последними отлаживаются (добавляются к отлаживаемой программе) программные модули, обеспечивающие сервисные функции (дополнительная обработка, дополнительный интерфейс, утилиты тестирования и настройки аналоговой части и т.п.). Полностью отлаженная программа программируется в память процессора и проверяется уже реальном устройстве. Этот этап отладки позволяет выявить ошибки, обусловленнные неполным представлением о работе устройства в целом, имеющимся в начале работы. Особое внимание при проверке следует уделить поведения программы при неправильных воздействиях и возможных неисправностях: а) на клавиатуру – при нажатии неправильных комбинаций кнопок, одновременном нажатии кнопок, длительном удержании нажатой кнопки, ввод нереальных значений и режимов; ============================================================================= 30-1 |