বাহ্যিক র‌্যাম থেকে চালিত কোড সংকলন


13

আমি একটি PIC18F85J5 এর উপর ভিত্তি করে ন্যূনতম গেম সিস্টেমের জন্য ডিজাইন বিবেচনা করছি আমার ডিজাইনের অংশটি হ'ল গিপগুলি এসিডি কার্ড থেকে চিপটি পুনরায় প্রোগ্র্যাম না করে বা প্রোগ্রামের মেমোরিটিকে ঝলকানো ছাড়া লোড করা যায়। আমি সেই চিপটি বেছে নিয়েছি কারণ এতে একটি বাহ্যিক মেমরি ইন্টারফেস রয়েছে যা আমাকে বাহ্যিক এসআরএএম থেকে কোড চালানোর অনুমতি দেবে।

প্রাথমিক ধারণাটি হ'ল অভ্যন্তরীণ প্রোগ্রামের মেমোরিতে এসডি কার্ড ব্রাউজ করার জন্য একটি ইন্টারফেস থাকবে এবং ব্যবহারকারী কোনও প্রোগ্রাম নির্বাচন করার পরে এটি একটি হেক্স ফাইলটি এসডি কার্ড থেকে বাহ্যিক র‌্যামে অনুলিপি করবে এবং তারপরে এক্সিকিউশনটি বাইরের র‌্যাম স্পেসে ঝাঁপিয়ে দেবে will ।

অভ্যন্তরীণ প্রোগ্রামের মেমোরিতে গ্রাফিক্স, নিয়ামক ইনপুট এবং অন্যান্য বিভিন্ন ইউটিলিটির জন্য বিভিন্ন গ্রন্থাগারও থাকবে।

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

আমি এমপিএলএব আইডিই ব্যবহার করছি তবে আমি এর সাথে খুব বেশি পরিচিত নই বা এই জাতীয় কাস্টমাইজেশন কীভাবে করব।


আমি এখানে কিছুক্ষণ দেখেছি এমন একটি সেরা প্রশ্ন ... আমি ধারণাগুলি এবং উত্তরগুলি দেখার অপেক্ষায় রয়েছি।
জন এল


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

উত্তর:


8

আপনার দুটি পৃথক সমস্যা রয়েছে:

  1. বাহ্যিক র‌্যাম ঠিকানা সীমার জন্য কোড তৈরি করা।

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

    বেস কোডটি বাহ্যিক স্মৃতিতে নতুন অ্যাপ্লিকেশন লোড করার পরে এটি কার্যকর করতে হয় তা জানতে হবে। সবচেয়ে সহজ জিনিসটি সম্ভবত প্রথম বাহ্যিক র‌্যামের অবস্থান থেকে কার্যকর করা শুরু করা। এর অর্থ হল আপনার কোডটির সেই নিখুঁত শুরুর ঠিকানায় একটি কোড কোড প্রয়োজন। এটিতে বাকী কোডের ডান লেবেলে একটি GOTO রয়েছে, যা সমস্ত পুনঃস্থাপনযোগ্য হবে।

  2. অ্যাপ্লিকেশনগুলিকে বেস কোডের লাইব্রেরি রুটিনগুলির সাথে সংযুক্ত করে।

    বিদ্যমান মাইক্রোচিপ সরঞ্জামগুলির সাথে এটি করার জন্য অবিলম্বে সহজ কোনও উপায় নেই তবে এটি খুব খারাপ নয়।

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

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

    একটি ভাল উপায় বেস কোডে একটি নির্বাচিত নির্দিষ্ট ज्ञात ঠিকানায় একটি সংজ্ঞায়িত ইন্টারফেস অঞ্চল থাকা। প্রতিটি সাবরুটিনের জন্য একটি গোটো থাকবে যা অ্যাপ কোড কল করতে পারে। এই জিওটিওগুলি নির্দিষ্ট পরিচিত ঠিকানাগুলিতে স্থাপন করা হবে এবং বাহ্যিক অ্যাপ্লিকেশনগুলি কেবলমাত্র সেই অবস্থানগুলিতে কল করবে, যা তখন বেস কোডের সেই বিল্ডে সাবরোটাইন আসলে শেষ পর্যন্ত যেখানে যেতে পারে jump এর জন্য রফতানি সাব্রোটিন প্রতি 2 প্রোগ্রাম মেমরি শব্দ এবং রান সময় দুটি অতিরিক্ত চক্র ব্যয় হয়, তবে আমি মনে করি এটির পক্ষে এটি বেশ মূল্যবান।

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

    আমার প্রিপ্রোসেসর এবং অন্যান্য সম্পর্কিত সামগ্রীর একগুচ্ছ www.ebrainc.com/pic/dload.htm এ বিনামূল্যে উপলব্ধ ।


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

5

বিকল্প 1: বর্ণিত ভাষা

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

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

অনুরূপ শিরাতে, আপনি নিজের ডোমেন-নির্দিষ্ট ভাষা তৈরি করতে পারেন। আপনাকে আরও একটি পূর্ণাঙ্গ API এবং বহিরাগত ডকুমেন্টেশন সরবরাহ করতে হবে তবে গেমগুলি যদি একই রকম হয় তবে এটি খুব বেশি কঠিন হবে না।

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

বিকল্প 2: কেবল পুরো বিষয়টি পুনরায় প্রোগ্রাম করুন

তবে, আপনি যদি ইতিমধ্যে সি তে সমস্ত গেমস প্রোগ্রাম করার পরিকল্পনা করে থাকেন তবে এসডি কার্ড থেকে কেবল গেমের যুক্তি লোড করে বিরক্ত করবেন না । পুনরায় প্রোগ্রাম করার জন্য আপনার কাছে মাত্র 32 কেবি ফ্ল্যাশ রয়েছে এবং এর জন্য খুব সহজেই 4 জিবি মাইক্রোএসডি কার্ড পেতে পারেন। (দ্রষ্টব্য: বৃহত্তর কার্ডগুলি প্রায়শই এসডিএইচসি হয় যার সাথে ইন্টারফেস করা শক্ত)। ধরে নিই যে আপনি আপনার 32 কেবি প্রতি শেষ বাইট ব্যবহার করেন যা আপনার ফার্মওয়্যারের 131,072 কপির জন্য এসডি কার্ডের জন্য জায়গাটি ছেড়ে দেয় যা আপনার প্রয়োজন গেম যুক্তি সহ with

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

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

এটি আমার বর্তমান সুপারিশ।

বিকল্প 3: ডিপ ম্যাজিক হেক্স ফাইলের কেবলমাত্র অংশ সংরক্ষণ করে

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

লিঙ্কার ইতিমধ্যে আপনার কোডটিকে একাধিক বিভাগে বিভক্ত করে; আপনি তাত্ত্বিকভাবে কিছু -sectionএবং #pragmaপ্ররোচনা দিয়ে এটি অতিরিক্ত বিভাগে বিভক্ত করতে পারেন । আমি কখনই এটি করিনি, এবং কীভাবে জানি না। উপরের দুটি পদ্ধতি আমাকে ব্যর্থ না করা পর্যন্ত (বা কেউ এখানে একটি দুর্দান্ত উত্তর পোস্ট করেছেন), আমি সম্ভবত এই পদ্ধতিটি শিখব না, এবং তাই আমি আপনাকে এটি শেখাতে পারি না।


2 নাম্বারটির বিষয়ে আমার আপত্তি হ'ল ফ্ল্যাশ মেমরির চিপের জীবদ্দশায় সীমিত সংখ্যক মুছে যাওয়া চক্র রয়েছে। আমি একটি বিফায়ার এমসিইউ ব্যবহার করতে চাই না কারণ আমি 8-বিট মিনিমালিজমের জন্য যাচ্ছি।
ক্যাপচার্যাগ

@ সিএমপি - এতে কমপক্ষে 10,000 টি মুছে ফেলা চক্র রয়েছে। যদি কেউ প্রতিদিন একটি আলাদা খেলা খেলে তা 2039 সাল অবধি চলবে The ফ্ল্যাশটি অবশ্যই অবশ্যই সার্কিটের বাকি অংশগুলিকে ছাড়িয়ে যাবে। আমি মনে করি না যে এটি প্রতি দিন কয়েকবার খেলে আরকেড না নেওয়া পর্যন্ত আপনাকে এই সম্পর্কে উদ্বিগ্ন হওয়ার দরকার আছে।
কেভিন ভার্মির

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

1
উভয়ই খুব ন্যায্য পয়েন্ট। এমনকি নিম্ন অংশের গণনায় যাওয়ার পরেও, একটি পিক 32 এর তুলনায় ব্যয় বা বাহ্যিক উপাদানগুলির চেয়ে আলাদা নয় এবং এতে 512K আভ্যন্তরীণ ফ্ল্যাশ থাকলেও এটি জিতে যায়।
ক্যাপচার্যাগ

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