در سمپل can برای rl کیل از rtx استفاده کرده که Mailbox هم استفاده کرد. البته کمی پیچیده هست.
در سمپل can برای rl کیل از rtx استفاده کرده که Mailbox هم استفاده کرد. البته کمی پیچیده هست.
سلام دوستان.
من برای کنترلر LPC1788 یه برنامه ساده نوشتم که یه ماژول gps از طریق وقفه UART هر ثانیه یک بار اطلاعات میفرسته و کنترلر در روتین وقفه evt تسک اول رو فعال میکنه. و داخل تسک اول هم تابع خواندن و دیکد کردن دیتای NMEA اجرا می شه. ولی هر کاری می کنم جواب نمیده و تسک ها اجرا نمی شن. اگر وقفه رو غیر فعال کنم تسکها اجرا می شن ولی وقتی وقفه اومد دگ هیچ تسکی اجرا نمی شه. البته بدون RTX وقفه و تابع دریافت رو چک کردم کامل کار میکنه. الان می خوام تسک هارو اضافه کنم جواب نمیده. اینم کدش :کد:OS_TID task_ID1,task_ID2,task_ID3; ///////////////////////////////////////////// void gds3(char serport){ char str[1000]; int i=0,m=0,n=1; while(n==1){ str[i]=UARTGetChar(serport); if(strstr(str,"ANTS")) m=1; if(str[i]==13 & m==1) n=0; if(str[i]!=13 & str[i]!=10) i++; } GUI_Text(8,300,str,Green,Black); } ////////////////////////////////////////////////// __task void task1(void){ os_evt_wait_or(0x0001,0xffff); while(1){ gds3(UART_0); } //////////////////////////////////////////////////// __task void task2(void){ while(1){ } } ///////////////////////////////////////////////////// __task void task3(void){ while(1){ } } ///////////////////////////////////////////////////// __task void task_init(void){ task_ID1=os_tsk_create(task1,1); task_ID2=os_tsk_create(task2,1); task_ID3=os_tsk_create(task3,1); os_tsk_delete_self(); } //////////////////////////////////////////////////// void UART0_Init2(){ UART_CFG_Type UART0_CFG; UART_FIFO_CFG_Type UART0_FIFO_CGF; UART0_CFG.Parity=UART_PARITY_NONE; UART0_CFG.Baud_rate=115200; UART0_CFG.Databits=UART_DATABIT_8; UART0_CFG.Stopbits=UART_STOPBIT_1; UART_FIFOConfigStructInit(&UART0_FIFO_CGF); UART_FIFOConfig(UART_0,&UART0_FIFO_CGF); PINSEL_ConfigPin(0,2,1); PINSEL_ConfigPin(0,3,1); UART_Init(UART_0, &UART0_CFG); UART_TxCmd(UART_0,ENABLE); UART_IntConfig(UART_0,UART_INTCFG_RBR,ENABLE); NVIC_EnableIRQ(UART0_IRQn); NVIC_SetPriority(UART0_IRQn,10); } /////////////////////////////////////////////////////// void UART0_IRQHandler(void){ isr_evt_set(0x0001,task_ID1); } ///////////////////////////////////////////////////// int main(void){ SDRAM_32M_16BIT_Init(); GLCD_Init(); GLCD_Clear(Black); UART0_Init2(); Delay(5000); os_sys_init(task_init); while(1){ } return 0; }
ویرایش توسط mzarkoob : 11-06-2017 در ساعت 22:23
سلام. اقا من وقتی از usart استفاده می کنم، وقتی یک task دارم هیچ مشکلی نیست و داده مورد نظرم را پشت سر هم برایم ارسال می کند به کامپیوتر ام. ولی وقتی یک task دیگر هم اضافه می کنم، usart می اید چند بار این کار را انجام می دهد و دیگر این کار را انجام نمی دهد. استاتید محترم برای رفع این مشکل چی کار کنم؟ یک راهنمایی کوچک هم بفرمایید ممنونتان می شوم.
با تشکر
سلام
خیلی فرصت نکردم برنامتون را ببینم چی به چی هست ولی در استفاده از rtx به نحوه پیاده سازی مفاهیمی که وجود دارد باید خیلی دقت کرد. زیرا مثالهای موجود بیشتر در حد blikly هست و با همین مفهوم نحوه استفاده از توابع انجام شده که بایستی برای کاربرد مورد نظر توسعه داده شود.
من فکر می کنم جداگانه در سمپل هایی مرحله به مرحله این موارد را تست کنید تا به نحوه پیاده سازی آن تسلط پیدا کنید. دانستن نحوه عملکرد توابع rtx به درک مفهوم آن فرق دارد. در فیلم پیشرفته 1788 در قسمت rtx هم سعی شده چنین کاری انجام شود.
این تابع
چطور دیتا را ازسریال میگیرد!؟ اگر با وقفه هست پس فقط در زیرروال وقفه رودیداد را فعال کرده اید؟ پس کجا دیتا میگیره؟کد:UARTGetChar
من دیدم از تابعاستفاده شده . چه تضمینی هست در زمان اجرای این تابع زمان تسک تمام نشده باشد؟ برای همین است که از mutex استفاده می شود....کد:GUI_Text(8,300,str,Green,Black);
ویرایش توسط mzarkoob : 12-06-2017 در ساعت 11:17
سلام .ممنون. لطفا در صورت امکان لینک فیلم را هم قرار دهید با تشکر.
در امضام لینک مجموعه فیلم های آموزشی فروشگاه هست!
ممنون.
سلام. اقا اگر در یک تسک، بین os_mut_wait(mutex,0xffff); و os_mut_release(mutex); یک تاخیر مثلا os_dly_wait(40); اتفاق بافتد، در این زمان تاخیر، سویچ بین تسک ها انجام می شود(در واقع از این تسک می رویم در یک تسک دیگر)؟
یا نه در همان خط منتظر می ماند که تاخیر تمام شود؟ و به تسک دیگری نمی رود. تا به os_mut_release(mutex); برسد و بعد سویچ بین تسک ها انجام می شود؟ من یک مقدار سر این قضیه گیج شدم. اساتید محترم در صورت امکان یک راهنمایی کوچک بفرماید. با تشکر
خوب چرا در عمل تست نمی کنید که چه اتفاقی می افتد!؟
مگر چه کاری می خواهید بکنید که لازم شده این گونه عمل کنید؟
در عمل همه چی خوب کار می کند ولی برای مدتی!!!!!!!!!!!!!!!!!!!!!!!!!! یعنی در واقع بعد از مدتی یهو سیستم عامل هنگ می کند. و دیگر متغیر ها تغییر نمی کنند.
به نظرتان مشکل می تواند از کجا باشد؟ از دوستان کسی به این مشکل بر خورده است ؟ اقا یک کلمه هم کمک بفرمایید ممنونتان می شوم.
کاری که دارم انجام می دهم مربوط به ناوبری کوادروتور است. (پایان نامه ام). و نمی دانم چرا این سیستم عامل یهو ما را ضایع می کند. جان من کمک کنید.
کلا وقتی سیستم منتظر گرفتن یک ماتکس هست اون تسک به حالت wait میره تا زمانی که ماتکس رو بگیره . وقتی تسک ماتکس رو گرفت اون تسک به حالت "اجرا" در میاد.
حالا که تسک به حالت اجرا در اومده سوییچ تسک اتفاق میافته ولی بقیه تسک ها یی که منتظر دریافت ماتکس هستند در حالت wait میمونند.
اگر شما از Delay سیستم عامل استفاده کنید باز این تسک در حالت wait قرار میگیره و بقیه تسک هایی که در حالت Wait برای ماتکس نیستند اجرا میشوند.
شما باید ببینید وقتی سیستم هنگ میکنه منظور چی هست!!!
اگر hard fault باشه دسترسی به حافظه غیر مجاز رخ داده ( مثلا اشاره گری که وجود نداره ) یا شاید هم Stack overflow رخ داده که باز هم اون رو میشه فهمید
و اخرین احتمال هم عدو تنظیم درست اینتراپت ها میتونه باشه.
با تشکر از پاسخ شما اقای (خانم) mrm.
مشکل در این بود که من os_itv_set() استفاده کرده بودم برای خواندن خروجی کالمن فیلتر ام برای زاویه های رول و پیچ و یاو. امدم انها را حذف کردم و با معادل ان os_dly_wait این کار را انجام دادم. و مشکل من حل شد. دیگر هنگ نمی کند. در واقع منظور از هنگ این بود که در یک تسک مثلا تسک مربوط به زاویه رول کالمن فیلتر، ناگهان بعد از مثلا یک دقیقه دیگر زوایه رول تغییر نمی کرد و سیستم در اخرین زاویه ای که خوانده بود گیر می کرد. که با ان تغییری که دادم مشکل حل شده است.
از ماتکس برای usart استفاده می کنم. (اقای مهدی زرکوب پیشنهاد دادند. دستشان درد نکند.)
اقا (خانم) mrm بابت اطلاعاتی که قرار دادید مممنونتان هستم. واقعا این ها را نمی دانستم. باز هم ممنون.
یک سوال میزان stack یک تسک را از کجا می شود خیلی راحت محاسبه کرد؟ خود کیل گزینه ای ندارد که قطعه کدی را که نوشته ایم میزان stack ان را نشان دهد؟
خوب به سلامتی
برای همینه که گفتم :مگر چه کاری می خواهید بکنید که لازم شده این گونه عمل کنید. یعنی چه عملیات مخاسباتی در تسک می خواهید انجام دهید نه برای انجام مربوط به ناوبری کوادروتور
ببینید کیل در فایل های خروجی که بهتون میده یه فایل به نام پروژه با پسوند html بهتون میده که تمام توابع رو به صورت جدا مقادیر استک رو داخلشون نوشته.
یان فکر کنم راحت ترین راه باشه.
واقعا ممنونتان هستم. خیلی عالی بود. دستتان درد نکند. ممنون.
روشتان خیلی باحال بود. انشا الله بتوان جبران کنم. فقط برای من فایلش پسوندش htm بود.
- - - Updated - - -
با تشکر از اقا (خانم) mrm
جبران آن وقت است پیشرفت که کردید و دیدید در فروم سوالی پرسیده شد که می توانید پاسخ دهید، نگویید من چرا باید جواب سوال دیگران را بدهم؟ بروند وقت بذارند پیدا کنند! ولی وقتی خودم سوال می کنم میگویم چرا کسی نمیاد جواب من را بدهد !؟
ویرایش توسط mzarkoob : 24-06-2017 در ساعت 01:10
سلام به دوستان عزیز. یه برنامه برای راه اندازی adc میکرو در cmsis rtos keil نوشتم که از وقفه استفاده میشه . ولی گویا برای استفاده از وقفه در سیستم عامل باید تنظیماتی انجام بشه کسی میتونه راهنمایی کنه.
در trx توابعی جدا در زیرروال وقفه استفاده می شود که اول آن isr است مثلا : isr_evt_set
میشه یکی راهنمایی کنه که وقفه ها رو چطور با سیستم عامل مچ کنیم.
مثلا وقتی برنامه بر مبنای سیستم عامل rtx میره به وقفه rtc مشکل پیش میاد.اساس و الگوریتم استفاده از وقفه ها تو سیستم عامل چه جوریه؟(با فرض اینکه تو پروژه م اصلا از delay ها استفاده نکردم.)
ویرایش توسط omid_2132 : 05-03-2018 در ساعت 14:55
اگر سمپلی باشد که انجام شده باشد این موضوع روشن تر می شود.
بالاخره وقفه هم در میکرو وجود دارد و نمی شود که نباشد. ولی در وقفه فقط می توان یک رویداد را فعال کرد که تسک دیگری منتظر این رویداد باشد.
در سمپل can برای rl کیل تحت rtx از Mailbox استفاده کرده است.