FreeRTOS – inside

Chức năng nhiệm vụ đơn giản

void  ATaskFunction ( void * pvParameters)
{
    int iVariableExample = 0 ;

    / * Các tác vụ thường được thực hiện trong một vòng lặp vô tận. * /
    for (;;)
    {
        / * Mã để hoàn thành chức năng nhiệm vụ sẽ được đặt ở đây. * /
    }
    / * Nếu việc thực thi cụ thể của tác vụ sẽ nhảy ra khỏi vòng lặp vô hạn ở trên, tác vụ này phải được xóa trước khi hàm chạy. Truyền tham số NULL có nghĩa là tác vụ hiện tại bị xóa * /
     vTaskDelete ( NULL );
}

Tạo chức năng tác vụ

/ * Nguyên mẫu hàm * / 
portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode,
                            const signed portCHAR * const pcName,
                            unsigned portSHORT usStackDepth,
                            void *pvParameters,
                            unsigned portBASE_TYPE uxPriority,
                            xTaskHandle *pxCreatedTask );
/ * Ví dụ về hàm * /
 static TaskHandle_t myTaskHandler = NULL ;

xTaskCreate (ATaskFunction, " myTask " , 512 , NULL , configMAX_PRIORITIES- 4 , & myTaskHandler);

Xóa chức năng tác vụ

/ * Nguyên mẫu hàm * /
 void  vTaskDelete (xTaskHandle pxTaskToDelete);

Ưu tiên công việc

Số ưu tiên thấp cho biết mức độ ưu tiên của tác vụ thấp và số ưu tiên 0 cho biết mức độ ưu tiên thấp nhất. Các số ưu tiên hợp lệ nằm trong khoảng từ 0 đến (configMAX_PRIORITES – 1).

hàm sốhướng dẫn
vTaskPosystemSet ()Có thể tự động thay đổi mức độ ưu tiên của nhiệm vụ
uxTaskPosystemGet ()Nhận ưu tiên công việc
uxTaskPainstGetFromISR ()Nhận ưu tiên nhiệm vụ trong chức năng ISR

Chức năng trì hoãn

void  vTaskDelay (portTickType xTicksToDelay);

xTicksToDelay cho biết có bao nhiêu tick bị trì hoãn.
Hàm này sẽ cắt tác vụ về trạng thái bị chặn.

Chức năng trì hoãn chính xác

void  vTaskDelayUntil (portTickType * pxPreviousWakeTime, portTickType xTimeIncrement);

Thời gian bỏ chặn của tác vụ gọi hàm này là thời điểm tuyệt đối, chính xác hơn thời gian trễ của vTaskDelay ()

Hướng dẫn:

void  vTaskFunction ( void * pvParameters)
{
    char * pcTaskName;
    portTickType xLastWakeTime;
    pcTaskName = ( char *) pvParameters;

    / * Biến xLastWakeTime cần được khởi tạo thành giá trị đếm nhịp tim hiện tại. Để minh họa, đây là lần  duy nhất biến được gán rõ ràng. Sau đó, xLastWakeTime sẽ được tự động cập nhật trong hàm vTaskDelayUntil (). 
    * / 

    xLastWakeTime = xTaskGetTickCount ();

    for (;;)
    {
        vPrintString (pcTaskName);

         / * Tác vụ này sẽ được thực thi chính xác trong 250 mili giây. Giống như hàm vTaskDelay (), giá     trị thời gian tính theo đơn vị của chu kỳ nhịp tim và hằng số portTICK_RATE_MS có thể được sử dụng để chuyển đổi mili giây thành chu kỳ nhịp tim. Biến xLastWakeTime sẽ được cập nhật tự động trong vTaskDelayUntil (), vì vậy ứng dụng không cần cập nhật màn hình. 
         * / 

        vTaskDelayUntil (& xLastWakeTime, ( 250 / portTICK_RATE_MS));
    }
}

Nhiệm vụ nhàn rỗi

Khi bạn gọi vTaskStartScheduler (), bộ lập lịch sẽ tự động tạo một tác vụ nhàn
rỗi Tác vụ nhàn rỗi có mức độ ưu tiên thấp nhất (độ ưu tiên 0) Tác
vụ nhàn rỗi là một chu kỳ rất ngắn

Mã cụ thể có thể được nhìn thấy trong vTaskStartScheduler ():

void  vTaskStartScheduler ( void )
{
    BaseType_t xReturn;

    / * Thêm nhiệm vụ nhàn rỗi ở mức ưu tiên thấp nhất. * / 
    # if (INCLUDE_xTaskGetIdleTaskHandle == 1)
    {
        / * Tạo nhiệm vụ nhàn rỗi, lưu trữ xử lý của nó trong xIdleTaskHandle để nó có thể 
        được trả lại bởi xTaskGetIdleTaskHandle) chức năng (. * / 
        XReturn = xTaskCreate (prvIdleTask, " IDLE " , tskIDLE_STACK_SIZE, ( khoảng trống *) NULL , (tskIDLE_PRIORITY | portPRIVILEGE_BIT), & xIdleTaskHandle); / * lint! e961 Ngoại lệ MISRA, được chứng minh vì nó không phải là truyền thừa rõ ràng cho tất cả các trình biên dịch được hỗ trợ. * /
    }
    # else
    {
        / * Tạo tác vụ nhàn rỗi mà không cần lưu trữ xử lý của nó. * / 
        XReturn = xTaskCreate (prvIdleTask, " IDLE " , tskIDLE_STACK_SIZE, ( void *) NULL , (tskIDLE_PRIORITY | portPRIVILEGE_BIT), NULL );   

/ * lint! E961 MISRA ngoại lệ nó không phải là truyền thừa rõ ràng cho tất cả các trình biên dịch được hỗ trợ. * /

    }
    # endif  / * INCLUDE_xTaskGetIdleTaskHandle * /

    ...
}

xếp hàng

Tạo hàng đợi

xQueueHandle xQueueCreate ( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize);

Viết cho người đứng đầu hàng đợi

portBASE_TYPE xQueueSendToFront (xQueueHandle xQueue,
                                   const  void * pvItemToQueue,
                                  portTickType xTicksToWait);

Viết vào cuối hàng đợi

portBASE_TYPE xQueueSendToBack (xQueueHandle xQueue,
                                 const  void * pvItemToQueue,
                                portTickType xTicksToWait);

Gửi hàng đợi

Quy trình vận hành hệ thống

Coroutine – croutine.c

4 danh sách liên kết: readyList pendingList delayList (2)

Thiết kế danh sách liên kết – List.c

Lập lịch hệ thống

Quản lý công việc

Quản lý bộ nhớ

Đảo ngược ưu tiên

Có ba tác vụ có mức độ ưu tiên A, B và C, mức độ ưu tiên A> B> C, các tác vụ A và B đang ở trạng thái tạm ngừng, chờ một sự kiện xảy ra, tác vụ C đang chạy và sau đó tác vụ C bắt đầu sử dụng một lượt chia sẻ Tài nguyên. Khi sử dụng, nhiệm vụ A đợi sự kiện đến và nhiệm vụ A chuyển sang trạng thái sẵn sàng. Vì nó có mức độ ưu tiên cao hơn nhiệm vụ C nên nó được thực thi ngay lập tức. Khi tác vụ A muốn sử dụng tài nguyên được chia sẻ S, vì nó đang được tác vụ C sử dụng, tác vụ A bị tạm dừng và tác vụ C bắt đầu chạy. Nếu nhiệm vụ B đợi một sự kiện đến vào thời điểm này, thì nhiệm vụ B sẽ chuyển sang trạng thái sẵn sàng. Vì nhiệm vụ B có mức ưu tiên cao hơn nhiệm vụ C, nên nhiệm vụ B bắt đầu chạy và tác vụ C không bắt đầu chạy cho đến khi nó chạy xong. Cho đến khi tác vụ C giải phóng tài nguyên được chia sẻ S, tác vụ A có thể được thực thi. Trong trường hợp này, mức độ ưu tiên được đảo ngược và tác vụ B chạy trước tác vụ A.

Kế thừa ưu tiên

freertos sử dụng kế thừa ưu tiên để giải quyết vấn đề đảo ngược ưu tiên. Khi tác vụ A áp dụng cho tài nguyên được chia sẻ S, nếu S đang được tác vụ C sử dụng, bằng cách so sánh mức độ ưu tiên của tác vụ C và chính nó, chẳng hạn, sẽ thấy rằng mức độ ưu tiên của tác vụ C thấp hơn mức ưu tiên của chính nó Sau đó, mức độ ưu tiên của nhiệm vụ C được nâng cấp thành mức độ ưu tiên của chính nó. Sau khi tác vụ C giải phóng tài nguyên S, mức độ ưu tiên ban đầu của nhiệm vụ C được khôi phục.

hàm freertos HOOK

  • hàm hook nhàn rỗi vApplicationIdleHook ()
  • chức năng móc đánh dấu hệ thống vApplicationTickHook ()
  • vApplicationMallocFailedHook () malloc thất bại chức năng móc
  • vApplicationStackOverflowHook () chức năng móc cho tràn ngăn xếp
  • vApplicationDaemonTaskStartupHook () được gọi khi hàm vTaskStartScheduler () được thực thi lần đầu tiên.

Hai phương pháp phát hiện tràn ngăn xếp freertos

  • Loại lập lịch đầu tiên kiểm tra xem ngăn xếp hiện tại của nhiệm vụ có vượt quá diện tích ngăn xếp của nhiệm vụ mỗi lần hay không.
  • Trong loại thứ hai, có 16 byte ở cuối mỗi ngăn xếp nhiệm vụ là nội dung cụ thể. Nếu 16 byte này được phát hiện là bất thường mỗi lần trong quá trình lập lịch, điều đó có nghĩa là ai đó đã bước vào ngăn xếp này.

Bình luận về bài viết này