PDA

View Full Version : Cho em hỏi về quản lý stack


david
29-09-2007, 03:05 AM
Pic 16f877a có 8 stack để chứa PC khi chương trình thực hiện ngắt,hay lệnh call,lệnh goto,và trong chương trình có nhiều vòng lệnh call,goto lồng nhau có thể dẫn đế tràn stack,em nói thế không sai chứ ạ
Có bác nào có thể nói cho em những qui tắc để không xay ra tràn không ?
Thank!

falleaf
29-09-2007, 03:19 PM
Lệnh goto không lưu vào stack (TOS = Top Of Stack). Lệnh goto chỉ ảnh hưởng tới PC.

Quản lý TOS chỉ ảnh hưởng khi mà bạn viết bằng MPASM, còn nếu bạn viết bằng C thì tự động giải thuật sẽ xử lý các vòng lặp cho bạn, và gần như các vòng lặp trong ngôn ngữ cấp cao chỉ là vòng lặp về mặt thuật toán, nó không ảnh hưởng tới TOS vì những nhà lập trình đã phải xử lý vấn đề này. Họ xử lý như thế nào thì F cũng không rõ, vì mỗi trình dịch và ngôn ngữ đều khác nhau.

Còn trong MPASM, thực chất khi nhảy vào ngắt thì khi có ngắt chúng ta sẽ lập tức khoá ngắt, không cho ngắt xảy ra đồng thời, vào trước ra trước, nếu ngắt đồng thời thì xử lý ưu tiên. Đó là cách xử lý thông dụng nhất. Do vậy, ngắt chỉ tốn 1 ngăn. Như vậy trong chương trình, còn lại 7 ngăn. Nguyên tắc của 7 ngăn chỉ ảnh hưởng bởi lệnh Call. Như vậy nếu bạn viết lệnh Call, thì bạn nhớ ghi chú vào đó là Call cấp mấy. Nếu bạn dùng tới Call cấp 7 lồng nhau, thì như vậy bạn rất có nguy cơ bị tràn stack.

Ngoài ra, không thể lường trước hết mọi tình huống như vòng lặp xoay vòng, tràn TOS, hoặc các ảnh hưởng nhiễu, chúng ta có công cụ WDT (Watch Dog Timer) để quản lý các trường hợp này.

Chúc vui.

plain
30-09-2007, 11:05 AM
theo tôi biết, với 16F877A, ta không có lệnh can thiệp vào stack, vậy bác F có cách nào làm một chương trình reset bằng phần mềm (đưa con trỏ lệnh về đầu chương trình) không? Ví dụ như khi xảy ra ngắt -> thực hiện ngắt -> nhảy về đầu chương trình và lờ đi chương trình con đang thực hiện. Kiểu như clr ACC, push ACC, Push ACC trong 8051 ý

falleaf
30-09-2007, 02:32 PM
theo tôi biết, với 16F877A, ta không có lệnh can thiệp vào stack, vậy bác F có cách nào làm một chương trình reset bằng phần mềm (đưa con trỏ lệnh về đầu chương trình) không? Ví dụ như khi xảy ra ngắt -> thực hiện ngắt -> nhảy về đầu chương trình và lờ đi chương trình con đang thực hiện. Kiểu như clr ACC, push ACC, Push ACC trong 8051 ý

877, 887, dòng Midrange nói chung, có các mức reset khác nhau. Hoạt động reset mà bạn nói là chủ động hay bị động? Chủ động có nghĩa là khi nào bạn muốn reset thì nhấn một nút nó sẽ reset, vậy tại sao bạn không dùng ngay nút reset. Bị động nghĩa là chương trình đang chạy bạn muốn reset. Tới một điểm nào bạn muốn reset thì bạn nhớ là có WDT đấy. WDT có thể làm khá nhiều việc, nếu bạn chỉ đặt thời gian reset cho WDT rất ngắn thì sẽ thế nào nhỉ? Hoặc nếu tới chỗ bạn cần mà bạn không reset WDT thì nó thế nào?

Chúc vui.

plain
04-10-2007, 07:12 PM
có thế mà em không nghĩ ra. Cám ơn bác F nhiều nhé

david
13-10-2007, 09:56 PM
Có cách nào mở rộng stack của Pic không các bác ?