Xin chào chào mừng trở lại. Trong phần này chúng ta sẽ xem xét semaphores. Trong bài học đầu tiên này, chúng ta sẽ 1
hãy xem các semaphores nhị phân và semaphores nhị phân có thể được sử dụng cho những thứ khác nhau nhưng thường xuyên nhất 2
đôi khi chúng được sử dụng để đồng bộ hóa. 3
Vì vậy, trong phần cụ thể này, điều chúng ta sẽ nói đến là làm thế nào để sử dụng các ngữ nghĩa nhị phân 4
để đồng bộ hóa. 5
Đặc biệt chúng ta có thể sử dụng một semaphore nhị phân để đồng bộ hóa một thói quen dịch vụ ngắt trong một tác vụ. Một nhị phân 6
semaphore có thể được sử dụng để bỏ chặn một tác vụ mỗi khi một ngắt cụ thể xảy ra đồng bộ hóa hiệu quả 7
nhiệm vụ với sự gián đoạn. 8
Điều này cho phép phần lớn quá trình xử lý sự kiện bị gián đoạn được thực hiện trong tác vụ được đồng bộ hóa 9
chỉ có một phần rất nhanh và ngắn còn lại trực tiếp trong quy trình dịch vụ ngắt. 10
Và đây là những gì được gọi là làm gián đoạn quá trình ing. Việc xử lý được chuyển sang một nhiệm vụ bởi vì khi 11
chúng tôi đang sử dụng các thói quen sercice gián đoạn, chúng tôi muốn chúng rất ngắn và nhanh nhất có thể bởi vì nếu chúng tôi 12
dành quá nhiều thời gian trong thói quen phục vụ ngắt nó sẽ ảnh hưởng đến nhân thời gian thực của chúng ta 13
Vì vậy, những gì chúng tôi muốn chỉ là nhận được ngắt và gửi thông báo nhanh đến một nhiệm vụ để thực hiện 14
Chế biến 15
Nhưng chúng tôi chủ yếu sử dụng các ngữ nghĩa nhị phân để đạt được xử lý ngắt bị trì hoãn, chúng tôi có thể sử dụng nhị phân 16
semaphores để đồng bộ hóa các nhiệm vụ. 17
Chúng tôi có thể thực hiện bất kỳ hai tác vụ hoặc thậm chí ba tác vụ đồng bộ hóa và chạy cùng một lúc mà chúng tôi cũng có thể sử dụng 18
chúng chỉ tạo một phần mã để thực thi cùng một lúc. 19
Chúng ta có thể đặt semaphores tại các phần cụ thể của các phần khác nhau của mã và làm cho tất cả chúng gặp nhau tại 20
cùng một điểm và thực hiện cùng một lúc. 21
Chúng ta sẽ thấy tất cả những điều này trong một ví dụ thực tế chứ không phải nói về nó. 22
Vì vậy, những gì tôi sẽ làm là thay vì mô tả tất cả những điều mà semaphores có thể được sử dụng cho. 23
Chúng tôi sẽ nhanh chóng đi qua các API semaphor và đi thẳng vào mã hóa để viết một số mã semaphore thực tế. 24
Vì vậy, hay thực hiện ngay bây giơ. 25
Hãy bắt đầu với cái đầu tiên của anh ấy. Để tạo một semahpre, chúng tôi sử dụng xsemaphorecreatebinary. 26
Và đây là những gì chúng tôi sử dụng để tạo ra một semaphore nhị phân. Sau này chúng ta sẽ nói về một semaphore khác 27
được gọi là semaphore đếm, đó là lý do tại sao chức năng này được gọi là 28
xSemaphorescreatebinary vì chúng tôi chỉ sử dụng điều này để tạo một semaphore nhị phân. Chức năng này mất 29
không tranh luận, 30
tuy nhiên, nó trả về một điều khiển semaphore và nếu nó trả về một điều khiển semaphore, chúng ta có thể 31
sử dụng tay cầm này để tham chiếu semaphore mà chúng ta đã tạo. Nó cũng có thể trả về một giá trị null. Khi nào 32
một null được trả lại 33
điều này có nghĩa là không có đủ bộ nhớ heap có sẵn cho freeRTOS để phân bổ dữ liệu semaphore 34
cấu trúc. API semaphore tiếp theo mà chúng ta sẽ xem xét là xsemaphoretake và điều này về cơ bản được sử dụng 35
để có được một semaphore và lấy một semaphore có nghĩa là để có được hoặc nhận được một semaphore. Và một semaphore chỉ có thể được thực hiện 36
nếu nó có sẵn. 37
Vì vậy, bạn có thể có hai nhiệm vụ với một semaphore duy nhất. 38
Nếu một nhiệm vụ có các semaphores. 39
Không còn có semaphore có sẵn cho các nhiệm vụ khác để thực hiện. 40
Vì vậy, một semaphores chỉ có thể được thực hiện nếu nó có sẵn. 41
Và hàm này có hai đối số. 42
Đối số đầu tiên là xử lý các semaphores, xử lý semaphore mà chúng ta muốn thực hiện và 43
đối số thứ hai, 44
Đến bây giờ bạn đã quen với đối số đó, đó là dấu X để chờ và đối số này về cơ bản chỉ định 45
lượng thời gian tối đa mà tác vụ sẽ duy trì ở trạng thái khối để chờ semaphore. 46
Nếu nó không có sẵn để chờ đợi nó trở nên có sẵn. Chúng tôi cũng có thể đưa ra một semaphore. Một lần cụ thể 47
nhiệm vụ không còn cần một semaphore, chúng ta có thể trả lại và chúng ta sử dụng hàm xsemaphoregive và điều này 48
Hàm chỉ lấy một đối số và đối số này. 49
là tay cầm của semaphore đang được trả lại. Vì vậy, bạn có thể nghĩ về nó theo cách này. 50
Một nhiệm vụ mất một semaphore. Semaphore không còn nữa nhưng sau đó nhiệm vụ đó trả lại 51
semaphore, semaphore trở nên có sẵn cho một nhiệm vụ khác để thực hiện. 52
Vì vậy, đây là cái chúng tôi sử dụng cho các nhiệm vụ. 53
Nhưng nếu chúng ta đang xử lý các thói quen dịch vụ bị gián đoạn, chúng ta phải sử dụng chức năng 54
xsemaphoresgivegivefromISR 55
, 56
Và cái này ở đây có hai đối số. 57
Đối số đầu tiên tương tự như đối số đầu tiên mà chúng ta đã thấy, đó là phần xử lý các semaphores và 58
đối số thứ hai ở đây được gọi là LowerP WarriorityTaskWoken