PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : [سوال] چطور میشه قسمتی از برنامه میکرو رو بصورت اسمبلی نوشت ؟



ppittl
25-07-2014, 20:38
سلام
می خواستم ببینم چطوری میشه توی کیل برای میکرو cortexm3 مثل stm32f103
وقتی داریم برنامه می نویسیم ، یه بخشی رو اسمبلی بنویسیم ، یا یه تابع رو بصورت اسمبلی بنویسیم
توی نت و هلپ کیل یه چیزایی دیدم ولی افاغه نکرد
( موضوعش اینه که من یه برنامه رو با AVR با فرکانس 14.7MHZ و بصورت اسمبلی نوشتم ، همون برنامه با STM32F103RET6 با فرکانس 72MHZ و کلاک I\O 50MHZ سرعتش اگر کمتر نباشه بیشتر هم نیست ، برنامه هم ساده هست ، یه پورت رو مثلا 10 هزار بار TOGGLE کنه ، اینو گفتم که بدونین مشکل اجرای یه حلقه FOR برای تعداد دفعات بالا با یه کد ساده هست.
اگر کسی تجربه ای داره ممنون میشم مطرح کنه:0013:
بعنوان مثال یه تابع باشه که یه عدد رو بگیره و یکی بهش اضافه کنه و برگردونه
اگر هم مثال گذاشتین که دمتون گرم:018:

sadmonew
25-07-2014, 23:54
سلام مهندس
میتونی با این صورت عمل کنی:

__asm function(void)
{

دستورات اسمبلی

}

void main(void)
{
function(); فراخوانی
}

ppittl
26-07-2014, 02:11
همینکار رو کردم،حتی تو فایل جداگانه با پسوند s هم انجام دادم
ایراد مربوط به سینتاکس می گیره
میگه area رو مشخص نکردی و ....
اگر یه مثال عملی پیدا میشد،خیلی خوب بود.

Doloop
26-07-2014, 02:52
سلام

صادق جان توی اینی که شما گفتید از endasm استفاده نکرده ..!!!

یادمه قبلا از اسمبلی که توی برنامه استفاده میکردیم باید برای دستورات اسمبلی شروع و پایان تعریف می کردیم

شبیه این :



void my_func (void)
{

#pragma asm
NOP
#pragma endasm

}

ppittl
26-07-2014, 04:44
خوب به یه نتایجی رسیدم
بایستی اینطوری عمل کنی ، اما نتونستم متغییر برگشتی رو دریافت کنم
این قسمت اسمبلیش هست که بایستی اینطوری نوشت و متغییرها هر دو بهش پاس میشن بصورت صحیح

AREA |.text|, CODE, READONLY
PRESERVE8
THUMB
PAV PROC
EXPORT PAV [WEAK]
ADD R3,R1,R2
MOV PC,LR
ALIGN
ENDP


و تعریف درون تابع MAIN هم باینصورت


extern int PAV(int xZ,int yZ);

sadmonew
26-07-2014, 10:28
سلام دوستان
من دقيقا" از همون روشي كه بالا خدمت دوستان عرض شد، دارم تو برنامه هام استفاده ميكنم! بدون هيچ مشكلي!


AREA |.text|, CODE, READONLY
PRESERVE8
THUMB
PAV PROC
EXPORT PAV [WEAK]
ADD R3,R1,R2
MOV PC,LR
ALIGN
ENDP



مهندس اين دستوراتي كه شما نوشتيد زماني استفاده ميشه كه بخواي يه فايل با پسوند s داشته باشي، اما موردي كه بنده نوشتم موقعي كه ميخواين دستورات C هم تو برنامتون استفاده كنيد .
نيازي نداريم كه از endasm استفاده كنيم

ppittl
26-07-2014, 12:38
در صورت امکان ، هر وقت که تونستید
میشه یه مثال مختصر بزارید
که یه متغییر بهش پاس کنی و یکی هم از اون تابع اسمبلی دریافت کنیم ، تو خود برنامه ،
بعد تو خود برنامه وقتی اسمبلی می نویسیم ، دستورات رو میشناسه ؟ یعنی مثل زمانی که تو فایل s می نویسیم که تغییر رنگ پیدا می کنن؟
وقتی تو فایل main می نویسم که ایراد می گیره ، نمی دونم چه کاری رو باید انجام بدم

ppittl
26-07-2014, 16:07
با تشکر از آقای صادق و DOLOOP
خوب مشکل متغییر برگشتی هم حل شد ، اینجا مطرح می کنم شاید مورد استفاده قرار بگیره
هر متغییری که پاس میشه به تابع اسمبلی به ترتیب در رجیسترهای R0 تا RX قرار میگیره
هر متغیری هم که برگرده به همین ترتیب هست
مشکل برنامه من این بود که حاصل رو توی R3 میریختم

پس درستش این هست


AREA |.text|, CODE, READONLY
PRESERVE8
THUMB
PAV PROC
EXPORT PAV [WEAK]
ADD R0,R0,R1
MOV PC,LR
ALIGN
ENDP

ppittl
26-07-2014, 16:59
نمی دونم توی کیل امکانش هست که وسط برنامه c یک دستور اسمبلی بکار برد یا نه
توی بسکام اینطوری بود مثلا
portc=452
!mov r1,10
....
میشه ؟
کلا یکی اگر بازی با اسمبلی و c و کیل رو مطلبی ، اطلاعاتی چیزی داره ، دستش درد نکنه
یه حالی به همه بده ، لطفا