![](/user_photo/_userpic.png)
книги / Математическая логика и теория алгоритмов. Анализ алгоритмов
.pdf![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx581x1.jpg)
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
![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx582x1.jpg)
Рис. 3.11. Результаты тестирования для последовательности 0132
Рис. 3.12. Результаты тестирования для последовательности 02
Рис. 3.13. Результаты тестирования для последовательности 010
82
![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx583x1.jpg)
Рис. 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
![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx584x1.jpg)
Рис. 3.15. Сайт встроенных систем Mbed
а |
б |
в
Рис. 3.16. Микроконтроллер NUCLEO-F401RE:
а– внешний вид платы; б – характеристики; в – прототип системы с тремя тумблерами и двумя светодиодами
84
![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx585x1.jpg)
На сайте 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
![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx588x1.jpg)
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
![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx589x1.jpg)
Рис. 3.22. Результаты тестирования для последовательности 010
Рис. 3.23. Результаты тестирования для последовательности 0131
При такой реализации сложность также линейно зависит от числа конъюнкций в описании автомата. Однако для точных временных характеристик необходимо учитывать быстродействие конкретного микроконтроллера.
89
![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx590x1.jpg)
4. ПОНЯТИЕ О ТЕСТИРОВАНИИ АЛГОРИТМОВ (ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ)
ОТЛАДКА ПРОГРАММ НА ЯЗЫКЕ ASM51
Для поиска ошибок в алгоритме (программе) очень полезным бывает режим отладки, который удобнее всего выполнять пошагово [11].
Для запуска режима отладки необходимо нажать на кнопку паузы на нижней панели задач и выбрать закладку «Отладка»
(рис. 4.1).
Отмечаем в меню пункт CPU Registers U1 (рис. 4.2).
Рис. 4.1. Запуск в режиме отладки
90