পিআইসি মাইক্রোকন্ট্রোলারগুলিতে মাল্টিটাস্কিং


17

মাল্টিটাস্কিং আজকাল গুরুত্বপূর্ণ। আমি অবাক হই যে আমরা কীভাবে এটি মাইক্রোকন্ট্রোলার এবং এমবেডেড প্রোগ্রামিংয়ে অর্জন করতে পারি। আমি একটি সিস্টেম ডিজাইন করছি যা পিআইসি মাইক্রোকন্ট্রোলারের উপর ভিত্তি করে। আমি সি ব্যবহার করে এমপ্ল্যাবএক্স আইডিইতে এর ফার্মওয়্যার ডিজাইন করেছি এবং তারপরে সি # ব্যবহার করে ভিজ্যুয়াল স্টুডিওতে এর জন্য একটি অ্যাপ্লিকেশন ডিজাইন করেছি।

যেহেতু আমি ডেস্কটপে সি # প্রোগ্রামিংয়ে থ্রেড ব্যবহার করে সমান্তরাল কাজগুলি বাস্তবায়িত করতে অভ্যস্ত হয়েছি, তাই আমার মাইক্রোকন্ট্রোলার কোডে কি এটি করার কোনও উপায় আছে? এমপ্ল্যাবএক্স আইডিই সরবরাহ করে pthreads.hতবে এটি কোনও বাস্তবায়ন ছাড়াই একটি স্টাব। আমি জানি ফ্রিআরটিওএস সমর্থন আছে তবে এটি ব্যবহার করা আপনার কোডটিকে আরও জটিল করে তুলেছে। কিছু ফোরাম বলেছে যে বাধাগুলি মাল্টি টাস্কিং হিসাবেও ব্যবহৃত হতে পারে তবে আমি মনে করি না যে বাধাগুলি থ্রেডের সমতুল্য।

আমি একটি সিস্টেম ডিজাইন করছি যা একটি ইউআআরটির কাছে কিছু ডেটা প্রেরণ করে এবং একই সাথে এটির (ওয়্যার্ড) ইথারনেটের মাধ্যমে কোনও ওয়েবসাইটে ডেটা প্রেরণ করা প্রয়োজন। কোনও ব্যবহারকারী ওয়েবসাইটের মাধ্যমে আউটপুট নিয়ন্ত্রণ করতে পারে তবে আউটপুট 2-3 সেকেন্ডের বিলম্বের সাথে চালু / বন্ধ হয় F সুতরাং যে সমস্যা আমি সম্মুখীন হয়। মাইক্রোকন্ট্রোলারগুলিতে মাল্টি টাস্কিংয়ের কোনও সমাধান আছে কি?


থ্রেডগুলি কেবলমাত্র প্রসেসরের ক্ষেত্রে ব্যবহার করা যেতে পারে যা কোনও ওএস চালায়, কারণ থ্রেডগুলি প্রক্রিয়ার অংশ এবং প্রসেসগুলি কেবল ওএসে ব্যবহৃত হয়।
টিকিটটয়ে

@ জোলা হ্যাঁ আপনি ঠিক বলেছেন। তবে নিয়ন্ত্রকদের ক্ষেত্রে কী হবে?
উড়োজাহাজ


1
আপনি কী ব্যাখ্যা করতে পারেন যে কেন আপনার সত্যিকারের মাল্টিটাস্কিং প্রয়োজন এবং আপনি যদি একটি রাউন্ড-রবিন টাস্ক অ্যাপ্রোচ বা একটি সিলেক্ট () লুপ বা অনুরূপের ভিত্তিতে আপনার সফ্টওয়্যারটি যুক্তিসঙ্গতভাবে প্রয়োগ করতে পারবেন না?
39-

2
ঠিক আছে, যেমন আমি ইতিমধ্যে বলেছি, আমি আপনার তথ্য পাঠাচ্ছি এবং গ্রহণ করছি এবং একই সাথে ইথারনেটে ডেটা প্রেরণ ও গ্রহণ করছি। এর বাইরে সময়ের সাথে সাথে আমার এসডি কার্ডে ডেটাও সংরক্ষণ করা দরকার, সুতরাং হ্যাঁ DS1307 আরটিসি জড়িত এবং ইপ্রোমও এতে জড়িত। এখন অবধি আমার কাছে মাত্র 1 ইউআরটি রয়েছে তবে কয়েক দিনের পরে আমি 3 টি ইউআরটি মডিউল থেকে ডেটা প্রেরণ ও গ্রহণ করব। ওয়েবসাইট প্রত্যন্ত স্থানে ইনস্টল করা 5 টি বিভিন্ন সিস্টেমের ডেটাও গ্রহণ করবে। এই সমস্তটি সমান্তরাল হতে হবে তবে সঠিকভাবে এটি সমান্তরাল নয় বরং কয়েক সেকেন্ডের বিলম্বের সাথে। !
বিমান

উত্তর:


20

দুটি প্রধান ধরণের মাল্টিটাস্কিং অপারেটিং সিস্টেম রয়েছে, পূর্বসামগ্রী এবং সমবায়। উভয়ই সিস্টেমে একাধিক টাস্ক সংজ্ঞায়িত করার অনুমতি দেয়, পার্থক্যটি কীভাবে টাস্ক স্যুইচিংয়ের কাজ করে। অবশ্যই একটি একক কোর-প্রসেসরের সাথে কেবল একটি সময়ে কেবলমাত্র একটি কাজ চলছে running

উভয় ধরণের মাল্টিটাস্কিং ওএসের প্রতিটি কাজের জন্য পৃথক স্ট্যাকের প্রয়োজন। সুতরাং এটি দুটি বিষয় বোঝায়: প্রথমত, প্রসেসরটি স্ট্যামকে র‌্যামের যে কোনও জায়গায় রাখার অনুমতি দেয় এবং তাই স্ট্যাক পয়েন্টার (এসপি )টিকে চারপাশে সরিয়ে নেওয়ার নির্দেশনা রয়েছে - যেমন কোনও নিম্ন উদ্দেশ্যের মতো হার্ডওয়্যার স্ট্যাক নেই there আমাদের PIC আছে। এটি PIC10, 12 এবং 16 সিরিজ ছেড়ে দেয়।

আপনি সি তে প্রায় পুরোপুরি একটি ওএস লিখতে পারেন, তবে এসপিটি ঘোরাফেরা করে এমন কার্য স্যুইচারটি সমাবেশে থাকতে হবে। বিভিন্ন সময়ে আমি PIC24, PIC32, 8051, এবং 80x86 এর জন্য টাস্ক স্যুইচার লিখেছি। প্রসেসরের আর্কিটেকচারের উপর নির্ভর করে সাহসগুলি একেবারে আলাদা।

দ্বিতীয় প্রয়োজনটি হ'ল একাধিক স্ট্যাকের জন্য পর্যাপ্ত র‌্যাম রয়েছে। সাধারণত একজন স্ট্যাকের জন্য কমপক্ষে কয়েকশো বাইট চাইবে; তবে প্রতি টাস্কে মাত্র 128 বাইটে, আটটি স্ট্যাকের জন্য 1 কে বাইট র‌্যাম লাগবে - আপনাকে প্রতিটি কাজের জন্য একই আকারের স্ট্যাক বরাদ্দ করতে হবে না। মনে রাখবেন বর্তমান টাস্কটি হ্যান্ডেল করার জন্য আপনার পর্যাপ্ত স্ট্যাক এবং এর নেস্টেড সাবরুটাইনগুলিতে যে কোনও কল প্রয়োজন, তবে একটি বিঘ্নিত কলের জন্যও স্ট্যাকের প্রয়োজন কারণ কখনই কখন ঘটবে তা আপনি জানেন না।

আপনি প্রতিটি কাজের জন্য কত স্ট্যাক ব্যবহার করছেন তা নির্ধারণ করার জন্য মোটামুটি সহজ পদ্ধতি রয়েছে; উদাহরণস্বরূপ আপনি সমস্ত স্ট্যাককে একটি নির্দিষ্ট মান থেকে শুরু করতে পারেন, 0x55 বলুন এবং কিছুক্ষণের জন্য সিস্টেমটি চালনা করুন এবং তারপরে মেমরিটি থামিয়ে পরীক্ষা করতে পারেন।

আপনি কোন ধরণের পিআইসি ব্যবহার করতে চান তা বলবেন না। বেশিরভাগ পিআইসি 24 এবং পিআইসি 32 এর একটি মাল্টিটাস্কিং ওএস চালানোর জন্য প্রচুর জায়গা থাকবে; পিআইসি 18 (র‌্যামে স্ট্যাকের একমাত্র 8-বিট পিআইসি) এর সর্বোচ্চ র‌্যাম আকার 4K। সুতরাং এটি বেশ ifif।

সমবায় মাল্টিটাস্কিং (দুজনের সহজ) দিয়ে, টাস্ক স্যুইচিং কেবল তখনই করা হয় যখন টাস্কটি ওএসকে তার নিয়ন্ত্রণ ফিরে দেয়। যখনই কোনও কার্য সম্পাদনের জন্য টাস্কের কোনও ওএস রুটিন কল করা প্রয়োজন যা এটি অপেক্ষা করবে যেমন আই / ও অনুরোধ বা টাইমার কল। এটি ওএসের জন্য স্ট্যাকগুলি স্যুইচ করা সহজ করে তোলে, যেহেতু রেজিস্টার এবং সমস্ত তথ্য সংরক্ষণের প্রয়োজন হয় না, এসপিটিকে অন্য কোনও কার্যে স্যুইচ করা যেতে পারে (যদি অন্য কোনও কার্য পরিচালনার জন্য প্রস্তুত না থাকে তবে একটি নিষ্ক্রিয় স্ট্যাক থাকে) প্রদত্ত নিয়ন্ত্রণ)। যদি বর্তমান টাস্কটির কোনও ওএস কল করার প্রয়োজন না হয় তবে কিছুক্ষণ চলতে থাকে তবে সিস্টেমকে প্রতিক্রিয়াশীল রাখতে স্বেচ্ছায় নিয়ন্ত্রণ ছেড়ে দেওয়া দরকার।

সমবায় মাল্টিটাস্কিংয়ের সমস্যা হ'ল যদি কাজটি কখনই নিয়ন্ত্রণ ছেড়ে না দেয় তবে এটি সিস্টেমে হোগ করতে পারে। কেবলমাত্র এটি এবং যে কোনও বিঘ্নিত রুটিন যা নিয়ন্ত্রণ দেওয়া হতে পারে তা চলতে পারে, সুতরাং ওএস লকআপ করে বলে মনে হবে। এটি এই সিস্টেমগুলির "সমবায়" দিক। যদি কোনও ওয়াচডগ টাইমার বাস্তবায়িত হয় যা কেবলমাত্র যখন কোনও টাস্ক স্যুইচ সম্পাদিত হয় তখন পুনরায় সেট করা হয়, তবে এই ত্রুটিযুক্ত কাজগুলি ধরা সম্ভব।

উইন্ডোজ ৩.১ এবং এর আগে সমবায় অপারেটিভ সিস্টেম ছিল, আংশিক কারণেই তাদের পারফরম্যান্স এত দুর্দান্ত ছিল না।

প্রিম্পিটিভ মাল্টিটাস্কিং কার্যকর করা আরও কঠিন। এখানে, কার্যগুলি ম্যানুয়ালি নিয়ন্ত্রণ ছেড়ে দেওয়ার প্রয়োজন নেই, তবে পরিবর্তে প্রতিটি টাস্ককে চালানোর জন্য সর্বাধিক পরিমাণ সময় দেওয়া যেতে পারে (10 এমএস বলুন), এবং তারপরে একটি টাস্ক স্যুইচ যদি পরবর্তী রানযোগ্য টাস্কে সঞ্চালিত হয় তবে একটি কাজ রয়েছে। এর জন্য নির্বিচারে কোনও কাজ বন্ধ করা, রাষ্ট্রের সমস্ত তথ্য সংরক্ষণ করা এবং এসপিটিকে অন্য কোনও কার্যে স্যুইচ করা এবং এটি শুরু করা দরকার। এটি টাস্কটিকে আরও জটিল করে তোলে, আরও স্ট্যাকের প্রয়োজন হয় এবং সিস্টেমটিকে কিছুটা কমিয়ে দেয়।

সমবায় এবং প্রিমিটিভ মাল্টিটাস্কিং উভয়ের জন্যই যে কোনও সময় বাধা সৃষ্টি হতে পারে যা সাময়িকভাবে চলমান কার্যটিকে প্রশমিত করবে p

সুপার ক্যাট যেমন একটি মন্তব্যে উল্লেখ করেছে, সমবায় মাল্টিটাস্কিংয়ের একটি সুবিধা হ'ল সংস্থানগুলি ভাগ করা সহজ (যেমন কোনও মাল্টি-চ্যানেল এডিসির মতো হার্ডওয়্যার বা একটি লিঙ্কযুক্ত তালিকার সংশোধন করার মতো সফ্টওয়্যার)। কখনও কখনও দুটি কাজ একই সময়ে একই সংস্থানটিতে অ্যাক্সেস চায়। পূর্বনির্ধারিত সময়সূচির সাহায্যে, কোনও সংস্থান ব্যবহার করে কোনও টাস্কের মাঝখানে ওএসের পক্ষে কার্যগুলি স্যুইচ করা সম্ভব হবে। সুতরাং অন্য কোনও কাজ একই সংস্থানটিতে আসা এবং অ্যাক্সেস করা থেকে রোধ করার জন্য লকগুলি প্রয়োজনীয়। সমবায় মাল্টিটাস্কিংয়ের সাথে এটি প্রয়োজনীয় নয় কারণ টাস্কটি কখন এটি ওএস-এ ফিরে আসবে তা নিয়ন্ত্রণ করে।


3
সমবায় মাল্টিটাস্কিংয়ের একটি সুবিধা হ'ল বেশিরভাগ ক্ষেত্রে সংস্থানগুলিতে অ্যাক্সেসের সমন্বয় করতে লক ব্যবহার করা প্রয়োজন হয় না। এটি যখনই নিয়ন্ত্রণ ত্যাগ করেন ততক্ষণ কাজগুলি সর্বদা একটি শেয়ারযোগ্য অবস্থায় সম্পদ ছেড়ে যায় তা নিশ্চিত করার পক্ষে এটি পর্যাপ্ত হবে। প্রিম্পিটিভ মাল্টিটাস্কিং আরও জটিল কারণ যদি কোনও কাজ অন্য কোনও কাজের জন্য প্রয়োজনীয় সংস্থানটিতে লক ধরে রাখে তখন কোনও কাজটি স্যুইচ করা হতে পারে। কিছু কিছু ক্ষেত্রে, দ্বিতীয় কাজটি শেষ হতে পারে, আর অবরুদ্ধ পেয়ে যেহেতু লক অধিষ্ঠিত টাস্ক devoting সিস্টেমের ... হতো তুলনায় এটি একটি সমবায় পদ্ধতিতে হতো
supercat

1
... ক্রিয়াকলাপ শেষ করার দিকে সম্পূর্ণ সংস্থান যা (প্রাক-শৈত্যপ্রবাহী ব্যবস্থায়) লকটির প্রয়োজন হত, এভাবে রক্ষিত বস্তুটিকে দ্বিতীয় কার্যের জন্য উপলব্ধ করে তোলে।
সুপারক্যাট

1
সমবায় মাল্টিটাস্কারদের শৃঙ্খলার প্রয়োজন থাকলেও সময়সীকরণের প্রয়োজনীয়তা পূরণ করা নিশ্চিত করা অনেক সময় সমবায় মাল্টিটাস্কারের অধীনে একটি প্রিমিটিভের অধীনে সহজ হতে পারে। যেহেতু খুব কম লক একটি টাস্ক সুইচ জুড়ে রাখা দরকার, একটি পাঁচ-টাস্ক রাউন্ড-রবিন টাস্ক-স্যুইচ সিস্টেম যেখানে কাজগুলি ফলন ছাড়াই 10 মিমি বেশি না যাওয়ার প্রয়োজন হয়, একটি সামান্য যুক্তির সাথে মিলিত করে বলা হয় "যদি টাস্ক এক্স জরুরিভাবে হয় চালানো দরকার, এটি পরবর্তী চালনা করুন ", এটি নিশ্চিত করবে যে এক্সটি চালানোর আগে সিগন্যাল হয়ে গেলে এটি কখনই 10 মিমের বেশি অপেক্ষা করতে হবে না। বিপরীতে, যদি কোনও কাজের জন্য একটি লক প্রয়োজন হয় তবে কোন টাস্ক এক্স ...
সুপারক্যাট

1
... প্রয়োজন হতে চলেছে তবে প্রি-ইম্পেটিভ সুইচারের রিলিজ করার আগে এটি স্যুইচ হয়ে যায়, সিপিইউ শিডিউলার প্রথম কাজটি চালানোর আগ পর্যন্ত এক্স কোনও কার্যকর কিছু করতে না পারে। তফসিলকারী অগ্রাধিকার বিপরীতটি সনাক্ত করতে এবং পরিচালনা করার জন্য যুক্তি অন্তর্ভুক্ত না করে, প্রথম টাস্কটি তার ব্যবসায়িক কাজটি শেষ করতে এবং লকটি ছেড়ে দেওয়ার জন্য এটি পেতে কিছুটা সময় লাগতে পারে। এই জাতীয় সমস্যাগুলি অলসযোগ্য নয়, তবে তাদের সমাধানের জন্য অনেক জটিলতা দরকার যা একটি সমবায় ব্যবস্থায় এড়ানো যেতে পারে। একটি গোটা বাদে সমবায় সিস্টেমগুলি দুর্দান্ত কাজ করে: ...
সুপারক্যাট

3
যদি আপনি ধারাবাহিকতায় কোড করেন তবে আপনাকে সমবায় একাধিক স্ট্যাকের প্রয়োজন নেই। সংক্ষেপে আপনার কোডটি ফাংশনগুলিতে বিভক্ত হয়ে void foo(void* context)যায় কন্ট্রোলার লজিক (কার্নেল) একটি পয়েন্টার এবং ক্রুটির ফাংশন পয়েন্টার জুটিকে টেনে নিয়ে যায় এবং একবারে এটিকে একটি বলে। এই ফাংশনটি তার ভেরিয়েবলগুলি এবং এগুলি সংরক্ষণ করার জন্য প্রসঙ্গটি ব্যবহার করে এবং তারপরে কাতারে একটি ধারাবাহিকতা জমা দিতে পারে। অন্যান্য কার্যগুলিকে সিপিইউতে তাদের মুহুর্তগুলি দেওয়ার জন্য সেই ফাংশনগুলি দ্রুত ফিরে আসতে হবে। এটি ইভেন্ট ভিত্তিক পদ্ধতি যা কেবলমাত্র একটি একক স্ট্যাকের প্রয়োজন।
ratchet freak

16

থ্রেডিং একটি অপারেটিং সিস্টেম দ্বারা সরবরাহ করা হয়। এম্বেড করা বিশ্বে আমাদের সাধারণত কোনও ওএস থাকে না ("বেয়ার মেটাল")। সুতরাং এটি নিম্নলিখিত বিকল্পগুলি ছেড়ে যায়:

  • ক্লাসিক প্রধান পোলিং লুপ। আপনার মূল ফাংশনটিতে কিছুটা সময় (1) থাকে যা 1 টাস্ক করে তারপর টাস্ক 2 করে ...
  • প্রধান লুপ + আইএসআর পতাকাগুলি: আপনার কাছে একটি আইএসআর রয়েছে যা সময়-সমালোচনামূলক কার্য সম্পাদন করে এবং তারপরে একটি ফ্ল্যাগ ভেরিয়েবলের মাধ্যমে মূল লুপটিকে সতর্ক করে দেয় যে টাস্কটির পরিষেবার প্রয়োজন। সম্ভবত আইএসআর একটি নতুন বৃত্তাকার বৃত্তাকার বাফারে একটি নতুন চরিত্র রাখে এবং তারপরে এটি প্রস্তুত হওয়ার সময় প্রধান লুপটিকে ডেটা পরিচালনা করতে বলে।
  • সমস্ত আইএসআর: এখানকার বেশিরভাগ যুক্তি আইএসআর থেকে কার্যকর করা হয়েছে। একটি এআরএম এর মতো আধুনিক নিয়ামক যার একাধিক অগ্রাধিকার স্তর রয়েছে। এটি একটি শক্তিশালী "থ্রেড-জাতীয়" স্কিম সরবরাহ করতে পারে তবে এটি ডিবাগ করতেও বিভ্রান্ত হতে পারে তাই এটি কেবল গুরুত্বপূর্ণ সময়সীমাবদ্ধতার জন্য সংরক্ষণ করা উচিত।
  • আরটিওএস: একটি আরটিওএস কার্নেল (একটি টাইমার আইএসআর দ্বারা সহজলভ্য) এক্সিকিউশনের একাধিক থ্রেডের মধ্যে স্যুইচ করার অনুমতি দিতে পারে। আপনি FreeRTOS উল্লেখ করেছেন mentioned

আমি আপনাকে উপরোক্ত স্কিমগুলির মধ্যে সবচেয়ে সহজ ব্যবহার করতে পরামর্শ দেব যা আপনার আবেদনের জন্য কাজ করবে। আপনি যা বর্ণনা করেন তা থেকে আমার কাছে প্রধান লুপটি তৈরির প্যাকেটগুলি তৈরি করে এবং সেগুলি বৃত্তাকার বাফারে রাখে। তারপরে একটি ইউআআআরটি আইএসআর ভিত্তিক ড্রাইভার থাকুন যা বাফার প্রেরণ না হওয়া পর্যন্ত পূর্ববর্তী বাইট প্রেরণ করা হয়ে গেলেই গুলি চালায়, তারপরে আরও বাফার সামগ্রীর জন্য অপেক্ষা করুন। ইথারনেটের জন্য অনুরূপ পন্থা।


3
এটি একটি খুব দরকারী উত্তর কারণ এটি সমস্যার মূলটিকে সম্বোধন করে (সমাধান হিসাবে থ্রেডের চেয়ে ছোট এমবেডড সিস্টেমে মাল্টিটাস্ক কীভাবে করবেন)। এটি মূল প্রশ্নের ক্ষেত্রে কীভাবে প্রয়োগ হতে পারে সে সম্পর্কে একটি অনুচ্ছেদে চমত্কার হবে, সম্ভবত দৃশ্যের জন্য প্রতিটিটির পক্ষে ভাল-বীজ।
ডেভিড

8

যে কোনও সিঙ্গল-কোর প্রসেসরের মতো বাস্তব সফ্টওয়্যার মাল্টিটাস্কিং করা সম্ভব নয়। সুতরাং একাধিক কাজের মধ্যে পরিবর্তন করতে আপনাকে অবশ্যই যত্ন নিতে হবে। বিভিন্ন আরটিওএস সেটির যত্ন নিচ্ছে। তাদের একটি শিডিয়ুলার রয়েছে এবং সিস্টেম টিকের উপর ভিত্তি করে তারা আপনাকে মাল্টিটাস্কিংয়ের ক্ষমতা দেওয়ার জন্য বিভিন্ন কাজের মধ্যে স্যুইচ করবে।

এর সাথে জড়িত ধারণাগুলি (প্রসঙ্গ সংরক্ষণ এবং পুনরুদ্ধার) বেশ জটিল, সুতরাং এটি নিজে হাতে করা সম্ভবত কঠিন হতে পারে এবং আপনার কোডটিকে আরও জটিল করে তোলে এবং কারণ আপনি এর আগে কখনও করেননি, এতে ত্রুটি থাকবে। আমার পরামর্শটি হ'ল ফ্রিআরটিওএসের মতো পরীক্ষিত আরটিওএস ব্যবহার করা।

আপনি উল্লেখ করেছেন যে বাধাগুলি একাধিক মাল্টিটাস্কিং সরবরাহ করে। এটি সত্য সাজানোর। বাধাগুলি যে কোনও সময়ে আপনার বর্তমান প্রোগ্রামকে বাধাগ্রস্ত করবে এবং সেখানে কোডটি কার্যকর করবে, এটি একটি দুটি টাস্ক সিস্টেমের সাথে তুলনাযোগ্য যেখানে আপনার 1 টি কম অগ্রাধিকার সহ অন্যটি উচ্চ অগ্রাধিকারের সাথে রয়েছে যা শিডিয়ুলারের এক সময়ের স্লাইসের মধ্যে শেষ হয়।

সুতরাং আপনি একটি বারবার টাইমারের জন্য একটি বাধা হ্যান্ডলার লিখতে পারেন যা ইউআরটির মাধ্যমে কয়েকটি প্যাকেট প্রেরণ করবে, তারপরে আপনার বাকি প্রোগ্রামটি কয়েক মিলিসেকেন্ডের জন্য কার্যকর করা যাক এবং পরবর্তী কয়েক বাইট প্রেরণ করুন। এইভাবে আপনি সাজানোর একটি সীমিত মাল্টিটাস্কিং ক্ষমতা পাবেন king তবে আপনার কাছে একটি দীর্ঘতর বাধা থাকতে হবে যা একটি খারাপ জিনিস হতে পারে।

সিঙ্গেল-কোর এমসিইউতে একই সময়ে একাধিক কাজ করার একমাত্র আসল উপায় হ'ল ডিএমএ এবং পেরিফেরিয়ালগুলি কোর থেকে স্বতন্ত্রভাবে কাজ করার সাথে সাথে ব্যবহার করা (ডিএমএ এবং এমসিইউ একই বাসে ভাগ করে নেয়), তাই তারা যখন কিছুটা ধীর গতিতে কাজ করে তখন উভয়ই সক্রিয়)। সুতরাং যখন ডিএমএ ইউআরটিতে বাইটগুলি বদল করছে তখন আপনার কোরটি ইথারনেটে স্টাফ প্রেরণে মুক্ত।


2
ধন্যবাদ, ডিএমএ আকর্ষণীয় মনে হচ্ছে। আমি অবশ্যই এটি অনুসন্ধান করব!
বিমান

সমস্ত সিরিজের পিআইসির ডিএমএ থাকে না।
ম্যাট ইয়ং

1
আমি PIC32;) ব্যবহার করছি
বিমানটি

6

অন্যান্য উত্তর ইতিমধ্যে সর্বাধিক ব্যবহৃত বিকল্পগুলি (প্রধান লুপ, আইএসআর, আরটিওএস) বর্ণনা করেছে। সমঝোতার হিসাবে এখানে আরও একটি বিকল্প রয়েছে: প্রোটোথ্রেড । এটি মূলত থ্রেডগুলির জন্য খুব হালকা ওজনের একটি লিবি যা মূল লুপ এবং কিছু সি ম্যাক্রো ব্যবহার করে একটি আরটিওএস "অনুকরণ" করে। অবশ্যই এটি কোনও সম্পূর্ণ ওএস নয়, তবে "সাধারণ" থ্রেডগুলির জন্য এটি কার্যকর হতে পারে।


আমি উইন্ডোজের জন্য এর উত্স কোডটি কোথা থেকে ডাউনলোড করতে পারি? আমি মনে করি এটি কেবল লিনাক্সের জন্য উপলব্ধ!
বিমান 10

@ সিজেডাবিনাভ এটি ওএস স্বতন্ত্র হওয়া উচিত এবং আপনি সর্বশেষ ডাউনলোডটি এখানে পেতে পারেন ।
erebos

আমি এখনই উইন্ডোতে আছি এবং এমপ্ল্যাবএক্স ব্যবহার করছি, আমি এখানে এটি দরকারী বলে মনে করি না। যাইহোক ধন্যবাদ.!
বিমানটি

প্রোটোথ্রেড সম্পর্কে শুনে নি, আকর্ষণীয় কৌশল বলে মনে হচ্ছে sounds
আর্সেনাল

@ সিজেডাবিনাভ আপনি কী সম্পর্কে কথা বলছেন? এটি সি কোড এবং আপনার অপারেটিং সিস্টেমের সাথে কিছুই করার নেই।
ম্যাট ইয়ং

3

ন্যূনতম সময়-কাটা আরটিএসের জন্য আমার বেসিক নকশাটি বেশ কয়েকটি মাইক্রো পরিবারের তুলনায় খুব বেশি পরিবর্তন হয়নি। এটি মূলত একটি টাইমর একটি স্টেট মেশিন ড্রাইভিং বিঘ্নিত হয়। বিঘ্নিত পরিষেবার রুটিন হ'ল ওএস কার্নেল যখন প্রধান লুপের স্যুইচ স্টেটমেন্টটি ব্যবহারকারী কাজগুলি হয়। ডিভাইস ড্রাইভাররা I / O বিঘ্নগুলির জন্য পরিষেবা রুটিনগুলিকে বাধা দেয়।

মূল কাঠামোটি নিম্নরূপ:

unsigned char tick;

void interrupt HANDLER(void) {
    device_driver_A();
    device_driver_B();
    if(T0IF)
    {
        TMR0 = TICK_1MS;
        T0IF = 0;   // reset timer interrupt
        tick ++;
    }
}

void main(void)
{
    init();

    while (1) {
        // periodic tasks:
        if (tick % 10 == 0) { // roughly every 10 ms
            task_A();
            task_B();    
        }
        if (tick % 55 == 0) { // roughly every 55 ms
            task_C();
            task_D();    
        }

        // tasks that need to run every loop:
        task_E();
        task_F();
    }
}

এটি মূলত একটি সমবায় মাল্টিটাস্কিং সিস্টেম। কোনও অসীম লুপ প্রবেশ না করার জন্য টাস্কগুলি লিখিত হয় তবে আমরা যত্ন করি না কারণ টাস্কগুলি ইভেন্ট লুপের মধ্যে চলে তাই অনন্ত লুপ অন্তর্ভুক্ত থাকে। এটি জাভাস্ক্রিপ্ট বা যাওয়ার মতো ইভেন্ট-ভিত্তিক / ননব্লকিং ভাষাগুলিতে প্রোগ্রামিংয়ের অনুরূপ স্টাইল।

আপনি আমার আরসি ট্রান্সমিটার সফ্টওয়্যারটিতে এই স্টাইলের আর্কিটেকচারের একটি উদাহরণ দেখতে পাচ্ছেন (হ্যাঁ, আমি এটি আরসি বিমানগুলি উড়ানোর জন্য ব্যবহার করি যাতে আমার বিমানগুলি বিধ্বস্ত হওয়া এবং সম্ভাব্য মানুষ হত্যার প্রতিরোধে এটি কিছুটা সুরক্ষা গুরুতর): https://github.com / slebetman / pic-txmod । এটিতে মূলত 3 টি কার্য রয়েছে - 2 রিয়েল-টাইম টাস্কগুলিকে রাষ্ট্রীয় ডিভাইস ড্রাইভার হিসাবে প্রয়োগ করা হয়েছে (পিপিএমআইও স্টাফ দেখুন) এবং 1 মিশ্রণ যুক্তি বাস্তবায়নের জন্য ব্যাকগ্রাউন্ড টাস্ক। সুতরাং মূলত এটি আপনার ওয়েব সার্ভারের মতোই এটির 2 আই / হে থ্রেড রয়েছে।


1
আমি সত্যিই এটিকে 'সমবায় মাল্টিটাস্কিং' বলব না, কারণ এটি কোনও মাইক্রোকন্ট্রোলার প্রোগ্রামের চেয়ে একাধিক কাজ করার চেয়ে যথেষ্ট আলাদা নয়।
কিয়াসনাম

2

যদিও আমি প্রশংসা করি যে প্রশ্নটি এম্বেড করা আরটিওএসের ব্যবহার সম্পর্কে বিশেষভাবে জিজ্ঞাসা করে, আমার কাছে ঘটে যায় যে বিস্তৃত প্রশ্নটি জিজ্ঞাসা করা হচ্ছে "এমবেডেড প্ল্যাটফর্মে মাল্টিটাস্কিং কীভাবে অর্জন করবেন"।

কমপক্ষে আপাতত এম্বেড থাকা আরটিওএস ব্যবহার করতে ভুলে যেতে আমি দৃ strongly়ভাবে আপনাকে পরামর্শ দিচ্ছি। আমি এটিকে পরামর্শ দিচ্ছি কারণ আমি মনে করি যে সহজ টাস্ক শিডিয়ুলার এবং রাষ্ট্রীয় মেশিনগুলি সমন্বিত অত্যন্ত সাধারণ প্রোগ্রামিং কৌশলগুলির মাধ্যমে প্রথমে কীভাবে 'কার্যকারিতা' অর্জন করতে হবে তা শিখতে জরুরী।

ধারণাটি খুব সংক্ষেপে ব্যাখ্যা করতে, প্রতিটি মডিউল যে কাজটি করা প্রয়োজন (যেমন প্রতিটি 'টাস্ক') রয়েছে তার একটি নির্দিষ্ট ফাংশন রয়েছে যা কিছু স্টাফ করার জন্য মডিউলের জন্য পর্যায়ক্রমে ('টিকড') বলা উচিত। মডিউলটি তার নিজস্ব বর্তমান অবস্থা ধরে রাখে। তারপরে আপনার একটি প্রধান অসীম লুপ রয়েছে (শিডিয়ুলার) যা মডিউল ফাংশনগুলিকে কল করে।

অপরিশোধিত চিত্র:

for(;;)
{
    main_lcd_ui_tick();
    networking_tick();
}


...

// In your LCD UI module:
void main_lcd_ui_tick(void)
{
    check_for_key_presses();
    update_lcd();
}

...

// In your networking module:
void networking_tick(void)
{
    //'Tick' the TCP/IP library. In this example, I'm periodically
    //calling the main function for Keil's TCP/IP library.
    main_TcpNet();
}

এর মতো একক থ্রেডযুক্ত প্রোগ্রামিং কাঠামো যার মাধ্যমে আপনি পর্যায়ক্রমে একটি প্রধান সময়সূচী লুপ থেকে প্রধান রাষ্ট্রের মেশিন ফাংশনগুলি এম্বেডড প্রোগ্রামিংয়ে সর্বব্যাপী কল করে থাকেন এবং এ কারণেই আমি প্রথমে ডাইভিংয়ের আগে ডাইভিংয়ের আগে ওপিটিকে প্রথমে পরিচিত এবং আরামদায়ক হতে উত্সাহিত করব আরটিওএস টাস্ক / থ্রেড।

আমি এমন একটি এম্বেডড ডিভাইসে কাজ করি যার একটি হার্ডওয়্যার এলসিডি ইন্টারফেস, অভ্যন্তরীণ ওয়েব সার্ভার, ইমেল ক্লায়েন্ট, ডিডিএনএস ক্লায়েন্ট, ভিওআইপি এবং অন্যান্য অনেকগুলি বৈশিষ্ট্য রয়েছে। যদিও আমরা একটি আরটিওএস (কেইল আরটিএক্স) ব্যবহার করি তবে স্বতন্ত্র থ্রেডগুলির (কার্যগুলি) সংখ্যা খুব কম এবং উপরে বর্ণিত হিসাবে বেশিরভাগ 'মাল্টিটাস্কিং' অর্জন করা হয়।

এই ধারণাটি প্রদর্শন করে এমন কয়েকটি গ্রন্থাগারের উদাহরণ দেওয়ার জন্য:

  1. কেইল নেটওয়ার্কিং লাইব্রেরি। পুরো টিসিপি / আইপি স্ট্যাকটি একক থ্রেডযুক্ত চালানো যেতে পারে; আপনি পর্যায়ক্রমে মেইন_সি.পি. নেট () কল করেন যা টিসিপি / আইপি স্ট্যাক এবং পুনরায় পাঠাগার (যেমন ওয়েব সার্ভার) থেকে সংকলিত অন্য কোনও নেটওয়ার্কিং বিকল্পকে পুনরাবৃত্তি করে। Http://www.keil.com/support/man/docs/rlarm/rlarm_main_tcpnet.htm দেখুন । স্বীকার করা যায় যে, কিছু পরিস্থিতিতে (সম্ভবত এই উত্তরের ক্ষেত্রের বাইরে) আপনি এমন একটি পর্যায়ে পৌঁছাতে পারেন যেখানে এটি থ্রেডগুলি ব্যবহার করা উপকারী বা প্রয়োজনীয় হয়ে উঠতে শুরু করে (বিশেষত বিএসডি সকেটগুলি ব্লক করে ব্যবহার করা হলে)। (ভবিষ্যত দ্রষ্টব্য: নতুন ভি 5 এমডিকে-এআরএম আসলে একটি উত্সর্গীকৃত ইথারনেট থ্রেড তৈরি করেছে - তবে আমি কেবল একটি উদাহরণ দেওয়ার চেষ্টা করছি))

  2. লিনফোন ভিওআইপি লাইব্রেরি। লিনফোনের লাইব্রেরি নিজেই একক থ্রেডযুক্ত। আপনি iterate()পর্যাপ্ত বিরতিতে ফাংশনটি কল করেন । দেখুন http://www.linphone.org/docs/liblinphone-javadoc/org/linphone/core/LinphoneCore.html#iterate () । (একটি দরিদ্র উদাহরণের বিট কারণ আমি এটি এম্বেডড লিনাক্স প্ল্যাটফর্ম এবং লিনফোনের নির্ভরতা লাইব্রেরিগুলিতে নিঃসন্দেহে থ্রেডগুলিকে স্প্যান করেছিলাম, তবে এটি আবার একটি বিষয় চিত্রিত করার জন্য))

ওপি দ্বারা বর্ণিত নির্দিষ্ট সমস্যার দিকে ফিরে গিয়ে, সমস্যাটি সত্য বলে মনে হচ্ছে যে ইউআআরটি যোগাযোগ অবশ্যই কয়েকটি নেটওয়ার্কিংয়ের (টিসিপি / আইপি মাধ্যমে প্যাকেট প্রেরণ করা) একই সময়ে হওয়া উচিত। আপনি আসলে কোন নেটওয়ার্কিং লাইব্রেরিটি ব্যবহার করছেন তা আমি জানি না, তবে আমি ধরে নেব এটির একটি মূল ফাংশন রয়েছে যা ঘন ঘন বলা দরকার। আপনাকে এমন একটি কোড লিখতে হবে যা ইউআরটি ডেটা ট্রান্সমিশন / সংবর্ধনার সাথে একইভাবে কাঠামোগত হওয়ার জন্য একটি রাজ্য মেশিন হিসাবে অন্তর্ভুক্ত যা কোনও প্রধান ফাংশনে পর্যায়ক্রমিক কল দ্বারা পুনরাবৃত্তি হতে পারে deals


2
এই সুন্দর ব্যাখ্যার জন্য ধন্যবাদ, আমি মাইক্রোচিপ দ্বারা সরবরাহিত টিসিপি / আইপি লাইব্রেরি ব্যবহার করছি এবং এটি খুব বিশাল জটিল কোড। আমি কোনওভাবে এটিকে কিছু অংশে ভেঙে আমার প্রয়োজনীয়তা অনুসারে ব্যবহারযোগ্য করে তুলেছি managed আমি অবশ্যই আপনার একটি পদ্ধতির চেষ্টা করব!
উড়োজাহাজ

মজা করুন :) একটি আরটিওএস ব্যবহার নিশ্চিতভাবেই অনেক পরিস্থিতিতে জীবনকে সহজ করে তোলে। আমার মতে, একটি থ্রেড (টাস্ক) ব্যবহার করা প্রোগ্রামিংয়ের প্রচেষ্টাটিকে এক অর্থে অনেক সহজ করে তোলে, যেহেতু আপনি কোনও কাজকে রাষ্ট্রীয় মেশিনে ভেঙে ফেলতে পারবেন না। পরিবর্তে, আপনি কেবল আপনার টাস্ক কোডটি আপনার সি # প্রোগ্রামগুলিতে লিখবেন যেমনটি আপনার টাস্ক কোডটি তৈরি করে যেন এটি কেবলমাত্র বিদ্যমান thing এটি উভয় পদ্ধতির অন্বেষণ করা অপরিহার্য এবং আপনি আরও এম্বেড প্রোগ্রামিং করার সাথে সাথে আপনি এমন অনুভূতি পেতে শুরু করেন যা প্রতিটি পরিস্থিতিতে সর্বোত্তম।
ট্রেভর পৃষ্ঠা

আমি থ্রেডিং বিকল্পটিও পছন্দ করি। :)
এয়ারক্রাফ্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.