সুচিপত্র:

পার্ট 1 এআরএম অ্যাসেম্বলি টিআই আরএসএলকে রোবটিক্স লার্নিং কারিকুলাম ল্যাব 7 এসটিএম 32 নিউক্লিও: 16 টি ধাপ
পার্ট 1 এআরএম অ্যাসেম্বলি টিআই আরএসএলকে রোবটিক্স লার্নিং কারিকুলাম ল্যাব 7 এসটিএম 32 নিউক্লিও: 16 টি ধাপ

ভিডিও: পার্ট 1 এআরএম অ্যাসেম্বলি টিআই আরএসএলকে রোবটিক্স লার্নিং কারিকুলাম ল্যাব 7 এসটিএম 32 নিউক্লিও: 16 টি ধাপ

ভিডিও: পার্ট 1 এআরএম অ্যাসেম্বলি টিআই আরএসএলকে রোবটিক্স লার্নিং কারিকুলাম ল্যাব 7 এসটিএম 32 নিউক্লিও: 16 টি ধাপ
ভিডিও: Iron Man Explained In BANGLA \ MARVEL - 1 Iron Man movie full explain in bangla. 2024, জুলাই
Anonim
Image
Image

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

কোড কম্পোজার স্টুডিও ব্যবহার করে MSP432- এর জন্য শুধুমাত্র একটি অ্যাসেম্বলি প্রজেক্ট তৈরি করতে অনলাইনে খুব বেশি সাহায্য নেই। এখন পর্যন্ত আমরা একটি পূর্ব-বিদ্যমান সমাবেশ প্রকল্প থেকে কেবল অনুলিপি/আটকানো হয়েছে। এই পদ্ধতিটি আমাদের ভালভাবে পরিবেশন করেছে।

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

উপরন্তু, যেহেতু অ্যারে শুধুমাত্র পঠনযোগ্য মান, এটি ফ্ল্যাশ মেমরিতে রাখা ভাল, র RAM্যাম নয়।

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

সেই লক্ষ্যের পথে, আমরা আরও একটি জনপ্রিয় মাইক্রো-কন্ট্রোলারের সাথে অভিজ্ঞতা অর্জন করব।

ধাপ 1: ডিভাইসের প্রাথমিক পরীক্ষা

ডিভাইসের প্রাথমিক পরীক্ষা
ডিভাইসের প্রাথমিক পরীক্ষা
ডিভাইসের প্রাথমিক পরীক্ষা
ডিভাইসের প্রাথমিক পরীক্ষা
ডিভাইসের প্রাথমিক পরীক্ষা
ডিভাইসের প্রাথমিক পরীক্ষা

আবার, কেন বিশেষ করে STM32 নিউক্লিও বাছুন?

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

আমি কিছু গবেষণা করেছি (অনেকগুলি সংস্করণ বেছে নিতে হবে - উপরের ছবিটি দেখুন), কিন্তু শেষ পর্যন্ত আমি যা পেতে পারি তা হয়ে গেল, যেহেতু আমি অ্যামাজন ব্যবহার করতে যাচ্ছিলাম (মার্কিন যুক্তরাষ্ট্রে)।

এটি একটি সহজ কিন্তু পেশাদার প্যাকেজে আসে, কিছু স্টার্ট-আপ নির্দেশাবলী সহ। এটা দেখে কিছুটা হাস্যকর লাগল যে কন্ট্রোলারে পোড়ানো ডেমোটি ঠিক পূর্ববর্তী ইন্সট্রাকটেবলে আমরা যা করেছি - একটি LED জ্বলছে এবং একটি বোতামের চাপ অনুসারে গতি পরিবর্তন করে।

মনে হচ্ছে এই ডেভেলপমেন্ট বোর্ডটি MSP432 এর সাথে অনেকটা সাদৃশ্যপূর্ণ যেখানে 2 টি LEDs এবং একটি ব্যবহারকারী-পুশবটন রয়েছে। MSP432 এর 2 টি ব্যবহারকারী-বোতাম রয়েছে।

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

আরেকটি ভাল পরীক্ষা হল যে যখন আপনি এটি আপনার কম্পিউটারে সংযুক্ত করেন (আমি একটি লিনাক্স বক্স ব্যবহার করছি), এটি আমার ফাইল ম্যানেজারে "NODE_F303RE" নামে একটি ফাইল সিস্টেম হিসেবে দেখা যায়। খোলার ফলে দুটি ফাইল প্রকাশ পায়, একটি HTML এবং একটি পাঠ্য।

এটিই, তবে কমপক্ষে এটিও বলে যে সংযোগটি বেশ সহজ বলে মনে হচ্ছে।

এখন আমরা শুরু করার জন্য প্রস্তুত।

আমি IVONOMICON বেয়ার মেটাল আর্টিকেল সিরিজের কোন ভাল তথ্যের পুনরাবৃত্তি না করার চেষ্টা করতে যাচ্ছি, বরং এটি বাড়ানোর চেষ্টা করছি।

ধাপ 2: অপরিহার্য

আমাদের প্রয়োজন প্রথম জিনিস একটি কম্পাইলার।

এবং তারপরে, আমাদের একটি ডিবাগার দরকার:

devchu@chubox: ~ $ sudo apt-get gdb-arm-none-eabi ইনস্টল করুন প্যাকেজ তালিকা পড়া … সম্পন্ন বিল্ডিং নির্ভরতা গাছ রাজ্যের তথ্য পড়া … সম্পন্ন হয়েছে নিম্নলিখিত নতুন প্যাকেজ ইনস্টল করা হবে: gdb-arm-none-eabi 0 আপগ্রেড, 1 টি নতুন ইনস্টল, 0 অপসারণ এবং 8 আপগ্রেড না। 2, 722 kB সংরক্ষণাগার পেতে হবে। এই অপারেশনের পরে, 7, 738 kB অতিরিক্ত ডিস্ক স্পেস ব্যবহার করা হবে। পান: kB/s) পূর্বে অনির্বাচিত প্যাকেজ gdb-arm-none-eabi নির্বাচন করা। (ডাটাবেস পড়ছে… 262428 ফাইল এবং ডিরেক্টরি বর্তমানে ইনস্টল করা আছে।) আনপ্যাক করার প্রস্তুতি নিচ্ছে…/gdb-arm-none-eabi_7.10-1ubuntu3+9_amd64.deb… আনপ্যাকিং gdb-arm-none-eabi (7.10-1ubuntu3+9)… প্রসেসিং man-db (2.7.5-1) এর জন্য ট্রিগার… gdb-arm-none-eabi (7.10-1ubuntu3+9) সেট আপ করা হচ্ছে…

ধাপ 3: অপরিহার্য - উইন্ডোজ

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

আপনি আর্ম ডেভেলপার সাইটে যেতে পারেন এবং সেখানে বেশ কয়েকটি ডাউনলোড অপশন পাওয়া যায়। আমি একটি উইন্ডোজ 8 মেশিন ব্যবহার করছি।

ইনস্টলেশনের সময়, আমি প্রোগ্রাম ফাইলের পরিবর্তে রুট "C: \" ড্রাইভে এটি ইনস্টল করার জন্য নির্বাচিত করেছি কারণ আমি সাইগউইনও ব্যবহার করছি, এবং আমার স্থানীয় বিন থেকে রুট সি: ফোল্ডারে একটি লিঙ্ক তৈরি করা সহজ ছিল প্রোগ্রাম ফাইলের পথে গোলমাল (স্পেস সহ, ইত্যাদি)।

সুতরাং, আমার সাইগউইন পরিবেশ এবং পথ, ইত্যাদি, এরকম দেখাচ্ছে:

C: / cygwin64 / home / bin / arm-none-eabi-gcc, যেখানে arm-none-eabi-gcc C: / GNUToolsArmEmbedded / 7.2018.q2.update / bin / arm-none-eabi- gcc

আমি তারপর cygwin হোমের অধীনে একটি "dev" ফোল্ডার তৈরি করেছি, এবং সেখানেই আমি core. S ফাইলটি স্থাপন করেছি এবং কম্পাইলার কমান্ডটি চালাচ্ছি। (কম্পাইলার স্টাফের জন্য নীচে আরও দেখুন)।

আমি gdb (arm-none-eabi-gdb) এর জন্য ঠিক একই কাজ করেছি।

ধাপ 4: অপরিহার্য কি

তাহলে "gcc-arm-none-eabi" কি?

Gnu কম্পাইলার (GCC) যে মেশিনে চলছে তার জন্য প্রোগ্রামিং ল্যাঙ্গুয়েজ (যেমন C) নেটিভ কোডে কম্পাইল করবে। উদাহরণস্বরূপ, যদি আপনি আপনার উইন্ডোজ মেশিনে GCC ব্যবহার করে কিছু সি কোড কম্পাইল করতে চান, তাহলে এটি উইন্ডোজ মেশিনে চালানোর জন্য নির্মিত হবে। উৎপন্ন এক্সিকিউটেবল (সাধারণত) এআরএম মাইক্রো-কন্ট্রোলারে চলবে না।

সুতরাং, এআরএম মাইক্রো-কন্ট্রোলারে (আমাদের বর্তমান ক্ষেত্রে যেটি STM32 Nucelo হবে) ডাউনলোড এবং বার্ন করার জন্য প্রোগ্রাম তৈরি করার জন্য, আমাদের GCC কে অন্য কিছু দিতে হবে: "ক্রস-কম্পাইল" করার ক্ষমতা। অর্থাৎ, একটি এক্সিকিউটেবল উৎপন্ন করার ক্ষমতা, এর নেটিভ সিস্টেম (এবং প্রসেসর) এর জন্য নয়, কিন্তু টার্গেট সিস্টেমের (ARM মাইক্রো-কন্ট্রোলার) জন্য। সেখানেই "gcc-arm-none-eabi" খেলার মধ্যে আসে।

তাহলে "gdb-arm-none-eabi" কি?

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

এইভাবে, জিডিবি-আর্ম-নন-ইবি জিডিবির কাছে, জিসিসি-আর্ম-নন-ইবি কি জিসিসি।

আরেকটি প্রস্তাবিত প্যাকেজ ইনস্টল ছিল "libnewlib-arm-none-eabi"। ওইটা কি?

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

এবং পরিশেষে, প্যাকেজ "libstdc ++-arm-none-eabi"। এটা বেশ স্পষ্ট; এটি ক্রস-কম্পাইলারের জন্য C ++ লাইব্রেরি; এমবেডেড এআরএম মাইক্রো-কন্ট্রোলারের জন্য।

ধাপ 5: লিঙ্কার ফাইল

লিঙ্কার ফাইল
লিঙ্কার ফাইল
লিঙ্কার ফাইল
লিঙ্কার ফাইল

আসুন একটি লিঙ্কার স্ক্রিপ্ট তৈরি করি।

এই ফাইলের একটি মূল অংশ বা ব্লক হবে মেমরি কমান্ড।

--- sourceware.org থেকে:

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

স্মৃতি

{name [(attr)]: ORIGIN = উৎপত্তি, LENGTH = len…}

নিবন্ধে উদাহরণ:

/* RAM এর শেষ এবং স্ট্যাক মেমরির সীমা সংজ্ঞায়িত করুন

স্মৃতি

{ফ্ল্যাশ (rx): ORIGIN = 0x08000000, LENGTH = 32K RAM (rxw): ORIGIN = 0x20000000, LENGTH = 4K}

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

নিউক্লিওর সাথে আসা সুন্দর ছোট কার্ডটি বলে যে এটিতে ফ্ল্যাশ মেমরি 512 Kbytes এবং SRAM 80 Kbytes। যাইহোক, এটিকে ইউএসবি এর সাথে সংযুক্ত করে, এটি দুটি ফাইল সহ একটি ফাইল সিস্টেম হিসাবে মাউন্ট করা হয় এবং ফাইল ম্যানেজার এবং জিপার্টেড উভয়ই ইঙ্গিত দেয় যে এটিতে 540+ Kbytes এর বেশি জায়গা রয়েছে। (র্যাম?).

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

সুতরাং আসুন কার্ডের পরিসংখ্যান দিয়ে যাই। সুতরাং এখন আমরা উপরের উদাহরণটি গ্রহণ করি এবং এটি আমাদের নির্দিষ্ট বোর্ডে রূপান্তর করি।

আপনি সাধারণ KB থেকে নির্দিষ্ট সংখ্যক বাইটে যেতে এই অনলাইন মেমরি কনভার্টারের মত কিছু ব্যবহার করতে চাইতে পারেন।

তারপরে আপনি একটি অনলাইন দশমিক থেকে হেক্স রূপান্তরকারী ব্যবহার করতে চাইতে পারেন।

/ * RAM এর শেষ এবং স্ট্যাক মেমরির সীমা নির্ধারণ করুন */

/* (STM32F031x6 লাইনে 4KB SRAM, 4096 = 0x1000)* //* উদাহরণ*/

/ * ধাপ 1: (STM32F303RE এ 80KB SRAM, 81920 = 0x14000) * // * আমাদের বোর্ড */

/* ধাপ 2, হেক্স প্রারম্ভিক ঠিকানায় হেক্স আকার যোগ করুন (নীচে)। */

/ * (র্যাম 0x20000000 ঠিকানায় শুরু হয়) */

_estack = 0x20001000; /* উদাহরণ */

_estack = 0x20014000; / * আমাদের বোর্ড */

স্মৃতি {

ফ্ল্যাশ (rx): ORIGIN = 0x08000000, LENGTH = 512K

RAM (rxw): ORIGIN = 0x20000000, LENGTH = 80K

}

আসুন উপরের ফাইলটিকে "linker.script.ld" কল করি।

ধাপ 6: ভেক্টর টেবিল

ভেক্টর টেবিল
ভেক্টর টেবিল

এখন আমরা একটি ছোট অ্যাসেম্বলি ফাইল তৈরি করতে যাচ্ছি (নির্দেশসহ) কিছু মৌলিক ইন্টারাপ্ট-হ্যান্ডলিং করার জন্য। আমরা নিবন্ধের উদাহরণ অনুসরণ করব এবং "core. S" নামে একটি ফাইল তৈরি করব।

আবার, এখানে উদাহরণ ফাইলের বিষয়বস্তু, কিন্তু আমি আমাদের নির্দিষ্ট বোর্ডের জন্য একটি পরিবর্তন করেছি:

// এই নির্দেশাবলী আমাদের চিপের বৈশিষ্ট্য সংজ্ঞায়িত করে এবং

// সমাবেশ ভাষা আমরা ব্যবহার করব:.সিন্ট্যাক্স ইউনিফাইড /*এই কোড এরিয়া পরে নিচে দেখুন পরিবর্তে আমাদের বোর্ড এর কর্টেক্স যোগ করুন। এই ধাপে উপরের ছবিটি দেখুন * / /। এটির একটি FPU */.thumb // গ্লোবাল মেমরি অবস্থান রয়েছে।.global vtable.global reset_handler / * * প্রকৃত ভেক্টর টেবিল। * সরলতার জন্য শুধুমাত্র RAM এবং 'রিসেট' হ্যান্ডলারের আকার অন্তর্ভুক্ত করা হয়েছে। */.type vtable, %object vtable:.word _estack.word reset_handler.size vtable,।-vtable

হুম.. না '.এলাইন' নির্দেশিকা

যাইহোক, এটি সমালোচনামূলক নয়। পরে আরও (হয়তো) পরে।

সিনট্যাক্স ইউনিফাইড

.syntax [একীভূত | বিভক্ত]

এআরএম-ইন্সট্রাকশন-সেট বিভাগে বর্ণিত নির্দেশাবলী নির্দেশিকা সিনট্যাক্স সেট করে

9.4.2.1 নির্দেশ সেট সিনট্যাক্স দুটি সামান্য ভিন্ন সিনট্যাক্স এআরএম এবং থাম্ব নির্দেশাবলীর জন্য সমর্থন। ডিফল্ট, বিভক্ত, পুরানো স্টাইল ব্যবহার করে যেখানে ARM এবং THUMB নির্দেশাবলীর নিজস্ব, আলাদা সিনট্যাক্স ছিল। নতুন, ইউনিফাইড সিনট্যাক্স, যা.syntax নির্দেশের মাধ্যমে নির্বাচন করা যেতে পারে।

.fpu vfpv4

GCC কম্পাইলার ফ্লোটিং পয়েন্ট সম্পর্কিত বেশ কয়েকটি অপশন দিয়ে বাইনারি তৈরি করতে পারে: নরম - কোন FPU ছাড়াই CPU- তে চলার জন্য উপযুক্ত - কম্পাইলার জেনারেটেড softfp দ্বারা সফ্টওয়্যারে গণনা করা হয় - FPU- এর সাথে বা ছাড়া CPU- তে চলার জন্য উপযুক্ত - উপস্থিত থাকলে FPU ব্যবহার করবে । আমাদের নির্দিষ্ট ক্ষেত্রে (আপনাকে আপনার নিজের গবেষণা করতে হবে), এই নির্দিষ্ট বোর্ডের FPU vfpv4 এর সাথে সামঞ্জস্যপূর্ণ। আপনাকে এই নিয়ে খেলতে হতে পারে। অথবা এমনকি এটি softfp এ ছেড়ে দিন।

.thumb (বনাম। arm)

এই এআরএম মাইক্রোকন্ট্রোলারের আসলে নির্দেশনা সেটের মিশ্রণ রয়েছে। একটি হলো এআরএম, আরেকটি হলো থাম্ব। একটি পার্থক্য হল 16-বিট নির্দেশাবলী বনাম 32-বিট নির্দেশাবলী। এইভাবে, এই নির্দেশনাটি কম্পাইলারকে পরবর্তী নির্দেশনাগুলিকে থাম্ব বা এআরএম হিসাবে বিবেচনা করতে বলে।

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

ধাপ 7: একটি 'হ্যালো ওয়ার্ল্ড' প্রোগ্রামের সমাবেশ সংস্করণ

নিম্নলিখিতগুলি পূর্বে তৈরি "core. S" ফাইলে যেতে পারে। এটি, আবার, নিবন্ধের উদাহরণ থেকে।

/ * * রিসেট হ্যান্ডলার। রিসেটে ডাকা হয়। */.type reset_handler, %function reset_handler: // স্ট্যাক পয়েন্টার সেট করুন স্ট্যাকের শেষে। // '_estack' মানটি আমাদের লিঙ্কার স্ক্রিপ্টে সংজ্ঞায়িত করা হয়েছে। LDR r0, = _estack MOV sp, r0

// কিছু ডামি মান সেট করুন। যখন আমরা এই মানগুলি দেখি

// আমাদের ডিবাগারে, আমরা জানতে পারব যে আমাদের প্রোগ্রাম // চিপে লোড হয়ে কাজ করছে। LDR r7, = 0xDEADBEEF MOVS r0, #0 main_loop: // 'r0' নিবন্ধনের জন্য 1 যোগ করুন। ADDS r0, r0, #1 // লুপ ব্যাক। B main_loop.size reset_handler,।-Reset_handler

সুতরাং, উপরের প্রোগ্রামের জোরটি হল একটি মূল MCU রেজিস্টারে (এই ক্ষেত্রে R7) একটি স্বীকৃত প্যাটার্ন লোড করা, এবং শূন্য থেকে শুরু করে একটি বৃদ্ধি মূল্য অন্য কোর MCU রেজিস্টারে (এই ক্ষেত্রে R0)। যদি আমরা এক্সিকিউটিং কোডের মধ্য দিয়ে যাই, আমাদের R0 এর ডেটা ইনক্রিমেন্ট দেখতে হবে।

যদি আপনি MSP432 এবং TI-RSLK কোর্স/ল্যাব সম্পর্কিত নির্দেশাবলীর সাথে অনুসরণ করে থাকেন, তাহলে উপরের সমস্ত প্রোগ্রাম আপনার কাছে পরিচিত হওয়া উচিত।

R7 নিবন্ধনের জন্য "DEADBEEF" লোড করার সময় আমি যে নতুন জিনিসটি দেখতে পাচ্ছি তা হল "=" ব্যবহার। আমরা এটা ব্যবহার করিনি।

এখানে সংযুক্ত "core. S" ফাইলটিতে এখন সম্পূর্ণ উৎস রয়েছে।

ধাপ 8: কোড সংকলন

কিছু কমান্ড-লাইন স্টাফ করার সময় এসেছে। কিছু বাস্তব, অবশেষে।

যাইহোক, আমরা সেখানে নেই। আমরা আবার নিবন্ধে দেওয়া কমান্ড পরিবর্তন করতে হবে, এবং এটি আমাদের নিজের অবস্থার জন্য পরিবর্তন।

এখানে উদাহরণ কোড:

arm -none -eabi -gcc -x assembler -with -cpp -c -O0 -mcpu = cortex -m0 -mthumb -wall core. S -o core.o

যদি আমরা GCC- এর জন্য gnu.org সাইটে যাই, (এই ক্ষেত্রে সংস্করণ 7.3),

এক্স

-X হল ভাষা নির্দিষ্ট করা। অন্যথায় যদি না -x, তাহলে কম্পাইলার ফাইল এক্সটেনশন ব্যবহার করে অনুমান করার চেষ্টা করবে। (আমাদের ক্ষেত্রে, *. S)।

নিবন্ধ থেকে উপরের উদাহরণটি অ্যাসেম্বলার-সহ-সিপিপি নির্দিষ্ট করে, তবে আমরা কেবল অ্যাসেম্বলার করতে পারি।

সি

-C বলে কম্পাইল করুন কিন্তু লিঙ্ক করবেন না।

O0

-O হল অপ্টিমাইজেশান স্তর সেট করা। -O0 (ওহ -জিরো) ব্যবহার করে "কম্পাইল করার সময় কমিয়ে আনুন এবং ডিবাগিংকে প্রত্যাশিত ফলাফল তৈরি করুন। এটি ডিফল্ট"।

mcpu = কর্টেক্স-এম 0

-Mcpu টার্গেট প্রসেসরের নাম উল্লেখ করে। আমাদের ক্ষেত্রে, এটি কর্টেক্স-এম 4 হবে।

মাথাম্ব

-Mthumb এআরএম এবং থাম্ব স্টেটগুলি চালানোর কোড তৈরি করার মধ্যে নির্বাচন নির্দিষ্ট করে।

ওয়াল

-ওয়াল অবশ্যই খুব সাধারণ এবং সুপরিচিত। এটি সমস্ত সতর্কতা পতাকা চালু করে।

অবশেষে, কমান্ডের শেষে আমাদের ইনপুট ফাইল core. S এবং আউটপুট ফাইল core.o.

আমাদের নির্দিষ্ট ক্ষেত্রে ফিট করার জন্য নতুন নতুন কমান্ড লাইন এখানে দেওয়া হল।

arm -none -eabi -gcc -x assembler -c -O0 -mcpu = cortex -m4 -mthumb -wall core. S -o core.o

এবং যে সংকলিত।

ধাপ 9: প্রোগ্রাম লিঙ্ক করা

নিবন্ধের উদাহরণ থেকে সরাসরি, আমাদের কাছে এটি রয়েছে:

arm -none -eabi -gcc core.o -mcpu = cortex -m0 -mthumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./STM32F031K6T6.ld -o main.elf

উপরের বেশিরভাগ আপনি দেখেছেন। নিচে নতুন কি আছে।

specs = nosys.specs

এটি ব্যাখ্যা করার জন্য কিছুটা জটিল।

এটি "সেমিহোস্টিং" এবং "রিটার্গেটিং" এর সাথে করতে হবে এবং এটি ইনপুট / আউটপুট দিয়ে করতে হবে। এটি সিস্টেম কল এবং লাইব্রেরির সাথেও সম্পর্কযুক্ত।

সাধারণত, এমবেডেড সিস্টেমগুলি স্ট্যান্ডার্ড ইনপুট/আউটপুট ডিভাইস সরবরাহ করে না। এটি সিস্টেম বা লাইব্রেরি কলগুলিকে প্রভাবিত করবে (উদাহরণ: printf ())।

সেমিহোস্টিং মানে ডিবাগার (ধাপ 11 ইমেজটি দেখুন যা ডিবাগারের অংশটি লাল রঙে ঘেরা) একটি বিশেষ চ্যানেল রয়েছে এবং সেমিহোস্টিং প্রোটোকল ব্যবহার করে এবং আপনি হোস্ট মেশিনে (ডিবাগারের মাধ্যমে) printf () এর আউটপুট দেখতে পারেন।

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

এই সব বলার পরে, --specs = nosys.specs এর মানে হল যে আমরা সেমিহোস্টিং হব না। এর মানে তখন স্বাভাবিকভাবেই আমরা পুনর্নির্মাণ করছি। এটি আমাদের পরবর্তী পতাকায় নিয়ে আসে।

নস্টডলিব

লিঙ্কার বিকল্প -nostdlib স্বতন্ত্র চালানোর উদ্দেশ্যে একটি প্রোগ্রাম লিঙ্ক করতে ব্যবহৃত হয়। -nostdlib পৃথক বিকল্পগুলি বোঝায় -nodefaultlibs এবং -nostartfiles। নীচে আমরা দুটি বিকল্প আলাদাভাবে আলোচনা করি, কিন্তু সবচেয়ে সাধারণ ব্যবহার হল এক-স্টপ শপিংয়ের জন্য শুধু nostdlib। যখন একটি হোস্ট করা প্রোগ্রাম লিঙ্ক করা হয়, তখন libc এর মতো স্ট্যান্ডার্ড সিস্টেম লাইব্রেরিগুলি ডিফল্টভাবে লিঙ্ক করা হয়, যা প্রোগ্রামটিকে সমস্ত স্ট্যান্ডার্ড ফাংশন (printf, strlen এবং বন্ধুরা)। লিঙ্কার অপশন -nodefaultlibs সেই ডিফল্ট লাইব্রেরির সাথে লিঙ্ক বন্ধ করে দেয়; লিঙ্ক করা একমাত্র লাইব্রেরিগুলি ঠিক সেগুলি যা আপনি স্পষ্টভাবে -l পতাকা ব্যবহার করে লিঙ্কারের নাম দেন।

এলজিসি

libgcc.a হল একটি স্ট্যান্ডার্ড লাইব্রেরি যা নির্দিষ্ট মেশিনের ত্রুটিগুলি দূর করার জন্য অভ্যন্তরীণ সাবরুটিন সরবরাহ করে। উদাহরণস্বরূপ, এআরএম প্রসেসর একটি বিভাগ নির্দেশ অন্তর্ভুক্ত করে না। Libgcc.a এর ARM সংস্করণে একটি ডিভিশন ফাংশন রয়েছে এবং কম্পাইলার সেই ফাংশনে কল প্রেরণ করে যেখানে প্রয়োজন।

টি

লিঙ্কারকে এই ফাইলটি লিঙ্কার স্ক্রিপ্ট হিসাবে ব্যবহার করার জন্য এটি একটি উপায়। আমাদের ক্ষেত্রে, ফাইলের নাম linker.script.ld।

ও প্রধান

পরিশেষে, আমরা লিঙ্কারকে বলি যে চূড়ান্ত আউটপুট ইমেজ ফাইলের নাম কি হবে যা আমাদের ডিভাইসে জ্বলবে/ফ্ল্যাশ হবে।

আমাদের নির্দিষ্ট পরিস্থিতির জন্য পরিবর্তিত সম্পূর্ণ কমান্ড-লাইনের আমাদের সংস্করণ এখানে:

arm -none -eabi -gcc core.o -mcpu = cortex -m4 -mthumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./linker.script.ld -o main.elf

আমরা নিশ্চিত করি যে স্ক্রিপ্ট ফাইল, এবং core.o ফাইল, উভয় একই ডিরেক্টরিতে রয়েছে, যেখানে আমরা উপরের কমান্ড-লাইনটি চালাব।

এবং এটি কোনও সমস্যা ছাড়াই লিঙ্ক করে।

একটি চেক

আমরা তারপর চালানো:

arm-none-eabi-nm main.elf

এবং আমরা পাই:

devchu@chubox: ~/Development/Atollic/TrueSTUDIO/STM32_workspace_9.1 $ arm-none-eabi-nm main.elf 20014000 A _estack 08000010 t main_loop 08000008 T reset_handler 08000000 T vtable

ভালো লাগছে। আর্ম-নন-ইবি-এনএম কমান্ড হল অবজেক্ট ফাইলের মধ্যে প্রতীক তালিকাভুক্ত করার একটি উপায়।

ধাপ 10: পরীক্ষা STM32 নিউক্লিও -64 এর সাথে সংযোগ

পরীক্ষা STM32 নিউক্লিও -64 এর সাথে সংযোগ
পরীক্ষা STM32 নিউক্লিও -64 এর সাথে সংযোগ
পরীক্ষা STM32 নিউক্লিও -64 এর সাথে সংযোগ
পরীক্ষা STM32 নিউক্লিও -64 এর সাথে সংযোগ

আপনার প্রথম মিশন, আপনার যদি এটি গ্রহণ করা বেছে নেওয়া হয়, তা হল আপনার সিস্টেমকে আপনার ডেভেলপমেন্ট বোর্ড দেখতে।

উইন্ডোজ ব্যবহার করে

উইন্ডোজের জন্য, আমি Atollic (Free version) থেকে TrueSTUDIO ইনস্টল করার সিদ্ধান্ত নিয়েছি। এটি একটি বেদনাদায়ক ইনস্টল ছিল এবং এটি স্বয়ংক্রিয়ভাবে ড্রাইভারটি ইনস্টল করেছিল যাতে আমি সংযোগটি পরীক্ষা করতে st-link ব্যবহার করতে পারি। একবার আমি TrueSTUDIO ইনস্টল করেছি এবং ডিভাইস ম্যানেজার ডিভাইসটি দেখেছি, আমি বেয়ার মেটাল নিবন্ধ দ্বারা প্রস্তাবিত টেক্সান/স্টিলিং সরঞ্জামগুলি ডাউনলোড করেছি যা আমরা অনুসরণ করছি। আমি আবার ফোল্ডারটি সরাসরি "C: \" এর অধীনে রেখেছি, এবং আবার আমার স্থানীয় সাইগউইন হোম বিন থেকে কমান্ডগুলিতে কিছু লিঙ্ক তৈরি করেছি।

ln -s /c/STM32. MCU/stlink-1.3.0-win64/bin/st-info.exe ~/bin/st-info

প্রাথমিক পরীক্ষা হিসাবে আমরা সত্যিই ডিভাইসের সাথে যোগাযোগ করতে পারি কিনা তা দেখার জন্য, আমি দৌড়েছি:

st-info-probe

এবং ফিরে পেয়েছি:

১ টি স্টিলিংক প্রোগ্রামার পাওয়া গেছে

তাই এখন আমরা জানি আমরা আমাদের উন্নয়ন বোর্ডের সাথে কথা বলতে/জিজ্ঞাসা করতে পারি।

লিনাক্স ব্যবহার করে

লিনাক্সের জন্য, আপনার সত্যিই একজন ড্রাইভার দরকার নেই। কিন্তু ডেবিয়ানের জন্য, আপনাকে উৎস থেকে st সরঞ্জাম তৈরি করতে হবে।

গিট ক্লোন

নিশ্চিত করুন যে আপনি libusb-1.0-0-dev ইনস্টল করেছেন।

উপযুক্ত তালিকা | grep -E "*libusb।*dev*"

তোমার দেখা উচিত:

libusb-1.0-0-dev/xenial, এখন 2: 1.0.20-1 amd64 [ইনস্টল]

অথবা এরকম কিছু।

এটি ইনস্টল করতে:

sudo apt-get libusb-1.0-0-dev ইনস্টল করুন

লক্ষ্য করুন যে উপরেরটি একই নয়:

sudo apt-get libusb-dev ইনস্টল করুন

সঠিক অনুপস্থিত libusb dev cmake এর সমস্যা হতে পারে।

CMake ত্রুটি: এই প্রকল্পে নিম্নলিখিত ভেরিয়েবল ব্যবহার করা হয়েছে, কিন্তু সেগুলি NOTFOUND এ সেট করা আছে দয়া করে সেগুলি সেট করুন বা নিশ্চিত করুন যে সেগুলি CMake ফাইলগুলিতে সঠিকভাবে সেট এবং পরীক্ষা করা হয়েছে: LIBUSB_INCLUDE_DIR (উন্নত)

প্রজেক্টের রুট ডিরেক্টরিতে পরিবর্তন করুন (… blah /blah /stlink)। একটি "মুক্তি" করুন।

এটি তৈরি হওয়ার পরে, সরঞ্জামগুলি ".. /বিল্ড /রিলিজ" এর অধীনে হওয়া উচিত।

আপনি তারপর "st-info --probe" চালাতে পারেন। এখানে নিউক্লিও সংযুক্ত সঙ্গে আউটপুট, তারপর না।

devchu@chubox: ~/Development/stlink $./build/Release/st-info --probeFound 1 stlink programmers serial: 303636414646353034393535363537 openocd: "\ x30 / x36 / x36 / x41 / x46 / x36 34 x35 34 x35 x39 / x35 / x35 / x36 / x35 / x37 "ফ্ল্যাশ: 524288 (পৃষ্ঠা আকার: 2048) sram: 65536 চিপিড: 0x0446 descr: F303 উচ্চ ঘনত্বের ডিভাইস devchu@chubox: ~/development/stlink $./build/Release/st- ইনফো -প্রোবে 0 স্ট্লিংক প্রোগ্রামার পাওয়া গেছে devchu@chubox: ~/Development/stlink $

ধাপ 11: আসুন লিনাক্সের সাথে জিডিবি ব্যবহার করি

আসুন লিনাক্সের সাথে জিডিবি ব্যবহার করি
আসুন লিনাক্সের সাথে জিডিবি ব্যবহার করি
আসুন লিনাক্সের সাথে জিডিবি ব্যবহার করি
আসুন লিনাক্সের সাথে জিডিবি ব্যবহার করি

যদি আপনি এই সব চেষ্টা করছেন, এবং আপনি এই পর্যন্ত পেয়েছেন - মহান! অসাধারণ। এবার একটু মজা করা যাক।

যখন আপনি এই এআরএম ডেভেলপমেন্ট বোর্ডগুলি কিনবেন, সেগুলি টেক্সাস ইন্সট্রুমেন্টস থেকে MSP432 লঞ্চপ্যাড কিনা, অথবা এই যে আমরা এখন আলোচনা করছি, নিউক্লিও-এফ 303 (এসটিএম 32 নিউক্লিও -64), তারা সাধারণত একটি চলমান প্রোগ্রামের সাথে ইতিমধ্যেই ফ্ল্যাশ হয়ে আসে, সাধারণত কিছু জ্বলজ্বলে প্রোগ্রাম যা LED (গুলি) ফ্ল্যাশ হারে পরিবর্তন করার জন্য একটি সুইচ টিপে অন্তর্ভুক্ত করে।

আমরা এত দ্রুত ওভার-রাইটিং করার আগে, আসুন দেখি কি এবং কি করা যায়।

লিনাক্সের সাথে, একটি টার্মিনাল খুলুন, স্টিলিংক গিট প্রজেক্টটি পরিবর্তন করুন যা আমরা সদ্য তৈরি করেছি, এবং st-utule টুলটি খুঁজে বের করুন।

devchu@chubox: ~/Development/stlink $ find। -নাম-উপ-ব্যবহার

./build/Release/src/gdbserver/st-util

সেই টুলটি চালান। যেহেতু আমরা ইতিমধ্যে st-info --probe এর সাথে আমাদের সংযোগ পরীক্ষা করেছি, তাই আমাদের কিছু আউটপুট পাওয়া উচিত:

devchu@chubox: ~/Development/stlink $./build/Release/src/gdbserver/st-util

st-util 1.4.0-50-g7fafee2 2018-10-20T18: 33: 23 INFO common.c: লোড হচ্ছে ডিভাইস প্যারামিটার…। 2018-10-20T18: 33: 23 INFO common.c: সংযুক্ত ডিভাইস হল: F303 উচ্চ ঘনত্বের ডিভাইস, আইডি 0x10036446 2018-10-20T18: 33: 23 INFO common.c: SRAM সাইজ: 0x10000 বাইট (64 KiB), ফ্ল্যাশ: 2048 বাইটের পাতায় 0x80000 বাইট (512 KiB) 2018-10-20T18: 33: 23 তথ্য gdb-server.c: চিপ আইডি 00000446, কোর আইডি 2ba01477। 2018-10-20T18: 33: 23 INFO gdb-server.c: *: 4242 এ শুনছে…

এটি এখন জিডিবি সার্ভার চলছে, এবং এটি আমাদের ডেভেলপমেন্ট বোর্ড দেখছে, এবং আরো গুরুত্বপূর্ণ, এটি পোর্ট 4242 (ডিফল্ট পোর্ট) শুনছে।

এখন আমরা জিডিবি ক্লায়েন্টকে বরখাস্ত করতে প্রস্তুত।

লিনাক্সে, অন্য একটি টার্মিনাল খুলুন, এটি লিখুন:

arm-none-eabi-gdb -tui

এটি জিডিবি কঠোরভাবে কমান্ড-লাইন চালানোর মতোই, তবে এটি পরিবর্তে একটি পাঠ্য-ভিত্তিক টার্মিনাল তৈরি করে (আমার অনুমান যে এটি অভিশাপ ব্যবহার করে)।

আমাদের জিডিবি ক্লায়েন্ট এবং জিডিবি সার্ভার চলছে। যাইহোক, ক্লায়েন্ট সার্ভারের সাথে সংযুক্ত নয়। এই মুহুর্তে এটি আমাদের নিউক্লিও (বা আপনার পছন্দের বোর্ড) সম্পর্কে কিছুই জানে না। আমাদের এটা বলতে হবে। টার্মিনালে, আপনার প্রম্পটটি এখন "(gdb)" হওয়া উচিত। লিখুন:

সাহায্য লক্ষ্য

এটি আপনাকে একটি তালিকা দেবে। লক্ষ্য করুন যে আমরা যা চাই তা হল টার্গেট এক্সটেন্ডেড -রিমোট - একটি সিরিয়াল লাইনের মাধ্যমে একটি রিমোট কম্পিউটার ব্যবহার করুন।

কিন্তু আমাদের এটির অবস্থানও দিতে হবে। সুতরাং, (জিডিবি) প্রম্পটে প্রবেশ করুন:

(gdb) টার্গেট এক্সটেন্ডেড-রিমোট লোকালহোস্ট: 4242

আপনার এমন কিছু প্রতিক্রিয়া ফিরে পাওয়া উচিত:

(gdb) টার্গেট এক্সটেন্ডেড-রিমোট লোকালহোস্ট: 4242

লোকালহোস্ট ব্যবহার করে রিমোট ডিবাগিং: 4242 0x080028e4 ইন ?? ()

এদিকে, সেন্ট-ইউটিলিটি gdbserver চালানোর টার্মিনালে, আমরা এটি পেয়েছি:

2018-10-20T18: 42: 30 INFO gdb-server.c: 6 hw ব্রেকপয়েন্ট রেজিস্টার পাওয়া গেছে

2018-10-20T18: 42: 30 তথ্য gdb-server.c: GDB সংযুক্ত।

ধাপ 12: আসুন পুনরাবৃত্তি করি, উইন্ডোজ এবং ফ্ল্যাশ দিয়ে আমাদের প্রোগ্রাম

আসুন পুনরাবৃত্তি করি, উইন্ডোজ এবং ফ্ল্যাশ দিয়ে আমাদের প্রোগ্রাম
আসুন পুনরাবৃত্তি করি, উইন্ডোজ এবং ফ্ল্যাশ দিয়ে আমাদের প্রোগ্রাম
আসুন পুনরাবৃত্তি করি, উইন্ডোজ এবং ফ্ল্যাশ দিয়ে আমাদের প্রোগ্রাম
আসুন পুনরাবৃত্তি করি, উইন্ডোজ এবং ফ্ল্যাশ দিয়ে আমাদের প্রোগ্রাম
আসুন পুনরাবৃত্তি করি, উইন্ডোজ এবং ফ্ল্যাশ দিয়ে আমাদের প্রোগ্রাম
আসুন পুনরাবৃত্তি করি, উইন্ডোজ এবং ফ্ল্যাশ দিয়ে আমাদের প্রোগ্রাম

St-util gdbserver, এবং arm-none-eabi-gdb ক্লায়েন্ট চালানোর ধাপগুলো মূলত একই রকম যা আমরা আগের ধাপে করেছি। আপনি দুটি টার্মিনাল খুলুন (সাইগউইন, ডস সেমিডি, বা উইন্ডোজ পাওয়ারশেল), স্ট-ইউটিলিটির অবস্থান সন্ধান করুন, এটি চালান। অন্য টার্মিনালে, arm-none-eabi-gdb ক্লায়েন্ট চালান। পার্থক্য শুধু এই যে -tui (টার্মিনাল -ভিত্তিক টেক্সট ভিউ) মোড সম্ভবত সমর্থিত নয়।

যদি উপরের উইন্ডোজে কাজ করে, তাহলে আপনাকে সম্ভবত বন্ধ করতে হবে (শুধু ক্লায়েন্ট)। এই মুহুর্তে, একরকম আপনাকে জিডিবি ক্লায়েন্ট চালাতে হবে যেখানে আপনার বিল্ড ফাইল ("core.out"), অথবা জিডিবি ক্লায়েন্টের যুক্তি হিসাবে সেই ফাইলের পুরো পথ যোগ করুন।

আমি সাইগউইন ব্যবহার করে এবং আমার স্থানীয় $ HOME // বিন ডিরেক্টরি থেকে লিঙ্ক তৈরি করে আমার জীবনকে সরল করেছি যেখানে এই দুটি সরঞ্জামই থাকে।

ঠিক আছে, আমরা ঠিক আগের মতই কম্পাইল এবং লিঙ্ক করেছি, এবং আমাদের কাছে ফাইল main.elf ফ্ল্যাশ করার জন্য প্রস্তুত।

আমাদের একটি উইন্ডোতে স্ট-ইউটিলিটি চলছে। আমরা জিডিবি ক্লায়েন্টকে পুনরায় শুরু করি, এবার আমরা করি:

arm-none-eabi-gdb main.elf

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

(জিডিবি) লোড

সাইগউইন টার্মিনালগুলির সাথে চলমান, কিছু সময় কনসোল কমান্ডগুলি আউটপুট না করার সাথে একটি পরিচিত সমস্যা রয়েছে। সুতরাং আমাদের ক্ষেত্রে, সার্ভারটি চালানো উইন্ডোটি সম্পূর্ণ নীরব ছিল। ক্লায়েন্ট চালাচ্ছেন, যেখানে আমরা লোড দৌড়েছি, এটি আউটপুট করুন:

লোডিং বিভাগ

ধাপ 13: লিনাক্সের সাথে ঝলকানি - আরো পুরস্কৃত করা: D

লিনাক্সের সাথে ঝলকানি - আরো পুরস্কৃত: D
লিনাক্সের সাথে ঝলকানি - আরো পুরস্কৃত: D

ধাপ 14: আসুন একটু গভীরভাবে ডুব দেই

আপনি যদি এখানে এসে থাকেন, চমৎকার। চল এগোই.

কেন এক্সিকিউটেবল, main.elf ফাইলের ভিতরে তাকাবেন না? নিম্নলিখিত চালান:

arm-none-eabi-objdump -d main.elf

আপনি এই মত একটি আউটপুট দেখতে হবে:

main.elf: ফাইল ফরম্যাট elf32-littlearm

বিভাগ। টেক্সট এর disassembly:

08000000:

8000000: 00 40 01 20 09 00 00 08.@. ….

08000008:

8000008: 4802 ldr r0, [পিসি, #8]; (8000014) 800000a: 4685 mov sp, r0 800000c: 4f02 ldr r7, [pc, #8]; (8000018) 800000e: 2000 movs r0, #0

08000010:

8000010: 3001 r0 যোগ করে, #1 8000012: e7fd b.n 8000010 8000014: 20014000.word 0x20014000 8000018: deadbeef.word 0xdeadbeef

উপরোক্ত আউটপুট থেকে আমরা কোন ছোট্ট নাগেট পেতে পারি?

যদি আপনি linker.script.ld ফাইলটি নিয়ে আলোচনা ও তৈরি করার সময় আপনার মনে পড়ে, আমরা বলেছি যে এই ARM ডিভাইসের RAM 0x20000000 থেকে শুরু হয় এবং ফ্ল্যাশ মেমরি 0x08000000 থেকে শুরু হয়।

সুতরাং, আমরা দেখতে পাচ্ছি যে প্রকৃতপক্ষে প্রোগ্রামটি এমন যে এটি সব ফ্ল্যাশ মেমরিতে থাকে।

তারপর, উপরে, কিন্তু পরবর্তী ধাপে, যখন আমরা "হ্যালো ওয়ার্ল্ড" অংশ নিয়ে আলোচনা করছিলাম, সেখানে একটি বিবৃতি ছিল যেখানে আমরা একটি MCU কোর রেজিস্টারে ("R7") একটি তাত্ক্ষণিক, ধ্রুবক, আক্ষরিক মান ("0xDEADBEEF") লোড করি।

বিবৃতিটি ছিল:

LDR R7, = 0xDEADBEEF

আমাদের কোডে, এটিই একমাত্র জায়গা যেখানে আমরা DEADBEEF এর কথাও উল্লেখ করেছি। যেখানে সেখানে. এবং তবুও, যদি আপনি উপরের বিচ্ছিন্ন/পুনর্গঠিত নির্দেশাবলী, ইত্যাদি দেখেন, তবে আমরা যতটা ভেবেছিলাম তার চেয়ে DEADBEEF সম্পর্কিত আরও কিছু আছে।

সুতরাং, কম্পাইলার/লিঙ্কার একরকম স্থায়ীভাবে DEADBEEF- এর মান 0x8000018 এ একটি ফ্ল্যাশ ঠিকানায় ফ্ল্যাশ করার সিদ্ধান্ত নিয়েছে। এবং তারপরে, কম্পাইলার আমাদের উপরের LDR নির্দেশনাটি পরিবর্তন করেছে:

LDR R7, [PC, #8]

এমনকি এটি আমাদের জন্য একটি মন্তব্য তৈরি করেছে। কী সুন্দর. এবং এটি আমাদেরকে বর্তমান প্রোগ্রাম কাউন্টার ভ্যালু (পিসি রেজিস্টার) নিতে বলে, সেই মানটিতে 0x8 যোগ করে, এবং সেখানেই DEADBEEF পুড়িয়ে ফেলা হয়েছে, এবং সেই মানটি পান এবং R7 এ স্টাফ করুন।

তাই এর মানে হল যে প্রোগ্রাম কাউন্টার (পিসি) 0x8000010 ঠিকানার দিকে ইঙ্গিত করছিল, যা main_loop এর শুরু, এবং যে DEADBEEF মান main_loop শেষ হওয়ার পর দুটি ঠিকানায় বসে।

ধাপ 15: পরিশেষে, প্রোগ্রাম চলমান একটি সংক্ষিপ্ত চেহারা

এমনকি যদি আপনি জিডিবি ছেড়ে যান, তবে কমান্ডটি পুনরায় প্রবেশ করুন। এমনকি আপনাকে এটির কোনো ফাইলও দিতে হবে না; আমরা আর ঝলকানি করছি না, শুধু এটি চালাচ্ছি।

একবার আপনি GDB ক্লায়েন্টকে GDB সার্ভারে পুনরায় সংযুক্ত করলে, (gdb) কমান্ড প্রম্পটে:

(জিডিবি) তথ্য নিবন্ধন

আপনি এই মত কিছু দেখতে হবে:

r0 0x0 0

r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0x0 0 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0 sp 0x20014000 0x20014000 lr 0xffffffff490800000000000000000000000000000000000000000000000000000000000000000000004

কিন্তু তারপর, (জিডিবি) প্রম্পটে, প্রবেশ করুন:

(gdb) চালিয়ে যান

এবং খুব দ্রুত CTRL-C চাপুন। এটি প্রোগ্রামটি বিরতি দেওয়া উচিত। আবার "তথ্য নিবন্ধক" কমান্ড লিখুন।

এইবার, এটি ভিন্ন দেখায়:

(জিডিবি) তথ্য নিবন্ধন

r0 0x350ffa 3477498 r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0xdeadbeef 3735928559 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 014 16777216

কি হলো? আমরা যা চেয়েছিলাম ঠিক তাই। DEADBEEF R7 তে লোড করা হয়েছিল, এবং R0 (অত্যন্ত দ্রুত) বৃদ্ধি পেয়েছে। যদি আপনি পুনরাবৃত্তি করেন, আপনি অন্য মান সহ আবার R0 দেখতে পাবেন।

ধাপ 16: আমরা ফ্ল্যাশে একটি পঠনযোগ্য অ্যারে তৈরি করতে চেয়েছিলাম

সমাবেশ এবং নির্দেশাবলী ব্যবহার করে একটি অ্যারের সমতুল্য তৈরি করার একটি উপায় নিম্নরূপ:

.type myarray, %object // নাম বা লেবেল 'myarray' একটি বস্তুর ধরন হিসেবে সংজ্ঞায়িত করা হয়েছে।

myarray: // এটি 'myarray' // এর ঘোষণার সূচনা // (এতে কী থাকবে)।.word 0x11111111 // প্রথম সদস্য বা মান 'myarray' এর অন্তর্ভুক্ত।.word 0x22222222 // দ্বিতীয় মান (সংলগ্ন ঠিকানা)।.word 0x33333333 // ইত্যাদি।.size myarray,।

এখন যেহেতু আমরা এটি ফ্ল্যাশ মেমরিতে সেট আপ করেছি, আমরা এটি প্রোগ্রামে ব্যবহার করতে পারি। নিচে একটি অংশ দেওয়া হল:

LDR R1, myarray // এটি 'myarray' এর প্রথম স্থানে থাকা ডেটা লোড করে। ' // এটা আমরা চাই না।

LDR R1, = myarray // এটি লোকেশন ভ্যালু নিজেই লোড করে (১ ম ঠিকানা), // তথ্য নয়.. // আমরা যা চাই তা হল।

MOV R2, #0 // R2 একটি হিসাব রাখবে যাতে আমরা হাঁটতে না পারি

// অ্যারের শেষ। LDR R3, = myarrsize // R3 'myarrsize' এর সমতুল্য হবে।

// R0 আমাদের ডেটা ধরে রাখবে

main_loop:

LDR R0, [R1] // R1 ('myarray') দ্বারা নির্দেশিত তথ্য R0 তে লোড করুন। CMP R2, R3 // আমরা কি অ্যারের সীমায় আছি? BEQ main_loop // যদি আমরা হয়, আমরা সম্পন্ন, তাই আমরা শুধু চিরতরে লুপ করব।

AD2 R2, #1 // অন্যথায়, আমরা অ্যারের মাধ্যমে পুনরাবৃত্তি করতে পারি।

R1 যোগ করুন, #4 // R1 নিবন্ধন করতে 4 যোগ করুন, তাই এটি সঠিকভাবে পরবর্তী নির্দেশ করে

// ঠিকানা..

B main_loop // লুপ ব্যাক।

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

প্রস্তাবিত: