রাস্পবেরি পাই নির্ভরযোগ্যভাবে একটি 9600 বাড সিরিয়ালটি বিট করতে পারে এবং এর উদাহরণ কোড আছে?


29

আমি ভাবছি যে রাস্পবেরি পাইতে জিপিআইও পিনের মাধ্যমে একটি 9600 বাউড সিরিয়াল চালনা করতে বিটব্যাংটি ব্যবহার করা কতটা সম্ভব সম্ভব।

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

নির্ভরযোগ্যতার জন্য আমার স্ট্যান্ডার্ড হ'ল এটি বেশিরভাগ সময় স্বাভাবিক 9600 বাউড সিরিয়ালের মধ্যে থাকা উচিত। অনুশীলনে কত ত্রুটি সহনীয় তা আমি বর্তমানে নিশ্চিত নই, তবে প্রোটোকলে retransferences এবং স্বীকৃতি রয়েছে, সুতরাং এটি অন্তত কিছুটা সহনীয়।

সুতরাং, আমার প্রশ্নগুলি হ'ল:

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

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

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


1
+1 ভাল প্রশ্ন। আমি এই উত্তরে আগ্রহী হবে। তবে, প্রশ্নটি reliabilityকর্ম এবং প্রত্যাশার উপর নির্ভর করতে পারে।
Jivings

2
আরএস -232 এর নেতিবাচক ভোল্টেজের প্রয়োজন, তবে এই সিরিয়াল লিঙ্কটি আরএস -232 ভোল্টেজ ব্যবহার করে না। আমি জানি না তবে আমি বিশ্বাস করি যে আরপিআই-র স্ট্যান্ডার্ড টিটিএল থেকে আরএস -২৩২ রূপান্তরকারী যেমন ম্যাক্স ২২২ বা কয়েকটি ডজন ডজন পছন্দের প্রয়োজন। তবে, কেবল পরিষ্কার করে বলতে গেলে, এটি আমার প্রশ্নের সাথে প্রাসঙ্গিক নয়, আমি কেবল উত্তর দিতে চেয়েছিলাম।
নেকিডেবল

4
পাশাপাশি জিপিআইও পিনগুলিতে একটি দ্বিতীয় ইউআরটি রয়েছে 15 এটি যদিও প্রধান হিসাবে পুরো বৈশিষ্ট্যযুক্ত নয়
জন লা রুই


1
@ নাকিবল আপনি কি আপনার কাজ ভাগ করে নিতে পারেন? আমার একটি একই সমস্যা রয়েছে এবং আপনি কীভাবে স্পির মাধ্যমে দ্বিতীয় সিরিয়ালটি করেছিলেন তা দেখতে চাই। ধন্যবাদ এমএসপি

উত্তর:


15

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

আমি 20x বাউড হারে লাইনগুলি নমুনার জন্য এসপিআই ব্যবহার করি। আমি এসসিএলকে এবং এসএস পিনগুলি সম্পূর্ণ উপেক্ষা করি, আরএক্স লাইনটি এমআইএসওতে এবং টিএক্স লাইনটি এমওএসআইতে সংযুক্ত করি। এটি আমাকে আরএক্স লাইনে একটি (1-বিট) অসিলোস্কোপের মতো দৃশ্য দেয় এবং স্পষ্টতই ক্রমিক লাইনে বিটগুলি সংক্রমণিত হয় তা দেখুন:

00 00 00 00 00 00 
00 00 00 00 01 FF 
FF FF FF FF 00 00 
01 FF FF FF FF FF 
FF FF E0 00 00 00 
00 00 07 FF FF FF 
FF FF 

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

বিট-ব্যাংিংয়ের চেয়ে এটি আরও ভাল কাজ করার কারণটি হ'ল এসপিআইয়ের নিজস্ব ঘড়ি রয়েছে যা কার্নেল দিয়ে স্থির হয় না এবং এসপিআইতে লাইনগুলি প্রেরণ ও গ্রহণের জন্য একটি 16-বাইট ফিফো থাকে যা কার্নেল ফ্রিজ থেকে পৃথক। 9600 বাউডের জন্য, আমি একটি 250kHz এসপিআই ঘড়িটি ব্যবহার করছি এবং এর অর্থ আমি কোনও সংক্রমণ ত্রুটি ছাড়াই FIFOs পূরণ এবং শুকানোর মধ্যে এমনকি এক মিলিসেকেন্ডের জন্যও ঘুমাতে পারি। তবে, নিরাপদ দিক থেকে ভুল করতে, আমি 300 µ এর ঘুম ব্যবহার করছি। আমি এই সংক্ষেপে পরীক্ষা করেছিলাম যে আমি এটিকে কতদূর এগিয়ে নিয়ে যেতে পারি এবং কমপক্ষে একটি 2 মেগাহার্টজ এসপিআই ঘড়িটি ব্যবহারযোগ্য ছিল তাই এই দ্রবণটি উচ্চতর বাডের হার পর্যন্ত স্কেল করে।

এই সমাধানটির একটি কুরুচিপূর্ণ অংশ হ'ল কার্নেল এসপিআই ড্রাইভার যেমন স্ট্রিমিং বিট স্থানান্তর সমর্থন করে না। এর অর্থ আমি কার্নেল এসপিআই ড্রাইভার ব্যবহার করে নিজের কার্নেল মডিউলটি লিখে এটি করতে পারি না এবং ব্যবহারকারীর জমি থেকে /dev/sdidev0.0 ব্যবহার করে এটিও করতে পারি না। তবে, রাস্পবেরি পাইতে, এসপিআই এবং অন্যান্য পেরিফেরিয়ালগুলি ব্যবহারকারল্যান্ড থেকে সরাসরি এমএমএপ (): এন / দেব / মেমের মাধ্যমে, কার্নেল নিয়ন্ত্রণ পুরোপুরি বাইপাস করে অ্যাক্সেসযোগ্য। আমি এতে ভয়াবহভাবে সন্তুষ্ট নই, তবে এটি পুরোপুরি কাজ করে এবং এটি যুক্ত হওয়া সুবিধা দেয় যে ব্যবহারকারীর ভূমিতে বিভাজন ত্রুটি কার্নেলটি ক্র্যাশ করতে পারে না (দুর্ঘটনাক্রমে অন্যান্য পেরিফেরিয়ালগুলির সাথে গোলযোগ না করলে)। সিপিইউ ব্যবহারের ক্ষেত্রে, 300 sleep এর ঘুমগুলি আমাকে প্রায় 7% সিপিইউ ক্রমাগত ব্যবহার করে বলে মনে হয়, তবে আমার কোডটি অত্যন্ত অপ্রয়োজনীয়। ঘুমের সময়কাল বাড়ানো স্পষ্টতই সরাসরি সিপিইউ ব্যবহার হ্রাস করে।

সম্পাদনা: উল্লেখ করতে ভুলে গেছি, আমি ইউজারল্যান্ড থেকে এসপিআই নিয়ন্ত্রণ করতে সুন্দর বিসিএম 2835 লাইব্রেরি ব্যবহার করেছি, যেখানে প্রয়োজন সেখানে প্রসারিত করেছি।

সুতরাং, সংক্ষেপে বলি : আমি রাস্পবেরি পাইতে 250kHz এ সরাসরি এসপিআই চিপটি ব্যবহার করে / ইউএসল্যান্ড থেকে পুরোপুরি একটি 9600 বাউড সিরিয়াল লিঙ্কটি নির্ভরযোগ্যভাবে প্রেরণ করতে এবং গ্রহণ করতে পারি।


@ নেকেডিবল - আপনি কি কিছুটা বিস্তৃত করতে পারেন বা এমএমএপ () অংশে লিঙ্ক সরবরাহ করতে পারেন। আমি একই জিনিস উপর কাজ করছি।
জে কে

আপনি কি এসপিআই হার্ডওয়্যারটিও সংক্রমণটি করতে ব্যবহার করছেন?
চিতা

হ্যাঁ, সংক্রমণও কাজ করে।
নেকেডেবল

3
আপনি কীভাবে কোডটি প্রেরণ করতে এবং গ্রহণ করতে পারেন সে সম্পর্কে একটি ধাপে ধাপে নির্দেশাবলী দিতে পারেন এবং আপনি নিজেরাই প্যাচ করা এমন কিছু ব্যবহার করেন যদি কোনও সংশোধিত প্যাকেজ ভাগ করে নিন ... টিআইএ!
ভ্যালেন্ট

10

দেখে মনে হবে রিয়েল-টাইম প্যাচগুলি (CONFIG_PREEMPT_RT) ছাড়া কমপক্ষে, রাস্পবেরি পাই নির্ভরযোগ্যভাবে একটি 9600 বাউড সিরিয়ালটি বিট-ব্যাং করতে পারে না।

আমি একটি সাধারণ ল্যাটেন্সি পরীক্ষক ব্যবহার করেছি যা সমস্ত লিনাক্সের পাশের জিনিসগুলি অনুকূলভাবে কনফিগার করেছে (সময়সূচি_ফাইফো, অগ্রাধিকার 99, সিপিইউ_ডিমা_লাটেনচ 0us, মলকল্ল)। আমি 100 µ সেকস (প্রায় 9600 বাউড) ঘুমানোর চেষ্টা করেছি এবং 2 মিনিটের জন্য একটি শান্ত সিস্টেমে ল্যাটেন্সিকে ছাড়িয়েছি checking ফলাফলগুলি ছিল:

ন্যূনতম: 12 µ সেকসেন্ট গড়: 24 µ সেক্স সর্বোচ্চ: 282 µ সেক

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

আমি অনুমান করি যে ত্রুটিগুলি না পাওয়ার জন্য সর্বাধিক বিলম্বগুলি 9600 বাউডের জন্য 50 শতাংশের নীচে হওয়া উচিত এবং 100 µ সেকেন্ডের বেশি কোনও বিলম্বতা সংক্রমণ বা সংবর্ধনাতে পুরোপুরি কিছুটা অনুপস্থিত হয়।

এটি এখনও জিপিআইও পিনগুলি স্পর্শ না করেই সমস্ত। যেহেতু আমি মাত্র 2 সেকেন্ডের পরেও ক্লিন রান পেতে পারি নি তাই এটি নিরাপদ বলে মনে হচ্ছে যে রিয়েল-টাইম প্যাচগুলি ছাড়া রাস্পবেরি পাই কোনও গুরুতর সময়ের জন্য ত্রুটি তৈরি না করে 9600 বাউড সিরিয়াল লিঙ্কটি বিট করতে পারে না।

আমি সময় পেলে আসল-সময় প্যাচগুলি পরে যাচ্ছি later

(ব্যবহৃত সরঞ্জাম: http://git.kernel.org/?p=linux/kernel/git/clrkwllms/rt-tests.git ; a=summary )

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

সুতরাং, এটি পরীক্ষা করা খুব কঠিন, এবং আমি এটিকে ত্যাগ করছি।


0

আপনার বিট বিং করার দরকার নেই। প্রারম্ভ বিটের পতন সনাক্ত করতে আপনি আরএক্স জিপিওতে একটি ব্যবহারকারীর স্থল বাধাই করতে পারেন। তারপরে বিটের মাঝখানে নমুনায় একটি সময় বিঘ্নিত করুন। একটি কর্নেল মডিউল এটি করা সম্ভব হয়।


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