سیستم عامل بلادرنگ RTOS بخش ششم (ُStructured Queue)

280,000 ریال

امروز در این آموزش قصد داریم نحوه استفاده از Queue(صف) را برای برقراری ارتباط بین تسک ها بیاموزیم. با مراجعه به سایت می توانید سایر آموزش های FreeRTOS را مشاهده کنید. تصویر زیر چگونگی کارکرد صف را نشان می دهد.

صف آسانترین روش ارسال و دریافت داده بین تسک هاست. ما از یک صف ساده در جلسه پیش استفاده کردیم ، که همه عناصر موجود در صف از انواع داده یکسان هستند. اما حالا از یک صف ساختار یافته استفاده می کنیم ، جایی که انواع داده ها می توانند متفاوت باشند.

توضیحات

امروز در این آموزش قصد داریم نحوه استفاده از Queue(صف) را برای برقراری ارتباط بین تسک ها بیاموزیم. با مراجعه به سایت می توانید سایر آموزش های FreeRTOS را مشاهده کنید. تصویر زیر چگونگی کارکرد صف را نشان می دهد.

صف آسانترین روش ارسال و دریافت داده بین تسک هاست. ما از یک صف ساده در جلسه پیش استفاده کردیم ، که همه عناصر موجود در صف از انواع داده یکسان هستند. اما حالا از یک صف ساختار یافته استفاده می کنیم ، جایی که انواع داده ها می توانند متفاوت باشند.

 

ساختار صف

همان طور که در ابتدا ذکر کردیم ، اگر می خواهیم انواع مختلف داده ها را ارسال کنیم ، باید از صف ساختار یافته استفاده کنیم. اول از همه هندلر مربوط را برای این Queue ایجاد کنید.

/**************** QUEUE HANDLER *****************/
;xQueueHandle St_Queue_Handler

ما باید ساختاری ایجاد کنیم که بتواند کلیه انواع داده ای را که می خواهیم از آنها استفاده کنیم ، ذخیره کند. ما آن را my_struct خواهیم نامید.

/**************** STRUCTURE DEFINITION *****************/
}typedef struct 
;char *str
;int counter
;uint16_t large_value
{ ;my_struct

بعد ، در داخل تابع اصلی ، صف را ایجاد کنید.

/***** create QUEUE *****/
;((St_Queue_Handler = xQueueCreate(2, sizeof (my_struct
if (St_Queue_Handler == 0) // if there is some error while creating queue
}
;”char *str = “Unable to create STRUCTURE Queue\n\n
;(HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen (str), HAL_MAX_DELAY
{
else
}
;”char *str = “STRUCTURE Queue Created successfully\n\n
;(HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen (str), HAL_MAX_DELAY
{

در اینجا ما یک صف ایجاد کرده ایم که می تواند ۲ عنصر از نوع داده my_struct را ذخیره کند. دوباره اگر خطایی در حین ایجاد صف وجود داشته باشد ، xQueueCreate با صفر بر می گردد یا در غیر این صورت یک مقدار دیگر برمی گرداند.
اکنون داده ها را از یک Sender Task به این صف ارسال می کنیم:

(void Sender1_Task (void *argument
}
;my_struct *ptrtostruct
;(uint32_t TickDelay = pdMS_TO_TICKS(2000
(while (1
}
;(char *str = “Entered SENDER1_Task\n about to SEND to the queue\n\n
;(HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen (str), HAL_MAX_DELAY
/****** ALOOCATE MEMORY TO THE PTR ********/
;(ptrtostruct = pvPortMalloc(sizeof (my_struct
/********** LOAD THE DATA ***********/
;ptrtostruct->counter = 1+indx1
;ptrtostruct->large_value = 1000 + indx1*100
;”ptrtostruct->str = “HELLO FROM SENDER 1
/***** send to the queue ****/
(if (xQueueSend(St_Queue_Handler, &ptrtostruct, portMAX_DELAY) == pdPASS
}
;”char *str2 = ” Successfully sent the to the queue\nLeaving SENDER1_Task\n\n\n
;(HAL_UART_Transmit(&huart2, (uint8_t *)str2, strlen (str2), HAL_MAX_DELAY
{
;indx1 = indx1+1
;(vTaskDelay(TickDelay
{
{

قبل از ارسال داده به صف ، باید حافظه را به ساختار اختصاص دهیم. و برای انجام این کار ، ما از تابع pvPortMALLOC استفاده می کنیم. پس از تخصیص حافظه ، داده ها را در اشاره گر این ساختار بارگذاری کنید.
در مرحله بعد ، با ارسال آدرس آن در پارامتر ، این داده ها را به صف ارسال می کنیم.

(void Receiver_Task (void *argument
}
;my_struct *Rptrtostruct
;(uint32_t TickDelay = pdMS_TO_TICKS(3000
;char *ptr
(while (1
}
;”char *str = “Entered RECEIVER Task\n about to RECEIVE FROM the queue\n\n
;(HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen (str), HAL_MAX_DELAY
/**** RECEIVE FROM QUEUE *****/
(if (xQueueReceive(St_Queue_Handler, &Rptrtostruct, portMAX_DELAY) == pdPASS
}
ptr = pvPortMalloc(100 * sizeof (char)); // allocate memory for the string
sprintf (ptr, “Received from QUEUE:\n COUNTER = %d\n LARGE VALUE = %u\n STRING = %s\n\n\n”,Rptrtostruct->counter,Rptrtostruct->large_value, ptrtostruct->str
;(HAL_UART_Transmit(&huart2, (uint8_t *)ptr, strlen(ptr), HAL_MAX_DELAY
vPortFree(ptr); // free the string memory
}
vPortFree(Rptrtostruct); // free the structure memory
;(vTaskDelay(TickDelay
{
{

ما یک اشاره گر دیگر برای ساختار در توابع گیرنده برای ذخیره داده های دریافت شده ایجاد خواهیم کرد. پس از دریافت داده ها ، ما حافظه اختصاص داده شده توسط sender Task را با استفاده از عملکرد vPortFREE آزاد می کنیم.
نتیجه این کد در زیر نشان داده شده است:



مدت ویدئو: ۲۰ دقیقه

نوع آموزش: فارسی

کد سورس: دارد

شماتیک مدار: ندارد

کامپایلر: IAR

کتابخانه: HAL Library


توجه: برای پخش ویدئو نرم افزار های KMPlayer و K-Lite Codec Pack در سیستم شما نصب باشد. و از نرم افزار ۷zip برای خارج کردن پروژه از حالت فشرده استفاده کنید.