vỏ não-m3 rất thân thiện. Bạn không cần một tấm bạt lò xo trong asm hoặc cần thêm bất kỳ cú pháp trình biên dịch không chuẩn nào để làm cho trình biên dịch làm điều đó cho bạn. Phần cứng phù hợp với abi bằng cách duy trì một số lượng thanh ghi nhất định cho bạn cũng như thay đổi chế độ. Thanh ghi liên kết được mã hóa để khi trở về từ chức năng, phần cứng biết nó thực sự là một sự trở lại từ ngắt. Vì vậy, tất cả những điều bạn phải làm trên một cánh tay và nhiều bộ xử lý khác mà bạn không phải làm.
Tương tự, với mức độ đau đớn, cortex-m (và các nhánh mới hơn) có một vectơ vectơ trong bảng vectơ, hàng chục đến hàng trăm ngắt, v.v. như đã đề cập trong một nhận xét ở trên, hãy xem http://github.com/ dwelch67 / stm32f4d ví dụ blinker05 sử dụng các ngắt với bộ định thời gian, bạn có thể thấy trong vectơ rằng tất cả những gì bạn làm là đặt tên của hàm:
.word hang
.word tim5_handler
.word hang
Và sau đó viết mã C:
//-------------------------------------------------------------------
volatile unsigned int intcounter;
//-------------------------------------------------------------------
// CAREFUL, THIS IS AN INTERRUPT HANDLER
void tim5_handler ( void )
{
intcounter++;
PUT32(TIM5BASE+0x10,0x00000000);
}
// CAREFUL, THIS IS AN INTERRUPT HANDLER
//------------------------------------------------------------------
Bây giờ, như với bất kỳ ngắt từ một số thiết bị ngoại vi / thiết bị mà bạn có thể phải, trong trình xử lý, hãy nói với thiết bị để xóa ngắt nếu không bạn có thể bị kẹt liên tục vào lại trình xử lý.
Các ví dụ của tôi không sử dụng IDE, chúng sử dụng các công cụ nguồn mở (gnu gcc và binutils và trình biên dịch clang của llvm). Xóa các nhị phân clang khỏi tất cả: dòng trong makefile nếu bạn không có / muốn sử dụng llvm. Các công cụ gnu rất dễ xuất hiện, cả hai đều được xây dựng từ các nguồn (tôi có hướng dẫn ở đâu đó tại github, có thể là một số địa điểm) hoặc chỉ lấy phiên bản rút gọn từ mã hóa (bây giờ là đồ họa cố vấn). Các ví dụ của tôi được phát triển và thử nghiệm trên linux, nhưng điều đó không làm nản lòng người dùng windows, thay đổi một số thứ như rm -f * .o thành del * .o, những thứ như thế hoặc chỉ xây dựng một tệp bó từ các lệnh của trình biên dịch / trình biên dịch / trình liên kết trong tệp thực hiện.
Tôi rất khuyên bạn nên tháo rời nhị phân của mình, đặc biệt nếu bạn đang cố gắng đặt một trình xử lý trong bảng vectơ, với rất nhiều thứ rất dễ bị nhầm lẫn và không có nó ở đúng địa chỉ. Bạn cần biết địa chỉ từ các tài liệu cánh tay sau đó kiểm tra việc tháo gỡ. ví dụ blinker05 khi tháo rời:
8000100: 0800014f stmdaeq r0, {r0, r1, r2, r3, r6, r8}
8000104: 0800014f stmdaeq r0, {r0, r1, r2, r3, r6, r8}
8000108: 08000179 stmdaeq r0, {r0, r3, r4, r5, r6, r8}
800010c: 0800014f stmdaeq r0, {r0, r1, r2, r3, r6, r8}
8000110: 0800014f stmdaeq r0, {r0, r1, r2, r3, r6, r8}
bù 0x108 là mục tiêu được nhắm mục tiêu. Lưu ý rằng các địa chỉ trong bảng phải là số lẻ 0x178 là địa chỉ thực tế, cánh tay muốn đặt lsbit để chỉ ra đó là địa chỉ tập lệnh ngón tay cái (cortex-m3 chỉ biết ngón tay cái và phần mở rộng ngón tay cái nó không thể thực hiện hướng dẫn cánh tay).