সি এর সাথে @ সহ পরিবর্তনশীল ঘোষণা ration


11

আমি কিছু সি কোড পড়ছি এবং প্রোগ্রামে এই ঘোষণাটি এসেছি:

unsigned char serv_ctr @0x0002;

কেউ আমাকে ডকুমেন্টেশনের দিকে নির্দেশ করতে পারে, বা এমপ্ল্যাব এক্সসি 8 ভি 1.35 সি সংকলকটিতে "@ 0x0002" কী তা ব্যাখ্যা করতে পারে ?


14
আমি অনুমান করব যে নির্দিষ্ট স্থানে ভেরিয়েবল স্থাপন করা এটি একটি সংকলক এক্সটেনশন।
ইউজিন শ।

2
প্রশ্নটি তখন # এমপ্ল্যাব ট্যাগকে উপকৃত করতে পারে, যেহেতু দেখা যাচ্ছে এটি এমপ্ল্যাব-নির্দিষ্ট।
sylvainulg

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

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

@ কামিকেজে জিজ্ঞাসা করার জন্য ধন্যবাদ, আমারও অনুরূপ প্রশ্ন ছিল (আমি এই এসই এর নিয়মিত ব্যবহারকারী নই)
জিপিপিকে

উত্তর:


20

এটি ভেরিয়েবলটি রাখার জন্য একটি নিখুঁত ঠিকানা নির্দিষ্ট করতে হবে।
থেকে XC8 কম্পাইলার ম্যানুয়াল পৃষ্ঠা 27, অধ্যায় 2.5.2 পরম অ্যাড্রেসিং :

ভেরিয়েবল এবং ফাংশন __at()কনস্ট্রাক্ট ব্যবহার করে একটি নির্ভুল ঠিকানায় স্থাপন করা যেতে পারে
......
২.২.২.২ বিভাজনসমূহ
8-বিট সংকলকগুলি একটি নিখুঁত ঠিকানা নির্দিষ্ট করতে একটি @ প্রতীক ব্যবহার করেছে


6

@সি ভাষার একটি সাধারণ অ-মানক এক্সটেনশন যা আপনাকে নির্দিষ্ট ঠিকানায় ভেরিয়েবল ঘোষণা করতে দেয় allows এটি মেমরি-ম্যাপযুক্ত হার্ডওয়্যার রেজিস্টার ইত্যাদির জন্য ব্যবহার করা যেতে পারে যার ক্ষেত্রে ভেরিয়েবলটি অবশ্যই ঘোষণা করতে হবে volatile, সুতরাং আপনার উদাহরণটি ভুল।

অন্যান্য সংকলকগুলি এর মতো কিছু ব্যবহার করে __attribute__(section...বা এর সবগুলিই #pragma ...অ-মানক সি use

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

আপনার যদি একটি ভাল ডিবাগার থাকে তবে এতে আপনার নির্দিষ্ট এমসিইউ সম্পর্কে সমর্থন এবং সচেতনতা থাকবে। তারপরে আপনাকে সি কোডে অ-মানক ক্রেপ লাগবে না, তবে আপনি এর পরিবর্তে খাঁটি, বহনযোগ্য মান সি লিখতে পারেন:

#define serv_ctr ( *(volatile uint8_t*)0x0002u )

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

1

একটি সংক্ষিপ্ত সম্প্রসারণ:

এটি xc8 2.0 এবং তার বেশি কাজ করে না। আপনাকে এখন লিখতে হয়েছিল:

unsigned char serv_ctr __at(0x0002);

serv_ctrএকটি সম্পূর্ণ পরিবর্তন ( ) একটি ভেরিয়েবল রাখতে 0x0002

XC8 2.0 এর সাহায্যে @সিন্টেক্স ব্যবহার করে আপনার পুরানো কোডটি সংকলন করা সম্ভব হয় যদি আপনি "C90" ফর্ম্যাটটি ব্যবহারের জন্য সংকলক সেটিংস সেট করেন। সেটিংসটি দেখে মনে হচ্ছে এটি "XC8 গ্লোবাল বিকল্পগুলি" এর অধীনে এবং এটি "সি স্ট্যান্ডার্ড" নামে পরিচিত।


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