ايران ويج

نسخه‌ی کامل: استفاده از static library در Keil
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام 

در keil دو تا پروژه ایجاد کردم

یکیش خروجیش outputName.lib هست(یعنی static library تولید میکنه)

دومی ، فایل outputName.lib رو استفاده میکنه و از تابع های داخل اون استفاده میکنه

میکرو هم lpc1768

مشکل اینجاست:
موقع دیباگ کردن کد(چه با simulator هه خود keil و چه با jlink) ، بعد ریست کردن، در startup.s گیر میکنه و اجرای برنامه به تابع main نمیرسه

این مشکل زمانی ایجاد میشه که حداقل یدونه فایل lib در پروژه add شده باشه(به عنوان فایل)


چیکار باید کرد؟


فایلی که ضمیمه کردم رو آنزیپ کنید، سعی کنید پروژه ی c_prj رو با simulator خود keil دیباگ کنید، متوجه میشید که اصلا به تابع main نمیرسه، و گیر میکنه
سلام.

من با ورژن 4 کار می کنم ، پروژه ات ورژن 5 هست، نتونستم چک کنم.

ارور و وارنینگ نداری؟
مسیر دهی ها درسته؟
تیک run to main رو زدی؟

بدون اینکه .lib اش کنی کار می کنه؟

با .lib یادم نمی یاد دیباگ کرده باشم، فردا تست می کنم، اما کلا اول با سورس هات کارا رو انجام بده، دیباگ و ... هر چی هست، بعد که اوکی شد می تونی از کتابخونه یه .lib بگیری.
آها ، گفتی توی startUp گیر می کنه.
یه عکس بذار ، شامل چند خط بالاتر و پایین ترش، احتمالا خطای hard fault هست که کم کم باید باهاش رفیق بشی  Biggrin
اگر اینه که کدهات مشکل دارن، باید ببینی خطوط برنامه از چه خطی می ره به hard fault error
سلام.

نقل قول: ارور و وارنینگ نداری؟
مسیر دهی ها درسته؟
تیک run to main رو زدی؟
آره همه اش درسته، اررور ندارم
مسیردهی منظور آدرس فایل lib در هارد؟ آره درسته
run to main رو هم زدم
زبان برنامه نویسی فایل lib سی پلاس هست که چند تا تابع از کلاس اش رو wrap کردم برای استفاده در C


نقل قول: بدون اینکه .lib اش کنی کار می کنه؟
آره
بدون فایل lib همه چیز درسته، به محض اضافه شدن lib همه چیز قاطی میشه

نقل قول: با .lib یادم نمی یاد دیباگ کرده باشم، فردا تست می کنم، اما کلا اول با سورس هات کارا رو انجام بده، دیباگ و ... هر چی هست، بعد که اوکی شد می تونی از کتابخونه یه .lib بگیری.
مشکل اینجاست که وقتی از پروژه دوم که کامپایل میکنم و فایل هگز میگیرم و میکرو رو پروگرم میکنم، میکرو هم هنگ میکنه، وقتی برنامه رو روی میکرو دیباگ میکنم(با جی لینک)، دقیقا همون شرایط شبیه ساز کیل پیش میاد.



نقل قول: آها ، گفتی توی startUp گیر می کنه.
یه عکس بذار ، شامل چند خط بالاتر و پایین ترش، احتمالا خطای hard fault هست که کم کم باید باهاش رفیق بشی  [تصویر:  biggrin.gif] 
اگر اینه که کدهات مشکل دارن، باید ببینی خطوط برنامه از چه خطی می ره به hard fault error
نه هارد فالت نمیره
در فایل startup_LPC17xx.s قسمت reset handler این کد ها هست:


کد:
; Reset Handler

Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  SystemInit
                IMPORT  __main
                LDR     R0, =SystemInit
                BLX     R0
                LDR     R0, =__main
                BX      R0
                ENDP

تابع systemInit به درستی اجرا میشه، بعد که میاد main__ رو LDR میکنه، به محض اجرای سطر بعدی BX R0 گیر میکنه روی دستور دیسمبلی زیر:

کد:
0x0000137A BEAB      BKPT     0xAB, =SystemInit 


اینم عکس در اون لحظه:
[attachment=13694]
راستی دقیقا همون کلاس ++C رو در visual studio پیاده کردم، یه فایل lib درست کردم، بعد همون فایل رو داخل یه پروژه C استفاده کردم، همه چیز درست کار کرد.

ولی با keil نمیشه اینکارو کرد



پروژه lib در keil باید آدرس های IROM1 و IRAM1 رو خودمون مقدار بدیم؟؟؟
نقل قول: پروژه lib در keil باید آدرس های IROM1 و IRAM1 رو خودمون مقدار بدیم؟؟؟

نه ... ، مثل پروژه عادی تعریفشون کن.


-------------------------------
فایل های پروژه ات رو که مرور می کردم، دیدم main ات توی top.c هست درسته؟
پس چطور می گی قبل از .lib درست کردن پروژه کار می کنه؟

وقتی از توابع ++C استفاده می کنی ، main ات هم باید در ++C باشه. توی ++C می شه از توابع C استفاده کرد، اما برعکسش رو ندیدم!
و قاعدتا نباید بشه ...

کلک زدی تو کار سیستم عامل نویسی؟   :))):
درسته
تابع main در برنامه C هست
برنامه C قراره که به کلاسی که داخل LIB نوشته شده دسترسی داشته باشه

این تاپیک هم برای همین زدم: http://www.iranled.com/forum/thread-30581.html

منتهی روی ویندوز جواب میده این کار
ولی نمیدونم روی میکرو چرا اذیت میکنه
ولی اصولا باید جواب بده، هیچی غیراستاندارد نیست.


هدف اینه:
از یه جورایی به C این امکان رو بدم که از کد های ++C بشه استفاده کرد داخل پروژه
سیستم عامل؟  Biggrin
دم کنکوری زده به سرم، میخوام ++C راه بندازم  Biggrin Biggrin
جالبه ...

اون تاپیک رو ندیده بودم!
struct ها در c بودن، اما هنوز با struct و class ها تو ++C متفاوت هستن. در واقع همین کلاس رو که به C اضافه کردن شد ++C ، بنابراین بنظرم نمی رسید که از C بتونیم دسترسی به ++C داشته باشیم، چون شیء گرایی در C مطرح نیست، یعنی کاربردی هم مد نظرم نبوده ... ، اما برعکسش چرا، مثل کاری که تو EasyMCU و Arduino و ... صورت گرفته!

خوبه با اصطلاح جدید آشنا شدیم، اما متاسفانه فعلا کمبود زمان دارم و نمی تونم راجع بهش بخونم. اما تو لیست گذاشتمش، سپاس ...   :))):

مورد دیگه باید قابلیت های کامپایلر هم در نظر گرفت ، همونطور که می دونی ویژوال ... سبک کامپایلش متفاوت هست.
شاید به ورژن پشتیبانی زبان c و ++C توسط کامپایلر هم مربوط باشه.

مورد دیگه دلیلت برای همچین کاری چیه؟ چرا C? چه الزامی هست؟
بیا سیستم عامل رو تو بستر ++C کار کن ، تا جایی هم که در توانم باشه در خدمتتم ، رو این قضیه می تونی وقت بذاری؟
چون برای EasyMCU مورد نیازه و تو برنامه بوده ...!

البته می دونم کنکور داری و نمی خوام ذهنت بیشتر درگیر بشه، بعد از کنکورت اگر موافق باشی روی جزئیاتش صحبت می کنیم ...
هدف از اینکار اینه:
برنامه های اوپن سورس خیلی خفنی وجود دارن که سورس اشون بر پایه سی پلاس نوشته شدن
هدف این بود که برای اونا، چند تا تابع wrapper بنویسم و به برنامه نویسای C این امکان داده بشه که از اون کلاس ها در زبان هایی که از شی گرایی ساپورت نمیکنن، استفاده کنن


یه نمونه خیلی بارز اش ، زبان اسکریپت squirrel هست
مثل LUA یا myBasic هست ولی خیلی خوبه خوشم میاد

البته LUA بشتر مطرح هست در این زمینه، حتی nodeMCU هارو هم چک کنی، روشون LUA رو پیاده کردن

معرکه نیس؟
اسکریپت رو بنویسی بعد بصورت تکست یا بایت به میکرویی که روشن هست بفرستی(به هر طریقی) و میکرو برنامه رو اجرا کنه؟!



سیستم عامل کار کردم البته اگر منظور RTOS اینا باشه
چیز خاصی نداره ها
البته چک نکردم که روی ++C چطوری میشه...




راستی یه بار هم همین static lib رو با IAR چک میکنم، شاید اونجا کار کرد
تا جایی که تونستم احساس کنم، IAR خیلی حرفه ای تره
نقل قول: هدف از اینکار اینه:
برنامه های اوپن سورس خیلی خفنی وجود دارن که سورس اشون بر پایه سی پلاس نوشته شدن
هدف این بود که برای اونا، چند تا تابع wrapper بنویسم و به برنامه نویسای C این امکان داده بشه که از اون کلاس ها در زبان هایی که از شی گرایی ساپورت نمیکنن، استفاده کنن


یه نمونه خیلی بارز اش ، زبان اسکریپت squirrel هست
مثل LUA یا myBasic هست ولی خیلی خوبه خوشم میاد

البته LUA بشتر مطرح هست در این زمینه، حتی nodeMCU هارو هم چک کنی، روشون LUA رو پیاده کردن

معرکه نیس؟
اسکریپت رو بنویسی بعد بصورت تکست یا بایت به میکرویی که روشن هست بفرستی(به هر طریقی) و میکرو برنامه رو اجرا کنه؟!
جالبه ...!
تا الان فرصتش نبود در مورد nodeMCU ها کنجکاو بشم.
الان صفحه ی squirrel رو خوندم، کدی که گذاشته بود به java خیلی نزدیک بود.
LUA و ... ها هم اطلاعاتی ندارم هنوز.

سر فرصت پروژه اش رو باید دانلود کنم ، هنوز درک درستی ازش ندارم، یعنی میکرو روشن هست، ما بیایم یه تکست به فرم همون اسکریپت ها رو فرضا با USART به MCU انتقال بدیم که از قبل هسته ی Squirrel روش پورت شده ، حالا این اسکریپت هایی رو که می فرستیم گویی هم زمان دارن کامپایل و اجرا می شن درسته؟ یا برداشتم اشتباه بوده؟


نقل قول: سیستم عامل کار کردم البته اگر منظور RTOS اینا باشه
چیز خاصی نداره ها
البته چک نکردم که روی ++C چطوری میشه...
یه سبک خاص مد نظر هست ، مثل سبک تعریف و استفاده thread توی C#
پروژه open source باید باشه که بشه ازش استفاده کرد ، اما احتمال زیاد برای همخون بودن با هسته ، بایستی نوشته بشه.
سیستم عامل بورد MBED رو می تونی یه نگاه بندازی، من چندتا مثال تو sparkfun ازش دیدم.


نقل قول: راستی یه بار هم همین static lib رو با IAR چک میکنم، شاید اونجا کار کرد

تا جایی که تونستم احساس کنم، IAR خیلی حرفه ای تره
حرفه ای تر تا چی مهم تر باشه، keil خیلی روون تره ، اما قدرت اصلی مربوط به کامپایلر می شه که چقدر انعطاف پذیر باشه.
یادم نمی یاد کامپایلر IAR چی بود، اما برای cpp از کامپایلر GCC خیلی تعریف شنیدم.
Co IDE تو ورژن جدیدش خراب کرد، وگرنه می خواستم برم سمتش ...
البته هنوز تو فکر eclipse + GCC هستم ، اما دردسرش زیاده ...
صفحه‌ها: 1 2