ஒரு வரையறுக்கப்பட்ட இயந்திரம் என்ன விவரிக்க முடியாது. வரையறுக்கப்பட்ட நிலை இயந்திரங்களின் வகைகள். ஆய்வு செய்யாமல் என்ன இருக்கிறது

இன்று நாம் இயந்திர துப்பாக்கிகளைப் பற்றி பேசுவோம், ஆனால் வீரர்கள் தங்கள் கைகளில் வைத்திருக்கும் துப்பாக்கிகள் அல்ல ரஷ்ய இராணுவம். தானியங்கு நிரலாக்கம் போன்ற நிரலாக்க மைக்ரோகண்ட்ரோலர்களின் சுவாரஸ்யமான பாணியைப் பற்றி பேசுவோம். இன்னும் துல்லியமாக, இது ஒரு நிரலாக்க பாணி கூட அல்ல, ஆனால் ஒரு முழு கருத்து, மைக்ரோகண்ட்ரோலர் புரோகிராமர் தனது வாழ்க்கையை மிகவும் எளிதாக்குவதற்கு நன்றி. புரோகிராமருக்கு வழங்கப்பட்ட பல பணிகள் மிகவும் எளிதாகவும் எளிமையாகவும் தீர்க்கப்படுகின்றன, இது புரோகிராமரை தலைவலியிலிருந்து விடுவிக்கிறது. மூலம், தானியங்கி நிரலாக்க அடிக்கடி அழைக்கப்படுகிறது ஸ்விட்ச் தொழில்நுட்பம்.

இந்த பதிவை எழுதுவதற்கு உத்வேகம் அளித்தது என்பதை நான் கவனிக்க விரும்புகிறேன் SWITCH தொழில்நுட்பம் பற்றிய தொடர் கட்டுரைகள் விளாடிமிர் டாடர்செவ்ஸ்கி. கட்டுரைகளின் தொடர் "மைக்ரோகண்ட்ரோலர்களுக்கான பயன்பாட்டு மென்பொருளை உருவாக்குவதில் ஸ்விட்ச் தொழில்நுட்பத்தைப் பயன்படுத்துதல்" என்று அழைக்கப்படுகிறது. எனவே இந்த கட்டுரையில் நான் பெரும்பாலும் வேலை செய்யும் குறியீடு மற்றும் அதன் விளக்கத்தின் உதாரணத்தை கொடுக்க முயற்சிப்பேன்.

மூலம், நிரலாக்கத்திற்காக அர்ப்பணிக்கப்பட்ட தொடர் கட்டுரைகளை நான் திட்டமிட்டுள்ளேன், அதில் ஏவிஆர் மைக்ரோகண்ட்ரோலர்களுக்கான நிரலாக்க நுட்பங்களை விரிவாகக் கருதுகிறேன், தவறவிடாதே…. சரி, போகலாம்!

புரோகிராமர் வழங்கிய கட்டளைகளை நிரல் தொடர்ந்து செயல்படுத்துகிறது. வழக்கமானது கணினி நிரல்நிரல் அதன் செயல்பாட்டை முடித்து, அதன் செயல்பாட்டை நிறுத்தும்போது, ​​​​அதன் வேலையின் முடிவுகளை மானிட்டரில் காண்பிக்கும் போது இது முற்றிலும் இயல்பானது.

ஒரு மைக்ரோகண்ட்ரோலர் நிரல் அதன் செயல்பாட்டை வெறுமனே முடிக்க முடியாது. நீங்கள் பிளேயர் அல்லது டேப் ரெக்கார்டரை இயக்கியுள்ளீர்கள் என்று கற்பனை செய்து பாருங்கள். பவர் பட்டனை அழுத்தி, விரும்பிய பாடலைத் தேர்ந்தெடுத்து, இசையை ரசியுங்கள். இருப்பினும், உங்கள் காது குழியில் இசை அதிர்வதை நிறுத்தியபோது, ​​பிளேயர் உறைந்து போய், பட்டன்களை அழுத்துவதற்கு எந்த விதத்திலும் எதிர்வினையாற்றவில்லை, தாம்பூலத்துடன் நீங்கள் நடனமாடுவது மிகவும் குறைவு.

அதில் என்ன தவறு? எல்லாம் நன்றாக உள்ளது - கட்டுப்படுத்தி, உங்கள் பிளேயரின் ஆழத்தில் உள்ளது, அதன் நிரலை செயல்படுத்தி முடித்துவிட்டது. நீங்கள் பார்க்கிறீர்கள், அது எப்படியோ சிரமமாக இருக்கிறது.

எனவே மைக்ரோகண்ட்ரோலருக்கான நிரல் வெறுமனே நிறுத்தப்படக்கூடாது என்று இங்கிருந்து முடிவு செய்கிறோம். சாராம்சத்தில், அது இருக்க வேண்டும் முடிவற்ற சுழற்சி- இந்த விஷயத்தில் மட்டுமே எங்கள் வீரர் சரியாக வேலை செய்வார். அடுத்து என்னென்ன டிசைன்கள் உள்ளன என்பதைக் காண்பிப்பேன். நிரல் குறியீடுமைக்ரோகண்ட்ரோலர்களுக்கு, இவை வடிவமைப்புகள் அல்ல, ஆனால் சில நிரலாக்க பாணிகள்.

நிரலாக்க பாணிகள்.

"புரோகிராமிங் ஸ்டைல்கள்" எப்படியோ புரிந்துகொள்ள முடியாததாகத் தெரிகிறது, ஆனால் ஓ. இதன் மூலம் நான் என்ன சொல்ல விரும்புகிறேன்?ஒருவர் இதற்கு முன் நிரலாக்கம் செய்யாதவர், அதாவது அவர் ஒரு முழுமையான நோப் என்று கற்பனை செய்து கொள்வோம்.

இந்த நபர் நிரலாக்கத்தில் பல புத்தகங்களைப் படித்துள்ளார் மற்றும் மொழியின் அனைத்து அடிப்படை கட்டமைப்புகளையும் படித்துள்ளார்.இப்போது தகவலுக்கான அணுகல் வரம்பற்றதாக இருப்பதால், அவர் சிறிது சிறிதாக தகவல்களை சேகரித்தார். இது எல்லாம் நன்றாக இருக்கிறது, ஆனால் அவரது முதல் திட்டங்கள் எப்படி இருக்கும்? அவர் தத்துவார்த்தம் செய்ய மாட்டார் என்று எனக்குத் தோன்றுகிறது, ஆனால் எளிமையானது முதல் சிக்கலானது வரையிலான பாதையைப் பின்பற்றுவார்.

எனவே இந்த பாணிகள் ஒரு எளிய மட்டத்திலிருந்து மிகவும் சிக்கலான, ஆனால் அதே நேரத்தில் மிகவும் பயனுள்ளதாக இருக்கும் படிகள்.

முதலில் நான் எதைப் பற்றியும் யோசிக்கவில்லை வடிவமைப்பு அம்சங்கள்திட்டங்கள். நான் நிரலின் தர்க்கத்தை உருவாக்கினேன் - ஒரு பாய்வு விளக்கப்படத்தை வரைந்து குறியீட்டை எழுதினேன். அதனால்தான் நான் ரேக்கில் ஓடிக்கொண்டே இருந்தேன். ஆனால் நான் கவலைப்படாமல் "சிம்பிள் லூப்பிங்" பாணியைப் பயன்படுத்தியது இதுவே முதல் முறை, பின்னர் நான் குறுக்கீடுகளைப் பயன்படுத்தத் தொடங்கினேன், பின்னர் தானியங்கி இயந்திரங்கள் இருந்தன, நாங்கள் வெளியேறுகிறோம்...

1. எளிய வளையம். இந்த வழக்கில், நிரல் எந்த தந்திரங்களும் இல்லாமல் சுழல்கிறது, மேலும் இது அதன் நன்மை தீமைகளைக் கொண்டுள்ளது. ஒரே நன்மை அணுகுமுறையின் எளிமை, நீங்கள் தந்திரமான வடிவமைப்புகளைக் கொண்டு வரத் தேவையில்லை, நீங்கள் நினைத்தபடி எழுதுகிறீர்கள் (படிப்படியாக உங்கள் சொந்த கல்லறையைத் தோண்டி).

வெற்றிட முக்கிய(வெற்றிடம்) (ஆரம்ப_AL(); //பெரிஃபெரல்களை துவக்கும்போது(1) (Leds_BLINK(); //செயல்பாடு LED flasherசிக்னல்_ஆன்(); //சிக்னல் சிக்னல்_ஆஃப்() ஐ இயக்குவதற்கான செயல்பாடு; //சிக்னலை அணைப்பதற்கான செயல்பாடு l=பொத்தானை(); //பொத்தான்கள் சுவிட்சை அழுத்துவதற்கு பொறுப்பான மாறி (எல்) //மாறியின் மதிப்பைப் பொறுத்து, ஒன்று அல்லது மற்றொரு செயல் செய்யப்படுகிறது ( வழக்கு 1: ( Deistvie1(); //ஒரு செயல்பாட்டிற்கு பதிலாக Deistvie2 ஒரு நிபந்தனை ஆபரேட்டர் இருக்கலாம் (); //அல்லது இன்னும் பல கிளைகள் வழக்கு Deistvie3(); Deistvie4(); Deistvie5(); ); வழக்கு 2: ( Deistvie6(); Deistvie7(); Deistvie8(); Deistvie9(); Deistvie10(); ) .. .. ..)))

நிரலின் இயக்க புள்ளி வரிசையில் நகரும். இந்த வழக்கில், அனைத்து செயல்கள், நிபந்தனைகள் மற்றும் சுழற்சிகள் தொடர்ச்சியாக செயல்படுத்தப்படுகின்றன. குறியீடு மெதுவாகத் தொடங்குகிறது, நீங்கள் நிறைய கூடுதல் நிபந்தனைகளைச் செருக வேண்டும், இதன் மூலம் உணர்வை சிக்கலாக்குகிறது.

இவை அனைத்தும் நிரலை பெரிதும் குழப்புகிறது, குறியீட்டை நிபந்தனைகளின் சிக்கலாக மாற்றுகிறது. இதன் விளைவாக, இந்த குறியீட்டில் இருந்து எதையும் சேர்க்கவோ அல்லது எடுக்கவோ முடியாது; இது ஒரு ஒற்றைத் துண்டு போல் மாறும். நிச்சயமாக, அளவு பெரியதாக இல்லாதபோது, ​​குறியீட்டை மாற்றியமைக்க முடியும், ஆனால் அது மேலும் செல்கிறது, அது மிகவும் கடினமாகிறது.

இந்த அணுகுமுறையைப் பயன்படுத்தி, நான் பல நிரல்களை எழுதினேன்; அவை பெரியதாகவும் செயல்படவில்லை, ஆனால் தெளிவு விரும்பத்தக்கதாக இருந்தது. சில புதிய நிபந்தனைகளைச் சேர்க்க, நான் முழு குறியீட்டையும் தோண்டி எடுக்க வேண்டியிருந்தது, ஏனென்றால் எல்லாமே பிணைக்கப்பட்டிருந்தன. இது நிறைய பிழைகள் மற்றும் தலைவலிகளை ஏற்படுத்தியது. கம்பைலர் முடிந்தவரை சபித்தார், அத்தகைய நிரலை பிழைத்திருத்தம் செய்து நரகமாக மாறியது.

2. லூப் + குறுக்கீடுகள்.

குறுக்கீடுகளைப் பயன்படுத்தி முடிவில்லா பிரேக்கிங் சுழற்சியை நீங்கள் ஓரளவு தீர்க்கலாம். குறுக்கீடுகள் ஒரு தீய வட்டத்திலிருந்து வெளியேற உதவுகின்றன, முக்கியமான நிகழ்வைத் தவறவிடாமல் இருக்க உதவுகின்றன, மேலும் கூடுதல் செயல்பாட்டைச் சேர்க்கின்றன (டைமர்களில் இருந்து குறுக்கீடுகள், வெளிப்புற குறுக்கீடுகள்).

பொத்தான்களைச் செயலாக்க அல்லது முக்கியமான நிகழ்வைக் கண்காணிக்க, குறுக்கீட்டைப் பயன்படுத்தலாம் என்று வைத்துக்கொள்வோம். இதன் விளைவாக, நிரல் மிகவும் காட்சியளிக்கிறது, ஆனால் குறைவான குழப்பம் இல்லை.

துரதிர்ஷ்டவசமாக, குறுக்கீடு செய்வது நிரல் மாறும் குழப்பத்திலிருந்து உங்களைக் காப்பாற்றாது. முழுமையாய் இருப்பதைப் பகுதிகளாகப் பிரிக்க இயலாது.

3. தானியங்கி நிரலாக்கம்.

இதோ நாம் வருகிறோம் முக்கிய தலைப்புஇந்த கட்டுரையின். வரையறுக்கப்பட்ட நிலை இயந்திரங்களில் நிரலாக்கமானது முதல் இரண்டு எடுத்துக்காட்டுகளில் உள்ளார்ந்த குறைபாடுகளை நீக்குகிறது. நிரல் எளிமையானது மற்றும் மாற்றியமைக்க எளிதானது.

தானியங்கி பாணியில் எழுதப்பட்ட ஒரு நிரல் ஒரு சுவிட்சைப் போன்றது, இது நிபந்தனைகளைப் பொறுத்து, ஒரு மாநிலத்திற்கு அல்லது இன்னொரு நிலைக்கு மாறுகிறது. மாநிலங்களின் எண்ணிக்கை ஆரம்பத்தில் புரோகிராமருக்குத் தெரியும்.

தோராயமாகச் சொன்னால், இது ஒரு ஒளி சுவிட்ச் போன்றது. இரண்டு நிலைகள் ஆன் மற்றும் ஆஃப், மற்றும் இரண்டு நிபந்தனைகள் உள்ளன. சரி, முதல் விஷயங்கள் முதலில்.

சுவிட்ச் தொழில்நுட்பத்தில் பல்பணியை செயல்படுத்துதல்.

மைக்ரோகண்ட்ரோலர் சுமையைக் கட்டுப்படுத்தும் திறன் கொண்டது, LED களை ஒளிரச் செய்வது, விசை அழுத்தங்களைக் கண்காணிப்பது மற்றும் பல. ஆனால் இதையெல்லாம் ஒரே நேரத்தில் செய்வது எப்படி? இந்த சிக்கலை தீர்க்க பல தீர்வுகள் உள்ளன. நான் ஏற்கனவே குறிப்பிட்டுள்ள அவற்றில் எளிமையானது குறுக்கீடுகளின் பயன்பாடு ஆகும்.

நிரல் செயல்பாட்டின் போது, ​​ஒரு குறுக்கீடு ஏற்படும் போது, ​​நிரல் குறியீட்டை செயல்படுத்துவதில் இருந்து கட்டுப்படுத்தி திசைதிருப்பப்பட்டு, குறுக்கீடு பொறுப்பான நிரலின் மற்றொரு பகுதியை சுருக்கமாக செயல்படுத்துகிறது. குறுக்கீடு வேலை செய்யும், பின்னர் நிரல் இயக்க புள்ளியானது குறுக்கீட்டால் கட்டுப்படுத்தி குறுக்கிடப்பட்ட இடத்திலிருந்து தொடரும் (இந்த வார்த்தையே கட்டுப்படுத்தி குறுக்கிடப்பட்டதைக் குறிக்கிறது).

பல்பணியைச் செயல்படுத்த மற்றொரு வழி பயன்படுத்துவது இயக்க முறைமைகள். ஆம், உண்மையில், சிறிய OS கள் ஏற்கனவே தோன்றத் தொடங்கியுள்ளன, அவை குறைந்த சக்தி கொண்ட கட்டுப்படுத்தியில் பயன்படுத்தப்படலாம். ஆனால் பெரும்பாலும் இந்த முறை ஓரளவு தேவையற்றதாக மாறிவிடும். எல்லாவற்றிற்கும் மேலாக, குறைந்த செலவில் நீங்கள் பெறக்கூடிய போது, ​​ஏன் தேவையற்ற வேலைகளால் கட்டுப்படுத்தியின் வளங்களை வீணடிக்க வேண்டும்.

சுவிட்ச் டெக்னாலஜியைப் பயன்படுத்தி எழுதப்பட்ட நிரல்களில், செய்தியிடல் அமைப்புக்கு நன்றி செலுத்தும் பல்பணி போன்ற "மாயை" பெறப்படுகிறது. நான் "மாயை" என்று எழுதினேன், ஏனெனில் இது உண்மையில் அப்படித்தான், ஏனெனில் ஒரு நிரல் ஒரே நேரத்தில் வெவ்வேறு குறியீடுகளின் வெவ்வேறு பிரிவுகளை இயக்க முடியாது. மெசேஜிங் சிஸ்டம் பற்றி இன்னும் கொஞ்சம் பேசுகிறேன்.

செய்தியிடல் அமைப்பு.

நீங்கள் பல செயல்முறைகளைத் தீர்க்கலாம் மற்றும் செய்தியிடல் முறையைப் பயன்படுத்தி பல்பணியின் மாயையை உருவாக்கலாம்.

எல்.ஈ.டி சுவிட்ச் செய்யப்பட்ட ஒரு நிரல் நமக்குத் தேவை என்று வைத்துக்கொள்வோம். இங்கே எங்களிடம் இரண்டு இயந்திரங்கள் உள்ளன, அவற்றை LEDON என்று அழைப்போம் - LED ஐ இயக்குவதற்குப் பொறுப்பான இயந்திரம் மற்றும் LEDOFF இயந்திரம் - LED ஐ அணைக்கப் பொறுப்பான இயந்திரம்.

ஒவ்வொரு இயந்திரத்திற்கும் இரண்டு நிலைகள் உள்ளன, அதாவது, இயந்திரம் செயலில் அல்லது செயலற்ற நிலையில், சுவிட்ச் ஆன் அல்லது ஆஃப் போன்றது.

ஒரு இயந்திரம் இயக்கப்படும் போது, ​​எல்.ஈ.டி ஒளிரும், மற்றொன்று செயல்படுத்தப்படும் போது, ​​எல்.ஈ.டி. ஒரு சிறிய உதாரணத்தைப் பார்ப்போம்:

Int main(void) ( INIT_PEREF(); //பெரிஃபெரல்களின் துவக்கம் (LEDகள்) InitGTimers(); //டைமர்களின் துவக்கம் InitMessages(); //செய்தி செயலாக்க பொறிமுறையின் துவக்கம் InitLEDON(); //LEDON இயந்திரத்தின் துவக்கம் InitLEDOFF(); // LEDOFF ஆட்டோமேட்டனின் SendMessage (MSG_LEDON_ACTIVATE) துவக்கம்; //LEDON sei(); //குறுக்கீடுகளை இயக்கு //புரோகிராமின் பிரதான சுழற்சியை (1) (ProcessLEDON(); //மறு செய்கை LEDON ஆட்டோமேட்டன் ProcessLEDOFF(); // LEDOFF ஆட்டோமேட்டன் ProcessMessages இன் மறு செய்கை (); //செய்தி செயலாக்கம் ); )

3-7 வரிகளில் பல்வேறு துவக்கங்கள் நிகழ்கின்றன, எனவே நாங்கள் இப்போது இதில் குறிப்பாக ஆர்வம் காட்டவில்லை. ஆனால் பின்வருபவை நிகழ்கின்றன: பிரதான சுழற்சியைத் தொடங்குவதற்கு முன் (அதே நேரத்தில் (1)), நாங்கள் இயந்திரத்திற்கு ஒரு செய்தியை அனுப்புகிறோம்

அனுப்புச்செய்தி(MSG_LEDON_ACTIVATE)

எல்.ஈ.டி வெளிச்சத்திற்கு பொறுப்பு. இந்த சிறிய படி இல்லாமல், நம் உறுப்பு வேலை செய்யாது. அடுத்து, மெயின் இன்ஃபினிட் லூப் முக்கிய வேலையைச் செய்கிறது.

ஒரு சிறிய விலகல்:

செய்தியில் மூன்று நிலைகள் உள்ளன. அதாவது, செய்தி நிலை செயலற்றதாக இருக்கலாம், அமைக்கப்பட்டது ஆனால் செயலற்ற நிலை மற்றும் செயலில் இருக்கும் நிலை.

செய்தி ஆரம்பத்தில் செயலற்றதாக இருந்தது, நாங்கள் செய்தியை அனுப்பியபோது, ​​​​அது "நிறுவப்பட்டது ஆனால் செயலற்றது" என்ற நிலையைப் பெற்றது. மேலும் இது நமக்கு பின்வருவனவற்றை அளிக்கிறது. நிரல் தொடர்ச்சியாக செயல்படுத்தப்படும் போது, ​​LEDON இயந்திரம் செய்தியைப் பெறாது. LEDON இயந்திரத்தின் செயலற்ற மறு செய்கை நிகழ்கிறது, அதில் செய்தியைப் பெற முடியாது. செய்தியில் "நிறுவப்பட்ட ஆனால் செயலற்ற" நிலை இருப்பதால், நிரல் அதன் செயல்பாட்டைத் தொடர்கிறது.

அனைத்து இயந்திரங்களும் செயலிழந்த பிறகு, செயல்முறை செய்திகள்() செயல்பாட்டிற்கு திருப்பம் வரும். ஆட்டோமேட்டாவின் அனைத்து மறு செய்கைகளும் முடிந்த பிறகு, இந்த செயல்பாடு எப்போதும் லூப்பின் முடிவில் வைக்கப்படும். ProcessMessages() செயல்பாடு ஒரு செய்தியை "செட் ஆனால் செயலற்ற" நிலையில் இருந்து "செயலில்" நிலைக்கு நகர்த்துகிறது.

எல்லையற்ற வளையம் இரண்டாவது சுற்றை முடிக்கும்போது, ​​படம் முற்றிலும் மாறுபட்டதாகிறது. ProcessLEDON இயந்திரத்தின் மறு செய்கை செயலற்றதாக இருக்காது. இயந்திரம் செய்தியைப் பெறவும், ஒளிரும் நிலைக்குச் செல்லவும், அதையொட்டி ஒரு செய்தியை அனுப்பவும் முடியும். இது LEDOFF இயந்திரம் மற்றும் முகவரியிடப்படும் வாழ்க்கை சுழற்சிசெய்திகள் மீண்டும் மீண்டும் வரும்.

"செயலில்" நிலை கொண்ட செய்திகள் ProcessMessages செயல்பாட்டை எதிர்கொள்ளும்போது அழிக்கப்படும் என்பதை நான் கவனிக்க விரும்புகிறேன். எனவே, ஒரு செய்தியை ஒரு இயந்திரத்தால் மட்டுமே பெற முடியும். மற்றொரு வகை செய்தி உள்ளது - ஒளிபரப்பு செய்திகள், ஆனால் நான் அவற்றை கருத்தில் கொள்ள மாட்டேன்; அவை டாடர்செவ்ஸ்கியின் கட்டுரைகளிலும் நன்கு விவரிக்கப்பட்டுள்ளன.

டைமர்கள்

செய்தி பரிமாற்றத்தின் சரியான அமைப்பின் உதவியுடன், வரையறுக்கப்பட்ட நிலை இயந்திரங்களின் செயல்பாட்டின் வரிசையை நாம் கட்டுப்படுத்தலாம், ஆனால் செய்திகளை மட்டும் கொண்டு அதைச் செய்ய முடியாது.

உதாரணமாக கொடுக்கப்பட்ட முந்தைய நிரல் துண்டு நோக்கம் போல் செயல்படாது என்பதை நீங்கள் கவனித்திருக்கலாம். இயந்திரங்கள் செய்திகளைப் பரிமாறிக் கொள்ளும், எல்.ஈ.டிகள் மாறும், ஆனால் நாங்கள் அதைப் பார்க்க மாட்டோம். மங்கலான எல்.ஈ.டியை மட்டுமே காண்போம்.

தாமதங்களை எவ்வாறு சரியாகக் கையாள்வது என்று நாங்கள் சிந்திக்காததே இதற்குக் காரணம். எல்லாவற்றிற்கும் மேலாக, எல்.ஈ.டிகளை மாறி மாறி இயக்குவதும் அணைப்பதும் போதாது; எல்இடி ஒவ்வொரு மாநிலத்திலும் நீடிக்க வேண்டும், ஒரு நொடி சொல்லுங்கள்.

அல்காரிதம் பின்வருமாறு இருக்கும்:

கிளிக் செய்து பெரிதாக்கலாம்

இந்த பிளாக் வரைபடத்தில் டைமர் டிக் டவுன் செய்யப்பட்டவுடன், நிச்சயமாக ஒரு செயல் செய்யப்படுகிறது - எல்இடியை ஒளிரச் செய்வது அல்லது அதை அணைப்பது.

1. ஒரு செய்தியை ஏற்று மாநிலத்திற்குள் நுழைகிறோம்.

2. டைமர்/கவுண்டர் ரீடிங்குகளை நாங்கள் சரிபார்க்கிறோம், எண்ணிக்கை எட்டப்பட்டால், நாங்கள் செயலைச் செய்கிறோம், இல்லையெனில் நமக்கே ஒரு செய்தியை அனுப்புவோம்.

3. அடுத்த இயந்திரத்திற்கு ஒரு செய்தியை அனுப்பவும்.

4. வெளியேறு

அடுத்த உள்ளீட்டில் எல்லாம் மீண்டும் மீண்டும் செய்யப்படுகிறது.

SWITCH தொழில்நுட்பம் பற்றிய திட்டம். மூன்று படிகள்.

வரையறுக்கப்பட்ட நிலை இயந்திரங்களில் ஒரு நிரலை எழுதுவோம், இதற்கு நாம் மூன்று மட்டுமே செய்ய வேண்டும் எளிய படிகள். நிரல் எளிமையானதாக இருக்கும், ஆனால் எளிமையான விஷயங்களுடன் தொடங்குவது மதிப்பு. ஸ்விட்ச்சிங் எல்இடி கொண்ட ஒரு நிரல் நமக்கு பொருந்தும். இது மிகவும் நல்ல உதாரணம், அதனால் புதிதாக எதையும் கண்டுபிடிக்க வேண்டாம்.

நான் SI மொழியில் நிரலை உருவாக்குவேன், ஆனால் இது வரையறுக்கப்பட்ட நிலை இயந்திரங்களில் நீங்கள் C இல் மட்டுமே எழுத வேண்டும் என்று அர்த்தமல்ல; வேறு எந்த நிரலாக்க மொழியையும் பயன்படுத்துவது மிகவும் சாத்தியம்.

எங்கள் நிரல் மட்டுவாக இருக்கும், எனவே பல கோப்புகளாக பிரிக்கப்படும். எங்களிடம் பின்வரும் தொகுதிகள் இருக்கும்:

  • பிரதான நிரல் வளையத்தின் தொகுதி leds_blink.c, HAL.c, HAL.h கோப்புகளைக் கொண்டுள்ளது
  • டைமர் தொகுதி டைமர்ஸ்.சி, டைமர்ஸ்.எச் கோப்புகள் உள்ளன
  • செய்தி செயலாக்க தொகுதி messages.c, messages.h கோப்புகள் உள்ளன
  • இயந்திர தொகுதி 1 ledon.c, ledon.h கோப்புகள் உள்ளன
  • இயந்திர தொகுதி 2 ledoff.c கோப்புகளைக் கொண்டுள்ளது, ledoff .h

படி 1.

நாங்கள் ஒரு திட்டத்தை உருவாக்கி, எங்கள் நிலையான தொகுதிகளின் கோப்புகளை உடனடியாக இணைக்கிறோம்: timers.c, timers.h, messages.c, messages.h.

பிரதான நிரல் வளையத்தின் தொகுதியின் leds_blink.c கோப்பு.

# "hal.h" #உள்ளடங்கு ############################################## ########################### ISR(TIMER0_OVF_vect) // குறுக்கீடு திசையன் (கவுண்டர் T0 டைமர் ஓவர்ஃப்ளோ) (ProcessTimers() //டைமர் இன்டர்ரப்ட் ஹேண்ட்லர்) //####################################### ################################################ முக்கிய(வெற்றிடம்) ( INIT_PEREF(); //பெரிஃபெரல்களின் (எல்இடிகள்) InitGTimers(); //டைமர்களின் துவக்கம் InitMessages(); //செய்தி செயலாக்க பொறிமுறையின் துவக்கம் InitLEDON(); // LEDON இயந்திரத்தின் துவக்கம் InitLEDOFF (); StartGTimer( TIMER_SEK); //டைமர் SendMessage (MSG_LEDON_ACTIVATE) ஐத் தொடங்கவும்; //தானியங்கி FSM1 sei()ஐச் செயல்படுத்தவும்; //குறுக்கீடுகளை இயக்கவும் //நிரலின் முக்கிய சுழற்சியை (1) (ProcessLEDON(); // ஆட்டோமேட்டனின் மறு செய்கை LEDON ProcessLEDOFF(); ProcessMessages( ); //message processing ); )

முதல் வரிகள் மீதமுள்ள தொகுதிகளை பிரதான நிரலுடன் இணைக்கின்றன. டைமர் தொகுதியும் செய்தி செயலாக்க தொகுதியும் இணைக்கப்பட்டுள்ளதை இங்கே காண்கிறோம். நிரல் உரையில் அடுத்தது ஓவர்ஃப்ளோ இன்டர்ரப்ட் வெக்டார்.

முக்கிய நிரல் வரி int main (வெற்று) உடன் தொடங்கும் என்று கூறலாம். மேலும் இது எல்லாவற்றையும் துவக்குவதில் தொடங்குகிறது. இங்கே நாம் சாதனங்களைத் துவக்குகிறோம், அதாவது ஒப்பீட்டாளரின் உள்ளீடு/வெளியீட்டு போர்ட்கள் மற்றும் கட்டுப்படுத்தியின் மற்ற எல்லா உள்ளடக்கங்களுக்கும் ஆரம்ப மதிப்புகளை அமைக்கிறோம். இவை அனைத்தும் INIT_PEREF செயல்பாட்டால் செய்யப்படுகின்றன; அதன் முக்கிய பகுதி hal.c கோப்பில் இருந்தாலும், அதை இங்கே இயக்குகிறோம்.

அடுத்து டைமர்களின் துவக்கம், செய்தி செயலாக்க தொகுதி மற்றும் ஆட்டோமேட்டாவின் துவக்கம் ஆகியவற்றைக் காண்கிறோம். இங்கே இந்த செயல்பாடுகளும் எளிமையாக தொடங்கப்படுகின்றன, இருப்பினும் செயல்பாடுகள் அவற்றின் தொகுதிகளின் கோப்புகளில் எழுதப்பட்டுள்ளன. இது எவ்வளவு வசதியானது என்று பாருங்கள். நிரலின் முக்கிய உரை படிக்க எளிதானது மற்றும் உங்கள் கால்களை உடைக்கும் தேவையற்ற குறியீட்டால் ஒழுங்கீனம் செய்யப்படவில்லை.

முக்கிய துவக்கங்கள் முடிந்துவிட்டன, இப்போது நாம் முக்கிய வளையத்தைத் தொடங்க வேண்டும். இதைச் செய்ய, நாங்கள் தொடக்கச் செய்தியை அனுப்புகிறோம், மேலும் எங்கள் கடிகாரத்தையும் மூடுகிறோம் - நாங்கள் டைமரைத் தொடங்குகிறோம்.

StartGTimer(TIMER_SEK); //SendMessage (MSG_LEDON_ACTIVATE) டைமரைத் தொடங்கவும்; //எந்திரம் FSM1 ஐ செயல்படுத்தவும்

முக்கிய சுழற்சி, நான் ஏற்கனவே கூறியது போல், மிகவும் எளிமையானது. அனைத்து இயந்திரங்களின் செயல்பாடுகளையும் நாங்கள் எழுதுகிறோம், வரிசையை கவனிக்காமல் ஒரு நெடுவரிசையில் எழுதுகிறோம். இந்த செயல்பாடுகள் ஆட்டோமேட்டா ஹேண்ட்லர்கள் மற்றும் ஆட்டோமேட்டா தொகுதிகளில் அமைந்துள்ளன. இந்த தானியங்கி பிரமிடு செய்தி செயலாக்க தொகுதியின் செயல்பாட்டின் மூலம் முடிக்கப்படுகிறது. நிச்சயமாக, செய்தி அனுப்பும் முறையை நாங்கள் கையாண்டபோது இதை நான் ஏற்கனவே உங்களிடம் சொன்னேன். நிரலின் பிரதான சுழற்சி தொகுதியின் மேலும் இரண்டு கோப்புகள் எப்படி இருக்கும் என்பதை இப்போது நீங்கள் பார்க்கலாம்

Hal.h என்பது நிரலின் முக்கிய லூப் தொகுதியின் தலைப்புக் கோப்பு.

#ifndef HAL_h #வரையறுத்து HAL_h #உள்ளடங்கும் #சேர்க்கிறது //குறுக்கீடுகள் உட்பட நிலையான நூலகம் #எல்இடி 1 வரையறுத்து 0 #எல்இடி 2 வரையறுத்து 1 #எல்இடி 3 வரையறுத்து 2 #எல்இடி 4 வரையறுத்து<

நீங்கள் கவனித்தபடி, இந்த கோப்பில் இயல்பாகவே இயங்கக்கூடிய குறியீட்டின் ஒரு வரி இல்லை - இவை அனைத்தும் மேக்ரோ மாற்றீடுகள் மற்றும் இணைக்கும் நூலகங்கள். இந்த கோப்பை வைத்திருப்பது வாழ்க்கையை மிகவும் எளிதாக்குகிறது, இது பார்வையை மேம்படுத்துகிறது.

ஆனால் Hal.c கோப்பு ஏற்கனவே இயங்கக்கூடிய கோப்பு, நான் ஏற்கனவே குறிப்பிட்டுள்ளபடி, இது பல்வேறு புற துவக்கங்களைக் கொண்டுள்ளது.

#include "hal.h" void INIT_PEREF(void) ( //I/O போர்ட்களை துவக்குதல் //########################## ### ############################################ ### ##### Komparator = ViklKomparator; //ஒப்பீட்டாளரைத் தொடங்குதல் - DDRD ஐ அணைத்தல் = 1<

சரி, நிரலின் முக்கிய சுழற்சியின் தொகுதியைக் காட்டினேன், இப்போது நாம் கடைசி படியை எடுக்க வேண்டும், ஆட்டோமேட்டாவின் தொகுதிகளை எழுத வேண்டும்.

படி 3.

நாம் செய்ய வேண்டியதெல்லாம், வரையறுக்கப்பட்ட நிலை இயந்திரங்களுக்கான தொகுதிகளை எழுதுவது மட்டுமே, எங்கள் விஷயத்தில் LEDON இயந்திரம் மற்றும் LEDOFF இயந்திரம். தொடங்குவதற்கு, LED ஐ விளக்கும் தானியங்கி சாதனத்திற்கான நிரலின் உரையை நான் தருகிறேன், கோப்பு ledon.c.

//file ledon.c #include "ledon.h" #include "timers.h" #include "messages.h" unsigned char ledon_state; //நிலை மாறி வெற்றிடமான InitLEDON(செல்லம்) ( ledon_state=0; //இங்கே நீங்கள் மற்ற //தானியங்கி மாறிகள் இருந்தால் துவக்கலாம்) void ProcessLEDON(void) ( switch(ledon_state) ( வழக்கு 0: //செயலற்ற நிலை என்றால்(GetMessage) MSG_LEDON_ACTIVATE)) //ஒரு செய்தி இருந்தால், அது ஏற்றுக்கொள்ளப்படும் ( //மற்றும் டைமர் சரிபார்க்கப்படும் என்றால்(GetGTimer(TIMER_SEK)==one_sek) //டைமர் 1 வினாடியாக இருந்தால், பிறகு இயக்கவும் ( StopGTimer(TIMER_SEK PORTD = 1<

இங்கே, முதல் வரிகளில், எப்போதும் போல, நூலகங்கள் இணைக்கப்பட்டு மாறிகள் அறிவிக்கப்படுகின்றன. அடுத்து நாம் ஏற்கனவே சந்தித்த செயல்பாடுகள் உள்ளன. இது InitLEDON ஆட்டோமேட்டனின் துவக்க செயல்பாடு மற்றும் ProcessLEDON ஆட்டோமேட்டன் ஹேண்ட்லரின் செயல்பாடு ஆகும்.

கையாளுபவரின் உடலில், டைமர் மாட்யூல் மற்றும் மெசேஜ் மாட்யூலின் செயல்பாடுகள் ஏற்கனவே செயலாக்கப்பட்டுள்ளன. இயந்திரத்தின் தர்க்கம் சுவிட்ச்-கேஸ் வடிவமைப்பின் அடிப்படையில் செய்யப்படுகிறது. பல கேஸ் சுவிட்சுகளைச் சேர்ப்பதன் மூலம் இயந்திர கையாளுதல் சிக்கலாக்கப்படலாம் என்பதை இங்கே நீங்கள் கவனிக்கலாம்.

கணினிக்கான தலைப்பு கோப்பு இன்னும் எளிமையாக இருக்கும்:

//file fsm1 #ifndef LEDON_h #define LEDON_h #include "hal.h" void InitLEDON(void); வெற்றிடமான ProcessLEDON(செல்லம்); #endif

இங்கே நாம் இணைக்கும் கோப்பு hal.h ஐ சேர்க்கிறோம் மற்றும் செயல்பாட்டு முன்மாதிரிகளையும் குறிப்பிடுகிறோம்.

எல்இடியை அணைக்கப் பொறுப்பான கோப்பு கண்ணாடிப் படத்தில் மட்டும் கிட்டத்தட்ட ஒரே மாதிரியாக இருக்கும், எனவே நான் அதை இங்கே காட்ட மாட்டேன் - நான் தயங்குகிறேன் :)

இந்த இணைப்பிலிருந்து அனைத்து திட்ட கோப்புகளையும் பதிவிறக்கம் செய்யலாம் ====>>> இணைப்பு.

மூன்று படிகள் மட்டுமே உள்ளன, எங்கள் திட்டம் முடிக்கப்பட்ட படிவத்தைப் பெற்றுள்ளது, அதாவது இன்றைய எனது பணி முடிந்துவிட்டது, அதை முடிக்க வேண்டிய நேரம் இது. இந்தக் கட்டுரையில் கொடுக்கப்பட்டுள்ள தகவல்கள் உங்களுக்கு மிகவும் பயனுள்ளதாக இருக்கும் என்று எனக்குத் தோன்றுகிறது. ஆனால் இந்த அறிவை நடைமுறையில் பயன்படுத்தினால் மட்டுமே அது உண்மையான பலனைத் தரும்.

மூலம், நான் குறிப்பாக சுவாரஸ்யமாக இருக்கும் பல சுவாரஸ்யமான திட்டங்களை திட்டமிட்டுள்ளேன், எனவே உறுதியாக இருங்கள் புதிய கட்டுரைகளுக்கு குழுசேரவும் . கூடுதல் பொருட்களை அனுப்பவும் திட்டமிட்டுள்ளேன், எனவே பலர் ஏற்கனவே தளத்தின் பிரதான பக்கத்தின் மூலம் குழுசேர்கின்றனர். நீங்களும் இங்கே குழுசேரலாம்.

சரி, இப்போது என்னிடம் எல்லாம் இருக்கிறது, அதனால் நான் உங்களுக்கு நல்ல அதிர்ஷ்டம், ஒரு சிறந்த மனநிலை மற்றும் உங்களை மீண்டும் சந்திக்க விரும்புகிறேன்.

n/a Vladimir Vasiliev இலிருந்து

ஆட்டோமேட்டா கோட்பாடு

ஒரு இயந்திரத்தின் வரையறை மற்றும் அதன் வகை. மாற்றங்கள் மற்றும் வெளியீடுகளின் அட்டவணைகள் மற்றும் வரைபடங்கள். துணை தானியங்கி இயந்திரங்கள். குறைக்கப்பட்ட ஆட்டோமேட்டன் தேற்றம்

இயந்திரங்கள் மூலம் செயல்பாடுகள்

மீலி இயந்திரத்தை மூர் இயந்திரமாகவும், மூர் இயந்திரத்தை மீலி இயந்திரமாகவும் மாற்றுதல். தானியங்கு சமநிலை. ஆட்டோமேட்டாவின் நிலைகளின் வேறுபாடு. ஆட்டோமேட்டாவைக் குறைத்தல். ஆட்டோமேட்டாவின் தொகுப்பு. அங்கீகார இயந்திரங்கள்

ஒரு தானியங்கி இயந்திரம் என்பது இயந்திரங்கள் மற்றும் சாதனங்களின் ஒரு அமைப்பாகும், இதில் ஆற்றல், பொருட்கள் மற்றும் தகவல்களைப் பெறுதல், மாற்றுதல் மற்றும் பரிமாற்றுதல் செயல்முறைகள் முழுமையாக தானியங்கு செய்யப்படுகின்றன. "தானியங்கி இயந்திரம்" என்ற சொல் இரண்டு அம்சங்களில் பயன்படுத்தப்படுகிறது:

1) தொழில்நுட்ப,

2) கணிதம்.

கணித அணுகுமுறையில், ஒரு ஆட்டோமேட்டன் ஒரு தொழில்நுட்ப சாதனத்தின் கணித மாதிரியாக புரிந்து கொள்ளப்படுகிறது, அதில் உள்ளீடுகள், உள் நிலைகள் மற்றும் வெளியீடுகள் இருக்க வேண்டும். சாதனத்தின் கட்டமைப்பின் விவரங்கள் குறித்து எந்த தகவலும் இருக்கக்கூடாது.

தொழில்நுட்ப அணுகுமுறையில், ஒரு இயந்திரம் மிகவும் உண்மையான சாதனமாக புரிந்து கொள்ளப்படுகிறது, எடுத்துக்காட்டாக, ஒரு தொலைபேசி சாவடி, ஒரு விற்பனை இயந்திரம் போன்றவை. இந்த விஷயத்தில், இயற்கையாகவே, சாதனத்தின் உள் கட்டமைப்பின் விவரங்கள் அறியப்படுகின்றன.

ஒரு ஆட்டோமேட்டனின் ஒரு சிறப்பு மற்றும் முக்கியமான வழக்கு ஒரு டிஜிட்டல் ஆட்டோமேட்டன் (DA), இதில் டிஜிட்டல் தகவலைப் பெறுதல், மாற்றுதல், சேமித்தல் மற்றும் வழங்குதல் ஆகிய செயல்முறைகள் முழுமையாக தானியங்கு செய்யப்படுகின்றன.

டிஏ சிக்னல்களின் பார்வையில், உள்ளீட்டு சிக்னல்களைப் பெறக்கூடிய ஒரு அமைப்பை வரையறுப்பது பயனுள்ளது, அவற்றின் செல்வாக்கின் கீழ், ஒரு மாநிலத்திலிருந்து மற்றொரு நிலைக்கு மாறலாம், அடுத்த உள்ளீட்டு சமிக்ஞை வரும் வரை அதை பராமரிக்கலாம் மற்றும் வெளியீட்டு சமிக்ஞைகளை உருவாக்கலாம்.

உள்ளீட்டு சமிக்ஞைகள் X, மாநிலங்கள் S மற்றும் வெளியீட்டு சமிக்ஞைகள் Y ஆகியவற்றின் தொகுப்புகள் வரையறுக்கப்பட்டதாக இருந்தால், ஒரு DA வரையறுக்கப்பட்டதாகக் கருதப்படுகிறது.கணினி போன்ற சாதனத்துடன் வரையறுக்கப்பட்ட நிலை இயந்திரம் இணைக்கப்படலாம். கணினி உள்வரும் உள்ளீட்டுத் தரவை வெளியீட்டுத் தரவில் (முடிவு) செயலாக்குகிறது, ஆனால் இந்த முடிவு உள்ளீட்டுத் தரவுக்கு மட்டுமல்ல, கணினியின் தற்போதைய நிலைக்கும் ஒத்திருக்கிறது, அதாவது. கணினி நினைவகத்தில் சேமிக்கப்பட்ட தரவு, எடுத்துக்காட்டாக, முந்தைய கணக்கீடுகளின் முடிவுகள், கணக்கீடு திட்டங்கள்.

இலக்கு பார்வையாளர்களின் பணி தானியங்கி நேரத்தில் மேற்கொள்ளப்படுகிறது, இது உள்ளீட்டு சமிக்ஞைகளின் ரசீது காலங்களின் எண்ணிக்கையால் தீர்மானிக்கப்படுகிறது.

ஒரு சுருக்க ஆட்டோமேட்டன் என்பது ஒரு உள்ளீட்டு சேனலைக் கொண்ட ஒரு தனித்துவமான சாதனத்தின் கணித மாதிரியாகும், இது ஒரு மொழியின் குறியீடுகளின் வரிசைகளைப் பெறுகிறது, ஒரு வெளியீட்டு சேனல், அதில் இருந்து வேறு சில மொழிகளின் குறியீடுகளின் வரிசைகள் எடுக்கப்படுகின்றன, மேலும் ஒவ்வொரு கணத்திலும் ஏதாவது ஒரு நிலையில் இருக்கும். தனித்துவமான நேரம். வரைபட ரீதியாக, ஒரு சுருக்க ஆட்டோமேட்டன் படம்.

உள்ளீட்டு மொழியின் சொற்களை X=(x 1 ,x 2 ,...x n ) என்ற தொகுப்பின் குறியீடுகளால் குறிப்பிடலாம். உள்ளீடு எழுத்துக்கள், மற்றும் வெளியீட்டு மொழியின் வார்த்தைகள் Y=(y 1 ,y 2 ,...y p ) என்ற தொகுப்பின் குறியீடுகளாகும். வெளியீடு எழுத்துக்கள். ஆட்டோமேட்டனின் நிலைகளின் தொகுப்பு S=(s 1 ,s 2 ,...s m ) எனப்படும் மாநிலங்களின் எழுத்துக்கள்.


கருத்து இயந்திர நிலைஒரு குறிப்பிட்ட நேரத்தில் உள்ளீட்டு சிக்னல்களை மட்டுமல்ல, சில முந்தைய வரலாற்றையும் சார்ந்திருக்கும் வெளியீட்டு சமிக்ஞைகள் அமைப்புகளை விவரிக்கப் பயன்படுகிறது, அதாவது. கணினி உள்ளீடுகளில் முன்பு பெறப்பட்ட சமிக்ஞைகள். எனவே, டிஜிட்டல் ஆட்டோமேட்டா வரிசை சுற்றுகளைக் குறிக்கிறது, ஏற்கனவே குறிப்பிட்டுள்ளபடி, நினைவகம் உள்ளது. ஒரு ஆட்டோமேட்டனின் நிலையின் கருத்து கடந்த காலத்தின் சில நினைவகத்திற்கு ஒத்திருக்கிறது, எனவே இந்த கருத்தின் அறிமுகம் நேரத்தை ஒரு வெளிப்படையான மாறியாக நீக்கவும் மற்றும் வெளியீடுகளை மாநிலங்கள் மற்றும் உள்ளீடுகளின் செயல்பாடாக வெளிப்படுத்தவும் அனுமதிக்கிறது.

ஒரு சுருக்க ஆட்டோமேட்டனின் செயல்பாடு குறிப்பிட்ட நேர இடைவெளிகளுடன் தொடர்புடையதாக கருதப்பட வேண்டும், ஏனெனில் ஒவ்வொரு தனி இடைவெளி டிஅதன் வெளியீட்டு சமிக்ஞை y(t) உடன் ஒத்திருக்கும். இதன் விளைவாக, இயந்திரத்தின் செயல்பாடு வரையறுக்கப்பட்ட கால இடைவெளியில் தனித்தனி நேர இடைவெளியில் கருதப்படுகிறது. டிஜிட்டல் ஆட்டோமேட்டாவின் சுருக்கக் கோட்பாட்டில், உள்ளீட்டு சமிக்ஞைகள் ஒவ்வொன்றின் தொடக்கத்திலும் ஒரு ஒத்திசைவான ஆட்டோமேட்டனில் செயல்படும் என்று நம்பப்படுகிறது. நான்- தொடர்புடைய ஒத்திசைவு துடிப்பு (சுழற்சி) மூலம் ஒதுக்கப்பட்ட நேரத்தின் இடைவெளி (குவாண்டம்), மற்றும் உள்ளீட்டு சமிக்ஞைகளின் செல்வாக்கு இல்லாத போது, ​​அருகிலுள்ள ஒத்திசைவு பருப்புகளுக்கு இடையிலான நேர இடைவெளியில் இயந்திரத்தின் உள் நிலைகளில் மாற்றம் ஏற்படுகிறது.

"நிலை" என்ற கருத்து, இயந்திரம் கொடுக்கப்பட்ட வழிமுறையை செயல்படுத்தும்போது உள்ளீட்டு மொழியின் குறியீடுகள் மற்றும்/அல்லது சொற்களின் மீது இயந்திரத்தால் உருவாக்கப்பட்ட வெளியீட்டு மொழியின் குறியீடுகள் மற்றும்/அல்லது சொற்களின் செயல்பாட்டு சார்புநிலையை நிறுவ பயன்படுகிறது. ஆட்டோமேட்டனின் ஒவ்வொரு நிலைக்கும் sОS மற்றும் ஒவ்வொரு குறியீடானது xОX தனித்த நேரத்தின் [t] தருணத்தில், சாதனத்தின் வெளியீட்டில் yОY குறியீடு உருவாக்கப்படும். இந்த சார்பு ஆட்டோமேட்டன் j இன் வெளியீட்டு செயல்பாட்டால் தீர்மானிக்கப்படுகிறது. ஆட்டோமேட்டனின் ஒவ்வொரு தற்போதைய நிலைக்கும் sОS மற்றும் ஒவ்வொரு குறியீடானது xОX தனி நேரத்தின் [t] தருணத்தில், ஆட்டோமேட்டன் அடுத்த நிலை sОS க்கு செல்கிறது. இந்த சார்பு ஆட்டோமேட்டன் y இன் மாற்றம் செயல்பாட்டால் தீர்மானிக்கப்படுகிறது. ஆட்டோமேட்டனின் செயல்பாடு இரண்டு வரிசைகளை உருவாக்குவதைக் கொண்டுள்ளது: ஆட்டோமேட்டனின் அடுத்த நிலைகளின் வரிசை (s 1[ s 2 s 3 ...) மற்றும் வெளியீட்டு குறியீடுகளின் வரிசை (y 1 y 2 y 3 ...), குறியீடுகளின் வரிசைக்கு (x 1 x 2 x 3...) தனித்தனி நேரத்தின் தருணங்களில் விரிவடைகிறது t = 1,2,3,.... செவ்வக அடைப்புக்குறிக்குள் தனித்த நேரத்தின் தருணங்களைக் குறிக்கிறது, அவை கடிகார சுழற்சிகள் என்று அழைக்கப்படுகின்றன. , அடைப்புக்குறிக்குள் - X, Y மற்றும் S எழுத்துக்களின் எழுத்துக்களின் வரிசைகள்.

எனவே, வரையறுக்கப்பட்ட ஆட்டோமேட்டனின் கணித மாதிரியானது மூன்று அடிப்படை இயற்கணிதம் ஆகும், இதன் கேரியர்கள் மூன்று தொகுப்புகள் X, Y மற்றும் S ஆகும், மேலும் செயல்பாடுகள் j மற்றும் y ஆகிய இரண்டு செயல்பாடுகளாகும்.

இந்தக் கட்டுரையில், "கட்டுப்படுத்தப்பட்ட நிலை இயந்திரம்" என்பது ஒரு சிறிய எண்ணிக்கையிலான மாநிலங்களில் ஒன்றில் இருக்கக்கூடிய ஒரு வழிமுறையைக் குறிக்கிறது. "நிலை" என்பது உள்ளீடு மற்றும் வெளியீட்டு சமிக்ஞைகள் மற்றும் உள்ளீட்டு சமிக்ஞைகள் மற்றும் அடுத்தடுத்த நிலைகளுக்கு இடையே கொடுக்கப்பட்ட உறவை வரையறுக்கும் ஒரு குறிப்பிட்ட நிபந்தனையாகும். இந்த கட்டுரையில் விவரிக்கப்பட்டுள்ள வரையறுக்கப்பட்ட நிலை இயந்திரங்கள் மீலி இயந்திரங்கள் என்பதை அறிவார்ந்த வாசகர் உடனடியாக கவனிப்பார். மீலி இயந்திரம் என்பது ஒரு வரையறுக்கப்பட்ட நிலை இயந்திரமாகும், அங்கு வெளியீடுகள் தற்போதைய நிலை மற்றும் உள்ளீட்டு சமிக்ஞையின் செயல்பாடுகளாகும், இது ஒரு மூர் இயந்திரத்திற்கு மாறாக வெளியீடுகள் மாநிலத்தின் செயல்பாடுகளாக மட்டுமே இருக்கும். இரண்டு சந்தர்ப்பங்களிலும், அடுத்தடுத்த நிலை தற்போதைய நிலை மற்றும் உள்ளீட்டு சமிக்ஞையின் செயல்பாடாகும்.

ஒரு எளிய வரையறுக்கப்பட்ட நிலை இயந்திரத்தின் உதாரணத்தைப் பார்ப்போம். ஒரு உரை சரத்தில் நீங்கள் "//" என்ற எழுத்து வரிசையை அடையாளம் காண வேண்டும் என்று கற்பனை செய்து பாருங்கள். மாநில இயந்திரத்தைப் பயன்படுத்தி இது எவ்வாறு செய்யப்படுகிறது என்பதை படம் 1 காட்டுகிறது. ஒரு ஸ்லாஷின் முதல் தோற்றம் வெளியீட்டு சமிக்ஞையை உருவாக்காது, ஆனால் இயந்திரம் இரண்டாவது நிலைக்குச் செல்லும். இரண்டாவது நிலையில் இயந்திரம் ஒரு சாய்வைக் கண்டுபிடிக்கவில்லை என்றால், அது முதல் நிலைக்குத் திரும்பும், ஏனெனில் அதற்கு ஒரு வரிசையில் 2 ஸ்லாஷ்கள் இருக்க வேண்டும். இரண்டாவது சாய்வு கண்டறியப்பட்டால், இயந்திரம் ஒரு "தயார்" சமிக்ஞையை வெளியிடுகிறது.

வாடிக்கையாளருக்கு என்ன தேவை என்பதைக் கண்டறியவும்.

மாநில மாற்ற வரைபடத்தை உருவாக்கவும்

கிளை செயல்பாடுகளை விவரிக்காமல் மாநில இயந்திரத்தின் "எலும்புக்கூட்டை" குறியாக்கம் செய்யவும்.

மாற்றங்கள் சரியாக செயல்படுகின்றன என்பதை உறுதிப்படுத்தவும்.

மாறுதல் விவரங்களைப் பற்றி குறிப்பாக இருங்கள்.

சோதனை எடு.

மாநில இயந்திரத்தின் உதாரணம்

மாநில இயந்திரத்தின் மிகவும் சுவாரஸ்யமான உதாரணத்தைப் பார்ப்போம் - விமானத்தின் தரையிறங்கும் கியரின் பின்வாங்கல் மற்றும் நீட்டிப்பைக் கட்டுப்படுத்தும் ஒரு நிரல். பெரும்பாலான விமானங்கள் எலக்ட்ரோ-ஹைட்ராலிக் கட்டுப்பாட்டு பொறிமுறையைப் பயன்படுத்தி இந்த செயல்முறையைச் செய்தாலும் (போர்டில் கணினி இல்லாததால்), சில சந்தர்ப்பங்களில், ஆளில்லா வான்வழி வாகனங்களில், மென்பொருள் கட்டுப்பாட்டைப் பயன்படுத்துவது மதிப்பு.

முதலில், உபகரணங்களைப் பார்ப்போம். விமானத்தின் தரையிறங்கும் கியர் ஒரு மூக்கு கியர், ஒரு முக்கிய இடது தரையிறங்கும் கியர் மற்றும் ஒரு முக்கிய வலது தரையிறங்கும் கியர் ஆகியவற்றைக் கொண்டுள்ளது. அவை ஹைட்ராலிக் பொறிமுறையால் இயக்கப்படுகின்றன. மின்சாரத்தால் இயக்கப்படும் ஹைட்ராலிக் பம்ப் பவர் ஆக்சுவேட்டருக்கு அழுத்தத்தை அளிக்கிறது. மென்பொருளைப் பயன்படுத்தி, பம்ப் ஆன் அல்லது ஆஃப் செய்யப்படுகிறது. தரையிறங்கும் கியரை உயர்த்த அல்லது குறைக்க அழுத்தத்தை அனுமதிக்க, திசை வால்வின் நிலையை கணினி சரிசெய்கிறது - "கீழ்" அல்லது "மேல்". சேஸ் ஆதரவுகள் ஒவ்வொன்றும் வரம்பு சுவிட்சைக் கொண்டுள்ளது: சேஸ் உயர்த்தப்பட்டால் அவற்றில் ஒன்று மூடப்படும், மற்றொன்று - அது கீழ் நிலையில் பூட்டப்பட்டிருந்தால். விமானம் தரையில் உள்ளதா என்பதைத் தீர்மானிக்க, விமானத்தின் எடை மூக்கு கியரில் இருக்கும்போது மூக்கு கியர் ஸ்ட்ரட்டில் ஒரு வரம்பு சுவிட்ச் மூடப்படும். விமானியின் கட்டுப்பாடுகள் மேல்/கீழ் தரையிறங்கும் கியர் கை மற்றும் மூன்று விளக்குகள் (ஒவ்வொரு காலுக்கும் ஒன்று) அணைக்கப்படலாம், பச்சை (கீழ் நிலை) அல்லது சிவப்பு (கோ பொசிஷன்) ஆகியவற்றைக் கொண்டிருக்கும்.

இப்போது வரையறுக்கப்பட்ட நிலை இயந்திரத்தை உருவாக்குவதற்கு செல்லலாம். வாடிக்கையாளரின் உண்மையான எதிர்பார்ப்புகளைப் புரிந்துகொள்வதே முதல் மற்றும் மிகவும் கடினமான படியாகும். ஒரு வரையறுக்கப்பட்ட நிலை இயந்திரத்தின் நன்மைகளில் ஒன்று, சாத்தியமான எல்லா நிகழ்வுகளையும் சிந்திக்க புரோகிராமரை கட்டாயப்படுத்துகிறது, இதன் விளைவாக, வாடிக்கையாளரிடமிருந்து தேவையான அனைத்து தகவல்களையும் பெறுகிறது. இதை நான் ஏன் மிகவும் கடினமான கட்டமாக கருதுகிறேன்? இதைப் போன்ற பணி விளக்கம் உங்களுக்கு எத்தனை முறை கொடுக்கப்பட்டுள்ளது: விமானம் தரையில் இருந்தால் தரையிறங்கும் கியரை திரும்பப் பெற வேண்டாம்.

நிச்சயமாக, இது முக்கியமானது, ஆனால் வாடிக்கையாளர் இங்குதான் முடிவடையும் என்று நம்புகிறார். மீதமுள்ள வழக்குகள் பற்றி என்ன? விமானம் தரையிலிருந்து புறப்படும் தருணத்தில் தரையிறங்கும் கியரை திரும்பப் பெற்றால் போதுமா? விமானம் ஓடுபாதையில் ஒரு பம்ப் மீது குதித்தால் என்ன செய்வது? வாகனம் நிறுத்தும் போது பைலட் கியர் ஸ்டிக்கை மேலே நகர்த்தி, அதன் விளைவாக, புறப்பட ஆரம்பித்தால் என்ன செய்வது? இந்த வழக்கில் தரையிறங்கும் கியர் உயர்த்தப்பட வேண்டுமா?

மாநில இயந்திரத்தின் அடிப்படையில் சிந்திப்பதன் நன்மைகளில் ஒன்று, வாடிக்கையாளருக்கு முன்னால், ஒரு திட்டப் பலகையில் மாநில மாற்ற வரைபடத்தை விரைவாக வரையலாம் மற்றும் அவருடன் முழு செயல்முறையிலும் நடக்கலாம். மாநில மாற்றத்திற்கான பின்வரும் பதவி ஏற்கப்படுகிறது: "மாற்றத்தை ஏற்படுத்திய நிகழ்வு"/"மாற்றத்தின் விளைவாக வெளியீட்டு சமிக்ஞை." வாடிக்கையாளர் முதலில் கேட்டதை மட்டுமே நாங்கள் உருவாக்கியிருந்தால் (“விமானம் தரையில் இருந்தால் தரையிறங்கும் கியரைத் திரும்பப் பெற வேண்டாம்”), பின்னர் படம் 2 இல் காட்டப்பட்டுள்ள இயந்திரத்தைப் பெற்றிருப்போம்.

நிலை மாற்றம் வரைபடத்தை (அல்லது வேறு ஏதேனும் அல்காரிதம்) உருவாக்கும் போது, ​​பின்வருவனவற்றை மனதில் கொள்ளுங்கள்:

இயந்திர சாதனங்களுடன் ஒப்பிடும்போது கணினிகள் மிக விரைவாக வேலை செய்கின்றன

என்ன செய்ய வேண்டும் என்பதை விளக்கும் மெக்கானிக்கல் இன்ஜினியருக்கு உங்களைப் போல் கணினி மற்றும் அல்காரிதம் பற்றி அதிகம் தெரியாது. இதுவும் ஒரு நேர்மறையான விஷயம், இல்லையெனில் நீங்கள் தேவைப்பட மாட்டீர்கள்!

இயந்திர அல்லது மின் பகுதி உடைந்தால் உங்கள் நிரல் எவ்வாறு செயல்படும்?

வாடிக்கையாளருக்கு உண்மையில் என்ன தேவை என்பதை அடிப்படையாகக் கொண்ட ஒரு அரசு இயந்திரம் படம் 3 இல் காட்டப்பட்டுள்ளது. இங்கே விமானத்தின் தரையிறங்கும் கருவியானது காற்றில் உறுதியாக இருக்கும் வரை பின்வாங்குவதைத் தடுக்க விரும்புகிறோம். இதைச் செய்ய, தரையிறங்கும் சுவிட்சைத் திறந்த பிறகு, இயந்திரம் பல விநாடிகள் காத்திருக்கிறது. விமானத்தின் நெம்புகோலின் உயரும் விளிம்பிற்கு பதில் அளிக்க விரும்புகிறோம். தரையிறங்கும் கியரைத் திரும்பப் பெறுவது அல்லது நீட்டிப்பது சில வினாடிகள் ஆகும், மேலும் இந்த செயல்பாட்டின் போது பைலட் தனது எண்ணத்தை மாற்றி, நெம்புகோலை எதிர் திசையில் நகர்த்துவதற்கான சூழ்நிலைக்கு நாம் தயாராக இருக்க வேண்டும். நாம் "வேயிட்டிங் ஃபார் டேக்ஆஃப்" நிலையில் இருக்கும் போது விமானம் மீண்டும் தரையிறங்கினால், டைமர் ரீஸ்டார்ட் ஆகும், மேலும் விமானம் 2 வினாடிகள் காற்றில் இருந்தால் மட்டுமே லேண்டிங் கியர் பின்வாங்கும்.

வரையறுக்கப்பட்ட நிலை இயந்திரத்தை செயல்படுத்துதல்

பட்டியல் 1 என்பது படம் 3 இல் காட்டப்பட்டுள்ள மாநில இயந்திரத்தின் எனது செயலாக்கமாகும். குறியீட்டின் சில விவரங்களைப் பார்ப்போம்.

/*பட்டியல் 1*/

typedef enum(GEAR_DOWN = 0, WTG_FOR_TKOFF, RAISING_GEAR, GEAR_UP, LOWERING_GEAR) மாநிலத்தின்_வகை;

/*இந்த வரிசையில் குறிப்பிட்ட நிலைகளில் அழைக்கப்படும் செயல்பாடுகளுக்கான சுட்டிகள் உள்ளன*/

வெற்றிடமானது(*state_table)() = (GearDown, WtgForTakeoff, RaisingGear, GearUp, LoweringGear);

மாநில_வகை curr_state;

InitializeLdgGearSM();

/*இயந்திரத்தின் இதயம் இந்த முடிவற்ற வளையமாகும். தொடர்புடைய செயல்பாடு

தற்போதைய நிலை, ஒரு முறை மீண்டும் அழைக்கப்படுகிறது */

போது (1) {

மாநில_அட்டவணை();

DecrementTimer();

வெற்றிடமானது InitializeLdgGearSM( வெற்றிடமானது )

curr_state = GEAR_DOWN;

/*சாதனங்களை நிறுத்துதல், விளக்குகளை அணைத்தல் போன்றவை*/

வெற்றிடமானதுவேகத்தை குறை( வெற்றிடமானது )

/* விமானம் என்றால் காத்திருக்கும் நிலைக்குச் செல்லவும்

தரையில் இல்லை மற்றும் தரையிறங்கும் கியரை உயர்த்துவதற்கான கட்டளையைப் பெற்றது*/

என்றால்((gear_lever == UP) && (prev_gear_lever == DOWN) && (squat_switch == UP)) (

curr_state = WTG_FOR_TKOFF;

prev_gear_lever = gear_lever;

வெற்றிடமானதுரைசிங் கியர்( வெற்றிடமானது )

என்றால்((nosegear_is_up == MADE) && (leftgear_is_up == MADE) && (rtgear_is_up == தயாரிக்கப்பட்டது)) (

curr_state = GEAR_UP;

/*விமானி தனது முடிவை மாற்றிக்கொண்டால், "லேண்டிங் கியர் லோயர்" நிலைக்குச் செல்லவும்*/

என்றால்(கியர்_லீவர் == கீழே) (

curr_state = LOWERING_GEAR;

வெற்றிடமானதுதயாராக இரு( வெற்றிடமானது )

/*பைலட் நெம்புகோலை "கீழே" நிலைக்கு நகர்த்தினால்,

நாங்கள் "லேண்டிங் கியர் குறைக்கும்" நிலைக்குச் செல்கிறோம்*/

என்றால்(கியர்_லீவர் == கீழே) (

curr_state = LOWERING_GEAR;

வெற்றிடமானது WtgForTakeoff( வெற்றிடமானது )

/* தரையிறங்கும் கியரை உயர்த்துவதற்கு முன் காத்திருங்கள்.*/

என்றால்(டைமர்<= 0.0) {

curr_state = RAISING_GEAR;

/*நாம் மீண்டும் தொட்டால் அல்லது விமானி மனம் மாறினால், மீண்டும் தொடங்கவும்*/

என்றால்((squat_switch == DOWN) || (gear_lever == DOWN)) (

curr_state = GEAR_DOWN;

/* அவர் மீண்டும் நெம்புகோலை மாற்ற வேண்டும் என்று விரும்பவில்லை

இது ஒரு துள்ளல் மட்டுமே.*/

prev_gear_lever = கீழே;

வெற்றிடமானதுலோயரிங் கியர்( வெற்றிடமானது )

என்றால்(கியர்_லீவர் == அப்) (

curr_state = RAISING_GEAR;

என்றால்((nosegear_is_down == MADE) && (leftgear_is_down == MADE) &&(rtgear_is_down == MADE)) (

curr_state = GEAR_DOWN;

முதலில், ஒவ்வொரு மாநிலத்தின் செயல்பாடும் தனித்தனி C செயல்பாட்டால் செயல்படுத்தப்படுவதை நீங்கள் கவனிக்கலாம். நிச்சயமாக, ஒவ்வொரு மாநிலத்திற்கும் தனித்தனி வழக்குடன் சுவிட்ச் ஸ்டேட்மென்ட்டைப் பயன்படுத்தி ஒரு ஆட்டோமேட்டனை செயல்படுத்த முடியும், ஆனால் இது மிக நீண்ட செயல்பாட்டிற்கு வழிவகுக்கும் (20-30 மாநிலங்களில் ஒவ்வொன்றிற்கும் ஒரு மாநிலத்திற்கு 10-20 கோடுகள்) . சோதனையின் இறுதிக் கட்டத்தில் குறியீட்டை மாற்றினால் இதுவும் பிழைகளுக்கு வழிவகுக்கும். ஒரு வழக்கின் முடிவில் ஒரு இடைவேளை அறிக்கையை நீங்கள் ஒருபோதும் மறந்திருக்க மாட்டீர்கள், ஆனால் இதுபோன்ற வழக்குகள் எனக்கு நடந்துள்ளன. ஒவ்வொரு மாநிலத்திற்கும் தனித்தனி செயல்பாடு இருந்தால், ஒரு மாநிலத்திற்கான குறியீடு மற்றொரு மாநிலத்திற்கான குறியீட்டில் முடிவடையாது.

ஸ்விட்ச் ஸ்டேட்மெண்ட்டைப் பயன்படுத்துவதைத் தவிர்க்க, மாநிலச் செயல்பாடுகளுக்கு சுட்டிகளின் வரிசையைப் பயன்படுத்துகிறேன், மேலும் வரிசையின் குறியீடாகப் பயன்படுத்தப்படும் மாறியை enum வகையாக அறிவிக்கிறேன்.

எளிமைக்காக, சுவிட்சுகளின் நிலையைப் படிக்கும் பொறுப்பான I/O வன்பொருள், பம்புகளை ஆன் மற்றும் ஆஃப் செய்தல், முதலியன எளிய மாறிகளாகக் குறிப்பிடப்படுகின்றன. இந்த மாறிகள் கண்ணுக்கு தெரியாத வழிமுறைகள் மூலம் வன்பொருளுடன் தொடர்புடைய "மேஜிக் முகவரிகள்" என்று கருதப்படுகிறது.

மற்ற தெளிவான விஷயம் என்னவென்றால், இந்த கட்டத்தில் குறியீடு உண்மையில் முக்கியமில்லை. அவர் வெறுமனே ஒரு மாநிலத்திலிருந்து மற்றொரு மாநிலத்திற்கு நகர்கிறார். இது ஒரு முக்கியமான இடைநிலை படி மற்றும் புறக்கணிக்கப்படக்கூடாது. இன்புட் சிக்னல்களின் தற்போதைய நிலை மற்றும் மதிப்புகளை அச்சிடக்கூடிய நிபந்தனை தொகுப்பு உத்தரவுகளுக்கு (#ifdef DEBUG .. #endif) இடையே அச்சு அறிக்கைகளைச் சேர்ப்பது நன்றாக இருக்கும்.

வெற்றிக்கான திறவுகோல் மாநில மாற்றத்தை ஏற்படுத்தும் குறியீட்டில் உள்ளது, அதாவது. தரவு உள்ளீடு ஏற்பட்டது என்பதை தீர்மானிக்கிறது.

குறியீடு அனைத்து நிலைகளிலும் சரியாகச் சென்றால், அடுத்த கட்டமாக குறியீட்டின் "நிரப்புதல்" எழுத வேண்டும், அதாவது வெளியீட்டு சமிக்ஞையை சரியாக உருவாக்குகிறது. ஒவ்வொரு மாற்றத்திற்கும் உள்ளீட்டு சமிக்ஞையும் (அதை ஏற்படுத்திய நிகழ்வு) மற்றும் வெளியீட்டு சமிக்ஞையும் (எங்கள் எடுத்துக்காட்டில் உள்ள வன்பொருள் I/O சாதனம்) இருப்பதை நினைவில் கொள்ளுங்கள். மாநில மாற்ற அட்டவணையின் வடிவத்தில் இதைப் படம்பிடிப்பது பெரும்பாலும் பயனுள்ளதாக இருக்கும்.

மாநில மாறுதல் அட்டவணையில், மாநில மாற்றத்திற்கு ஒரு வரிசை உள்ளது.

மாநில இயந்திரத்தை குறியிடும் போது, ​​அதன் வலிமையைப் பாதுகாக்க முயற்சிக்கவும்-வாடிக்கையாளரின் தேவைகளுக்கும் குறியீட்டிற்கும் இடையே உள்ள தெளிவான கடிதம். வன்பொருள் விவரங்களை மற்றொரு செயல்பாட்டு அடுக்கில் மறைப்பது அவசியமாக இருக்கலாம், எடுத்துக்காட்டாக, மாநில இயந்திரக் குறியீட்டை ஒரு நிலை மாற்ற அட்டவணை மற்றும் ஒரு நிலை மாற்றம் வரைபடத்தைப் போல இருக்க வேண்டும். இந்த சமச்சீர்மை பிழைகளைத் தடுக்க உதவுகிறது மற்றும் உட்பொதிக்கப்பட்ட அமைப்புகள் புரோகிராமர்களின் ஆயுதக் களஞ்சியத்தின் முக்கிய பகுதியாக மாநில இயந்திரங்கள் ஏன் உள்ளன என்பதை விளக்குகிறது. நிச்சயமாக, நீங்கள் தேர்வுப்பெட்டிகள் மற்றும் எண்ணற்ற உள்ளமைக்கப்பட்ட அறிக்கைகள் மூலம் அதே விளைவை அடைய முடியும், ஆனால் இது குறியீட்டைக் கண்காணிப்பதையும் வாடிக்கையாளரின் விருப்பத்துடன் ஒப்பிடுவதையும் மிகவும் கடினமாக்கும்.

பட்டியல் 2 இல் உள்ள குறியீடு துணுக்கு RaisingGear() செயல்பாட்டை நீட்டிக்கிறது. ரைசிங் கியர்() செயல்பாட்டிற்கான குறியீடு, ரைசிங் கியர் நிலைக்கான டிரான்சிஷன் டேபிளின் 2 வரிசைகளை பிரதிபலிப்பதை நோக்கமாகக் கொண்டுள்ளது என்பதை நினைவில் கொள்ளவும்.

வெற்றிடமானதுரைசிங் கியர்( வெற்றிடமானது )

/*அனைத்து சுவிட்சுகளும் உயர்த்தப்பட்ட பிறகு, "சேஸ் உயர்த்தப்பட்ட" நிலைக்குச் செல்கிறோம்*/

என்றால்((nosegear_is_up == MADE) && (leftgear_is_up == MADE) && (rtgear_is_up == தயாரிக்கப்பட்டது)) (

பம்ப்_மோட்டார் = ஆஃப்;

gear_lights = அணைத்தல்;

curr_state = GEAR_UP;

/*விமானி மனம் மாறினால், தரையிறங்கும் கியரைத் திரும்பப் பெறத் தொடங்குங்கள்*/

என்றால்(கியர்_லீவர் == கீழே) (

பம்ப்_திசை = கீழே;

curr_state = GEAR_LOWERING;

மறைந்திருக்கும் நிலைமைகளைத் தவிர்க்க நினைவில் கொள்ளுங்கள். ஒரு குறிப்பிட்ட நிலையைச் சேர்ப்பதற்குப் பதிலாக, சோம்பேறித்தனத்தால், நிபந்தனைக்குட்பட்ட துணை நிலையைச் சேர்க்க முயற்சிக்கும்போது, ​​மறைந்த நிலை ஏற்படுகிறது. எடுத்துக்காட்டாக, உங்கள் குறியீடு ஒரே உள்ளீட்டு சமிக்ஞையை வெவ்வேறு வழிகளில் (அதாவது வெவ்வேறு நிலை மாற்றங்களைத் தூண்டுகிறது) பயன்முறையைப் பொறுத்து செயலாக்கினால், அது ஒரு மறைக்கப்பட்ட நிலை. இந்த நிலையில், இந்த மாநிலத்தை இரண்டாகப் பிரிக்க வேண்டுமா? மறைக்கப்பட்ட நிலைகளைப் பயன்படுத்துவது மாநில இயந்திரத்தைப் பயன்படுத்துவதன் நன்மையை மறுக்கிறது.

ஒரு நடைமுறையாக, தரையிறங்கும் கியரில் ஒரு காலக்கெடுவைச் சேர்ப்பதன் மூலம் நாங்கள் பார்த்த அரசு இயந்திரத்தை நீட்டிக்கலாம் அல்லது சுழற்சியை நீட்டிக்கலாம், ஏனெனில்... ஹைட்ராலிக் பம்ப் 60 வினாடிகளுக்கு மேல் இயங்குவதை மெக்கானிக்கல் இன்ஜினியர் விரும்பவில்லை. சுழற்சி முடிவடைந்தால், பைலட் பச்சை மற்றும் சிவப்பு விளக்குகளை மாற்றுவதன் மூலம் எச்சரிக்கப்பட வேண்டும், மேலும் மீண்டும் முயற்சி செய்ய நெம்புகோலை மீண்டும் நகர்த்த முடியும். பம்ப் இயங்கும் போது அதன் திசையை மாற்றியமைப்பதன் விளைவு என்ன என்று ஒரு அனுமான இயந்திர பொறியாளரிடம் நீங்கள் கேட்க விரும்பலாம், ஏனெனில் பைலட் தனது மனதை மாற்றும் போது இது இரண்டு நிகழ்வுகளில் நிகழ்கிறது. நிச்சயமாக, மெக்கானிக் எதிர்மறை என்று கூறுவார். திசையை மாற்றும் போது பம்பை விரைவாக நிறுத்தும் வகையில் அரசு இயந்திரத்தை எப்படி மாற்றுவீர்கள்?

மாநில இயந்திர சோதனை

ஸ்டேட் மெஷின்களாக குறியீட்டு வழிமுறைகளின் அழகு என்னவென்றால், சோதனைத் திட்டம் தானாகவே எழுதுகிறது. நீங்கள் செய்ய வேண்டியது ஒவ்வொரு மாநில மாற்றத்தையும் கடந்து செல்ல வேண்டும். நான் வழக்கமாக கையில் ஒரு மார்க்கருடன் இதைச் செய்கிறேன், அவர்கள் தேர்வில் தேர்ச்சி பெறும்போது மாநில மாற்ற வரைபடத்தில் உள்ள அம்புகளைக் கடக்கிறேன். "மறைக்கப்பட்ட நிலைகளை" தவிர்க்க இது ஒரு சிறந்த வழியாகும் - அவை குறிப்பிட்ட நிலைகளை விட சோதனைகளில் அடிக்கடி தவறவிடப்படுகின்றன.

இதற்கு கணிசமான பொறுமை மற்றும் நிறைய காபி தேவைப்படுகிறது, ஏனெனில் ஒரு நடுத்தர அளவிலான மாநில இயந்திரம் கூட 100 வெவ்வேறு மாற்றங்களைக் கொண்டிருக்கலாம். மூலம், மாற்றங்களின் எண்ணிக்கை ஒரு அமைப்பின் சிக்கலை அளவிட ஒரு சிறந்த வழியாகும். பிந்தையது வாடிக்கையாளரின் தேவைகளால் தீர்மானிக்கப்படுகிறது, மேலும் அரசு இயந்திரம் சோதனையின் நோக்கத்தை தெளிவாக்குகிறது. குறைவான ஒழுங்கமைக்கப்பட்ட அணுகுமுறையுடன், தேவைப்படும் சோதனையின் அளவு சுவாரஸ்யமாக இருக்கலாம், ஆனால் அது உங்களுக்குத் தெரியாது.

தற்போதைய நிலை மற்றும் உள்ளீடு மற்றும் வெளியீட்டு சமிக்ஞைகளின் மதிப்புகளைக் காண்பிக்கும் உங்கள் குறியீட்டில் அச்சு அறிக்கைகளைப் பயன்படுத்துவது மிகவும் வசதியானது. மென்பொருள் சோதனையின் கோல்டன் ரூல் வெளிப்படுத்துவதை எளிதாகக் கண்காணிக்க இது உங்களை அனுமதிக்கிறது: நிரல் என்ன செய்ய விரும்புகிறதோ அதைச் செய்கிறது என்பதைச் சரிபார்க்கவும், மேலும் அது தேவையற்ற எதையும் செய்யவில்லை. வேறு வார்த்தைகளில் கூறுவதானால், நீங்கள் எதிர்பார்க்கும் வெளியீடுகளை மட்டுமே பெறுகிறீர்களா, அதைத் தாண்டி வேறு என்ன நடக்கிறது? ஏதேனும் "கடினமான" நிலை மாற்றங்கள் உள்ளதா, அதாவது லூப்பின் ஒரே ஒரு ரிப்பீட் மட்டும் தோராயமாக கடந்து செல்லும் என்று கூறுகிறது? நீங்கள் எதிர்பார்க்காத போது வெளியீடுகள் மாறுமா? வெறுமனே, உங்கள் printfs இன் வெளியீடு குறிப்பிடத்தக்க வகையில் ஒரு நிலை மாற்றம் அட்டவணையை ஒத்திருக்க வேண்டும்.

இறுதியாக - இது எந்த உட்பொதிக்கப்பட்ட மென்பொருளுக்கும் பொருந்தும், மாநில இயந்திர அடிப்படையிலான மென்பொருள் மட்டுமல்ல - உண்மையான வன்பொருளில் மென்பொருளை இயக்கும் போது மிகவும் கவனமாக இருங்கள். சிக்னல் துருவத்தை தவறாகப் புரிந்துகொள்வது மிகவும் எளிதானது - "ஓ, நான் 1 என்பது தரையிறங்கும் கியரைக் குறிக்கிறது மற்றும் 0 என்பது தரையிறங்கும் கியரைக் குறைக்கிறது என்று நினைத்தேன்." பல சமயங்களில், எனது மென்பொருள் சரியான திசையில் விஷயங்களை நகர்த்துவதை உறுதி செய்யும் வரை மதிப்புமிக்க கூறுகளைப் பாதுகாக்க எனது வன்பொருள் உதவியாளர் தற்காலிக "சிக்கன் சுவிட்சை" பயன்படுத்துவார்.

துவக்கவும்

அனைத்து வாடிக்கையாளரின் தேவைகளும் பூர்த்தி செய்யப்பட்டால், ஓரிரு நாட்களில் இதேபோன்ற சிக்கலான ஒரு மாநில இயந்திரத்தை நான் தொடங்க முடியும். எப்பொழுதும் இயந்திரங்கள் நான் விரும்பியதைச் செய்கின்றன. மிகவும் கடினமான விஷயம் என்னவென்றால், வாடிக்கையாளர் என்ன விரும்புகிறார் என்பதை சரியாகப் புரிந்துகொள்வது மற்றும் வாடிக்கையாளருக்கு அவர் என்ன விரும்புகிறார் என்பதை உறுதிப்படுத்துவது. பிந்தையது அதிக நேரம் எடுக்கும்!

மார்ட்டின் கோம்ஸ் ஜான்ஸ் ஹாப்கின்ஸ் பல்கலைக்கழகத்தில் பயன்பாட்டு இயற்பியல் ஆய்வகத்தில் ஒரு புரோகிராமர் ஆவார். ஆராய்ச்சி விண்கலங்களின் விமானங்களை ஆதரிக்க மென்பொருள் உருவாக்கத்தில் ஈடுபட்டுள்ளது. உட்பொதிக்கப்பட்ட அமைப்புகள் மேம்பாட்டுத் துறையில் 17 ஆண்டுகள் பணியாற்றினார். மார்ட்டின் ஏரோஸ்பேஸ் இன்ஜினியரிங்கில் இளங்கலை பட்டமும், கார்னெல் பல்கலைக்கழகத்தில் மின் பொறியியலில் முதுகலை அறிவியல் பட்டமும் பெற்றுள்ளார்.

சுவிட்ச் கன்ஸ்ட்ரக்ட்கள், ரன்டைம் டேபிள்கள் மற்றும் பூஸ்ட் ஸ்டேட்சார்ட் லைப்ரரி ஆகியவற்றைப் பயன்படுத்தி எளிய வரையறுக்கப்பட்ட நிலை இயந்திரங்கள் மற்றும் அவற்றை C++ இல் செயல்படுத்துவது பற்றி கட்டுரை விவாதிக்கிறது.

அறிமுகம்

தோராயமாகச் சொன்னால், பயனரின் பார்வையில் ஒரு ஃபைனிட் ஸ்டேட் மெஷின் என்பது ஒரு கருப்புப் பெட்டியாகும், அதில் எதையாவது மாற்றலாம் மற்றும் அங்கிருந்து ஏதாவது பெறலாம். இது மிகவும் வசதியான சுருக்கமாகும், இது ஒரு சிக்கலான வழிமுறையை மறைக்க உங்களை அனுமதிக்கிறது, மேலும் வரையறுக்கப்பட்ட நிலை இயந்திரங்களும் மிகவும் திறமையானவை.

வரையறுக்கப்பட்ட நிலை இயந்திரங்கள் மாநிலங்கள் மற்றும் மாற்றங்களைக் கொண்ட வரைபடங்களின் வடிவத்தில் சித்தரிக்கப்படுகின்றன. ஒரு எளிய உதாரணத்துடன் விளக்குகிறேன்:

நீங்கள் யூகித்தபடி, இது ஒரு ஒளி விளக்கின் நிலை வரைபடம். ஆரம்ப நிலை ஒரு கருப்பு வட்டத்தால் குறிக்கப்படுகிறது, அம்புகளால் மாற்றங்கள், சில அம்புகள் பெயரிடப்பட்டுள்ளன - இவை இயந்திரம் மற்றொரு நிலைக்கு செல்லும் நிகழ்வுகள். எனவே, ஆரம்ப நிலையிலிருந்து உடனடியாக, நாம் மாநிலத்தில் இருப்பதைக் காண்கிறோம் லைட் ஆஃப்- விளக்கு எரிவதில்லை. நீங்கள் பொத்தானை அழுத்தினால், இயந்திரம் அதன் நிலையை மாற்றி, குறிக்கப்பட்ட அம்புக்குறியைப் பின்பற்றும் புஷ் பட்டன், ஒரு மாநிலத்தில் வெளிச்சம்- விளக்கு எரிகிறது. இந்த நிலையில் இருந்து, மீண்டும் அம்புக்குறியைப் பின்தொடர்ந்து, பொத்தானை அழுத்திய பின், மாநிலத்திற்குச் செல்லலாம் லைட் ஆஃப்.

மாற்ற அட்டவணைகளும் பரவலாகப் பயன்படுத்தப்படுகின்றன:

தானியங்கி இயந்திரங்களின் நடைமுறை பயன்பாடு

நிரலாக்கத்தில் வரையறுக்கப்பட்ட நிலை இயந்திரங்கள் பரவலாகப் பயன்படுத்தப்படுகின்றன. உதாரணமாக, ஒரு தானியங்கி இயந்திரத்தின் வடிவத்தில் ஒரு சாதனத்தின் செயல்பாட்டை கற்பனை செய்வது மிகவும் வசதியானது. இது குறியீட்டை எளிமையாகவும், பரிசோதனை செய்து பராமரிக்கவும் எளிதாக்கும்.

மேலும், அனைத்து வகையான பாகுபடுத்திகள் மற்றும் உரை பகுப்பாய்விகளை எழுத வரையறுக்கப்பட்ட நிலை இயந்திரங்கள் பயன்படுத்தப்படுகின்றன; அவற்றின் உதவியுடன், நீங்கள் திறம்பட சப்ஸ்ட்ரிங்க்களைத் தேடலாம்; வழக்கமான வெளிப்பாடுகள் வரையறுக்கப்பட்ட நிலை இயந்திரத்தில் மொழிபெயர்க்கப்படுகின்றன.

எடுத்துக்காட்டாக, உரையில் எண்கள் மற்றும் சொற்களை எண்ணுவதற்கு ஒரு ஆட்டோமேட்டனை செயல்படுத்துவோம். தொடங்குவதற்கு, ஒரு எண் தன்னிச்சையான நீளம் கொண்ட 0 முதல் 9 வரையிலான எண்களின் வரிசையாகக் கருதப்படும், அதைச் சுற்றிலும் இடைவெளி எழுத்துக்கள் (வெளி, தாவல், வரி ஊட்டம்) இருக்கும் என்பதை ஒப்புக்கொள்வோம். ஒரு சொல் எழுத்துகளைக் கொண்ட தன்னிச்சையான நீளத்தின் வரிசையாகக் கருதப்படும், மேலும் அது இடைவெளி எழுத்துகளால் சூழப்பட்டுள்ளது.

வரைபடத்தைப் பார்ப்போம்:

ஆரம்ப நிலையிலிருந்து நாம் நிலைக்கு வருகிறோம் தொடங்கு. தற்போதைய எழுத்தை நாங்கள் சரிபார்க்கிறோம், அது ஒரு கடிதமாக இருந்தால், நாங்கள் மாநிலத்திற்குச் செல்கிறோம் சொல்என குறிக்கப்பட்ட அம்புக்குறியுடன் கடிதம். நாங்கள் தற்போது ஒரு வார்த்தையை பரிசீலித்து வருகிறோம் என்று இந்த நிலை கருதுகிறது; மேலும் சின்னங்களின் பகுப்பாய்வு இந்த அனுமானத்தை உறுதிப்படுத்தும் அல்லது அதை மறுக்கும். எனவே, அடுத்த எழுத்தைக் கவனியுங்கள், அது ஒரு எழுத்தாக இருந்தால், நிலை மாறாது (இவ்வாறு குறிக்கப்பட்ட வட்ட அம்புக்குறியைக் கவனியுங்கள் கடிதம்) எழுத்து ஒரு எழுத்து அல்ல, ஆனால் ஒரு இடைவெளி எழுத்துடன் ஒத்திருந்தால், இதன் பொருள் அனுமானம் சரியானது மற்றும் நாங்கள் வார்த்தையைக் கண்டுபிடித்தோம் (அம்புக்குறியைப் பின்பற்றுகிறோம் விண்வெளிஒரு மாநிலத்தில் தொடங்கு) எழுத்து ஒரு எழுத்தாகவோ அல்லது இடமாகவோ இல்லை என்றால், நாம் அனுமானத்தில் தவறு செய்துள்ளோம், மேலும் நாம் கருத்தில் கொள்ளும் வரிசை ஒரு வார்த்தை அல்ல (அம்புக்குறியைப் பின்தொடரவும் தெரியவில்லைஒரு மாநிலத்தில் தவிர்க்கவும்).

திறன் தவிர்க்கவும்ஒரு இடைவெளி பாத்திரம் சந்திக்கும் வரை நாங்கள் இருக்கிறோம். ஒரு இடைவெளி கண்டறியப்பட்ட பிறகு, நாங்கள் அம்புக்குறியைப் பின்பற்றுகிறோம் விண்வெளிஒரு மாநிலத்தில் தொடங்கு. எங்கள் தேடல் முறையுடன் பொருந்தாத ஒரு வரியை முற்றிலும் தவிர்க்க இது அவசியம்.

மாநிலத்திற்குள் நுழைந்த பிறகு தொடங்கு, தேடல் சுழற்சி ஆரம்பத்திலிருந்தே மீண்டும் நிகழ்கிறது. எண் அறிதல் கிளை வார்த்தை அங்கீகாரம் கிளை போன்றது.

சுவிட்ச் வழிமுறைகளைப் பயன்படுத்தி தானியங்கு

முதலாவது சாத்தியமான நிலைகள்:

அதன் பிறகு, தற்போதைய குறியீட்டை இயந்திரத்தில் நழுவவிட்டு, வரியின் மேல் மீண்டும் செய்கிறோம். ஆட்டோமேட்டன் என்பது ஒரு சுவிட்ச் அறிவுறுத்தலாகும், இது முதலில் தற்போதைய நிலையின் பகுதிக்கு மாற்றத்தை செய்கிறது. பிரிவின் உள்ளே if-else கன்ஸ்ட்ரக்ட் உள்ளது, இது நிகழ்வைப் பொறுத்து (உள்வரும் சின்னம்), தற்போதைய நிலையை மாற்றுகிறது:

const size_t நீளம் = text.length(); (size_t i = 0; i! = length; ++ i) ( const char current = text[i] ; switch (state) ( case State_Start: if (std:: isdigit (current) ) ( state = State_Number; ) வேறு என்றால் (std:: isalpha (தற்போதைய) ) ( state = State_Word; ) முறிவு ; வழக்கு State_Number: if (std:: isspace (தற்போதைய) ) (

இங்கே நாம் வரைபடத்தைப் பார்க்கிறோம் - தற்போதைய நிலை எண், நிகழ்வு விண்வெளி(ஒரு ஸ்பேஸ் கேரக்டர் எதிர்கொண்டது), அதாவது எண் காணப்படுகிறது:

FoundNumber() ; மாநிலம் = மாநிலம்_தொடக்கம்; ) இல்லையெனில் (! std::isdigit(தற்போதைய) ) (நிலை = State_Skip; ) முறிவு ; வழக்கு State_Word: என்றால் (std:: isspace (current) ) ( FoundWord() ; state = State_Start; ) இல்லையெனில் (! std:: isalpha (தற்போதைய) ) ( state = State_Skip; ) முறிவு ; வழக்கு State_Skip: if (std::isspace (தற்போதைய) ) ( state = State_Start; ) முறிவு ; ))

விளைவாக:

உயர் செயல்திறன்

எளிமையான அல்காரிதம்களை செயல்படுத்துவது எளிது

- பராமரிப்பது கடினம்

இயக்க நேர விளக்கம்

இந்த அணுகுமுறையின் யோசனை எளிதானது - நீங்கள் ஒரு மாற்றம் அட்டவணையை உருவாக்க வேண்டும், அதை நிரப்ப வேண்டும், பின்னர், ஒரு நிகழ்வு நிகழும்போது, ​​அட்டவணையில் அடுத்த நிலையைக் கண்டுபிடித்து மாற்றத்தை உருவாக்கவும்:

enum நிகழ்வுகள் ( Event_Space, Event_Digit, Event_Letter, Event_Unknown ) ; செயலற்ற நிகழ்வு (நிகழ்வுகள் நிகழ்வு) ; ... struct Transition (States BaseState_; Events Event_; States TargetState_; ); void AddTransition (மாநிலத்திலிருந்து மாநிலங்கள், நிகழ்வுகள் நிகழ்வு, மாநிலங்கள் முதல் மாநிலம் வரை) ; ...typedef std::vector< transition>மாற்றம் அட்டவணை; TransitionTable Transitions_; மாநிலங்கள் தற்போதைய மாநிலம்_;

அட்டவணையை நிரப்புதல்:

AddTransition(State_Start, Event_Digit, State_Number) ; AddTransition(State_Start, Event_Letter, State_Word) ; AddTransition(State_Number, Event_Space, State_Start) ; AddTransition(State_Number, Event_Letter, State_Skip) ; AddTransition(State_Number, Event_Unknown, State_Skip) ; AddTransition(State_Word, Event_Space, State_Start) ; AddTransition(State_Word, Event_Digit, State_Skip) ; AddTransition(State_Word, Event_Unknown, State_Skip) ; AddTransition(State_Skip, Event_Space, State_Start) ;

இது மிகவும் தெளிவாக மாறியது. தெளிவுக்கான விலை இயந்திரத்தின் மெதுவான செயல்பாடாக இருக்கும், இருப்பினும், இது பெரும்பாலும் ஒரு பொருட்டல்ல.

இயந்திரம், சில நிகழ்வுகள் நிகழும்போது, ​​சில குறியீட்டை அறிவிக்க முடியும், மாற்றத்தைப் பற்றிய தகவலுடன் அதை கட்டமைப்பில் சேர்க்கலாம் ( மாற்றம்செயல்பாடு சுட்டிக்காட்டி ( செயல்), இது அழைக்கப்படும்:

typedef void (DynamicMachine::* Action) () ; struct Transition (States BaseState_; Events Event_; States TargetState_; Action Action_; ) ; ... void AddTransition (மாநிலத்திலிருந்து மாநிலங்கள், நிகழ்வுகள் நிகழ்வு, மாநிலங்கள் முதல் மாநிலம், அதிரடி நடவடிக்கை) ; ...AddTransition(State_Number, Event_Space, State_Start, & DynamicMachine::FoundNumber) ;

விளைவாக:

நெகிழ்வுத்தன்மை மற்றும் தெரிவுநிலை

பராமரிக்க எளிதானது

- சுவிட்ச் பிளாக்குகளுடன் ஒப்பிடும்போது குறைந்த செயல்திறன்

செயல்படுத்தும் நேரத்தின் விளக்கம். வேக உகப்பாக்கம்

பார்வையை வேகத்துடன் இணைக்க முடியுமா? சுவிட்ச் பிளாக்குகளை அடிப்படையாகக் கொண்ட ஒரு தானியங்கி இயந்திரத்தைப் போல ஒரு தானியங்கி இயந்திரத்தை செயல்திறன் மிக்கதாக மாற்றுவது சாத்தியமில்லை, ஆனால் இடைவெளியை மூடுவது சாத்தியமாகும். இதைச் செய்ய, நீங்கள் அட்டவணையில் இருந்து ஒரு மேட்ரிக்ஸை உருவாக்க வேண்டும், அதாவது மாற்றம் பற்றிய தகவலைப் பெற, நீங்கள் தேட வேண்டிய அவசியமில்லை, ஆனால் மாநில மற்றும் நிகழ்வு எண் மூலம் ஒரு தேர்வு செய்யுங்கள்:

நினைவக நுகர்வு செலவில் இதன் விளைவாக அடையப்படுகிறது.

விளைவாக:

நெகிழ்வுத்தன்மை, தெரிவுநிலை

பயனுள்ள

- நினைவக நுகர்வு (பெரும்பாலும் முக்கியமற்றது)

மாநில விளக்கப்படத்தை அதிகரிக்கவும்

அரசு இயந்திரத்தை நீங்களே செயல்படுத்த பல வழிகளை நாங்கள் விவாதித்தோம். ஒரு மாற்றத்திற்காக, பூஸ்டிலிருந்து இயந்திரங்களை உருவாக்குவதற்கான நூலகத்தை பரிசீலிக்க முன்மொழிகிறேன். இந்த நூலகம் மிகவும் சக்தி வாய்ந்தது; வழங்கப்படும் திறன்கள் மிகவும் சிக்கலான வரையறுக்கப்பட்ட நிலை இயந்திரங்களை உருவாக்க உங்களை அனுமதிக்கின்றன. நாங்கள் அதை மிக விரைவாகப் பார்ப்போம்.

எனவே, முதலில் நாம் நிகழ்வுகளை வரையறுக்கிறோம்:

பெயர்வெளி நிகழ்வுகள் (struct Digit : boost::statechart::event< Digit>(); struct கடிதம் : boost::statechart:: event< Letter>(); struct Space: boost::statechart:: event< Space>(); struct தெரியவில்லை : boost::statechart::event< Unknown> { } ; }

இயந்திரமே (இரண்டாவது டெம்ப்ளேட் அளவுரு ஆரம்ப நிலை என்பதை நினைவில் கொள்ளவும்):

struct இயந்திரம்: boost::statechart::state_machine< Machine, States:: Start > { } ;

மற்றும் மாநிலங்கள் அவர்களே. மாநிலங்களுக்குள், மாற்றங்களை விவரிக்கும் வகையைத் தீர்மானிக்க வேண்டியது அவசியம் ( எதிர்வினைகள்), மற்றும் பல மாற்றங்கள் இருந்தால், அவற்றை boost::mpl::list வகை பட்டியலில் பட்டியலிடவும். இரண்டாவது டெம்ப்ளேட் அளவுரு எளிய_நிலை- இயந்திரத்தை விவரிக்கும் வகை. மாற்றங்கள் ஒரு ஜோடி, மாற்றம் டெம்ப்ளேட்டின் அளவுருக்கள் மூலம் விவரிக்கப்படுகின்றன நிகழ்வு - அடுத்த மாநிலம்:

பெயர்வெளி மாநிலங்கள் (struct Start : boost::statechart::simple_state< Start, Machine> < boost:: statechart :: transition < Events:: Digit , States:: Number >< Events:: Letter , States:: Word >> எதிர்வினைகள்; ); struct Number : boost::statechart::simple_state< Number, Machine>( typedef boost::mpl::list< boost:: statechart :: transition < Events:: Space , States:: Start >, boost::statechart::transition< Events:: Letter , States:: Skip >, boost::statechart::transition< Events:: Unknown , States:: Skip >> எதிர்வினைகள்; ); struct Word: boost::statechart::simple_state< Word, Machine>( typedef boost::mpl::list< boost:: statechart :: transition < Events:: Space , States:: Start >, boost::statechart::transition< Events:: Digit , States:: Skip >, boost::statechart::transition< Events:: Unknown , States:: Skip >> எதிர்வினைகள்; ); struct தவிர்: boost::statechart::simple_state< Skip, Machine>( typedef boost::statechart::transition< Events:: Space , States:: Start >எதிர்வினைகள்; ); )

இயந்திரம் கட்டமைக்கப்பட்டுள்ளது, அதைத் தொடங்குவது மட்டுமே எஞ்சியுள்ளது, நீங்கள் அதைப் பயன்படுத்தலாம்:

இயந்திர இயந்திரம்; machine.initiate(); ...machine.process_event(நிகழ்வுகள்::Space());

விளைவாக:

நெகிழ்வுத்தன்மை, விரிவாக்கம்

- செயல்திறன்

செயல்திறன்

கட்டப்பட்ட இயந்திரங்களின் செயல்திறனை சரிபார்க்க நான் ஒரு சோதனை நிரலை எழுதினேன். இயந்திரங்கள் மூலம் ~17 MB உரையை இயக்கினேன். ஓட்டத்தின் முடிவுகள் இங்கே:

உரையை ஏற்றுகிறது உரை நீளம்: 17605548 பைட்டுகள் 0.19 கள் இயங்கும் பூஸ்ட்மெஷின் வார்த்தைகள்: 998002, எண்கள்: 6816 0.73 கள் இயங்கும் டைனமிக் மெஷின் வார்த்தைகள்: 998002, எண்கள்: 6816 0.568 வார்த்தைகள்: 0.590 6816 0.29 s ரன்னிங் சிம்பிள் மெஷின் வார்த்தைகள்: 998002, எண்கள் : 6816 0.20 வி

ஆய்வு செய்யாமல் என்ன இருக்கிறது

வரையறுக்கப்பட்ட நிலை இயந்திரங்களின் பல செயலாக்கங்கள் இன்னும் வெளிவரவில்லை (http://www.rsdn.ru/article/alg/Static_Finite_State_Machine.xml மற்றும் http://www.rsdn.ru/article/alg/FiniteStateMachine.xml ஐ பரிந்துரைக்கிறேன்) , விளக்கங்களிலிருந்து இயந்திரங்களை உருவாக்கும் ஜெனரேட்டர்கள், பூஸ்ட் பதிப்பு 1.44.0 இலிருந்து மெட்டா ஸ்டேட் மெஷின் லைப்ரரி, அத்துடன் வரையறுக்கப்பட்ட நிலை இயந்திரங்களின் முறையான விளக்கங்கள். ஆர்வமுள்ள வாசகர் மேலே உள்ள அனைத்தையும் தானே தெரிந்துகொள்ள முடியும்.

ஆட்டோமேட்டா கோட்பாடு என்பது தனித்த கணிதத்தின் ஒரு பிரிவாகும், இது தனித்தனி தகவல் மாற்றிகளின் மாதிரிகளை ஆய்வு செய்கிறது. இத்தகைய மாற்றிகள் உண்மையான சாதனங்கள் (கணினிகள், உயிரினங்கள்) மற்றும் கற்பனை சாதனங்கள் (அச்சு கோட்பாடுகள், கணித இயந்திரங்கள்). அடிப்படையில், ஒரு வரையறுக்கப்பட்ட நிலை இயந்திரத்தை ஒரு சாதனமாக வகைப்படுத்தலாம் எம் , உள்ளீடு மற்றும் வெளியீட்டு சேனல்கள் மற்றும் கடிகார தருணங்கள் எனப்படும் தனித்தனியான நேரங்கள் ஒவ்வொன்றிலும், இது இறுதி நிலைகளில் ஒன்றாகும்.

ஒவ்வொரு தருணத்திலும் உள்ளீடு சேனல் மூலம் டி =1, 2, ... சாதனத்திற்கு எம் உள்ளீட்டு சமிக்ஞைகள் வரும் (சில வரையறுக்கப்பட்ட சிக்னல்களிலிருந்து). உள்ளீட்டு சமிக்ஞை மற்றும் தற்போதைய நேரத்தில் சாதனத்தின் நிலையைப் பொறுத்து அடுத்த முறை மாநில மாற்றத்தின் சட்டம் அமைக்கப்படுகிறது. வெளியீட்டு சமிக்ஞை தற்போதைய நேரத்தில் நிலை மற்றும் உள்ளீட்டு சமிக்ஞையைப் பொறுத்தது (படம் 1).

ஒரு வரையறுக்கப்பட்ட நிலை இயந்திரம் என்பது உண்மையான தனித்த தகவல் செயலாக்க சாதனங்களின் கணித மாதிரியாகும்.

அரசு இயந்திரம் அமைப்பு என்று அழைக்கப்படுகிறது A= (எக்ஸ் , கே , ஒய் , , ), எங்கே எக்ஸ் , கே , ஒய் தன்னிச்சையான வெற்று அல்லாத வரையறுக்கப்பட்ட தொகுப்புகள், மற்றும் மற்றும் - செயல்பாடுகள், இதில்:

    ஒரு கொத்து எக்ஸ் ={ 1 , ..., மீ ) என்று அழைக்கப்படுகிறது உள்ளீடு எழுத்துக்கள் , மற்றும் அதன் கூறுகள் உள்ளீட்டு சமிக்ஞைகள் , அவற்றின் வரிசைகள் உள்ளன பொதுவான வார்த்தைகளில் ;

    ஒரு கொத்து கே ={கே 1 , ..., கே n ) என்று அழைக்கப்படுகிறது பல மாநிலங்கள் ஆட்டோமேட்டன் மற்றும் அதன் கூறுகள் - மாநிலங்களில் ;

    ஒரு கொத்து ஒய் ={பி 1 , ..., பி ) என்று அழைக்கப்படுகிறது வெளியீடு எழுத்துக்கள் , அதன் கூறுகள் வெளியீட்டு சமிக்ஞைகள் , அவற்றின் வரிசைகள் வெளியேறும் வார்த்தைகள் ;

    செயல்பாடு : எக்ஸ் கே கே அழைக்கப்பட்டது மாற்றம் செயல்பாடு ;

    செயல்பாடு :எக்ஸ் கே ஒய் அழைக்கப்பட்டது வெளியீடு செயல்பாடு .

இதனால், (எக்ஸ் , கே )கே , (எக்ஸ் , கே )ஒய் க்கு எக்ஸ் எக்ஸ் , கே கே .

ஒரு வரையறுக்கப்பட்ட நிலை இயந்திரம் பின்வருமாறு செயல்படும் ஒரு கற்பனை சாதனத்துடன் தொடர்புடையது. இது பல மாநிலங்களில் ஒன்றில் இருக்கலாம் கே , பல்வேறு வகையான சமிக்ஞைகளை உணர்தல் எக்ஸ் மற்றும் பல்வேறு சிக்னல்களை வெளியிடுகிறது ஒய் .

2. வரையறுக்கப்பட்ட நிலை இயந்திரத்தைக் குறிப்பிடுவதற்கான முறைகள்

சுருக்க ஆட்டோமேட்டாவை வரையறுக்க பல சமமான வழிகள் உள்ளன, அவற்றில் மூன்றை பெயரிடலாம்: அட்டவணை , வடிவியல் மற்றும் செயல்பாட்டு .

2.1. இயந்திரத்தின் அட்டவணைப் பணி

ஒரு ஆட்டோமேட்டனின் வரையறையிலிருந்து, அது எப்போதும் இரண்டு உள்ளீடுகளைக் கொண்ட அட்டவணையால் குறிப்பிடப்படலாம். டி கோடுகள் மற்றும் பி நெடுவரிசைகள், நெடுவரிசையின் குறுக்குவெட்டில் கே மற்றும் சரங்கள் செயல்பாட்டு மதிப்புகள் ஆகும் ( நான் , கே ஜே ), ( நான் , கே ஜே ).

கே

கே 1

கே ஜே

கே n

1

( 1 , கே 1), ( 1 , கே 1)

( 1 , கே ஜே ), ( 1 , கே ஜே )

( 1 , கே n ), ( 1 , கே n )

நான்

( நான் , கே 1), ( நான் , கே 1)

( நான் , கே ஜே ), ( நான் , கே ஜே )

( நான் , கே n ), ( நான் , கே n )

மீ

( மீ , கே 1), ( மீ , கே 1)

( மீ , கே ஜே ), ( மீ , கே ஜே )

( மீ , கே n ), ( மீ , கே n )

2.2 மூர் வரைபடத்தைப் பயன்படுத்தி ஒரு ஆட்டோமேட்டனைக் குறிப்பிடுதல்

வரையறுக்கப்பட்ட நிலை இயந்திரத்தை வரையறுப்பதற்கான மற்றொரு வழி, வரைபடத்தைப் பயன்படுத்துவதாகும். ஆட்டோமேட்டன் ஒரு பெயரிடப்பட்ட இயக்கப்பட்ட வரைபடமாக சித்தரிக்கப்படுகிறது ஜி(கே , டி ) பல முனைகளுடன் கே மற்றும் பல வளைவுகள் டி ={(கே ஜே , ( நான் , கே ஜே ))| கே ஜே கே , நான் எக்ஸ் , வில் போது ( கே ஜே , ( நான் , கே ஜே )) ஜோடி ( நான் , ( நான் , கே ஜே )). எனவே, இந்த முறை மூலம், இயந்திரத்தின் நிலைகள் மாநில சின்னங்கள் எழுதப்பட்ட வட்டங்களால் சித்தரிக்கப்படுகின்றன கே ஜே (ஜே = 1, …, n ) ஒவ்வொரு வட்டத்திலிருந்தும் அது மேற்கொள்ளப்படுகிறது டி அம்புக்குறிகள் (சார்ந்த விளிம்புகள்) உள்ளீட்டு எழுத்துக்களின் எழுத்துக்களுடன் தொடர்புடைய ஒன்றுக்கு ஒன்று எக்ஸ் ={ 1 , ..., மீ ) எழுத்துடன் தொடர்புடைய அம்பு நான் எக்ஸ் மற்றும் வட்டத்தை விட்டு வெளியேறுகிறது கே ஜே கே , ஜோடிக்குக் காரணம் ( நான் , ( நான் , கே ஜே )), மற்றும் இந்த அம்புக்குறி தொடர்புடைய வட்டத்திற்கு வழிவகுக்கிறது ( நான் , கே ஜே ).

இதன் விளைவாக வரைதல் அழைக்கப்படுகிறது தானியங்கி வரைபடம் அல்லது, மூர் வரைபடம் . மிகவும் சிக்கலான இயந்திரங்களுக்கு, இந்த முறை மிகவும் காட்சியானது அட்டவணை.