আই / ও পিন বিমূর্তনের জন্য সি ++ ক্লাস


13

আমি হার্ডওয়্যার আই / ও পয়েন্ট বা পিনের জন্য সি ++ বিমূর্ততা খুঁজছি। ইন_পিন, আউট_পিন, ইনআউট_পিন, ওপেন_ক্লোলেক্টর_পিন ইত্যাদির মতো বিষয়

আমি অবশ্যই এই ধরণের বিমূর্ততার সংকলন নিজেই নিয়ে আসতে পারি, তাই আমি 'আরে, আপনি এটি এভাবেই করতে পারেন' ধরণের উত্তরগুলি খুঁজছি না, বরং 'এই লাইব্রেরিতে দেখুন যা এই এবং এটিতে ব্যবহৃত হয়েছে এই প্রকল্পের'.

গুগল কোনও জিনিস আপ করেনি, কারণ আমি জানি না যে অন্যরা কীভাবে এটি কল করবে।

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

আমি জানি এটি ইলেকট্রনিক্স / সফ্টওয়্যার প্রান্তে রয়েছে, দুঃখিত যদি এটি এখানে না থাকে।

@ লেওন: ওয়্যারিং এটি একটি বড় ব্যাগ সফটওয়্যার, আমার আরও কাছাকাছি দেখার দরকার হবে। তবে মনে হয় তারা আমার মতো পিন বিমূর্ত ব্যবহার করে না। উদাহরণস্বরূপ কীপ্যাড বাস্তবায়ন আমি দেখতে পাচ্ছি

digitalWrite(columnPins[c], LOW);   // Activate the current column.

এটি বোঝায় যে একটি ফাংশন (ডিজিটাল রাইট) রয়েছে যা জানে যে কোনও আই / ও পিনে কীভাবে লিখতে হয়। এটি ডিজিটাল রাইট ফাংশনটি আবার না লিখে নতুন ধরণের আই / ও পিন যুক্ত করতে পারে (উদাহরণস্বরূপ যেটি এমসিপি 23017 এ রয়েছে, তাই এটি আই 2 সি এর মাধ্যমে লিখতে হবে)।

@ অলি: আমি একটি আরডুইনো IO উদাহরণটি গুগল করেছিলাম, তবে তারের লাইব্রেরির মতোই পদ্ধতিটি ব্যবহার করা হবে বলে মনে হচ্ছে:

int ledPin = 13;                 // LED connected to digital pin 13
void setup(){
    pinMode(ledPin, OUTPUT);      // sets the digital pin as output
}

আমরা এখানে কোন মাইক্রোকন্ট্রোলার কথা বলছি?
মাজেঙ্কো

এটি অপ্রাসঙ্গিক; কোনও নির্দিষ্ট মাইক্রোকন্ট্রোলারের জন্য সেই ইউসি উইলের আইও পিনগুলি উপযুক্ত ইন্টারফেস প্রয়োগ করবে। তবে এটি সি ++ এর জন্য, সুতরাং এআরএম, কর্টেক্স এবং এমআইপিএসের মতো 32-বিট চিপগুলি ভাবেন।
ওয়াউটার ভ্যান ওইজেন

1
আমি কখনও একটি ব্যবহার করি নি, তবে আরডুইনো কি এই জাতীয় পিনগুলি বিমূর্ত করে না? তারা (বা নাও) তারা যেভাবে কাজ করেছে তার দিকে নজর রেখে কিছু দরকারী তথ্য পেতে পারে।
অলি গ্লেজার

1
এবং ডিজিটাল রাইটিং ফাংশনটি পুনরায় লেখার ক্ষেত্রে - সি ++ এ "ওভারলোডিং" দেখুন। আমি মাত্র কয়েক মুহুর্ত আগে আরডুইনোর জন্য আইও এক্সপেন্ডার বোর্ডের জন্য একটি ওভারলোডেড ডিজিটাল রাইটিং ফাংশন লিখেছি। যতক্ষণ আপনি বিভিন্ন প্যারামিটার ব্যবহার করেন (যতক্ষণ না আমি প্রথম "ইনট" কে "স্ট্রাক্ট" দিয়ে প্রতিস্থাপন করেছি) এটি আপনার ডিজিটাল রাইফ্টটিকে ডিফল্টর চেয়ে বেশি পছন্দ করবে।
মাজেঙ্কো

1
আমি এই বিষয়ে আমার কাজ সম্পর্কে বার্লিনে সি ++ সাক্ষাতের বিষয়ে একটি আলোচনা করেছি। এটি ইউটিউবে পাওয়া যাবে: youtube.com/watch?v=k8sRQMx2qUw এর পর থেকে আমি কিছুটা ভিন্ন পদ্ধতির দিকে চলে গেলাম, তবে আলোচনাটি এখনও আকর্ষণীয় হতে পারে।
ওয়াউটার ভ্যান ওইজেন

উত্তর:


3

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

সি ++ কেন?

  1. সংকলক গতিশীল শব্দের-আকারের এক্সপ্রেশন মূল্যায়ন ব্যবহার করতে নিখরচায়। সি ইনট প্রচার করে। আপনার বাইট মাস্ক / শিফটটি দ্রুত / আরও ছোট করা যায়।
  2. ইনলাইনিং।
  3. টেম্প্লেটিজিং অপারেশনগুলি আপনাকে টাইপ-সুরক্ষা সহ শব্দের আকার এবং অন্যান্য বৈশিষ্ট্যগুলি পরিবর্তিত করতে দেয়।

5

আমাকে নির্লজ্জভাবে আমার ওপেন সোর্স প্রকল্পটি https://Kvasir.io প্লাগ করতে অনুমতি দিন । কোভাসির :: আইও অংশটি পিন ম্যানিপুলেশন ফাংশন সরবরাহ করে। আপনাকে প্রথমে কোনও কাভাসির :: আইও :: পিনলোকেশন ব্যবহার করে আপনার পিনটি সংজ্ঞায়িত করতে হবে:

constexpr PinLocation<0,4> led1;    //port 0 pin 4
constexpr PinLOcation<0,8> led2;

লক্ষ্য করুন যে এটি আসলে র‌্যাম ব্যবহার করে না কারণ এগুলি কনটেক্সটপ্রাপ্ত ভেরিয়েবল।

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

apply(makeOutput(led1),
    makeOutput(led2),
    makeOpenDrain(led1),
    makeOpenDrain(led2));

যেহেতু ক্রিয়াকলাপগুলি তৈরি এবং মার্জ করার সময় সংকলনের সময় সম্পন্ন হয় এটি সাধারণ হাতের কোডড সমতুল্য হিসাবে একই এসেম্বলারের কোড অর্জন করতে পারে:

PORT0DIR |= (1<<4) | (1<<8);
PORT0OD |= (1<<4) | (1<<8);

3

তারের প্রকল্পটি এর মতো বিমূর্তি ব্যবহার করে:

http://wiring.org.co/

এবং সংকলকটি সি ++ তে লেখা আছে। সোর্স কোডে আপনার প্রচুর উদাহরণ পাওয়া উচিত। আরডুইনো সফ্টওয়্যার তারের উপর ভিত্তি করে তৈরি।


প্রশ্নের সংস্থার উত্তরে
Wouter van Ooijen

2

সি ++ তে কোনও ক্লাস লেখা সম্ভব যাতে আপনি I / O পোর্টগুলি যেমন ভেরিয়েবলের মতো ব্যবহার করতে পারেন, যেমন

  পোর্টটিবি = 0x12; / * একটি 8-বিট বন্দরে লিখুন * /
  যদি (আরবি 3) এলএটিবি 4 = 1; / * একটি আই / ও বিট পড়ুন এবং শর্তসাপেক্ষে অন্যটি লিখুন * /

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

  যদি (IO_PORTS.bbRB3) IO_PORTS.bbLATB4 = 1;

যা ঘুরে দেখা যায় এমন কিছুতে রূপান্তরিত হবে:

  if (!! (PORTB & 8)) (1? (PORTB | = 16): (PORTB & = ~ 16));

কোনও সংকলকটি?: অপারেটরে ধ্রুবক প্রকাশটি লক্ষ্য করতে সক্ষম হবে এবং কেবল "সত্য" অংশটি অন্তর্ভুক্ত করবে। ম্যাক্রোগুলির মতো কিছুতে প্রসারিত করে তৈরি করা সম্পত্তিগুলির সংখ্যা হ্রাস করা সম্ভব হতে পারে:

  যদি (IO_PORTS.ppPORTB [3]) IO_PORTS.ppPORTB [4] = 1;

অথবা

  if (IO_PORTS.bb (addrPORTB, 3)) IO_PORTS.bbPORTB (অ্যাডরপোর্টটিবি, 4) = 1;

তবে আমি নিশ্চিত নই যে কোনও সংকলক কোডটি দুর্দান্তভাবে ইন-লাইন করতে সক্ষম হবে।

আমি কোনওভাবেই এটি বোঝাতে চাই না যে I / O বন্দরগুলি ভেরিয়েবল হিসাবে ব্যবহার করা অগত্যা একটি ভাল ধারণা, তবে যেহেতু আপনি সি ++ উল্লেখ করেছেন এটি জানার জন্য একটি দরকারী কৌশল। সি বা সি ++ তে আমার নিজের পছন্দটি, যদি পূর্বোক্ত শৈলী ব্যবহার করে এমন কোডের সাথে সামঞ্জস্যতা প্রয়োজন না হয় তবে সম্ভবত প্রতিটি আই / ও বিটের জন্য কিছু ধরণের ম্যাক্রো সংজ্ঞায়িত করতে হবে এবং তারপরে "রিডবিট", "রাইটবিট" এর জন্য ম্যাক্রো সংজ্ঞায়িত করতে হবে, "সেটবিট", এবং "ক্লিয়ারবিট" প্রভিস সহ যে ম্যাক্রোগুলিতে বিট-শনাক্তকরণ যুক্তিটি এই ম্যাক্রোগুলির সাথে ব্যবহারের উদ্দেশ্যে তৈরি আই / ও পোর্টের নাম হতে হবে। উপরের উদাহরণ, উদাহরণস্বরূপ, হিসাবে লেখা হবে

  যদি (রিডবিট (আরবি 3)) সেটবিট (এলএটিবি 4);

এবং হিসাবে অনুবাদ

  যদি (!! (_ PORT_RB3 & _BITMASK_RB3)) _PORT_LATB4 | = _BITMASK_LATB4;

এটি প্রিপ্রসেসরের জন্য সি ++ স্টাইলের চেয়ে কিছুটা বেশি কাজ হবে তবে এটি সংকলকটির জন্য কম কাজ হবে। এটি অনেকগুলি I / O প্রয়োগের জন্য সর্বোত্তম কোড জেনারেশন এবং প্রায় সকলের জন্য শালীন কোড প্রয়োগের অনুমতি দেয়।


3
প্রশ্নের একটি উক্তি: "আমি 'আরে খুঁজছি না, আপনি এটি এই ধরণের উত্তর দিতে পারেন" ...
ওয়েটার ভ্যান ওওইজেন

আমার ধারণা আপনি যা খুঁজছেন তা আমি পুরোপুরি পরিষ্কার করছি না। অবশ্যই আমি আশা করব যে I / O পিন পুনর্নির্মাণের ক্লাসে আগ্রহী এমন অনেক লোকেরাও জানতে আগ্রহী যে সম্পত্তি ব্যবহার করে যে কোনও একটি কোড তৈরি করতে পারে যা I / O এর এক স্টাইলের জন্য লেখা অন্য কিছু ব্যবহার করতে পারে। আমি "LATB3 = 1" এর মত বিবৃতি দেওয়ার জন্য বৈশিষ্ট্যগুলি ব্যবহার করেছি; একটি টিসিপি স্ট্রিমে আই / ও অনুরোধ প্রেরণ করুন।
সুপারক্যাট

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

@ ওয়াটার ভ্যান ওইজেন: আপনি কী "নতুন ধরণের আই / ও পিনগুলি" আশা করছেন? যদি সোর্স কোডটি যদি "if (BUTTON_PPressED) MOTOR_OUT = 1;" এর মতো সিনট্যাক্স দিয়ে লেখা থাকে তবে আমি প্রত্যাশা করব যে প্রসেসরের বোতাম নিয়ন্ত্রণ বা কোনও মোটর একটি লাইব্রেরি লিখতে পারে এমন কোনও প্রক্রিয়া সম্বন্ধে তাই উপরের উত্সটি বোতামটি চাপ দিলে কোড মোটরটি চালু করবে। এই ধরনের একটি লাইব্রেরি মোটর চালু করার সবচেয়ে কার্যকর উপায় উপস্থাপন করতে পারে না, তবে এটি কাজ করা উচিত।
সুপারক্যাট

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

1

আপনি যদি হার্ডওয়্যারটিকে বিমূর্ত করতে সত্যিই দুর্দান্ত কিছু খুঁজছেন এবং আপনি আপনার সি ++ দক্ষতায় আত্মবিশ্বাসী হন তবে আপনার এই প্যাটার্নটি চেষ্টা করা উচিত:

https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern

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


এই পোস্টের পরের বছরগুলিতে আমি পিন_ইন, পিন_আউট, পিন_ক এবং পিন_আউট_র জন্য পৃথক "ক্লাস" চালিয়েছি। অনুকূল পারফরম্যান্সের জন্য (আকার এবং গতি) আমি স্ট্যাটিক ক্লাস ব্যবহার করি, টেমপ্লেট পরামিতি হিসাবে উত্তীর্ণ। আমি বার্লিনে সি ++ বৈঠকে এ সম্পর্কে কথা বলেছি
ওয়াউটার ভ্যান ওইজেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.