সমস্যাটি
একটি নিম্ন স্তরের বেয়ার মেটাল এমবেডেড প্রসঙ্গ, আমি একটি সি ++ কাঠামোর মধ্যে এবং কোন নাম ছাড়া মেমরির মধ্যে একটি ফাঁকা স্থান তৈরি করতে, অ্যাক্সেস মেমরি অবস্থানকে ব্যবহারকারী নিষেধ করতে চাই।
এই মুহুর্তে, আমি এটি একটি uint32_t :96;
কুরুচিপূর্ণ বিটফিল্ড স্থাপন করে অর্জন করেছি যা সহজেই তিনটি শব্দের স্থান গ্রহণ করবে, তবে এটি জিসিসির কাছ থেকে একটি সতর্কতা উত্থাপন করবে (বিটফিল্ড uint32_t ফিট করতে খুব বড় হবে না) এটি বেশ বৈধ is
এটি কার্যকরভাবে কাজ করার সময়, আপনি যখন কয়েকশ সতর্কতা দিয়ে একটি লাইব্রেরি বিতরণ করতে চান তখন খুব পরিষ্কার হয় না ...
আমি কীভাবে এটি সঠিকভাবে করব?
প্রথমদিকে কেন একটি সমস্যা আছে?
আমি যে প্রকল্পে কাজ করছি তাতে সম্পূর্ণ মাইক্রোকন্ট্রোলার লাইনের (এসটিএমক্রোইলেকট্রনিক্স এসটিএম 32) বিভিন্ন পেরিফেরিয়ালগুলির মেমরি কাঠামো সংজ্ঞায়িত করে। এটি করার জন্য, ফলাফলটি এমন একটি শ্রেণী যা লক্ষ্যযুক্ত মাইক্রোকন্ট্রোলারের উপর নির্ভর করে সমস্ত রেজিস্ট্রার সংজ্ঞায়িত করে এমন বেশ কয়েকটি কাঠামোর একটি ইউনিয়ন ধারণ করে।
বেশ সহজ পেরিফেরিয়ালগুলির জন্য একটি সাধারণ উদাহরণ নিম্নরূপ: একটি সাধারণ উদ্দেশ্য ইনপুট / আউটপুট (জিপিআইও)
union
{
struct
{
GPIO_MAP0_MODER;
GPIO_MAP0_OTYPER;
GPIO_MAP0_OSPEEDR;
GPIO_MAP0_PUPDR;
GPIO_MAP0_IDR;
GPIO_MAP0_ODR;
GPIO_MAP0_BSRR;
GPIO_MAP0_LCKR;
GPIO_MAP0_AFR;
GPIO_MAP0_BRR;
GPIO_MAP0_ASCR;
};
struct
{
GPIO_MAP1_CRL;
GPIO_MAP1_CRH;
GPIO_MAP1_IDR;
GPIO_MAP1_ODR;
GPIO_MAP1_BSRR;
GPIO_MAP1_BRR;
GPIO_MAP1_LCKR;
uint32_t :32;
GPIO_MAP1_AFRL;
GPIO_MAP1_AFRH;
uint32_t :64;
};
struct
{
uint32_t :192;
GPIO_MAP2_BSRRL;
GPIO_MAP2_BSRRH;
uint32_t :160;
};
};
যেখানে সমস্তই GPIO_MAPx_YYY
ম্যাক্রো, হিসাবে নির্ধারিত হয় uint32_t :32
বা নিবন্ধের ধরণ (উত্সর্গীকৃত কাঠামো)।
এখানে আপনি uint32_t :192;
যা ভালভাবে কাজ করে তা দেখতে পান তবে এটি একটি সতর্কবার্তা ট্রিগার করে।
আমি এখন পর্যন্ত যা বিবেচনা করেছি:
আমি এটি বেশ কয়েকটি uint32_t :32;
(এখানে 6) দ্বারা প্রতিস্থাপন করতে পারি, তবে আমার কিছু চরম ঘটনা রয়েছে যেখানে আমার uint32_t :1344;
(42) (অন্যদের মধ্যে) রয়েছে। সুতরাং আমি 8k অন্যদের উপরে প্রায় একশ লাইন যুক্ত করব না, যদিও কাঠামো প্রজন্মের স্ক্রিপ্ট করা আছে।
যথাযথ সতর্কতা বার্তাটি হ'ল:
width of 'sool::ll::GPIO::<anonymous union>::<anonymous struct>::<anonymous>' exceeds its type
(আমি কেবল এটি কতটা ছায়াময় তা পছন্দ করি)।
আমি বরং এটি কেবল সতর্কতা অপসারণ করেই সমাধান করব না , তবে ব্যবহার করব
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-WTheRightFlag"
/* My code */
#pragma GCC diagnostic pop
সমাধান হতে পারে ... যদি আমি পাই TheRightFlag
। যাইহোক, এই থ্রেডে উল্লেখ করা হিসাবে , gcc/cp/class.c
এই দু: খিত কোড অংশ সহ:
warning_at (DECL_SOURCE_LOCATION (field), 0,
"width of %qD exceeds its type", field);
যা আমাদের জানিয়েছে যে -Wxxx
এই সতর্কতাটি সরাতে কোনও পতাকা নেই ...
char unused[12];
ইত্যাদি?