PDA

View Full Version : (__IO uint8_t)داستان این نوع تعریق چیه؟



mohsen.hex
چهارشنبه 09 آذر 1390, 21:47 عصر
typedef struct
{
union {
__I uint8_t RBR;
__O uint8_t THR;
__IO uint8_t DLL;
uint32_t RESERVED0;
};
union {
__IO uint8_t DLM;
__IO uint32_t IER;
};
union {
__I uint32_t IIR;
__O uint8_t FCR;
};
__IO uint8_t LCR;
uint8_t RESERVED1[7];
__I uint8_t LSR;
uint8_t RESERVED2[7];
__IO uint8_t SCR;
uint8_t RESERVED3[3];
__IO uint32_t ACR;
__IO uint8_t ICR;
uint8_t RESERVED4[3];
__IO uint8_t FDR;
uint8_t RESERVED5[7];
__IO uint8_t TER;
uint8_t RESERVED6[39];
__I uint8_t FIFOLVL;
} LPC_UART_TypeDef;


خوب حالا سوال ها
قضیه اون io ها چیه؟
اگه i تنها باشه چی؟
این نوع تعریف یعنی چی؟
union یعنی چی؟

jeson_park
پنج شنبه 10 آذر 1390, 17:22 عصر
با سلام
احتمالا کد شما بخشی از این (http://www.keil.com/dd/docs/arm/nxp/lpc17xx/lpc17xx.h) سورس هست
فکر کنم Typedef ّباشن
uint_8 همون unsigned int هست که به صورت typedef تعریف شده
typedef unsigned char uint8_t
و در مورد اون 2 تای دیگه هم باز هم به همین صورت هست
این 2 تا که گفتید در هدر core_cm3.h به این صورت تعریف شدن

#ifdef __cplusplus
#define __I volatile /*!< defines 'read only' permissions */
#else
#define __I volatile const /*!< defines 'read only' permissions */
#endif
#define __O volatile /*!< defines 'write only' permissions */
#define __IO volatile

ببنید volatile یه کلمه کلیدی مربوط به زبان C++‎ هست این کلمه به کامپایلر میگه که متغییر ممکنه توسط چیزی جز خود برنامه (مثل سخت افزار یا برنامه دیگه) تغییر کنه
مثلا یه برنامه دیگه یا یه سخت افزار بخواد این متغییر رو دست کاری کنه
در مورد union ها:
یونون ها یه نوع داده ای هستند که به شما اجازه می دن نوع های داده ای متفاوت رو در یک فضای مشترک نگه داری کند.در یونیون ها شما نمی تونید هم زمان از چند عضو استفاده کنید
به عنوان مثال

union {
__I uint8_t RBR;
__O uint8_t THR;
__IO uint8_t DLL;
uint32_t RESERVED0;
};



در یونیون بالا شما نمیتونید همزمان هم از RBR استفاده کنید و هم از THR

mohsen.hex
پنج شنبه 10 آذر 1390, 18:09 عصر
اره کد همینه!

گفتین(uint_8 همون unsigned int هست که به صورت typedef تعریف شده)

typedef یعنی چی ؟ چه فرقی داره؟
داستان این نوع تعریف اصلا چیه؟

در مورد __i که جالبه تا حالا ندیده بودم توی این هدر پیکر بندی شدن!

چه لزومی داره یونیون ها رو تعریف کنی که در هر لحضه فقط بشه از یکی از اعضاش استفاده کرد؟

jeson_park
پنج شنبه 10 آذر 1390, 18:37 عصر
با سلام
ببنید فلسفه typedef اینه که یه نام جدید به نوع داده ای شما بده
مثلا فرض کنید شما یه تابع می خواید بنویسید که زاویه یه چیزی رو دریافت کنه و به اون اندازه او ن چیز رو بچرخونه
مثلا تابع شما زاویه بازوی یه ربات رو دریافت میکنه و به همون اندازه بازوی ربات رو می چرخونه
حالا به نظر شما کدم یکی از این توابع واضح تر هستند؟؟

typedef float Degree ;
bool Rotate( Degree armAngle)
{
// do somthing
return true;
}
//////////////////////////////////OR///////////////////////////////
bool Rotate( float armAngle)
{
// do somthing
return true;
}

طبیعتا نسخه اول تابع واضح تر هست
هیچ فرقی در اجرا نداره اما شما با فراخوانی تابع می دونید که مقداری که به تابع می دید باید بر حسب درجه باشه


چه لزومی داره یونیون ها رو تعریف کنی که در هر لحضه فقط بشه از یکی از اعضاش استفاده کرد؟
هدر ندادن حافظه و استفاده بهینه از اون
خب با توجه به هدر ها ، شما دارید با یه میکروکنترلر کار می کنید توی میکروکنترلر ها هم معمولا حافظه زیاد نیست و باید به صورت بهینه ازش استفاده شه
به همین خاطر از union استفاده شده

mohsen.hex
پنج شنبه 10 آذر 1390, 18:59 عصر
هدر ندادن یعنی چی ؟
یعنی به حافضه (مثلا 8 بیت ) رو اختصاص میده به کل اون متغیرها؟
اگه این جوره چطور مقدار اون متغیر از بین نمیره؟

jeson_park
پنج شنبه 10 آذر 1390, 19:06 عصر
نه ببنید مثلا سیستم شما 1 گیگ حافظه داره
ممکنه یه میکرو کنترلر خیلی کمتر از این ها مثلا 512 کیلو بایت حافظه داشته باشه
مقدرا یکی از اعضا از بین میره و مقداری که به عضو جدید دادین در حافظه "اختصاص داده شده "قرار میگیره

mohsen.hex
پنج شنبه 10 آذر 1390, 19:10 عصر
پس در نتیجه اطلاعات دیتا های دیگر مربوط به این یونیون در صورت مقدار دهی جدید به هر کدوم از این اعضا از بین میره درسته؟

jeson_park
پنج شنبه 10 آذر 1390, 19:16 عصر
بله
البته دقت کنید برای هر نمونه از این Struct و یونیون این اتفاق می افته