- FreeRTOS Arduino இல் ஒரு பணியை நீக்குகிறது
- FreeRTOS இல் வரிசை என்ன?
- FreeRTOS இல் ஒரு வரிசையை உருவாக்குதல்
- சுற்று வரைபடம்
- Arduino IDE இல் FreeRTOS வரிசையை செயல்படுத்துகிறது
முந்தைய டுடோரியலில், Arduino Uno இல் FreeRTOS ஐ அறிமுகப்படுத்தினோம் மற்றும் ஒளிரும் எல்.ஈ. இப்போது, இந்த டுடோரியலில், ஆர்டிஓஎஸ் ஏபிஐகளின் முன்கூட்டிய கருத்தாக்கங்களுக்கு மேலும் முழுக்குவோம் மற்றும் வெவ்வேறு பணிகளுக்கு இடையிலான தொடர்பு பற்றி அறிந்து கொள்வோம். ஒரு பணியிலிருந்து இன்னொரு பணிக்கு தரவை மாற்றுவதற்கும் , வரிசை ஏபிஐக்களின் செயல்பாட்டை ஆர்டுயினோ யூனோவுடன் 16x2 எல்சிடி மற்றும் எல்.டி.ஆரை இணைப்பதன் மூலம் வரிசை பற்றி இங்கே கற்றுக்கொள்கிறோம்.
வரிசைகளைப் பற்றி விவாதிப்பதற்கு முன், இன்னும் ஒரு FreeRTOS API ஐப் பார்ப்போம், இது ஒதுக்கப்பட்ட வேலையுடன் முடிந்ததும் பணிகளை நீக்க உதவுகிறது. ஒதுக்கப்பட்ட நினைவகத்தை விடுவிக்க சில நேரங்களில் பணி நீக்கப்பட வேண்டும். முந்தைய டுடோரியலின் தொடர்ச்சியாக, பணிகளில் ஒன்றை நீக்க அதே குறியீட்டில் vTaskDelete () API செயல்பாட்டைப் பயன்படுத்துவோம். ஒரு பணி தன்னை நீக்க vTaskDelete () API செயல்பாட்டைப் பயன்படுத்தலாம் அல்லது வேறு எந்த பணியையும் பயன்படுத்தலாம்.
இந்த API ஐப் பயன்படுத்த, நீங்கள் FreeRTOSConfig.h கோப்பை உள்ளமைக்க வேண்டும். பயன்பாட்டிற்கு ஏற்ப FreeRTOS ஐத் தக்கவைக்க இந்த கோப்பு பயன்படுத்தப்படுகிறது. திட்டமிடல் வழிமுறைகள் மற்றும் பல அளவுருக்களை மாற்ற இது பயன்படுகிறது. உங்கள் கணினியின் ஆவணங்கள் கோப்புறையில் பொதுவாகக் கிடைக்கும் Arduino அடைவில் கோப்பைக் காணலாம். என் விஷயத்தில், இது கீழே காட்டப்பட்டுள்ளபடி \ ஆவணங்கள் \ Arduino \ நூலகங்கள் \ FreeRTOS \ src இல் கிடைக்கிறது .

இப்போது, எந்த உரை ஆசிரியர் பயன்படுத்தி இந்த கோப்பை திறக்க மற்றும் தேட INCLUDE_vTaskDelete வரையறுத்து மற்றும் உறுதி அதன் மதிப்பு செய்ய '1' (1 வழிமுறையாக செயல்படுத்த மற்றும் 0 வழிமுறையாக முடக்க). இது இயல்பாக 1 ஆகும், ஆனால் அதை சரிபார்க்கிறது.

அளவுருக்களை அமைப்பதற்கான எங்கள் அடுத்த டுடோரியல்களில் இந்த கட்டமைப்பு கோப்பை அடிக்கடி பயன்படுத்துவோம்.
இப்போது, ஒரு பணியை எவ்வாறு நீக்குவது என்று பார்ப்போம்.
FreeRTOS Arduino இல் ஒரு பணியை நீக்குகிறது
ஒரு பணியை நீக்க, vTaskDelete () API செயல்பாட்டைப் பயன்படுத்த வேண்டும். இது ஒரு வாதத்தை மட்டுமே எடுக்கும்.
vTaskDelete (TaskHandle_t pxTaskToDelete);
pxTaskToDelete: இது நீக்கப்பட வேண்டிய பணியின் கைப்பிடி. இது xTaskCreate () API இன் 6 வது வாதத்திற்கு சமம் . முந்தைய டுடோரியலில், இந்த வாதம் NULL என அமைக்கப்பட்டுள்ளது, ஆனால் எந்தவொரு பெயரையும் பயன்படுத்தி பணியின் உள்ளடக்கங்களின் முகவரியை அனுப்பலாம். டாஸ்க் 2 க்காக டாஸ்க் ஹேண்டில் அமைக்க வேண்டுமா எனக் கூறலாம்
TaskHandle_t any_name; எடுத்துக்காட்டு: TaskHandle_t xTask2Handle;
இப்போது, vTaskCreate () API இல் 6 வது வாதத்தை அமைக்கவும்
xTaskCreate (TaskBlink2, "task2", 128, NULL, 1, & xTask2Handle);
இந்த பணியின் உள்ளடக்கத்தை இப்போது நீங்கள் வழங்கிய கைப்பிடியைப் பயன்படுத்தி அணுகலாம்.
மேலும், சரியான பணி கைப்பிடிக்கு பதிலாக NULL ஐ அனுப்புவதன் மூலம் ஒரு பணி தன்னை நீக்க முடியும்.
பணி 3 இலிருந்து பணி 3 ஐ நீக்க விரும்பினால், நீங்கள் vTaskDelete (NULL) ஐ எழுத வேண்டும் ; பணி 3 செயல்பாட்டிற்குள் ஆனால் பணி 2 இலிருந்து பணி 3 ஐ நீக்க விரும்பினால் vTaskDelete (xTask3Handle) எழுதவும் ; பணி 2 செயல்பாடு உள்ளே.
முந்தைய டுடோரியல் குறியீட்டில், பணி 2 இலிருந்து பணி 2 ஐ நீக்க, vTaskDelete (NULL) ஐச் சேர்க்கவும் ; உள்ள வெற்றிடத்தை TaskBlink2 (வெற்றிடத்தை * pvParameters) செயல்பாடு. பின்னர் மேலே உள்ள செயல்பாடு இப்படி இருக்கும்
TaskBlink2 (void * pvParameters) { Serial.println (“Task2 இயங்குகிறது மற்றும் நீக்கப்போகிறது”); vTaskDelete (NULL); pinMode (7, OUTPUT); (1) { டிஜிட்டல்ரைட் (7, உயர்); vTaskDelay (300 / portTICK_PERIOD_MS); digitalWrite (7, LOW ஐ); vTaskDelay (300 / portTICK_PERIOD_MS); } }
இப்போது, குறியீட்டைப் பதிவேற்றி, எல்.ஈ.டி மற்றும் சீரியல் மானிட்டரைக் கவனிக்கவும். இரண்டாவது எல்.ஈ.டி இப்போது ஒளிரவில்லை என்பதை நீங்கள் காண்பீர்கள் மற்றும் நீக்கு API ஐ எதிர்கொண்ட பிறகு பணி 2 நீக்கப்படும்.

எனவே குறிப்பிட்ட பணியை நிறைவேற்றுவதை நிறுத்த இந்த API ஐப் பயன்படுத்தலாம்.
இப்போது, வரிசையுடன் தொடங்குவோம்.
FreeRTOS இல் வரிசை என்ன?
வரிசை என்பது நிலையான அளவு உறுப்புகளின் வரையறுக்கப்பட்ட எண்ணிக்கையை வைத்திருக்கக்கூடிய தரவு அமைப்பு மற்றும் இது FIFO திட்டத்தில் இயக்கப்படுகிறது (முதலில் முதல்-அவுட்). வரிசைகள் ஒரு பணிக்கு-பணி, பணி-க்கு-குறுக்கீடு மற்றும் குறுக்கீடு-க்கு-பணி தொடர்பு பொறிமுறையை வழங்குகின்றன.
வரிசையின் அதிகபட்ச உறுப்புகளின் எண்ணிக்கையை அதன் “நீளம்” என்று அழைக்கப்படுகிறது. வரிசை உருவாக்கப்படும் போது ஒவ்வொரு தனிமத்தின் நீளம் மற்றும் அளவு இரண்டும் அமைக்கப்படும்.
தரவு பரிமாற்றத்திற்கு வரிசை எவ்வாறு பயன்படுத்தப்படுகிறது என்பதற்கான எடுத்துக்காட்டு இங்கே காணக்கூடிய FreeRTOS ஆவணத்தில் நன்கு விளக்கப்பட்டுள்ளது. கொடுக்கப்பட்ட உதாரணத்தை நீங்கள் எளிதாக புரிந்து கொள்ளலாம்.

வரிசைகளைப் புரிந்து கொண்ட பிறகு, வரிசையை உருவாக்கும் செயல்முறையைப் புரிந்துகொண்டு அதை எங்கள் FreeRTOS குறியீட்டில் செயல்படுத்த முயற்சிப்போம்.
FreeRTOS இல் ஒரு வரிசையை உருவாக்குதல்
முதலில், FreeRTOS வரிசை மற்றும் Arduino Uno ஆகியவற்றின் உதவியுடன் செயல்படுத்தப்பட வேண்டிய சிக்கல் அறிக்கையை விவரிக்கவும்.
எல்.டி.ஆர் சென்சாரின் மதிப்பை 16 * 2 எல்சிடியில் அச்சிட விரும்புகிறோம். எனவே இப்போது இரண்டு பணிகள் உள்ளன
- பணி 1 எல்.டி.ஆரின் அனலாக் மதிப்புகளைப் பெறுகிறது.
- பணி 2 எல்சிடியில் அனலாக் மதிப்பை அச்சிடுகிறது.
எனவே, இங்கே வரிசை அதன் பங்கை வகிக்கிறது, ஏனெனில் பணி 1 ஆல் உருவாக்கப்பட்ட தரவை பணி 2 க்கு அனுப்புகிறது. பணி 1 இல், வரிசைக்கு அனலாக் மதிப்பை அனுப்புவோம், பணி 2 இல், அதை வரிசையிலிருந்து பெறுவோம்.
வரிசைகளுடன் பணிபுரிய மூன்று செயல்பாடுகள் உள்ளன
- ஒரு வரிசையை உருவாக்குதல்
- வரிசைக்கு தரவை அனுப்புகிறது
- வரிசையில் இருந்து தரவைப் பெறுதல்
வரிசையை உருவாக்க, xQueueCreate () செயல்பாடு API ஐப் பயன்படுத்தவும். இது இரண்டு வாதங்களை எடுக்கும்.
xQueueCreate (UBaseType_t uxQueueLength, UBaseType_t uxItemSize);
uxQueueLength: வரிசை உருவாக்கப்படும் அதிகபட்ச உருப்படிகள் எந்த நேரத்திலும் வைத்திருக்க முடியும்.
uxItemSize: வரிசையில் சேமிக்கக்கூடிய ஒவ்வொரு தரவு உருப்படியின் பைட்டுகளின் அளவு.
இந்த செயல்பாடு NULL ஐத் திருப்பினால், போதிய நினைவகம் காரணமாக வரிசை உருவாக்கப்படாது, மேலும் அது NULL அல்லாத மதிப்பைக் கொடுத்தால், வரிசை வெற்றிகரமாக உருவாக்கப்படுகிறது. கீழே காட்டப்பட்டுள்ளபடி வரிசையை அணுக ஒரு கைப்பிடியாகப் பயன்படுத்த இந்த வருவாய் மதிப்பை ஒரு மாறியில் சேமிக்கவும்.
வரிசை ஹேண்டில்_டி வரிசை 1; queue1 = xQueueCreate (4, sizeof (int));
இது எண்ணின் அளவின் (ஒவ்வொரு தொகுதியின் 2 பைட்டுகள்) குவியல் நினைவகத்தில் 4 உறுப்பு வரிசையை உருவாக்கி, திரும்பும் மதிப்பை வரிசை 1 கைப்பிடி மாறிக்கு சேமிக்கும் .
2. FreeRTOS இல் வரிசைக்கு தரவை அனுப்புதல்
மதிப்புகளை வரிசையில் அனுப்ப, FreeRTOS இந்த நோக்கத்திற்காக API இன் 2 வகைகளைக் கொண்டுள்ளது.
- xQueueSendToBack (): வரிசையின் பின்புறம் (வால்) தரவை அனுப்ப பயன்படுகிறது.
- xQueueSendToFront (): வரிசையின் முன் (தலை) க்கு தரவை அனுப்ப பயன்படுகிறது.
இப்போது , xQueueSend () என்பது xQueueSendToBack () க்கு சமமானதாகும் .
இந்த API கள் அனைத்தும் 3 வாதங்களை எடுக்கும்.
xQueueSendToBack (QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait);
xQueue: தரவு அனுப்பப்படும் வரிசையின் கைப்பிடி (எழுதப்பட்டது). இந்த மாறி xQueueCreate API இன் வருவாய் மதிப்பை சேமிக்க பயன்படும்.
pvItemToQueue: வரிசையில் நகலெடுக்க வேண்டிய தரவுக்கான ஒரு சுட்டிக்காட்டி.
xTicksToWait: வரிசையில் இடம் கிடைக்கும் வரை காத்திருக்க பணி தடைசெய்யப்பட்ட நிலையில் இருக்க வேண்டும்.
அமைத்தல் xTicksToWait செய்ய portMAX_DELAY பணி (வெளியே நேரங்கால இல்லாமல்) காலவரையின்றி காத்திருக்க ஏற்படுத்தும், வழங்கப்படும் INCLUDE_vTaskSuspend 1 அமைக்கப்படுகிறது FreeRTOSConfig.h வேறு நீங்கள் மேக்ரோ பயன்படுத்த முடியும் pdMS_TO_TICKS () உண்ணி குறிப்பிடப்பட்ட ஆகியவற்றை நேரமாக மில்லி விநாடிகளில் குறிப்பிட்டுள்ள நேரம் மாற்றுவதற்குப் பயன்படுத்தப்படுகிறது.
3. FreeRTOS இல் வரிசையில் இருந்து தரவைப் பெறுதல்
வரிசையில் இருந்து ஒரு பொருளைப் பெற (படிக்க), xQueueReceive () பயன்படுத்தப்படுகிறது. பெறப்பட்ட உருப்படி வரிசையில் இருந்து அகற்றப்படும்.
இந்த API மூன்று வாதங்களையும் எடுக்கும்.
xQueueReceive (QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait);
முதல் மற்றும் மூன்றாவது வாதங்கள் API ஐ அனுப்புவதற்கு சமம். இரண்டாவது வாதம் மட்டுமே வேறுபட்டது.
const pvBuffer: பெறப்பட்ட தரவு நகலெடுக்கப்படும் நினைவகத்திற்கான ஒரு சுட்டிக்காட்டி.
மூன்று API களை நீங்கள் புரிந்து கொண்டீர்கள் என்று நம்புகிறேன். இப்போது, இந்த API களை Arduino IDE இல் செயல்படுத்துவோம், நாங்கள் மேலே விவரித்த சிக்கல் அறிக்கையை தீர்க்க முயற்சிப்போம்.
சுற்று வரைபடம்

ப்ரெட்போர்டில் இது எப்படி இருக்கும்:

Arduino IDE இல் FreeRTOS வரிசையை செயல்படுத்துகிறது
எங்கள் பயன்பாட்டிற்கான குறியீட்டை எழுத ஆரம்பிக்கலாம்.
1. முதலில், Arduino IDE ஐத் திறந்து Arduino_FreeRTOS.h தலைப்பு கோப்பைச் சேர்க்கவும். இப்போது, வரிசை போன்ற எந்த கர்னல் பொருளும் பயன்படுத்தப்பட்டால், அதன் தலைப்பு கோப்பை சேர்க்கவும். நாங்கள் 16 * 2 எல்சிடியைப் பயன்படுத்துவதால், அதற்கான நூலகத்தையும் சேர்க்கவும்.
# அடங்கும் # அடங்கும்
2. வரிசையின் உள்ளடக்கங்களை சேமிக்க வரிசை கைப்பிடியைத் தொடங்கவும். மேலும், எல்சிடி முள் எண்களை துவக்கவும்.
வரிசை ஹேண்டில்_டி வரிசை_1; லிக்விட் கிரிஸ்டல் எல்சிடி (7, 8, 9, 10, 11, 12);
3. வெற்றிட அமைப்பில் (), 9600 பாட் வீதத்துடன் எல்சிடி மற்றும் சீரியல் மானிட்டரைத் தொடங்கவும். அந்தந்த API களைப் பயன்படுத்தி வரிசை மற்றும் இரண்டு பணிகளை உருவாக்கவும். இங்கே நாம் முழு எண் வகை 4 அளவு வரிசையை உருவாக்குவோம். சம முன்னுரிமைகளுடன் ஒரு பணியை உருவாக்கவும், பின்னர் இந்த எண்ணுடன் விளையாட முயற்சிக்கவும். இறுதியாக, கீழே காட்டப்பட்டுள்ளபடி திட்டமிடலைத் தொடங்கவும்.
void setup () { Serial.begin (9600); lcd.begin (16, 2); queue_1 = xQueueCreate (4, sizeof (int)); if (queue_1 == NULL) { Serial.println ("வரிசையை உருவாக்க முடியாது"); } xTaskCreate (TaskDisplay, "Display_task", 128, NULL, 1, NULL); xTaskCreate (TaskLDR, "LDR_task", 128, NULL, 1, NULL); vTaskStartScheduler (); }
4. இப்போது, TaskDisplay மற்றும் TaskLDR ஆகிய இரண்டு செயல்பாடுகளைச் செய்யுங்கள் . இல் TaskLDR செயல்பாடு, ஒரு மாறி அனலாக் முள் A0 படியுங்கள் LDR Arduino யூனோ இன் A0 முள் இணைந்திருந்தால் போன்ற. இப்போது மாறியில் சேமிக்கப்பட்ட மதிப்பை xQueueSend API இல் அனுப்பி அனுப்பவும், கீழே காட்டப்பட்டுள்ளபடி vTaskDelay () API ஐப் பயன்படுத்தி 1 விநாடிக்குப் பிறகு மாநிலத்தைத் தடுக்க பணியை அனுப்பவும்.
வெற்றிட பணி TLDR (வெற்றிடத்தை * pvParameters) { int current_intensive; போது (1) { Serial.println ("Task1"); current_intensive = அனலாக் ரீட் (A0); சீரியல்.பிரண்ட்ல்ன் (நடப்பு_இன்ஸ்டென்சிட்டி); xQueueSend (வரிசை_1, & நடப்பு_இன்ஸ்டென்சிட்டி, போர்ட்மேக்ஸ்_டெலாய்); vTaskDelay (1000 / portTICK_PERIOD_MS); } }
5. இதேபோல், டாஸ்க் டிஸ்ப்ளேவுக்கு ஒரு செயல்பாட்டை உருவாக்கி, xQueueReceive செயல்பாட்டிற்கு அனுப்பப்படும் மாறியில் மதிப்புகளைப் பெறுங்கள் . மேலும், xQueueReceive () திரும்புகிறார் pdPASS தரவு வரிசையில் இருந்து வெற்றிகரமாகப் பெறப்பட்டது மற்றும் திரும்புகிறார் வேண்டும் என்றால் முடியும் errQUEUE_EMPTY ஒரு வரிசை காலியாக உள்ளது என்றால்.
இப்போது பயன்படுத்தி எல்சிடி மதிப்புகள் காட்ட lcd.print () செயல்பாடு.
void TaskDisplay (வெற்றிடத்தை * pvParameters) { int தீவிரம் = 0; (1) { Serial.println ("Task2"); if (xQueueReceive (வரிசை_1, & தீவிரம், portMAX_DELAY) == pdPASS) { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("தீவிரம்:"); lcd.setCursor (11, 0); lcd.print (தீவிரம்); } } }
அவ்வளவுதான். வரிசை செயல்படுத்தலின் குறியீட்டு பகுதியை முடித்துவிட்டோம். வேலை செய்யும் வீடியோவுடன் முழுமையான குறியீட்டை இறுதியில் காணலாம்.
இப்போது, எல்.சி.டி மற்றும் எல்.டி.ஆரை சர்க்யூட் வரைபடத்தின்படி ஆர்டுயினோ யு.என்.ஓ உடன் இணைக்கவும். சீரியல் மானிட்டரைத் திறந்து பணிகளைக் கவனிக்கவும். பணிகள் மாறுவதையும், ஒளி தீவிரத்திற்கு ஏற்ப எல்.டி.ஆர் மதிப்புகள் மாறுவதையும் நீங்கள் காண்பீர்கள்.


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