PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Cho em hỏi về quản lý stack (http://www.picvietnam.com/forum/showthread.php?t=1557)

david 29-09-2007 03:05 AM

Cho em hỏi về quản lý stack
 
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

Trích:

Nguyên văn bởi plain (Post 11692)
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 ?


Múi giờ GMT. Hiện tại là 04:53 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam