Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Математическая логика и теория алгоритмов. Анализ алгоритмов

.pdf
Скачиваний:
3
Добавлен:
12.11.2023
Размер:
8.87 Mб
Скачать

int main()

Ввод символа, вычисление

{

функций переходов и выходов,

 

перевод в новое внутренне

do

состояние и выдача выходных

{scanf("%x",&x);//input console symbol

сигналов

printf ("x=%0x\n",x);//print of the console

 

symbol

 

{

//y=0xc;

x=y|x;//get new input vector with memory printf ("x=0x%x\n",x);

int idx = 0;

for (idx=0;idx<24;idx++)

{

if(A[idx].A1==0)//condition of the massive end break;

T=x&A[idx].A1;//masc of variables T=T^A[idx].A2;//masc of not inverse variables if(T==0)//condition of the product term truth

{

z=z|A[idx].A3;//output vector

printf ("z (%d)=0x%x\n",idx,z);//print output vector

//y=z&0xc;// set new state

//printf ("y (%d)=0x%x\n",idx,y);//print new state

//break;

}

}

y=z&0xc;// set new state

printf ("y (%d)=0x%x\n",idx,y);//print new state

}

}

while (1);//infinity cicle

}

Очевидно, что сложность в этом случае линейно зависит от числа конъюнкций в описании автомата. Конкретные временные характеристики определяются компьютером, на котором выполняется программа.

Тестирование автомата на правильной и неправильных последовательностях изображено на рис. 3.11–3.14.

81

Рис. 3.11. Результаты тестирования для последовательности 0132

Рис. 3.12. Результаты тестирования для последовательности 02

Рис. 3.13. Результаты тестирования для последовательности 010

82

Рис. 3.14. Результаты тестирования для последовательности 0131

3.8.ПРОГРАММА КОНТРОЛЛЕРА NUCLEO-F401RE ПЛАТФОРМЫ MBED ДЛЯ РАСПОЗНАВАНИЯ ПОСЛЕДОВАТЕЛЬНОСТИ СРАБАТЫВАНИЯ ПЕРЕКЛЮЧАТЕЛЕЙ*

Используем ресурс [14] Mbed (https: //www.mbed.com/en/) –

аппаратно-программную платформу с открытым исходным кодом и одноимённую операционную систему (Mbed OS) для устройств на базе 32-разрядных микроконтроллеров семейства ARM Cortex- M. IDE (англ. Integrated Development Environment) – интегриро-

ванная среда разработки, система программных средств, используемая программистами для разработки программного обеспечения платформы Mbed работает онлайн. Название Mbed – от английского словосочетания, обозначающего встроенные системы

(embedded systems) (рис. 3.15).

Программа реализует тот же автомат, но входные символы вводятся с тумблеров a, b, c, выходные сигналы выводятся на светодиоды z1, z2 (рис. 3.16).

* В написании и отладке программы участвовали доценты О.В. Гончаровский и М.В. Кавалеров.

83

Рис. 3.15. Сайт встроенных систем Mbed

а

б

в

Рис. 3.16. Микроконтроллер NUCLEO-F401RE:

а– внешний вид платы; б – характеристики; в – прототип системы с тремя тумблерами и двумя светодиодами

84

На сайте Mbed создаём проект [15], пишем и компилируем программу, затем передаём её в контроллер (во флэш-память кон-

троллера) (рис. 3.17, 3.18).

Рис. 3.17. Создание проекта для NUCLEO-F401RE на сайте Mbed

Рис. 3.18. «Диск» NUCLEO-F401RE,

на который копируется программа

Для передачи информации из контроллера в компьютер используется разработанное О.В. Гончаровским приложение [15] (рис. 3.19).

Рис. 3.19. Приложение NUCLEO-L15

Программа реализации конечного автомата на языке СИ в микроконтроллере NUCLEO-F401RE представлена ниже.

85

Программа реализации конечного автомата на языке СИ в микроконтроллере NUCLEO-F401RE

#include"mbed.h"

Задание входов и выходов

DigitalOutled1(LED1);

контроллера, режима

DigitalOutled2(A5);

опроса тумблеров

DigitalOutled3(A4);

(антидребезг)

Serialpc(USBTX,USBRX);

 

InterruptInbutton1(USER_BUTTON);

 

DigitalInbutton2(A3);

 

DigitalInbutton3(A2);

 

DigitalInbutton4(A1);

 

volatileboolbutton1_pressed=false;//Usedinthemainloop

 

volatileboolbutton1_enabled=true;//Usedfordebouncing

 

Timeoutbutton1_timeout;//Usedfordebouncing

 

//Enablesbuttonwhenbouncingisover

 

voidbutton1_enabled_cb(void)

 

{

 

button1_enabled=true;

 

}

 

//ISRhandlingbuttonpressedevent

 

voidbutton1_onpressed_cb(void)

 

{

 

if(button1_enabled){//Disabledwhilethebuttonis

 

bouncing

 

button1_enabled=false;

 

button1_pressed=true;//Tobereadbythemainloop

 

button1_timeout.attach(callback(button1_enabled_cb),

 

0.3);//Debouncetime300ms

 

}

 

}

 

typedefstruct{

 

unsignedcharA1;

 

unsignedcharA2;

 

unsignedcharA3;

Заданиемассиваконстант.

}A_type;

 

Длинамассива(24)

A_typeA[24]=

условная,рассчитанана

{

максимальноеколичество

{0x0f,0x01,0x04},

констант

{0x0f,0x02,0x02},

 

{0x0f,0x04,0x06},

 

{0x0f,0x05,0x04},

 

{0x0f,0x07,0x0c},

 

{0x0f,0x0d,0x0E},

 

{0x0f,0x0f,0x0c},

 

86

{0x0f,0x0e,0x0d},

 

{0,0,0}};

 

unsignedcharx=0x0;//InputVector

 

unsignedcharz=0x0;//OutputVector

 

unsignedcharT=0x0;//Memory

 

unsignedchary=0x0;//Temporal

 

intmain()

Вычислениеавтоматного

{

отображенияпонажатии

//button1.mode(PullUp);//Activatepull-up

кнопкиbutton1

 

button1.fall(callback(button1_onpressed_cb));//

 

AttachISRtohandlebuttonpressevent

 

pc.baud(115200);

 

button2.mode(PullUp);//Activatepull-up

 

button3.mode(PullUp);//Activatepull-up

 

button4.mode(PullUp);//Activatepull-up

 

intidx1=0;//Justforprintfbelow

 

printf("HelloElbasi\n");

 

x=0x0;

 

y=0x0;

 

while(1){

 

if(button1_pressed){//Setwhenbuttonispressed

 

button1_pressed=false;

 

printf("Buttonpressed%d\n",idx1++);

 

led1=!led1;

 

x=y|!button3|(!button2<<1);

 

printf("x=0x%x\n",x);

 

intidx=0;

 

for(idx=0,z=0x0;idx<24;idx++)

 

{

 

if(A[idx].A1==0)

 

break;

 

T=x&A[idx].A1;

 

T=T^A[idx].A2;

 

if(T==0){

 

z=z|A[idx].A3;

 

break;

 

}

 

}

 

87

y=z&0xc;//setnewstate printf("z(%d)=0x%x\n",idx,z); led2=z&1;

led3=(z>>1)&1;

}

}

}

Результаты тестирования представлены на рис. 3.20–3.23.

Рис.3.20.Результатытестированиядляпоследовательности0132

Рис.3.21.Результатытестированиядляпоследовательности02

88

Рис. 3.22. Результаты тестирования для последовательности 010

Рис. 3.23. Результаты тестирования для последовательности 0131

При такой реализации сложность также линейно зависит от числа конъюнкций в описании автомата. Однако для точных временных характеристик необходимо учитывать быстродействие конкретного микроконтроллера.

89

4. ПОНЯТИЕ О ТЕСТИРОВАНИИ АЛГОРИТМОВ (ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ)

ОТЛАДКА ПРОГРАММ НА ЯЗЫКЕ ASM51

Для поиска ошибок в алгоритме (программе) очень полезным бывает режим отладки, который удобнее всего выполнять пошагово [11].

Для запуска режима отладки необходимо нажать на кнопку паузы на нижней панели задач и выбрать закладку «Отладка»

(рис. 4.1).

Отмечаем в меню пункт CPU Registers U1 (рис. 4.2).

Рис. 4.1. Запуск в режиме отладки

90