0
1
00:00:03,370 --> 00:00:12,340
Bây giờ chúng ta hãy khám phá làm thế nào chúng ta có thể chuyển đổi đồng thời các đèn LED màu xanh và màu cam, không theo thứ tự
1

2
00:00:12,340 --> 00:00:15,190
cách nhưng một cách song song.
2

3
00:00:15,460 --> 00:00:22,540
Vì vậy, để làm điều này, chúng ta phải tạo các chức năng chính cho màu cam và màu xanh lá cây và bây giờ tôi sẽ làm điều đó
3

4
00:00:22,540 --> 00:00:30,530
sẽ tạo ra chính màu cam và sau đó là chính màu xanh lá cây và sau đó trong các chức năng này sẽ có một vô hạn
4

5
00:00:30,590 --> 00:00:32,970
vòng lặp giống như chức năng chính mà chúng ta có.
5

6
00:00:33,170 --> 00:00:39,120
Nhưng lần này là màu cam và sau đó là màu xanh lá cây và tôi sẽ bắt đầu, chức năng chính thông thường là
6

7
00:00:39,120 --> 00:00:45,700
int main, nhưng lần này chúng ta muốn cam chính, int cam chính. Nó không cần
7

8
00:00:45,740 --> 00:00:46,520
tranh luận.
8

9
00:00:52,400 --> 00:00:54,270
Tôi sẽ mở và tôi sẽ đóng.
9

10
00:00:54,270 --> 00:00:57,130
Và tất nhiên, tôi sẽ có một vòng lặp trong đó.
10

11
00:00:57,280 --> 00:01:01,660
Đây là những gì thực sự làm cho nó một chức năng chính.
11

12
00:01:02,840 --> 00:01:07,670
Và tôi sẽ có một cái tương tự cho màu xanh như thế này.
12

13
00:01:15,310 --> 00:01:21,320
Và dĩ nhiên, tôi sẽ điền mã chuyển đổi của đèn LED màu xanh trong một vòng của
13

14
00:01:21,320 --> 00:01:23,830
màu xanh và sau đó làm tương tự cho quả cam.
14

15
00:01:24,020 --> 00:01:29,840
Vì vậy, tôi sẽ cắt mã này ở đây mà chúng tôi đã thử nghiệm cho màu xanh và sau đó đặt nó vào màu xanh chính
15

16
00:01:29,950 --> 00:01:37,410
hoặc chính màu xanh và sau đó tôi chỉ cần chuyển nó thành màu cam và sau đó đổi tên thành màu cam và tôi sẽ chỉ
16

17
00:01:37,460 --> 00:01:40,200
đến đây màu cam và
17

18
00:01:40,310 --> 00:01:50,600
tất nhiên rồi, màu cam
18

19
00:01:50,790 --> 00:01:51,330
hãy xem nào
19

20
00:01:51,350 --> 00:01:53,560
Tại sao điều này có vấn đề?
20

21
00:01:53,990 --> 00:01:57,070
Hãy xem, tất nhiên có một sai lầm ở đây.
21

22
00:01:57,140 --> 00:01:57,690
Tốt
22

23
00:01:59,630 --> 00:02:06,340
Vì vậy, chúng tôi có hai chức năng chính bây giờ. Hãy giữ chức năng chính ban đầu và sau đó gọi
23

24
00:02:06,390 --> 00:02:07,990
màu xanh chính và màu cam chính
24

25
00:02:08,050 --> 00:02:09,790
bên trong chức năng chính này
25

26
00:02:12,700 --> 00:02:20,560
Tôi sẽ chỉ gọi chính màu xanh ở đây. Màu xanh gạch dưới chính và sau đó là màu cam chính.
26

27
00:02:25,880 --> 00:02:32,110
Trong thực tế, thay vì chỉ tắt các bit của đèn LED màu xanh ở cổng D.
27

28
00:02:32,410 --> 00:02:38,150
Hãy tắt toàn bộ cổng để chúng ta không gặp phải tình huống trong quá trình thử nghiệm
28

29
00:02:38,390 --> 00:02:45,350
nơi chúng tôi tắt đèn LED màu xanh nhưng vì chúng tôi không tắt màu cam rõ ràng nên chúng tôi tìm thấy màu cam
29

30
00:02:45,350 --> 00:02:46,310
on.
30

31
00:02:46,310 --> 00:02:49,370
Tôi có nghĩa là sẽ làm cho thí nghiệm hơi khó hiểu.
31

32
00:02:49,370 --> 00:02:58,010
Vì vậy, những gì tôi sẽ làm là, thay vì sử dụng toán tử này để tắt chỉ màu xanh, tôi sẽ biến tất cả
32

33
00:02:58,010 --> 00:03:05,360
tất cả các chân đều tắt, để khi tôi nói tắt màu xanh, tất cả các đèn LED đều tắt.
33

34
00:03:05,390 --> 00:03:13,790
Và khi tôi nói màu cam tắt tất cả các đèn LED cũng tắt. Điều này sẽ đơn giản hóa cách chúng ta nhìn thấy nó.
34

35
00:03:14,060 --> 00:03:23,440
Vì vậy, tôi sẽ chỉ giữ nó ở đây như thế này và một điều cuối cùng, khi tôi mang các chức năng này đến đây, khi
35

36
00:03:23,440 --> 00:03:31,270
Tôi đã mang các chức năng này đến đây, tôi phải giữ một trong những chức năng chính ban đầu để
36

37
00:03:31,270 --> 00:03:34,990
làm cho mã không chấm dứt.
37

38
00:03:34,990 --> 00:03:40,200
Nếu chúng ta không đặt dây này ở đây thì chức năng chính này sẽ chạy và nó sẽ chấm dứt.
38

39
00:03:40,240 --> 00:03:46,570
Nhưng khi chúng tôi đặt nó ở đây, nó vẫn còn và nó cho chúng tôi thời gian để chuyển đổi giữa chính màu xanh và sau đó là
39

40
00:03:46,570 --> 00:03:47,490
bàn tay màu cam.
40

41
00:03:47,590 --> 00:03:55,940
Và một điều nữa là, để có thể đạt được phần mã này, hãy nhớ chính màu xanh ở đây.
41

42
00:03:55,960 --> 00:03:56,810
Tôi chỉ vừa mới đến đây.
42

43
00:03:56,890 --> 00:03:59,780
Và như bạn có thể thấy nó có một vòng lặp vô hạn ở đây.
43

44
00:03:59,800 --> 00:04:01,530
Hàm này không trả về.
44

45
00:04:01,690 --> 00:04:08,780
Vì vậy, khi trình biên dịch biên dịch những gì nó làm, nó thường sẽ loại bỏ mã này
45

46
00:04:08,800 --> 00:04:15,760
bởi vì nó biết rằng chức năng chính màu xanh đầu tiên này không trả về nên mọi thứ sau đó không thể truy cập được
46

47
00:04:15,820 --> 00:04:17,730
bởi vì có một vòng lặp vô hạn ở đây.
47

48
00:04:18,040 --> 00:04:24,880
Vì vậy, để tạo mã khác, mã sau chính màu xanh, mã sau vòng lặp vô hạn có thể truy cập, chúng ta có thể
48

49
00:04:25,210 --> 00:04:32,350
tạo một biến dễ bay hơi như thế này và có một điều kiện if, nếu bắt đầu làm điều này, thì điều khác làm điều đó
49

50
00:04:32,410 --> 00:04:36,860
và chúng ta có thể khởi tạo biến ở đây để có điểm bắt đầu.
50

51
00:04:36,940 --> 00:04:41,920
Và do đó, khi chúng tôi đi đến trình gỡ lỗi và chúng tôi cố gắng thao tác các giá trị trong bộ nhớ.
51

52
00:04:41,920 --> 00:04:44,730
Chúng tôi thực sự có thể đạt được mã này ở đây.
52

53
00:04:46,110 --> 00:04:54,360
Bây giờ để tiến hành hãy thay đổi một cái gì đó trong các tùy chọn mục tiêu. Tôi sẽ nhấp vào đây và sau đó tôi sẽ vô hiệu hóa
53

54
00:04:54,360 --> 00:04:55,760
phần cứng điểm nổi.
54

55
00:04:55,800 --> 00:05:02,200
Điều này sẽ cho phép chúng ta quan sát đúng các thay đổi trong bộ nhớ.
55

56
00:05:02,220 --> 00:05:09,430
Vì vậy, theo mặc định, nó nói sử dụng độ chính xác duy nhất. Tôi sẽ nói không được sử dụng và sau đó tôi sẽ nhấp vào OK.
56

57
00:05:09,630 --> 00:05:12,740
Và một khi đã xong tôi sẽ kiểm tra lại.
57

58
00:05:12,850 --> 00:05:15,890
Đây là chức năng chính, đây là chức năng chính thông thường.
58

59
00:05:15,900 --> 00:05:19,810
Và bên trong chức năng chính, chúng ta có cái chính màu xanh, chúng ta có cái chính màu cam.
59

60
00:05:19,950 --> 00:05:25,030
Tôi đã có biến dễ bay hơi này ở đây và nó được khởi tạo về không.
60

61
00:05:25,050 --> 00:05:31,500
Có nghĩa là nếu khác, eaning phần khác của mã chúng tôi chạy bởi vì không là khác.
61

62
00:05:31,530 --> 00:05:36,190
Vì vậy, khi chúng ta chạy mã, chúng ta sẽ thấy đèn LED màu cam bật tắt.
62

63
00:05:36,770 --> 00:05:41,150
Nhưng tôi sẽ chạy nó từ chế độ gỡ lỗi nên tôi sẽ bắt đầu bằng cách nhấp vào đây.
63

64
00:05:45,290 --> 00:05:50,540
Tôi sẽ chỉ đóng cái này và sau đó những gì tôi sẽ làm là, tôi sẽ bấm vào đây để chạy mã.
64

65
00:05:53,980 --> 00:05:57,450
Và như bạn có thể thấy đèn LED màu cam đang nhấp nháy.
65

66
00:05:57,700 --> 00:06:05,720
Vì vậy, những gì tôi sẽ làm tiếp theo là, tôi sẽ đặt một điểm dừng bên trong hệ thống để khi chúng ta bước vào
66

67
00:06:05,780 --> 00:06:09,730
dịch vụ thường xuyên bị gián đoạn chúng ta có thể tự thực hiện một số thay đổi nhất định.
67

68
00:06:09,740 --> 00:06:14,100
Vì vậy, tôi sẽ đặt một điểm dừng ở đây như thế này và sau đó nó dừng lại.
68

69
00:06:14,150 --> 00:06:22,760
Khi đã xong, tôi sẽ thêm chế độ xem bộ nhớ vào chế độ xem của mình ở đây và đến đây, cửa sổ bộ nhớ và chọn bộ nhớ một
69

70
00:06:23,240 --> 00:06:28,230
và tôi sẽ điều hướng đến địa chỉ của con trỏ ngăn xếp là sáu bốn không.
70

71
00:06:28,310 --> 00:06:29,180
Đó là giá trị này
71

72
00:06:29,280 --> 00:06:31,340
Vì vậy, nếu tôi chỉ gõ giá trị này ở đây.
72

73
00:06:31,520 --> 00:06:37,390
và tôi nhấn Enter, nó sẽ đưa tôi đến địa chỉ của con trỏ ngăn xếp.
73

74
00:06:37,540 --> 00:06:39,820
Vì vậy, tôi sẽ chỉ điều chỉnh quan điểm của tôi một chút nữa.
74

75
00:06:39,890 --> 00:06:46,870
Vì vậy, khi xảy ra gián đoạn trong bộ xử lý vỏ não M, nội dung của một số thanh ghi trong vỏ não M
75

76
00:06:47,220 --> 00:06:55,390
đăng ký ngân hàng được lưu vào ngăn xếp. Hãy nhớ ngăn xếp chỉ là một vùng nhớ cụ thể tồn tại trong
76

77
00:06:55,390 --> 00:06:56,210
RAM.
77

78
00:06:56,320 --> 00:07:00,990
Vì vậy, những nội dung này được lưu vào ngăn xếp.
78

79
00:07:01,000 --> 00:07:07,410
Để bộ xử lý có thể quay trở lại ngăn xếp và khôi phục nội dung mà nó đã lưu trước đó
79

80
00:07:07,430 --> 00:07:09,430
sau khi nó kết thúc
80

81
00:07:09,440 --> 00:07:12,150
phục vụ các thói quen dịch vụ ngắt.
81

82
00:07:12,190 --> 00:07:20,280
Điều này cho phép quá trình tiếp tục chính xác nơi nó dừng lại khi xảy ra gián đoạn.
82

83
00:07:20,310 --> 00:07:25,030
Chúng ta hãy xem hướng dẫn sử dụng chung của các thiết bị ARM cortex M4.
83

84
00:07:25,110 --> 00:07:31,650
Đầu tiên tôi sẽ thoát khỏi trình gỡ lỗi để tôi có thể có tùy chọn chọn sách tại đây. Tôi sẽ chọn sách
84

85
00:07:31,680 --> 00:07:34,650
và sau đó tôi sẽ chọn cuốn sách đặc biệt này.
85

86
00:07:34,800 --> 00:07:35,600
Đúng.
86

87
00:07:35,640 --> 00:07:42,290
Vì vậy, trong hướng dẫn sử dụng chung của thiết bị ARM cortex M4, trong mô hình ngoại lệ,
87

88
00:07:42,300 --> 00:07:49,330
ở đây nó nói mục ngoại lệ xảy ra khi có một ngoại lệ đang chờ xử lý với
88

89
00:07:49,330 --> 00:07:52,990
đủ ưu tiên
89

90
00:07:52,990 --> 00:07:59,030
đừng lo lắng nhiều về các chi tiết và những gì quan trọng hơn, những gì chúng ta muốn tìm hiểu
90

91
00:07:59,030 --> 00:08:00,230
đây rồi, ở đây
91

92
00:08:00,230 --> 00:08:07,630
Nó cũng cho biết khi bộ xử lý có ngoại lệ, bộ xử lý sẽ đẩy thông tin lên ngăn xếp.
92

93
00:08:07,650 --> 00:08:15,730
Hoạt động này được gọi là xếp chồng và cấu trúc của tám từ dữ liệu được gọi là khung ngăn xếp.
93

94
00:08:16,050 --> 00:08:19,540
Ghi nhớ một từ có nghĩa là loại dữ liệu 32 bit.
94

95
00:08:19,590 --> 00:08:24,190
Vì vậy, nó có nghĩa là cấu trúc của tám thanh ghi được gọi là khung stack.
95

96
00:08:24,210 --> 00:08:32,160
Nó tiếp tục nói khi sử dụng các thói quen dấu phẩy động, bộ xử lý cortex M4 tự động
96

97
00:08:32,180 --> 00:08:39,810
cũng sắp xếp các trạng thái dấu phẩy động trên mục ngoại lệ và nó cung cấp một sơ đồ ở đây
97

98
00:08:39,850 --> 00:08:42,490
để miêu tả những gì anh ấy đang nói về.
98

99
00:08:42,870 --> 00:08:49,750
Vì vậy, đây là khung ngăn xếp sử dụng bộ xử lý mà không kích hoạt điểm nổi.
99

100
00:08:49,920 --> 00:08:55,320
Và đây là khung stack sử dụng bộ xử lý với điểm nổi được kích hoạt, bạn có thể thấy nó dài bao nhiêu
100

101
00:08:55,320 --> 00:08:55,860
is.
101

102
00:08:55,860 --> 00:09:01,350
Vì vậy, đó là lý do tại sao tôi đã vô hiệu hóa đơn vị dấu phẩy động phần cứng dấu phẩy động.
102

103
00:09:01,470 --> 00:09:03,810
Vì vậy, chúng tôi nhận được khung stack này.
103

104
00:09:03,810 --> 00:09:12,420
Vì vậy, khi bộ xử lý có một ngoại lệ như ngắt systick, đó là một ngoại lệ,
104

105
00:09:12,810 --> 00:09:16,560
các thanh ghi này được lưu vào ngăn xếp.
105

106
00:09:16,680 --> 00:09:22,260
Nếu chúng tôi không vô hiệu hóa đơn vị dấu phẩy động phần cứng, chúng tôi sẽ lưu tất cả các thanh ghi này vào
106

107
00:09:22,260 --> 00:09:24,090
ngăn xếp nhưng chúng tôi đã vô hiệu hóa nó.
107

108
00:09:24,210 --> 00:09:26,900
Vì vậy, các thanh ghi được lưu vào ngăn xếp.
108

109
00:09:27,210 --> 00:09:34,680
Vì vậy, khi bộ xử lý kết thúc phục vụ thói quen dịch vụ ngắt thì nó sẽ khôi phục
109

110
00:09:34,770 --> 00:09:42,270
các thanh ghi này và nội dung của các thanh ghi này cho bộ xử lý biết chính xác nơi nó dừng trước
110

111
00:09:42,270 --> 00:09:47,160
sự gián đoạn xảy ra để nó có thể nhận từ nơi nó dừng lại.
111

112
00:09:47,160 --> 00:09:53,550
Vì vậy, chỉ cần tóm tắt lại từ sự sắp xếp này ở đây, chúng ta có thể nói rằng khi một ngoại lệ ngắt
112

113
00:09:53,640 --> 00:09:58,570
xảy ra tám thanh ghi được tự động lưu vào ngăn xếp.
113

114
00:09:58,700 --> 00:10:11,280
Các PSR, PC, LR, R12, R3, R2, R1 và sau đó là R0. XPSR được lưu trước và sau đó là R0
114

115
00:10:11,340 --> 00:10:12,840
được lưu cuối cùng.
115

116
00:10:12,840 --> 00:10:19,860
Vì vậy, chúng tôi tìm thấy R0 ở đầu ngăn xếp. Ngăn xếp M vỏ não phát triển từ địa chỉ bộ nhớ cao nhất
116

117
00:10:19,860 --> 00:10:21,060
đến mức thấp nhất
117

118
00:10:21,120 --> 00:10:25,040
Do đó, chúng tôi tìm thấy phần tử cuối cùng được đẩy lên ngăn xếp.
118

119
00:10:25,260 --> 00:10:29,270
Trong trường hợp này R0 với địa chỉ bộ nhớ thấp nhất.
119

120
00:10:29,340 --> 00:10:31,150
Bây giờ chúng ta hãy quay trở lại uVision.
120

121
00:10:31,190 --> 00:10:37,960
Hãy nhớ thanh ghi con trỏ ngăn xếp SP luôn luôn chỉ lên đỉnh của ngăn xếp.
121

122
00:10:38,160 --> 00:10:42,240
Vì vậy, con trỏ ngăn xếp đăng ký trong ngân hàng đăng ký vỏ não M.
122

123
00:10:42,270 --> 00:10:47,840
Nếu chúng ta có được địa chỉ của thanh ghi con trỏ ngăn xếp này và đi đến vị trí bộ nhớ đó.
123

124
00:10:47,910 --> 00:10:52,590
Sau đó chúng ta thực sự có thể nói tất cả nội dung của các thanh ghi này.
124

125
00:10:52,590 --> 00:10:58,370
Bởi vì điều này được lưu trữ trong ngăn xếp và thanh ghi con trỏ ngăn xếp trỏ đến đỉnh của ngăn xếp.
125

126
00:10:58,380 --> 00:11:04,240
Bây giờ chúng ta hãy đến uVision và xem liệu chúng ta có thể tìm thấy sự sắp xếp tương tự này trong bộ nhớ của chúng ta hay không.
