কেন সবসময় এসটিএম 32 এ ইউআরটির সাথে বিঘ্নের পক্ষে ডিএমএ ব্যবহার করবেন না? [বন্ধ]


9

আমি গত মাসে খুব বেশি সাফল্য ছাড়াই বাধা ব্যবহার করে একটি এসটিএম (STM32F103C8T6) এর সাথে ইউআরটি (এমআইডিআইয়ের জন্য) পাওয়ার জন্য অনেক সময় ব্যয় করি।

তবে, এই সন্ধ্যায় ডিএমএ ব্যবহার করে এটি বেশ দ্রুত কাজ করেছে worked

যেহেতু আমি পড়েছি ডিএমএ দ্রুততর এবং সিপিইউকে মুক্তি দেয়, কেন সবসময় ডিএমএ ব্যাঘাতের পক্ষে ব্যবহার করবেন না? বিশেষত যেহেতু এসটিএম 32 তে বেশ কিছু সমস্যা রয়েছে বলে মনে হয়।

আমি STM32CubeMx / HAL ব্যবহার করছি।


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

6
যদি কাজগুলিতে বাধা পেতে কয়েক সপ্তাহ সময় নেয়, কারণ আপনি ভুল পথে কাজটির কাছে এসেছেন; ডিএমএর কাজ করা আরও দীর্ঘ সময় নিতে পারে - এটি আসলে আরও জটিল কাজ, সুতরাং সাধারণের চেয়ে আরও জটিল কাজটির আপাত স্বাচ্ছন্দ্য হ'ল আপনি যে সকল সংস্থার সাথে দিকনির্দেশনার জন্য ব্যবহার করেছেন, তা কিন্তু প্রক্রিয়া নয় itself
ক্রিস স্ট্রাটন

5
কখনই ধরে নিবেন যে ডিএমএ সিপিইউ মুক্ত করে, কখনও কখনও হ্যাঁ, সিপিইউ চালিয়ে যায়, কখনও কখনও কোনও প্রসেসর ডিএমএ ইঞ্জিনের জন্য বাস ধরে রাখতে হিমায়িত হয় না। একটি আর্ম বাস্তবায়নের সাথে এটি করা তুচ্ছ, সুতরাং ঠিক এটি বলতে পারবেন না যে সমস্ত বাহু এইভাবে এবং সমস্ত x86 গুলি সেভাবে বা যাই হোক না কেন, এটি এত সহজ নয়, আপনাকে সর্বদা সিস্টেমের নকশা পরীক্ষা করতে হবে এবং সম্ভবত কিছুটা হ্যাকিং করতে হবে। আপনার কাছে থাকা চিপটি আর্ম কোরকে খুব ভালভাবে মুক্ত করতে পারে, এটি ডিএমএর উপর একটি মন্তব্য। আপনার প্রশ্ন হিসাবে, আপনি কি ধরে রাখতে পারছেন না এবং ডিএমএ + ইন্টের সম্ভাব্যতা রয়েছে তা পুরোপুরি সমাধান করতে পারছেন না যদি আপনি ঠিক মত পোষণ করতে না পারেন তবে এই ধারণাটি কী তা বোঝায় না।
old_timer

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

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

উত্তর:


24

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

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

    উদাহরণস্বরূপ, যদি আপনার প্রতি 5 মিনিটে বাল্ক আই 2 সি স্থানান্তর হয় তবে এটি ইউআরটি 2-তে আগত একটি ডিবাগ কমান্ডের চেয়ে ডিএমএর পক্ষে আরও ভাল প্রার্থী বলে মনে হয়।

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

  • ডিএমএ অতিরিক্ত শক্তি ব্যবহার করতে পারে , যেহেতু এটি এখনও-কোর-এর অন্য একটি ডোমেন যা আটকে রাখা দরকার। অন্যদিকে, ডিএমএ ট্রান্সফার চলাকালীন আপনি সিপিইউ স্থগিত করতে পারেন, যদি কোর এটি সমর্থন করে।

  • ডিএমএর সাথে কাজ করার জন্য মেমরি বাফারগুলি প্রয়োজন (যদি আপনি পেরিফেরিয়াল থেকে পেরিফেরিয়াল ডিএমএ না করেন) তবে এর সাথে কিছু মেমরি ব্যয় যুক্ত রয়েছে।

    ( প্রতি-চরিত্রের বিঘ্ন ব্যবহার করার সময় মেমোরির ব্যয়ও সেখানে থাকতে পারে, তবে বার্তাটি ইন্টারপটের অভ্যন্তরে যদি তাত্ক্ষণিকভাবে ব্যাখ্যা করা হয় তবে এটি আমার থেকে অনেক ছোট বা অদৃশ্য হয়ে যেতে পারে))

  • ডিএমএ একটি বিলম্ব ঘটায় কারণ স্থানান্তর সম্পূর্ণ / অর্ধেক সম্পূর্ণ হলে সিপিইউ কেবলমাত্র বিজ্ঞপ্তি হয় (অন্যান্য উত্তরগুলি দেখুন)।

  • কোনও রিং বাফারটিতে / থেকে ডেটা স্ট্রিম করার সময় বাদ দিয়ে, আপনি কতটা ডেটা গ্রহণ / প্রেরণ করবেন তা আগে থেকেই আপনার জানতে হবে।

    • এর অর্থ এই হতে পারে যে প্রতি-চরিত্রের বিঘ্ন ব্যবহার করে কোনও বার্তার প্রথম অক্ষরগুলি প্রক্রিয়া করা প্রয়োজন: উদাহরণস্বরূপ, এক্সবিয়ের সাথে ইন্টারফেস করার সময়, আপনি প্রথমে প্যাকেট টাইপ এবং আকার পড়তেন এবং তারপরে একটি ডিএমএ স্থানান্তরকে বরাদ্দকৃত বাফারে ট্রিগার করতে পারেন।

    • অন্যান্য প্রোটোকলগুলির জন্য, এটি মোটেও সম্ভব নয়, যদি তারা কেবলমাত্র মেসেজের শেষ প্রান্তে ব্যবহার করে: উদাহরণস্বরূপ, পাঠ্য-ভিত্তিক প্রোটোকল যা '\n'ডিলিমিটার হিসাবে ব্যবহার করে । (যদি না ডিএমএ পেরিফেরাল কোনও চরিত্রের সাথে মেলানো সমর্থন করে))

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

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

অবশ্যই, ডিএমএ ব্যবহারেরও সুবিধাগুলি রয়েছে তবে এটি আপনি যা চেয়েছিলেন তা নয়।


আপনার বিস্তারিত উত্তরের জন্য ধন্যবাদ। এমআইডিআই সবচেয়ে সমালোচনামূলক অংশ হবে তাই আমি অনুমান করি যে এটির জন্য ডিএমএ উপযুক্ত (যদিও গতি কম: 31250 বাউড)। আমার পর্যাপ্ত ডিএমএ চ্যানেল রয়েছে, পরে আমি 4 ইউএসআরটি ব্যবহার করার সময় অন্য একটি এসটিএম 32 ব্যবহার করতে যাচ্ছি। আমার সিপিইউ স্থগিত করার দরকার নেই, কারণ এতে 5 ভি ইউএসবি শক্তি থাকবে এবং বার্তাগুলির মধ্যে (মূল লুপে থাকা বার্তাগুলি প্রক্রিয়া করার জন্য) আমার প্রসেসিং করা দরকার। আমার কাছে 256 বাইট রিড এবং 256 বাইট ট্রান্সমিট বাফার রয়েছে। প্রয়োজনে আমি পরে এটি বাড়াতে পারি। STM32f103c8t6 এর 20 কেবি র‌্যাম রয়েছে, আমি যে শেষ এসটিএম ব্যবহার করব তা 192 কেবি রয়েছে।
মিশেল কেইজজার্স

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

ডিএমএ সহ একক বাইট পড়া খুব অযোগ্য is নিম্নতর বিলম্বিতা এবং উচ্চতর দক্ষতার জন্য, প্রতি-চরিত্রের বিঘ্নগুলি ব্যবহার করা আপনার আকারটি না জানা পর্যন্ত এবং তারপরে ডিএমএতে স্যুইচ করা অনুকূল হবে।
জোনাস শ্যাফার 11

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

6
এটি সম্ভবত একটি ভুল - আপনার ডিএমএ ছাড়াই আপনার সাধারণ বিঘ্নিত কোডটি ঠিক করা উচিত ।
ক্রিস স্ট্রাটন

10

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

এই বিলম্বিতাটি খারাপ জিনিস হতে পারে, বিশেষত এমআইডিআইয়ের মতো একটি বিলম্ব-সংবেদনশীল অ্যাপ্লিকেশনটিতে, যেখানে বেশ কয়েকটি এমএস এবং সেখানে লাইভ পারফরম্যান্সের জন্য মারাত্মক প্লেবিলিটি সমস্যা যুক্ত করতে পারে।


আমি যা করি তা একবারে 1 বাইট (সুতরাং 1 বাইটের একটি 'ডিএমএ' বাফার) এবং সেই ডি বাইটের প্রতিটি ডিএমএ কলব্যাকের পরে এটি একটি রিং বাফারে সংরক্ষণ করতে হয় যা আমি ম্যানুয়ালি হ্যান্ডেল করি। আমার মূল লুপটিতে আমি সম্পূর্ণ এমআইডিআই বার্তাগুলি পরীক্ষা করার এবং সেগুলি প্রক্রিয়া করার ইচ্ছা করছি।
মিশেল কেইজার্স

3
ডিএমএ সাধারণত একাধিক বাইট পেতে ব্যবহৃত হয় এবং কেবল যখন সেগুলি প্রাপ্ত হয় কেবল তখনই বাধা দেয়। ডিএমএ ব্যবহার না করার সময় কেবল একটি বাইটের পরে বাধা দেওয়া স্বাভাবিক , তাই এটি আমাকে অবাক করে তোলে: এর জন্য ডিএমএ ব্যবহারের অতিরিক্ত জটিলতায় কী লাভ?
স্টিভ মেল্নিকফ

5
@ মিশেলকিজজারস তারপর আপনি যা করছেন ঠিক তেমনই আপনি খাঁটি বিঘ্নিত-চালিত বাস্তবায়নের ক্ষেত্রে যা করেন তা ঠিক। অতএব, এই ক্ষেত্রে ডিএমএ ব্যবহার করে কোনও লাভ নেই এবং আপনার আসল সমস্যাটি সম্ভবত ডিএমএ দ্বারা নয় বরং আপনার (আইএসআর, সেটআপ) কোডটি পুনরায় লেখার মাধ্যমে সমাধান করা হয়েছে।
জিমিবি

@ জিমিবি ... ধন্যবাদ ... তবে নীচে জোনাসের জবাবের কারণে, আমি বার্তাটি দীর্ঘ হওয়ায় অনেকগুলি বাইট পড়তে উন্নতি করব। আমি প্রথম বাইট পাওয়ার পরে এটি জানি (বেশিরভাগ ক্ষেত্রে)। বিঘ্নের মাধ্যমে ডিএমএ ব্যবহার করতে এটি আরও বেশি উপকৃত হবে।
মিশেল কেইজার্স

8

ডিএমএ বাধাগুলির বিকল্প নয় - এগুলি সাধারণত একসাথে ব্যবহৃত হয়! আপনি যদি কোনও ইউআরটির মাধ্যমে ডেটা প্রেরণের জন্য ডিএমএ ব্যবহার করে থাকেন তবে, প্রেরণটি সম্পূর্ণ হওয়ার পরে আপনাকে জানাতে একটি বাধা প্রয়োজন।


সত্যই, সম্ভবত এসটিএম 32 এ সরাসরি ডিএমএর তুলনায় (খাঁটি নন ডিএমএ) বিঘ্নিত প্রক্রিয়াটি কিছুটা আনাড়ি।
মিশেল কেইজার্স

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

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

@ ক্রিসট্রেটটন ভালো পয়েন্ট ... এখন পর্যন্ত আমি সংক্রমণ করা সম্ভব কিনা তা পরীক্ষা করে দেখিনি, আমি ঠিক কিছু সংক্রমণ করি, ঠিক আছে কিনা তা খতিয়ে দেখছি না। সম্ভবত না হলে আমি পরে আবার চেষ্টা করব।
মিশেল কেইজার্স

@ পিটারকর্ডস দেখে মনে হচ্ছে এসটিএম 32 এর ডিএমএর জন্য পর্যাপ্ত বাধা রয়েছে এবং আমি প্রতিবার মাত্র 1 বাইট পড়ি। এমনকি সহজতম STM32 (F103c8t6) এ পর্যাপ্ত ডিএমএ পোর্ট / বিঘ্ন উপলব্ধ।
মিশেল কেইজার্স

5

ডিএমএ ব্যবহার করে ইউআরটি পেরিফেরিয়াল ব্যবহারের অন্যান্য বিবেচনার বাইরে কিছু আকর্ষণীয় প্রশ্ন এবং চ্যালেঞ্জের পরিচয় দেওয়া। আমি আপনাকে কয়েকটি উদাহরণ দেব: ধরে নিন যে আপনার ইউসি অন্য ডিভাইসগুলির সাথে একটি আরএস ৪85৫ (বা যাই হোক না কেন) বাসে বসে আছে। বাসে অনেক বার্তা রয়েছে, কিছু আপনার ইউসির উদ্দেশ্যে, কিছু নেই। অতিরিক্তভাবে অনুমান করুন যে এই বাস-প্রতিবেশীরা সকলেই একটি আলাদা ডেটা প্রোটোকল বলে, যা বোঝায় বার্তার দৈর্ঘ্য আলাদা are

কেবলমাত্র ডিএমএ ব্যবহার করার সময় কিছু প্রশ্ন আসে:

  • আমি কখন বাধা দিই?
    • ডিএমএগুলি কেবল তখনই বাধা দিতে পছন্দ করে যখন তারা কোনও প্রিসেট পরিমাণ ডেটা স্থানান্তর করে।
    • আপনি যদি কোনও ডিএমএ বিঘ্ন ঘটানোর জন্য পর্যাপ্ত ডেটা না পান তবে আপনি কী করবেন?
  • আপনি যদি কেবলমাত্র ডিএমএ বাধা দেয় তখনই কোনও আংশিক বার্তা পান?
  • আপনার আরএক্স বাফারগুলি দেখতে কেমন? তারা লিনিয়ার না বিজ্ঞপ্তি?
    • ডিএমএ হ'ল একটি অনাকাঙ্ক্ষিত বৃত্তাকার বাফার অংশীদার হতে পারে যে এটি কেবল ঠিকানার সীমানা মেনে চলে, তবে বিজ্ঞপ্তি বাফার সিস্টেমে অন্যান্য পয়েন্টারগুলিকে ছাড়িয়ে যাওয়ার কোনও সমস্যা নেই।

যাইহোক, চিন্তার জন্য কেবল খাবার।


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

আরে, কোন উদ্বেগ নেই। আমি নিশ্চিত আপনার আবেদনটি ভালভাবে উন্নত হবে ra অন্যরা যেমন উল্লেখ করেছে, ডিএমএ দুর্দান্ত, তবে তা বিনামূল্যে নয়। এটি সিস্টেমে অতিরিক্ত বিবেচনা প্রবর্তন করে যা অস্তিত্ব নেই যদি আপনি এটি ব্যবহার না করেই পালাতে পারেন।
pgvoorhees

আমি আশা করি, আমি এখনও একটি শিক্ষানবিস
মিশেল কেইজার্স

3

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


আমি প্রকৃতপক্ষে বাই বাইট পেয়েছি এবং এটির পরে প্রক্রিয়া করার জন্য এটি ম্যানুয়ালি একটি রিং বাফারে অনুলিপি করছি।
মিশেল কেইজজার্স

1

আমি এখন বেশ কয়েকটি প্রকল্পে STM32CubeMx / HAL ব্যবহার করেছি এবং দেখতে পেয়েছি যে এটি যে ইউআরটি হ্যান্ডলিং সফ্টওয়্যার উত্পন্ন করে তার প্রাপ্তির সুনির্দিষ্ট ত্রুটি রয়েছে।

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

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

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


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

আপনি কি মনে করেন যে আমি এই সমস্যায় পড়তে পারি যে প্রতিবার ডিএমএ স্থাপন করলে আমার প্রসেসর / নিখোঁজ অক্ষরগুলি 31,250 বাউডে ওভারলোড হবে?
মিশেল কেইজজার্স

1
যতক্ষণ আপনি DMA সেট করে রাখছেন যতক্ষণ না এটির চেয়ে একবারে বেশ কয়েকটি অক্ষর স্থানান্তর করতে সমস্যা হবে না। আমার 4 টি ইউআরটি 115200 চলছে এবং উচ্চতর এবং আই 2 সি সমস্যা ছাড়াই ডিএমএ ব্যবহার করছে। ইউআরটি সংক্রমণ সমস্ত 20 বাইট বা তার বেশি। সমস্যাটি ইউআরটি-তে প্রাপ্তির জন্য ডিএমএ ব্যবহার করছিল (এলএম 4 প্রসেসর 80MHz, 9600বাউড)।
uɐɪ

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