現在讓我們探索如何同時而不是按順序切換藍色和橙色LED 1
方式，但有點平行。 2
因此，要做到這一點，我們必須為橙色和綠色創建主要功能，現在我要做的是 3
將先創建橙色主線，然後創建綠色主線，然後在這些函數中將存在無限個 4
循環就像我們擁有的主要功能一樣。 5
但這一次是橙色，然後是綠色，我要開始，常規的主要功能是 6
int main，但這次我們要使用橙色main，int橙色main。不用 7
論點。 8
我要打開，我要關閉。 9
當然，我將在其中有一個循環。 10
這才真正使它成為主要功能。 11
我將有一個類似的藍色。 12
當然，我將在循環的一個循環中填充藍色LED的切換代碼 13
藍色，然後對橙色執行相同操作。 14
因此，我將在此處剪切我們測試過的藍色代碼，然後將其放入主藍色 15
或藍色主體，然後我將其變成橙色，然後將其重命名為橙色，我將 16
過來這裡橙色 17
那當然是橙色 18
讓我們來看看 19
為什麼這有問題？ 20
讓我們看看，當然這裡有一個錯誤。 21
好。 22
因此，我們現在有兩個主要功能。讓我們保留原始的main函數，然後調用 23
藍色主體和橙色主體 24
在這個主要功能內 25
我只在這裡叫藍色總管。藍色強調底線，然後強調橙色。 26
實際上，不僅僅是關閉端口D中藍色LED的位。 27
讓我們關閉整個端口，以免在實驗過程中陷入困境 28
在這裡我們關閉了藍色LED，但是由於我們沒有明確關閉橙色，我們找到了橙色 29
on. 30
我的意思是，這會使實驗有些混亂。 31
因此，我要做的是，與其使用該運算符關閉藍色，不如將其關閉 32
的所有引腳都熄滅，所以當我說藍色熄滅時，所有LED都熄滅。 33
當我說橙色時，所有LED也會熄滅。這將簡化我們的查看方式。 34
所以當我將這些功能帶入此處，何時 35
我把這些功能帶到這裡，我不得不在原始主要功能中保留一會兒，以便 36
使代碼不終止。 37
如果我們不把這根線放在這裡，這個主要功能將運行，並且將終止。 38
但是，當我們將其放置在此處時，它仍然存在，它使我們有時間在藍色主電源和藍色主電源之間進行切換。 39
橙色的手。 40
另一件事是，為了能夠到達代碼的這一部分，請記住這裡的藍色主體。 41
我剛到這裡 42
如您所見，這裡有一個無限循環。 43
此函數不返回。 44
因此，當編譯器編譯所執行的操作時，通常會忽略此代碼 45
因為它知道第一個藍色主函數不會返回，所以此後的任何內容都無法訪問 46
因為這裡有一個無限循環。 47
因此，要使其他代碼，藍色主體代碼之後的代碼，無限循環之後的代碼可以訪問，我們可以 48
創建一個像這樣的volatile變量並設置一個if條件，如果啟動則執行此操作，否則執行該操作 49
我們可以在此處初始化變量，以便有一個起點。 50
因此，當我們轉到調試器時，我們嘗試操作內存中的值。 51
我們實際上可以在這裡找到此代碼。 52
現在繼續進行操作，更改目標選項。我將點擊此處，然後禁用 53
浮點硬件。 54
這將使我們能夠正確觀察內存中的變化。 55
因此，默認情況下表示使用單精度。我要說不使用，然後單擊“確定”。 56
一旦完成，我將仔細檢查。 57
這是主要功能，這是常規的主要功能。 58
在main函數內部，我們有藍色main，還有橙色main。 59
我在這裡有此volatile變量，它已初始化為零。 60
表示是否為其他，表示運行代碼的else部分，因為else為零。 61
因此，當我們運行代碼時，我們應該看到橙色的LED閃爍。 62
但是我將從調試視圖運行它，所以我將首先單擊此處。 63
我將關閉它，然後要做的是，我將單擊此處運行代碼。 64
如您所見，橙色LED閃爍。 65
所以我接下來要做的是，我將一個斷點放置在systick中，以便當我們進入 66
中斷服務程序我們可以手動進行某些更改。 67
因此，我將像這樣在此處放置一個斷點，然後停止。 68
完成此操作後，我將在此處向我的視圖添加內存視圖，並在此處查看內存窗口並選擇一個內存 69
我將導航到堆棧指針的地址，該地址為六四零。 70
這就是這個價值 71
因此，如果我只是在此處輸入此值。 72
然後按Enter鍵，它將帶我到堆棧指針的地址。 73
因此，我將稍微調整一下視圖。 74
因此，當皮質M處理器中發生中斷時，皮質M中某些寄存器的內容 75
寄存器組保存到堆棧中。請記住，堆棧只是存在於其中的特定內存區域 76
RAM。 77
因此，這些內容將保存到堆棧中。 78
這樣處理器就可以返回堆棧並恢復之前保存的內容 79
完成之後 80
為中斷服務程序提供服務。 81
這使進程可以在中斷發生時準確地繼續到停止的位置。 82
讓我們看一下ARM cortex M4設備通用使用指南。 83
首先，我將退出調試器，以便可以在此處選擇書籍。我會選書 84
然後選擇這本特殊的書 85
對。 86
因此，在ARM cortex M4設備通用用戶指南中，在異常模型中， 87
在這裡它說當有一個待處理的異常時發生異常輸入 88
足夠的優先權 89
不必擔心細節，更重要的是，我們想學習什麼 90
在這裡 91
它還說，當處理器發生異常時，處理器會將信息壓入堆棧。 92
此操作稱為堆棧，八個數據字的結構稱為堆棧幀。 93
請記住，單詞是指32位數據類型。 94
因此，這意味著八個寄存器的結構稱為堆棧幀。 95
繼續說，��用浮點例程時，Cortex M4處理器會自動 96
還將異常條目上的浮點狀態堆棧起來，並在此處提供了一個圖表 97
描繪他在說什麼。 98
因此，這是使用未啟用浮點的處理器的堆棧幀。 99
這是使用啟用了浮點的處理器的堆棧幀，您可以看到它有多長時間 100
is. 101
因此，這就是為什麼我禁用了浮點硬件的浮點單元的原因。 102
這樣我們就得到了這個堆棧框架。 103
因此，當處理器處理異常（例如systick中斷）時， 104
這些寄存器保存到堆棧中。 105
如果我們沒有禁用硬件浮點單元，我們會將所有這些寄存器保存到 106
堆棧，但我們禁用了它。 107
因此，這些寄存器將保存到堆棧中。 108
因此，當處理器完成對中斷服務程序的服務後，它將恢復 109
這些寄存器以及這些寄存器的內容會告訴處理器確切的停止位置 110
發生中斷，以便它可以從停止的地方開始。 111
因此，是的，只是在這裡再次回顧一下這種安排，我們可以知道當一個中斷異常時 112
發生八個寄存器會自動保存到堆棧中。 113
PSR，PC，LR，R12，R3，R2，R1然後是R0。首先保存XPSR，然後保存R0 114
最後保存。 115
因此，我們在堆棧頂部找到了R0。 cortex M堆棧從最高內存地址增長 116
到最低。 117
因此，我們找到了最後一個要壓入堆棧的元素。 118
在這種情況下，R0具有最低的存儲器地址。 119
現在讓我們回到uVision。 120
請記住，堆棧指針寄存器SP始終指向堆棧的頂部。 121
因此，堆棧指針在皮質M寄存器組中進行寄存器。 122
如果要獲取此堆棧指針寄存器的地址並轉到該內存位置。 123
然後，我們實際上可以說出這些寄存器的所有內容。 124
因為它存儲在堆棧中，並且堆棧指針寄存器指向堆棧的頂部。 125
現在，我們轉到uVision，看看是否可以在內存中找到這種相似的排列。