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
cách nhưng một cách song song. 2
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
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
vòng lặp giống như chức năng chính mà chúng ta có. 5
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
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
tranh luận. 8
Tôi sẽ mở và tôi sẽ đóng. 9
Và tất nhiên, tôi sẽ có một vòng lặp trong đó. 10
Đây là những gì thực sự làm cho nó một chức năng chính. 11
Và tôi sẽ có một cái tương tự cho màu xanh như thế này. 12
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
màu xanh và sau đó làm tương tự cho quả cam. 14
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
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
đến đây màu cam và 17
tất nhiên rồi, màu cam 18
hãy xem nào 19
Tại sao điều này có vấn đề? 20
Hãy xem, tất nhiên có một sai lầm ở đây. 21
Tốt 22
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
màu xanh chính và màu cam chính 24
bên trong chức năng chính này 25
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
Trong thực tế, thay vì chỉ tắt các bit của đèn LED màu xanh ở cổng D. 27
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
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
on. 30
Tôi có nghĩa là sẽ làm cho thí nghiệm hơi khó hiểu. 31
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
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
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
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
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
làm cho mã không chấm dứt. 37
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
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
bàn tay màu cam. 40
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
Tôi chỉ vừa mới đến đây. 42
Và như bạn có thể thấy nó có một vòng lặp vô hạn ở đây. 43
Hàm này không trả về. 44
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
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
bởi vì có một vòng lặp vô hạn ở đây. 47
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
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
và chúng ta có thể khởi tạo biến ở đây để có điểm bắt đầu. 50
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
Chúng tôi thực sự có thể đạt được mã này ở đây. 52
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
phần cứng điểm nổi. 54
Điều này sẽ cho phép chúng ta quan sát đúng các thay đổi trong bộ nhớ. 55
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
Và một khi đã xong tôi sẽ kiểm tra lại. 57
Đây là chức năng chính, đây là chức năng chính thông thường. 58
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
Tôi đã có biến dễ bay hơi này ở đây và nó được khởi tạo về không. 60
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
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
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
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
Và như bạn có thể thấy đèn LED màu cam đang nhấp nháy. 65
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
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
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
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
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
Đó là giá trị này 71
Vì vậy, nếu tôi chỉ gõ giá trị này ở đây. 72
và tôi nhấn Enter, nó sẽ đưa tôi đến địa chỉ của con trỏ ngăn xếp. 73
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
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
đă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
RAM. 77
Vì vậy, những nội dung này được lưu vào ngăn xếp. 78
Để 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
sau khi nó kết thúc 80
phục vụ các thói quen dịch vụ ngắt. 81
Đ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
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
Đầ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
và sau đó tôi sẽ chọn cuốn sách đặc biệt này. 85
Đúng. 86
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
ở đâ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
đủ ưu tiên 89
đừ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
đây rồi, ở đây 91
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
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
Ghi nhớ một từ có nghĩa là loại dữ liệu 32 bit. 94
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
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
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
để miêu tả những gì anh ấy đang nói về. 98
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
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
is. 101
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
Vì vậy, chúng tôi nhận được khung stack này. 103
Vì vậy, khi bộ xử lý có một ngoại lệ như ngắt systick, đó là một ngoại lệ, 104
các thanh ghi này được lưu vào ngăn xếp. 105
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
ngăn xếp nhưng chúng tôi đã vô hiệu hóa nó. 107
Vì vậy, các thanh ghi được lưu vào ngăn xếp. 108
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
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
sự gián đoạn xảy ra để nó có thể nhận từ nơi nó dừng lại. 111
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
xảy ra tám thanh ghi được tự động lưu vào ngăn xếp. 113
Các PSR, PC, LR, R12, R3, R2, R1 và sau đó là R0. XPSR được lưu trước và sau đó là R0 114
được lưu cuối cùng. 115
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
đến mức thấp nhất 117
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
Trong trường hợp này R0 với địa chỉ bộ nhớ thấp nhất. 119
Bây giờ chúng ta hãy quay trở lại uVision. 120
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
Vì vậy, con trỏ ngăn xếp đăng ký trong ngân hàng đăng ký vỏ não M. 122
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
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
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
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.