PDA

View Full Version : سوال: دوستان کسی میتونه این قطعه کد رو تحلیل کنه؟



iltsaetsi
دوشنبه 12 مهر 1395, 17:37 عصر
سلام دوستان
کسی می تونه این قطعه کد رو تحلیل کنه؟

قسمتی از یک مثال میکروکنترلره.

#pragma DATA_ALIGN(Vcim, 512)
#pragma DATA_SECTION(Vcim, ".intvecs")

void (* const Vcim[])(void) =
{
(void (*) (void))((unsigned long)&__STACK_END),
function_name_1,
function_name_2,
function_name_3,
function_name_4,
function_name_5,
function_name_6
.
.
.
}

T.R.G.T
دوشنبه 12 مهر 1395, 20:31 عصر
من دقیق نمیدونم که تعریفم درست باشه یانه اما اگه اشتباه نکنم
در این کد تراز بندی داده (دقیقا اطمینان ندارم که اسمش این باشه) آرایه Vcim به اندازه 512 تغییر پیدا کرده (یعنی بجای io و پردازش با اندازه استاندارد با اندازه 512 پرذازش میشه که باعث افزایش سرعت میشه).
بعد Vcim در ناحیه .intvecs داخل سگمنت دیتا قرار میگیره.
سپس متغیر Vcim بصورت یک آرایه از اشاره گر های ثابت به تابع تعریف و با اشاره گر هایی به توابع مقدار دهی میشه.

iltsaetsi
سه شنبه 13 مهر 1395, 10:39 صبح
من دقیق نمیدونم که تعریفم درست باشه یانه اما اگه اشتباه نکنم
در این کد تراز بندی داده (دقیقا اطمینان ندارم که اسمش این باشه) آرایه Vcim به اندازه 512 تغییر پیدا کرده (یعنی بجای io و پردازش با اندازه استاندارد با اندازه 512 پرذازش میشه که باعث افزایش سرعت میشه).
بعد Vcim در ناحیه .intvecs داخل سگمنت دیتا قرار میگیره.
سپس متغیر Vcim بصورت یک آرایه از اشاره گر های ثابت به تابع تعریف و با اشاره گر هایی به توابع مقدار دهی میشه.

ممنون از پاسختون.
نحوه ی نوشتن کدها رو می تونید توضیح بدید؟ که مثلا این یعنی چی؟
(void (*) (void))((unsigned long)&__STACK_END)

T.R.G.T
سه شنبه 13 مهر 1395, 16:20 عصر
من سعی میکنم توضیح بدم اما بازدوباره میگم من دقیقا نمیدونم که نظرم درست باشه و اصطلاحاتم درست باشن چون من تحصیلات آکادمیک ندارم.
(void (*) (void))
این کد یک اشاره گر به یک تابع ایجاد میکنه که هیچ آرگومان استانداردی دریافت نمیکنه و هیچ آرگومان استانداردی برنمیگردونه یعنی میتونه آرگومان بصورت غیر استاندارد(غیر از داده های int bool و ...) بگیره و برگردونه به عبارت دیگه تبدیل داده به روش C انجام میده.
((unsigned long)&__STACK_END)
این دستور هم آدرس __STACK_END رو تبدیل به "unsigned long" میکنه و بجای آدرس اشاره گر "(void (*) (void))" قرار مید.