Chuyển đến nội dung chính

Chapter 2: Queue Management (Quản lý hàng đợi).

Bài trước: Chap 1: Task management (Quản lý Task).
Ở chap này chúng ta sẽ học về hàng đợi, cách khởi tạo và thức hoạt động của nó.
Hàng đợi là nơi lưu trữ dữ liệu của các Task, không gian của hàng đợi có giới hạn và do người dùng định nghĩa. Về cơ bản thì hàng đợi hoạt động theo nguyên tắc FIFO (vào trước thì ra trước), tất nhiên bình thường là thế nhưng trong những trường hợp đặc biệt ta vấn có thể cho nó vào sau mà ra trước.
1 hàng đợi có thể dùng để phục vụ nhiều Task khác nhau.
Khi 1 task chờ để ghi dữ liệu vào hàng đợi hoặc là đọc dữ liệu ra từ hàng đợi thì nó sẽ bị rơi vào trạng thái Block, nó sẽ thoát khỏi trạng thái này khi công việc của nó thành công hoặc là Time Out (Thời gian đợi mà mình cho phép kết thúc).

1. Khởi tạo 1 hàng đợi:
    xQueueHandle xQueueCreate ( unsigned portBASE_TYPE uxQueueLength,
                                                     unsigned portBASE_TYPE uxItemSize );
    uxQueueLength: là độ dài của hàng đợi, là số "từ" mà hàng đợi có thể chứa.
    uxItemSize       : là kích thước của 1 dữ liệu, của 1 "từ" trong hàng đợi.
    Giá trị trả về của hàm này là NULL nếu mà khởi tạo hàng đợi không thành công (không đủ bộ nhớ chẳng hạn). Và khác NULL nếu khởi tạo thành công, lúc này giá trị bộ nhớ chính là "Handle" của hàng đợi.

2. Các hàm tác động vào hàng đợi:
2.1 Ghi 1 dữ liệu vào hàng đợi:
      portBASE_TYPE xQueueSendToFront ( xQueueHandle xQueue,
                                                                      const void * pvItemToQueue,
                                                                      portTickType xTicksToWait );
      portBASE_TYPE xQueueSendToback(...);
      portBASE_TYPE xQueueSend(...); tương tự như hàm xQueueSendToback(...);
      nếu sử dụng ở trong các hàm phục vụ ngắt thì phải sử dụng các hàm này:
      portBASE_TYPE xQueueSendToFrontFromISR(...);
      portBASE_TYPE xQueueSendToBackFromISR(...);

      xQueue: Handle của hàng đợi mà mình muốn ghi vào.
      pvItemToQueue: dữ liệu muốn ghi vào hàng đợi.
      xTicksToWait: Số Tick trễ cho phép để time out. Nếu cái này = 0 tức là hàm này phải thực hiện ngay.
      Giá trị trả về của các hàm này là:
             + pdPASS: nếu nhiệm vụ thành công.
             + errQUEUEFULL: nhiệm vụ thất bại (đầy bộ nhớ hoặc hết thời gian chờ).
2.2 Các hàm đọc dữ liệu:
      portBASE_TYPE xQueueReceive( xQueueHandle xQueue,
                                                             const void * pvBuffer,
                                                             portTickType xTicksToWait );
      portBASE_TYPE xQueueReceiveFromISR(...);
      portBASE_TYPE xQueuePeek(...); hàm này là đọc dữ liệu mà không xóa mất dữ liệu trong hàng đợi.
      pvBuffer: Con trỏ bộ nhớ nơi mà dữ liệu bị copy ra.
      Giá trị trả về của các hàm này:
            + pdPASS: Nếu nhiệm vụ thành công.
            + errQUEUE_EMPTY: nhiệm vụ thất bại (không có dữ liệu trong hàng đợi trước khi hết thời gian ).
2.3 Các hàm truy vấn trong hàng đợi:
      unsigned portBASE_TYPE uxQueueMessagesWaiting ( xQueueHandle xQueue);
      unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR ( xQueueHandle xQueue);
      Giá trị trả về là số lượng "từ" đang có trong hàng đợi.

3. Các chú ý đặc biệt:
    + Nếu các hàm Sender có Priority thấp hơn hàm Receiveder thì hàng đợi luôn có ít hơn 1 dữ liệu, và hàm Sender thì không cần đặt time out vì nó sẽ thực hiện ngay lập tức. Ngược lại nếu là cao hơn.
    + Với kiểu dữ liệu là kiểu cấu trúc thì phải là các trường dữ liệu để nhận diện được kiểu cấu túc đó của Sender nào gửi tới. (Example010 và Example011).
    + Nếu dữ liệu cần lưu và hàng đợi nó lớn hơn khả năng của hàng đợi thì mình chỉ cẩn lưu vào hàng đợi con trỏ nơi chứ dữ liệu ấy thôi. ( Cái này thì mình chưa hiểu lắm, để nghiên cứu tiếp đã ).


Bài tiếp: Chapter 3: Interrupt management (quản lý ngắt).

Nhận xét

  1. Casinos, & FAQs | Dr.MD
    The first casinos to accept US players are Encore 부천 출장샵 Boston Harbor, and 이천 출장안마 that 태백 출장안마 has made them one 과천 출장샵 of the 서귀포 출장마사지 biggest casino gambling hubs in the world.

    Trả lờiXóa

Đăng nhận xét

Bài đăng phổ biến từ blog này

Bắt đầu với FreeRTOS (Bài 1)

NOTE: 1 vài tài liệu mình sử dụng trong bài này là mình sưu tầm được, có thể không có bản quyền, nếu tác giả không muốn đăng lên thì mình sẽ xóa. Trước khi tìm hiểu mọi người có thể biên dịch thử 1 chương trình để lấy khí thế tại  đây. FreeRTOS là 1 hệ điều hành nhúng phù hợp cho các ứng dụng có yêu cầu về thời gian thực 1 cách chặt chẽ. Và vì nó miễn phí, nhỏ gọn và có thể nhúng vào các dòng vi điều khiển thông thường như PIC, AVR, MSP430, ARM...nên mình làm hướng dẫn này cho những ai muốn bắt đầu tìm hiểu về FreeRTOS. Trang chủ của nó  http://www.freertos.org/ Đầu tiên là phải tải FreeRTOS về đã: vào  http://sourceforge.net/projects/freertos/files/   Click vào  Download FreeRTOSV7.5.2.exe (9.3 MB) (thời điểm này bản mới nhất là 7.5.2) để tải về. Sau khi tải về bạn click đúp vào file .exe ấy để giải nén. Ta được 1 folder FreeRTOSV7.5.2. Xong Bước 1  Tiếp theo là nên đọc 1 tài liệu để hiểu sơ qua xem RTOS nó là cái gì và nó hoạt động như...

Chapter 3: Interrupt management (quản lý ngắt).

Bài trước: Chapter 2: Queue Management (Quản lý hàng đợi). Nối tiếp chương 2 về quản lý hàng đợi, hôm nay chúng ta sẽ tìm hiểu về quản lý ngắt. Ngắt là 1 thành phần cực kỳ quan trọng trong lập trình nhúng, nếu bạn đã học qua về vi điều khiển thì chắc không phải nói nhiều về cái này làm gì. Còn nếu chưa thì hiểu nôm na Ngắt là 1 sự kiện mà nó luôn được ưu tiên cao nhất, tức là khi sự kiện ngắt xảy ra thì tất cả mọi sự kiên khác đều phải dừng lại để ngắt thực hiện công việc của mình. Nhưng có 1 sự khác nhau ở ngắt trong FreeRTOS và ngắt thông thường ở chỗ: Khi ngắt thông thường xảy ra nó sẽ nhảy vào hàm ngắt và các công việc cần phải làm đều đặt trong hàm ngắt. Còn ở FreeRTOS thì khi ngắt xảy ra nó sẽ nhảy vào hàm thủ tục ngắt, hàm thủ tục ngắt lại phát đi 1 "tín hiệu" để hàm thực hiện chức năng của ngắt Unblocking và hàm này có Priority cao hơn tất cả các task khác nên nó sẽ thực hiện ngay lập tức. Tín hiệu ở đây chính là Semaphore, có 2 loại Semaphore là Binary Semaph...

Chap 1: Task management (Quản lý Task).

Bài trước: Bắt đầu với FreeRTOS (Bài 2) 1 tháng rồi bận bịu quá nà. Bài này sẽ tổng hợp lại những thứ cần chú ý ở trong Chap 1 cuốn "Using the freertos real time kernel" Câu 1: Task là gì? và được tạo ra thế nào? Task được hiểu nôm na như là 1 chương trình thực hiện 1 nhiệm vụ nào đó. 1 Task gồm có: tên, chức năng, giá trị ưu tiên, độ sâu stack, task handle (như kiểu cái móc để tác động ấy), biến tác động vào task. Để tạo task thì đầu tiên phải định nghĩa chức năng của nó trước, cấu trúc hàm cơ bản như sau: void ATaskFunction(void *pvParameters) { // Khởi tạo biến ở đây for( ; ; ) { // Chức năng thực hiện ở đây } } Ví dụ: void vTask1(void *pvParameters) {                const char *pcTaskName = "This is Task 1 \r\n";                for ( ; ; ) { vPrintString(pcTaskName); ...