0
1
00:00:02,130 --> 00:00:06,210
歡迎回來，讓我們繼續。
1

2
00:00:06,220 --> 00:00:07,210
所以我要繼續
2

3
00:00:07,210 --> 00:00:13,750
通過在此處創建一個簡單的功能來幫助我打開和關閉深藍色LED。我要去
3

4
00:00:13,750 --> 00:00:20,900
要創建一個簡單的API，我將其命名為藍色，因此將其禁用為藍色
4

5
00:00:21,490 --> 00:00:24,450
而且它也是void void function。
5

6
00:00:25,720 --> 00:00:30,310
基本上，我可以簡單地調用此功能來打開藍色LED
6

7
00:00:37,800 --> 00:00:49,730
讓我們有一個對手，這將是一個開始。
7

8
00:00:49,930 --> 00:00:56,150
在這裡，我們可以使用此運算符打開藍色
8

9
00:00:56,170 --> 00:00:59,350
因此，讓我們將原型放在頂部
9

10
00:00:59,810 --> 00:01:03,520
看看，就把它放在這裡
10

11
00:01:06,560 --> 00:01:07,020
也把這個放在這裡
11

12
00:01:11,630 --> 00:01:14,430
所以現在我要過來。
12

13
00:01:15,290 --> 00:01:18,590
我要做的就是調用一個新函數
13

14
00:01:22,550 --> 00:01:34,460
亮或延遲一秒鐘，然後滅，然後再延遲一秒鐘，對。
14

15
00:01:34,460 --> 00:01:41,160
因此，讓我們在板上進行編譯和測試。
15

16
00:01:44,730 --> 00:01:46,990
零錯誤，零警告。
16

17
00:01:47,070 --> 00:01:55,500
因此，連接您的電路板並下載，我希望您的藍色LED閃爍。
17

18
00:01:55,530 --> 00:01:57,070
我的在閃爍，只是藍色
18

19
00:01:57,210 --> 00:02:03,060
因此，現在讓我們進入調試視圖，並檢查代碼大部分時間都花在了哪裡。
19

20
00:02:03,070 --> 00:02:04,970
所以我將點擊此處進行調試視圖
20

21
00:02:09,020 --> 00:02:11,270
它打開。
21

22
00:02:11,430 --> 00:02:11,760
對。
22

23
00:02:11,760 --> 00:02:17,310
因此，在測試代碼之前，請確保您具有本地視圖，核心堆棧和本地視圖。
23

24
00:02:17,610 --> 00:02:18,450
在這裡
24

25
00:02:18,450 --> 00:02:26,160
如果您不來這裡查看，然後選擇調用堆棧窗口，那麼它將啟用該視圖
25

26
00:02:26,160 --> 00:02:27,720
為了你。
26

27
00:02:27,720 --> 00:02:34,830
所以發生的是，當我在這裡按下此按鈕時，運行，代碼將像我在
27

28
00:02:34,830 --> 00:02:37,750
以正常方式運行固件。
28

29
00:02:37,740 --> 00:02:43,200
當它運行時，我將在開始運行此按鈕時按此按鈕，然後停止按鈕
29

30
00:02:43,200 --> 00:02:48,450
要激活，我將按此按鈕，然後它將停止，然後我們將在哪裡看到
30

31
00:02:48,450 --> 00:02:49,440
代碼停止。
31

32
00:02:49,440 --> 00:02:55,260
因此，我將按此按鈕，代碼將運行，因為您可以看到藍色的LED像預期的那樣閃爍
32

33
00:02:55,260 --> 00:02:56,280
眨眼。
33

34
00:02:56,280 --> 00:02:58,740
因此，我將單擊此處停止。
34

35
00:02:58,800 --> 00:03:03,380
我們中斷代碼，以便可以找到程序停止的位置。
35

36
00:03:03,510 --> 00:03:05,750
對。在通話堆棧中加上本地人
36

37
00:03:06,180 --> 00:03:07,140
視圖。
37

38
00:03:07,470 --> 00:03:12,660
我們意識到，它已停止在此函數，get tick函數中，並且此函數是延遲的一部分
38

39
00:03:12,660 --> 00:03:13,100
模塊。
39

40
00:03:13,110 --> 00:03:18,760
我們可以通過右鍵單擊此處並顯示顏色代碼來找到答案。看到，
40

41
00:03:18,900 --> 00:03:22,740
我們發現它在delay的函數中。
41

42
00:03:22,740 --> 00:03:30,700
因此，我們將再次運行該代碼以停止它，然後查看我正在運行它，然後再次停止。
42

43
00:03:30,740 --> 00:03:32,810
然後我們在同一個地方找到它。
43

44
00:03:33,000 --> 00:03:43,440
它在哪裡度過時間？在延遲中。讓我們第三次這樣做。我只是隨機運行，停止運行
44

45
00:03:43,770 --> 00:03:51,180
然後我們仍然在get tick函數中找到自己，它是延遲函數，對。
45

46
00:03:51,200 --> 00:03:57,830
實際上，這段代碼在延遲功能上花費了大約95％的時間，我們知道延遲功能
46

47
00:03:57,920 --> 00:03:59,020
什麼也沒做。
47

48
00:03:59,120 --> 00:04:02,890
它只會吞噬CPU週期而無所作為。
48

49
00:04:02,930 --> 00:04:08,360
我還應該指出，這種簡單的程序結構就是所謂的背景/前景
49

50
00:04:08,960 --> 00:04:16,900
線程結構，意味著具有正常的主要功能和至少一個中斷服務程序。
50

51
00:04:16,900 --> 00:04:21,410
主功能設置為前台，而中斷服務程序設置為前台
51

52
00:04:21,410 --> 00:04:22,410
的背景。
52

53
00:04:22,410 --> 00:04:28,100
在上面的示例中，我們當然編寫了main函數和一個中斷服務處理程序
53

54
00:04:28,130 --> 00:04:34,590
systick處理程序記住中斷處理程序也稱為中斷服務程序。
54

55
00:04:34,760 --> 00:04:40,440
我還應該向您指出，目前正在進行激烈的辯論，其背景是什麼
55

56
00:04:40,440 --> 00:04:43,020
而這是前景。在某些文本中
56

57
00:04:43,100 --> 00:04:50,260
您會發現主要功能描述為在後台運行，而中斷服務則在前景運行。
57

58
00:04:50,300 --> 00:04:57,160
此類文本的一個示例是microm OS 2。你們中有些人可能很熟悉
58

59
00:04:57,220 --> 00:05:04,550
使用microm操作系統，這是實時的內核，非常流行的工業級microm os兩個真正的
59

60
00:05:04,550 --> 00:05:10,790
時間內核文檔將主線程描述為中斷服務時的後台
60

61
00:05:10,790 --> 00:05:13,940
例行程序是前台。
61

62
00:05:13,940 --> 00:05:20,510
但是，大多數文本都發現將主線程稱為前台和
62

63
00:05:20,510 --> 00:05:26,780
以中斷服務程序為背景，在本課程中，我們將參考
63

64
00:05:26,780 --> 00:05:32,870
主線程作為前台，中斷服務程序a作為後台。
64

65
00:05:32,900 --> 00:05:40,220
讓我們看一下我們剛剛編寫的簡單固件的流程圖。正如我們在這裡看到的，它開始了
65

66
00:05:40,510 --> 00:05:47,810
它初始化GPIO，它打開藍色，然後延遲一秒鐘，然後關閉藍色
66

67
00:05:47,960 --> 00:05:51,100
然後延遲一秒鐘，然後返回。
67

68
00:05:51,440 --> 00:05:59,330
但重要的是這裡的矩形，我們在延遲函數中發現
68

69
00:05:59,330 --> 00:06:06,650
這些箭頭往回走。當執行到達此處時，它會等待事件，並保留下來
69

70
00:06:06,650 --> 00:06:09,200
阻止，直到事件發生。
70

71
00:06:09,290 --> 00:06:13,230
在此示例中，該事件是操縱桿超時。
71

72
00:06:13,390 --> 00:06:19,910
記住，我們通過傳遞給delay函數的參數直接設置了超時時間。
72

73
00:06:20,390 --> 00:06:27,170
我們幾乎每天在嵌入式固件中使用的這種實現方式會造成延遲
73

74
00:06:27,170 --> 00:06:30,990
功能，這就是所謂的阻塞代碼。
74

75
00:06:31,080 --> 00:06:36,530
這就是為什麼程序將大部分時間都用在延遲s中的原因，因為當到達該部分時
75

76
00:06:36,620 --> 00:06:39,050
阻塞直到發生超時。
76

77
00:06:39,050 --> 00:06:44,700
繼續，現在讓我們創建API，以幫助我們切換橙色LED。
77

78
00:06:44,840 --> 00:06:50,030
所以我要做的是像這樣複製我要藍的那些
78

79
00:06:50,030 --> 00:06:57,320
然後將其粘貼到此處，然後在所有找到藍色的地方都將其重命名為橙色，因此我將
79

80
00:06:57,320 --> 00:07:01,370
將其重命名為橙色應為小寫。
80

81
00:07:01,760 --> 00:07:03,830
那邊當然是橙色
81

82
00:07:07,140 --> 00:07:09,640
然後在這裡橙色
82

83
00:07:13,210 --> 00:07:17,180
然後是橙色。
83

84
00:07:17,440 --> 00:07:22,870
是的，這是藍色，我誤將其命名為藍色。
84

85
00:07:23,260 --> 00:07:25,190
所以我只是要重新安排它。
85

86
00:07:26,730 --> 00:07:27,430
這個這裡
86

87
00:07:30,540 --> 00:07:35,920
讓我把它拿到那裡，整理一下，對。
87

88
00:07:35,960 --> 00:07:37,180
被掩蓋了。
88

89
00:07:37,190 --> 00:07:42,080
所以接下來讓我們像這樣在這裡放置新功能的原型
89

90
00:07:45,880 --> 00:07:48,510
讓我們複製此內容，然後粘貼。
90

91
00:07:48,730 --> 00:07:50,670
然後變成橙色，
91

92
00:07:55,590 --> 00:07:58,380
這當然變成橙色
