книги / Математическая логика и теория алгоритмов. Анализ алгоритмов
.pdfint 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