বেশ কয়েকটি মেশিনে আমি যে জিনিসটি দরকারী পেয়েছি তা হ'ল একটি সাধারণ স্ট্যাক সুইচার। আমি পিআইসির জন্য আসলে একটিও লিখিনি, তবে আমি আশা করব যে উভয় / সমস্ত থ্রেড মোট 31 বা তার চেয়ে কম স্ট্যাক স্তর ব্যবহার করলে পিক 18 এ পিকচারটি ঠিক কাজ করবে। 8051-তে, প্রধান রুটিনটি হ'ল:
_taskswitch:
এক্সচ এ, এসপি
xch a, _altSP
এক্সচ এ, এসপি
পচান
পিআইসি-তে, আমি স্ট্যাক পয়েন্টারের নামটি ভুলে যাই, তবে রুটিনটি এমন কিছু হবে:
_taskswitch:
মুভলব _াল্টএসপি >> 8
Movf _altSP, w, খ
Movff _STKPTR, AltSP
Movwf _STKPTR, গ
প্রত্যাবর্তন
আপনার প্রোগ্রামের শুরুতে, একটি টাস্ক 2 () রুটিন কল করুন যা বিকল্প স্ট্যাকের ঠিকানা দিয়ে AltSP লোড করে (16 সম্ভবত কোনও PIC18Fxx এর জন্য ভাল কাজ করবে) এবং টাস্ক 2 লুপটি চালায়; এই রুটিনটি আর কখনও ফিরে আসবে না অন্যথায় জিনিসগুলি বেদনাদায়ক মৃত্যুতে মরবে। পরিবর্তে, যখনই এটি প্রাথমিক কাজের নিয়ন্ত্রণ অর্জন করতে চায় তখন এটি _ টাস্কউইচকে কল করা উচিত; প্রাথমিক টাস্কটি তখনই টাস্কউইচকে কল করতে হবে যখনই এটি গৌণ কাজটি করতে চায়। প্রায়শই, কারওর মতো ছোট্ট রুটিনগুলি থাকে:
অকার্যকর বিলম্ব_t1 (স্বাক্ষরযুক্ত স্বল্প ভল)
{
করা
taskswitch ();
যখন ((স্বাক্ষরযুক্ত স্বল্প স্বাক্ষরিত) (মিলিসেকেন্ড_ক্লোক - ভাল)> 0xFF00);
}
নোট করুন যে টাস্ক সুইচারটির কোনও 'শর্তের অপেক্ষা' করার কোনও উপায় নেই; এটি সমর্থন একটি স্পিনওয়েট। অন্যদিকে, টাস্ক সুইচটি এত দ্রুত যে একটি টাস্কউইচ () চেষ্টা করার সময় যখন অন্য টাস্কটির টাইমারের মেয়াদ শেষ হওয়ার অপেক্ষায় থাকে তখন অন্য টাস্কটিতে স্যুইচ হয়ে যায়, টাইমারটি পরীক্ষা করে দেখবে এবং একটি সাধারণ টাস্ক-স্যুইচারের চেয়ে দ্রুত ফিরে যেতে হবে এটি নির্ধারণ করবে যে এটিতে টাস্কউইচের দরকার নেই।
মনে রাখবেন যে সমবায় মাল্টিটাস্কিংয়ের কিছু সীমাবদ্ধতা রয়েছে তবে অস্থায়ীভাবে বিরক্ত হওয়া ইনগ্রান্টেটদের দ্রুত পুনরায় প্রতিষ্ঠিত হতে পারে এমন ক্ষেত্রে এটি প্রচুর লকিং এবং অন্যান্য মিটেক্স সম্পর্কিত কোডের প্রয়োজনীয়তা এড়িয়ে চলে।
(সম্পাদনা): স্বয়ংক্রিয় ভেরিয়েবল এবং এ সম্পর্কিত কয়েকটি দম্পতি
- যদি কোনও রুটিন যা টাস্ক-স্যুইচিং ব্যবহার করে উভয় থ্রেড থেকে ডেকে আনা হয়, তবে সাধারনত রুটিনের দুটি কপি সংকলন করা প্রয়োজন (সম্ভবত # বিভিন্ন উত্সর বিবৃতি সহ একই উত্স ফাইলটি দুবার অন্তর্ভুক্ত করে)। প্রদত্ত যে কোনও উত্স ফাইলটিতে কেবল একটি থ্রেডের কোড থাকবে, অথবা অন্যথায় এমন কোড থাকবে যা দু'বার সংকলিত হবে - প্রতিটি থ্রেডের জন্য একবার - তাই আমি "# সংজ্ঞা বিলম্ব (x) বিলম্ব_t1 (এক্স)" বা ম্যাক্রোগুলি ব্যবহার করতে পারি # নির্ধারিত বিলম্ব (x) বিলম্ব_টিএক্স (এক্স) "আমি কোন থ্রেড ব্যবহার করছি তার উপর নির্ভর করে।
- আমি বিশ্বাস করি যে পিআইসির সংকলকরা যে ফাংশনটি "দেখা" করতে পারে না তা ধরে নিতে পারে যে এই জাতীয় ফাংশনটি কোনও এবং সমস্ত সিপিইউ রেজিস্ট্রে ট্র্যাশ করতে পারে, এইভাবে টাস্ক-স্যুইচ রুটিনে কোনও রেজিস্টার সংরক্ষণের প্রয়োজনীয়তা এড়ানো হবে [এর তুলনায় একটি দুর্দান্ত সুবিধা প্রিমিটিভ মাল্টিটাস্কিং]। অন্য যে কোনও সিপিইউয়ের জন্য অনুরূপ টাস্ক স্যুইচার বিবেচনা করে যে কোনও ব্যক্তিকে ব্যবহারের ক্ষেত্রে নিবন্ধভুক্ত কনভেনশন সম্পর্কে সচেতন হওয়া দরকার। কোনও টাস্ক স্যুইচের আগে রেজিস্টারগুলিকে পুশ করা এবং তাদের পরে পপ করা জিনিসগুলির যত্ন নেওয়ার একটি সহজ উপায়, ধরে নেওয়া যথেষ্ট পর্যাপ্ত স্ট্যাকের জায়গা রয়েছে।
সমবায় মাল্টিটাস্কিং লকিং এবং এই জাতীয় সমস্যাগুলি থেকে পুরোপুরি পালানোর অনুমতি দেয় না, তবে এটি সত্যিই জিনিসগুলিকে সহজতর করে। একটি কমপ্যাক্টিং আবর্জনা সংগ্রহকারী সহ একটি পূর্ববর্তী আরটিওএসে, উদাহরণস্বরূপ, অবজেক্টগুলিকে পিন করার অনুমতি দেওয়া প্রয়োজন। কো-অপারেটিভ সুইচার ব্যবহার করার সময়, জিসি অবজেক্ট যে কোনও সময় টাস্কউইচ () ডাকা যেতে পারে সেটিকে কোড ধরে নিয়েছে তবে এটি প্রয়োজনীয় নয়। একটি কমপ্যাক্ট সংগ্রাহক যা পিনযুক্ত বস্তুগুলির বিষয়ে চিন্তা করতে হবে না তার চেয়ে অনেক সহজ হতে পারে।