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).
Ở 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).
Casinos, & FAQs | Dr.MD
Trả lờiXóaThe 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.