0
1
00:00:00,580 --> 00:00:06,370
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

2
00:00:06,370 --> 00:00:14,000
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

3
00:00:14,000 --> 00:00:16,460
đôi khi chúng được sử dụng để đồng bộ hóa.
3

4
00:00:16,540 --> 00:00:21,480
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

5
00:00:21,630 --> 00:00:22,930
để đồng bộ hóa.
5

6
00:00:23,200 --> 00:00:29,570
Đặ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

7
00:00:29,650 --> 00:00:36,600
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

8
00:00:36,620 --> 00:00:38,720
nhiệm vụ với sự gián đoạn.
8

9
00:00:38,740 --> 00:00:45,760
Đ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

10
00:00:46,060 --> 00:00:53,530
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

11
00:00:53,530 --> 00:01:00,760
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

12
00:01:00,760 --> 00:01:07,210
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

13
00:01:07,210 --> 00:01:13,610
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

14
00:01:13,720 --> 00:01:20,020
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

15
00:01:20,020 --> 00:01:20,760
Chế biến
15

16
00:01:20,810 --> 00:01:26,650
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

17
00:01:26,650 --> 00:01:29,260
semaphores để đồng bộ hóa các nhiệm vụ.
17

18
00:01:29,260 --> 00:01:35,950
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

19
00:01:35,950 --> 00:01:41,260
chúng chỉ tạo một phần mã để thực thi cùng một lúc.
19

20
00:01:41,410 --> 00:01:47,790
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

21
00:01:47,820 --> 00:01:50,700
cùng một điểm và thực hiện cùng một lúc.
21

22
00:01:50,730 --> 00:01:54,630
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

23
00:01:54,700 --> 00:01:59,190
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

24
00:01:59,200 --> 00:02:07,300
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

25
00:02:07,300 --> 00:02:08,190
Vì vậy, hay thực hiện ngay bây giơ.
25

26
00:02:08,230 --> 00:02:14,160
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

27
00:02:14,290 --> 00:02:19,900
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

28
00:02:19,900 --> 00:02:24,800
được gọi là semaphore đếm, đó là lý do tại sao chức năng này được gọi là
28

29
00:02:24,840 --> 00:02:31,480
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

30
00:02:31,510 --> 00:02:32,490
không tranh luận,
30

31
00:02:32,510 --> 00:02:39,370
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

32
00:02:39,370 --> 00:02:45,730
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

33
00:02:45,730 --> 00:02:46,840
một null được trả lại
33

34
00:02:46,840 --> 00:02:53,740
đ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

35
00:02:53,740 --> 00:03:00,090
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

36
00:03:00,090 --> 00:03:08,290
để 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

37
00:03:08,380 --> 00:03:09,880
nếu nó có sẵn.
37

38
00:03:09,880 --> 00:03:13,350
Vì vậy, bạn có thể có hai nhiệm vụ với một semaphore duy nhất.
38

39
00:03:13,450 --> 00:03:15,300
Nếu một nhiệm vụ có các semaphores.
39

40
00:03:15,310 --> 00:03:19,620
Không còn có semaphore có sẵn cho các nhiệm vụ khác để thực hiện.
40

41
00:03:19,720 --> 00:03:23,460
Vì vậy, một semaphores chỉ có thể được thực hiện nếu nó có sẵn.
41

42
00:03:23,700 --> 00:03:26,080
Và hàm này có hai đối số.
42

43
00:03:26,080 --> 00:03:32,680
Đố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

44
00:03:32,680 --> 00:03:33,740
đối số thứ hai,
44

45
00:03:33,760 --> 00:03:40,330
Đế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

46
00:03:40,360 --> 00:03:45,980
lượng thời gian tối đa mà tác vụ sẽ duy trì ở trạng thái khối để chờ semaphore.
46

47
00:03:46,030 --> 00:03:53,020
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

48
00:03:53,020 --> 00:03:59,440
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

49
00:03:59,440 --> 00:04:02,830
Hàm chỉ lấy một đối số và đối số này.
49

50
00:04:02,830 --> 00:04:08,480
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

51
00:04:08,590 --> 00:04:15,690
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

52
00:04:15,760 --> 00:04:21,430
semaphore, semaphore trở nên có sẵn cho một nhiệm vụ khác để thực hiện.
52

53
00:04:21,490 --> 00:04:23,400
Vì vậy, đây là cái chúng tôi sử dụng cho các nhiệm vụ.
53

54
00:04:23,500 --> 00:04:29,590
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

55
00:04:29,620 --> 00:04:29,930
xsemaphoresgivegivefromISR
55

56
00:04:29,950 --> 00:04:31,300
,
56

57
00:04:31,470 --> 00:04:33,550
Và cái này ở đây có hai đối số.
57

58
00:04:33,640 --> 00:04:39,100
Đố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

59
00:04:39,100 --> 00:04:43,570
đối số thứ hai ở đây được gọi là LowerP WarriorityTaskWoken
