প্রোগ্রাম সরাসরি সি উত্স থেকে এভিআর ইপ্রোম


11

আপনি যখন কোনও এভিআর সি উত্সে নিম্নলিখিত কোডটি অন্তর্ভুক্ত করেন, তখন কোনও অতিরিক্ত কমান্ড বা .hex ফাইলের প্রয়োজন ছাড়াই আপনি দৃশ্যত সরাসরি ফিউজগুলি প্রোগ্রাম করতে পারেন:

#include <avr/io.h>

FUSES = {
        .low =          LFUSE_DEFAULT ,
        .high =         HFUSE_DEFAULT ,
        .extended =     EFUSE_DEFAULT ,
};

EEPROM এ প্রোগ্রামের মানগুলির সাথে কি একই রকম কৌশল আছে?

আমি /usr/lib/avr/include/avr/fuse.hম্যাক্রো সম্পর্কে আমি যেখানে কিছু মন্তব্য পেতে পারি তা পরীক্ষা করে দেখেছি, তবে আমি তেমন কোনও মন্তব্য খুঁজে পাচ্ছি না /usr/lib/avr/include/avr/eeprom.hএবং প্রিপ্রসেসর সামগ্রীর ব্যাখ্যা আমার লিগের বাইরে কিছুটা।

যদি আমি সি উত্স কোডে ডিফল্ট EEPROM মান অন্তর্ভুক্ত করতে পারি তবে এটি সত্যিই সহজ হবে। কেউ কীভাবে তা সম্পাদন করতে জানেন?

edit1:

এই FUSES কৌশলটি কেবল আইএসপি-সময়ে চালিত হয়, আরএন-টাইমে নয়। সুতরাং নিয়ামকটিতে ফলাফলের বিধি কোডে কোনও ফিউজ প্রোগ্রাম করা হচ্ছে না। পরিবর্তে প্রোগ্রামার একটি অতিরিক্ত FUSES প্রোগ্রামিং চক্রের মাধ্যমে স্বয়ংক্রিয়ভাবে চক্র।

edit2:

আমি লিনাক্সে avr-gcc এবং avrdude সরঞ্জামচেন ব্যবহার করি।


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

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

@ ইংল্যাটলারেজ কেবল আইএসপি প্রোগ্রামিং। এই সেটআপটিতে কোনও বুটলোডার নেই।
জিপ্পি

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

উত্তর:


7

অ্যাভিআর-জিসিসি দিয়ে EEMEMম্যাক্রো একটি ভেরিয়েবলের সংজ্ঞা অনুসারে ব্যবহার করা যেতে পারে, libcডকস এবং এখানে একটি উদাহরণ দেখুন :

#include <avr/eeprom.h>
char myEepromString[] EEMEM = "Hello World!";

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


আমি 'অনুমিত' হওয়ার চেয়ে কিছুটা আলাদা ফাইল নাম ব্যবহার করেছি, তবে কমান্ড লাইন (এবং
মেকফিল

1
প্রোগ্রামার দ্বারা ব্যবহৃত ইনটেল avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 ihex $(src).elf $(src).eeprom.hex
হেক্সস ডেটাযুক্ত

1
আসল প্রোগ্রামিংটি করেছেন:avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U eeprom:w:$(src).eeprom.hex
জিপ্পি

7

হ্যাঁ, আপনি উত্স কোডে ম্যানুয়ালি EEPROM এ ডিফল্ট ডেটা লিখতে পারেন। প্রথমে, এভিআর: ডিনের এভিআর ইপ্রোম টিউটোরিয়াল দিয়ে ইপ্রোমের এই দুর্দান্ত নির্দেশিকাটি দেখুন এছাড়াও, আমার যুক্ত করা উচিত যে মেকফিল ব্যবহার করে EEPROM ডেটাযুক্ত একটি। ডিপ ফাইল তৈরি করা ভাল is ধারণা যা উত্স কোডের সাথে ডিভাইসে প্রোগ্রাম করা হবে। তবে, আপনি যদি বিভিন্ন মেকফিল এবং লিঙ্কার অপারেশন সম্পর্কে অপরিচিত হন তবে এটি এখনও আপনার উত্স কোড ফাইলের মধ্যে থেকে করা যেতে পারে - সার্কিটটি চালিত হওয়ার সাথে সাথে এটি ঘটবে, প্রাথমিক প্রোগ্রাম অপারেশনটি থামিয়ে দেবে।

প্রোগ্রামের শুরুতে (কোনও মূল লুপের আগে) আপনি এরকম কিছু করতে পারেন:

#include <avr/eeprom.h>

#define ADDRESS_1 46  // This could be anything from 0 to the highest EEPROM address
#define ADDRESS_2 52  // This could be anything from 0 to the highest EEPROM address
#define ADDRESS_3 68  // This could be anything from 0 to the highest EEPROM address

uint8_t dataByte1 = 0x7F;  // Data for address 1
uint8_t dataByte2 = 0x33;  // Data for address 2
uint8_t dataByte3 = 0xCE;  // Data for address 3

eeprom_update_byte((uint8_t*)ADDRESS_1, dataByte1);
eeprom_update_byte((uint8_t*)ADDRESS_2, dataByte2);
eeprom_update_byte((uint8_t*)ADDRESS_3, dataByte3);

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

if(eeprom_read_byte((uint8_t*)SOME_LOCATION) != DESIRED_VALUE){
  eeprom_write_byte((uint8_t*)SOME_LOCATION, DESIRED_VALUE);
  eeprom_update_byte((uint8_t*)ADDRESS_1, dataByte1);
  eeprom_update_byte((uint8_t*)ADDRESS_2, dataByte2);
  eeprom_update_byte((uint8_t*)ADDRESS_3, dataByte3);
}

আপনি যদি প্রচুর পরিমাণে ডেটা আপডেট করতে চান, তবে অন্যান্য ফাংশনগুলি ব্যবহার করে দেখুন eeprom_update_block(...)। এবং অবশ্যই এই টিউটোরিয়ালটি পড়ুন; এটা ভাল লেখা আছে।

আপনি EEPROM আপডেটের সমস্ত বিবৃতি একক প্রিপ্রসেসর শর্তাধীন বিবৃতিতে রাখতে পারেন। এটি করা খুব সহজ:

#if defined _UPDATE_EEPROM_
  #define ADDRESS_1 46  // This could be anything from 0 to the highest EEPROM address
  uint8_t dataByte = 0x7F;  // Data for address 1
  eeprom_update_byte((uint8_t*)ADDRESS_1, dataByte1);
#endif // _UPDATE_EEPROM_

আপনি যদি নিম্নলিখিতটি না করেন তবে এই বিট কোডটিও সংকলিত হবে না:

#define _UPDATE_EEPROM_

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


দেখে মনে হচ্ছে সঠিক উত্তরটি লিঙ্কযুক্ত পিডিএফের শেষ অনুচ্ছেদে রয়েছে। Ch. 7 Setting Initial Values
জিপ্পি

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

1
স্ট্যাটিক EEPROM ঠিকানা ব্যবহার করা খারাপ অভ্যাস। পরিবর্তে EEMEM বৈশিষ্ট্যটি ব্যবহার করা আরও ভাল এবং সংকলকটি ঠিকানা বিতরণ পরিচালনা করতে দেয়। এছাড়াও, আমি প্রতিটি বিভাগে একটি সিআরসি চেক প্রয়োগ / সম্পাদন করার পরামর্শ দেব। যদি সিআরসি ব্যর্থ হয় তবে সংশ্লিষ্ট বিভাগে অবিচ্ছিন্ন বা দূষিত ডেটা রয়েছে। এইভাবে, আপনি এমনকি ডেটা দুর্নীতির ক্ষেত্রে পূর্ববর্তী কনফিগারেশনটিতে একটি ফ্যালব্যাক প্রক্রিয়া প্রয়োগ করতে পারেন।
Rev1.0

"স্ট্যাটিক EEPROM ঠিকানা ব্যবহার করা খারাপ অভ্যাস" " কেন?
অ্যাঞ্জেল্যাট্রাজ

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