გალერეა

ქვეპროგრამები მიკროკონტროლერში. სტეკი

მიკროკონტროლერი. დღე 3.  

ქვეპროგრამები მიკროკონტროლერში. სტეკი. 

atmel-chip1-1გავაგრძელოთ ექსპერიმენტები  Atmega8 მიკროკონტროლერის პროგრამირებასა და მოდელირებაში. ალგორითმის საბოლოო ვარიანტი გარდავქმნათ ისე, როგორც სურათზეა გამოსახული.

ალგორითმი მოიცავს ორ შტოს. პირველი მათგანი, რომელიც იწყება ვერტექსით RESET, წამოადგენს ძირითად პროგრამას, ხოლო მეორე (ვერტქსით DELAY) წარმოადგენს დაყოვნების ქვეპროგრამას. ძირთად პროგრამაში დირექტივა „DELAY” ახორციელებს ამავე სახელწოდების ქვეპროგრამის შერულებას. სახელწოდება, რა თქმა უნდა, ნებისმიერი შეიძლება იყოს. ახალი ვერტექსის მისაღებად მოათავსეთ კურსორი თავისუფალ ადგილას და ერთდროულად დააჭირეთ Ctrl+Alt+Shift. მიღებულ ვერტექსს დაარქვით DELAY. დანარჩენი რაიმე სიძნელეს არ უნდა წარმოადგენდეს. თუ ძველ და ახლად შექმნილ ალგორითმებს შევადარებთ, დავრწმუნდებით, რომ ისინი ფუნქციონალურად იდენტურნი არიან.
ალგორითმის განმეორებადი ნაწილების ცალკე ქვეპროგრამად გამოყოფა ფართოდ გავრცელებულ პრაქტიკას წარმოადგენს.  ქვეპროგრამა ყოველთვის მთავრდება ბრძანებით “RET”, რაც აიძულებს მიკროკონტროლერს გადავიდეს იმ ბრძანების შესრულებაზე, რომელიც უშუალოდ მოჰყვება ქვეპროგრამის გამოძახების დირექტივას.  ცხადია, რომ მიკროკონტროლერი იმახსოვრებს ადგილს, სადაც უნდა დაბრუნდეს ქვეპროგრამის შესრულების შემდეგ. დაბრუნების მისამართების დასამახსოვრებლად მიკროკონტრელერის ოპერატიულ მახსოვრობაში გამოყოფილია სპეციალური ადგილი, რომელსაც სტეკი ეწოდება. თუ ქვეპროგრამა, თავის მხრივ შეიცავს მეორე ქვეპროგამას, მაშინ პირველი ქვეპროგრამის გამოძახებისას, ოპერატიული მახსოვრობის სულ ბოლო უჯრაში (სტეკის ძირი) ჩაიწერება დაბრუნების მისამართის უფროსი ბაიტი, ბოლოს წინა უჯრაში – დაბრუნების მისამართის უმცროსი ბაიტი (მისამართები ორ ბაიტიანია) და რეგისტრში, რომელსაც სტეკის მაჩვენებელი ეწოდება, ჩაიწერება ოპერატიული მახსოვრობის ბოლოს წინას წინა უჯრის მისამართი, რომელშიც შეიძლება ჩაწერილი იქნას შემდეგი ქვეპროგრამიდან დასაბრუნებელი მისამართი. ამ უჯრას სტეკის წვერო ეწოდება. ამრიგად, სტეკის მაჩვენებლის (რეგისტრის) შიგთავსი ორით შემცირდა. შემდეგი ქვეპროგრამის გამოძახებისას, იგი კიდევ ორით შემცირდება, ხოლო მეორე ქვეპროგრამიდან დაბრუნების შემდეგ – ორით გაიზრდება, ვინაიდან მეორე ქვეპროგრამის დაბრუნების მისამართი აღარ გვჭირდება. პირველი ქვეპროგრამიდან დაბრუნება გამოიწვევს სტეკის მაჩვენებლის კიდევ ორით გაზრდას და სტეკის წვერო მის ძირს გაუტოლდება (სტეკი ცარიელია). იმის გამო, რომ კვების წყაროს ჩართვის შემდეგ  სტეკის მაჩვენებლის რეგისტრში ნოლები წერია, საჭიროა პროგრამის დასაწყისში მოხდეს სტეკის მაჩვენებლის ინიციალიზაცია – ანუ მასში სტეკის ძირის მისამართის ჩაწერა. დააყენეთ კურსორი ალგორითმის დასაწყისზე (RESET) და მენიუში აირჩიეთ “Elements”, “Setter”, “Stack Pointer (SP)”.
თუ ქვეპროგრამა მიკროკონტროლერის იმავე რეგისტრებს იყენებს, რომელსაც ძირითადი, მაშინ, ცხადია, აუცილებელია ამ რეგისტრების შიგთავსების სტეკში დამახსოვრება და პირიქით, ქვეპროგრამის დასრულებისას მათი მნიშნელობების აღდგენა. ეს ხორციელდება ბრძანებებით „Rx->”  -რეგისტრის შიგთავსის გადაგზავნა სტეკში და  “->Rx” -რეგისტრის აღდგენა. სტეკი ისეა ორგანიზებული, რომ ჩაწერა და აღდგენა ხდება უკუ თანმიმდევრობით. ეს წააგავს ერთი ბოლოდან დახურულ ცილინდრში ტენისის ბურთების ჩაწყობა – ამოღებას. ბურთების ამოღებისას პირველი ამოდის ის ბურთი, რომელიც ბოლოს იყო ჩადებული ცილინდრში. სტეკის ასეთ ორგანიზაციას “LIFO” ეწოდება (“Last In, First Out” – „ბოლო შევიდა, პირველი გამოვიდა“). ამიტომ განსაკუთრებული ყურადღება უნდა მიექცეს შენახვა – აღდგენის ბრძანებების თანმიმდევრობას. მაგალითად თუ რეგისტრების შესანახად იყო გამოყენებული თანმიმდევრობა „R1->, R2->, R3->” , მაშინ აღდგენა უნდა მოხდეს თანმიმდევრობით   “->R3, ->R2, ->R1” .

მენიუში აირჩიეთ “Program” “Compile”. გადაინაცვლეთ Proteus-ში და გაუშვით სიმულაცია. როგორც ხედავთ შედეგი იგივეა, რაც წინა ალგორითმის შემთხვევაში.

დატოვეთ კომენტარი