|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
這是我學習UCOSII和LPC2132后的寫的第一個程序,請教! |
| 作者:mikezhong 欄目:ARM技術(shù) |
各位好,這是我學習UCOSII和LPC2132后的寫的第一個程序,憧憬著能夠成功,可是現(xiàn)實確打擊的我體無完膚,沉痛中思索,我到底到哪里出來問題?可是自已總是無法找到原因,請各路好漢伸出你們的雙手,幫我看看! 下面是我的main程序的所有代碼,總共4個任務,分別指行同一個端口的狀態(tài),驅(qū)動LED,用LED點亮或滅來判斷各位任務是否跑起來,沒有使用任何的消息,和事件,當我在Main_Task中,創(chuàng)建一個任務Task1_Task時,程序可以跑起來,但是在Main_Task中再創(chuàng)建一個任務Task2_Task時,PCB 上LED沒有任何反應。由此可知UCOS根本沒有運行任務,包括MAIN——TASK,請問各位,為何會出現(xiàn)這種情況。 #include "config.h" #include "stdlib.h" #define TaskStkLengh 1024 //Define the Task0 stack length 定義用戶任務0的堆棧長度 OS_STK Main_Stack[TaskStkLengh]; //主任務堆棧 #define Main_PRIO 10 //任務1 OS_STK Task1_Stack[TaskStkLengh]; //任務1堆棧 #define Task1_PRIO 12 //任務1優(yōu)先級 //任務2 OS_STK Task2_Stack[TaskStkLengh]; //任務2堆棧 #define Task2_PRIO 14 //任務2優(yōu)先級 //任務3 OS_STK Task3_Stack[TaskStkLengh]; //任務3堆棧 #define Task3_PRIO 16 //任務3優(yōu)先級 #define LED1 (1 << 18) // P1.18控制LED1 #define LED2 (1 << 19) // P1.18控制LED2 #define LED3 (1 << 20) // P1.18控制LED3 //任務1函數(shù)定義 void Task1_Task(void *pdata) { uint32 i; pdata=pdata; while (1) { i++; OS_ENTER_CRITICAL(); //寫我自已的代碼 //IO1CLR = LED1; //點亮LED1 IO1CLR = 0XFF00FFFF; OSTimeDly(OS_TICKS_PER_SEC / 2); //IO1SET = LED1; OSTimeDly(OS_TICKS_PER_SEC / 2); OS_EXIT_CRITICAL(); OSTimeDly(1000); //延時掛起 } } //任務2函數(shù)定義 void Task2_Task(void *pdata) { uint32 i; pdata=pdata; while (1) { i++; OS_ENTER_CRITICAL(); //寫我自已的代碼 //IO1CLR = LED2; //點亮LED2 IO1SET = 0XFF00FFFF; OSTimeDly(OS_TICKS_PER_SEC / 2); //IO1SET = LED2; //OSTimeDly(OS_TICKS_PER_SEC / 2); OS_EXIT_CRITICAL(); OSTimeDly(2000); //延時掛起 } } //任務3函數(shù)定義 void Task3_Task(void *pdata) { uint32 i; pdata=pdata; while (1) { i++; OS_ENTER_CRITICAL(); IO1CLR = LED3; //點亮LED3 OSTimeDly(OS_TICKS_PER_SEC / 2); IO1SET = LED3; OSTimeDly(OS_TICKS_PER_SEC / 2); OS_EXIT_CRITICAL(); OSTimeDly(3000); //延時掛起 } } //主任務的定義 void Main_Task(void *pdata) { pdata=pdata; //TargetInit (); //PINSEL1=0X00000000; //引腳設(shè)為GPIO功能 //IO1DIR =0XFFFFFFFF; //引腳設(shè)為輸出模式 IO1SET =0Xff00ffff; //引腳全部設(shè)為滅狀態(tài) OSTimeDly(OS_TICKS_PER_SEC/2); OSTaskCreate(Task1_Task,(void *)0,&Task1_Stack[TaskStkLengh-1],Task1_PRIO); //OSTaskCreate(Task2_Task,(void *)0,&Task2_Stack[TaskStkLengh-1],Task2_PRIO);//當創(chuàng)建此任務時,發(fā)現(xiàn)電路根本沒反應,去掉Task2_task后,又Task1_Task又能運行。為何???? //OSTaskCreate(Task3_Task,(void *)0,&Task3_Stack[TaskStkLengh-1],Task3_PRIO); while(1) { OSTimeDly(1000); } } //主函數(shù)開始 int main() { //這里寫對目標初始化函數(shù) OSInit(); TargetInit (); PINSEL1=0X00000000; //引腳設(shè)為GPIO功能 IO1DIR =0XFFFFFFFF; //引腳設(shè)為輸出模式 IO1CLR =0Xffffffff; //引腳全部設(shè)為滅狀態(tài) OSTaskCreate(Main_Task,(void *)0,&Main_Stack[TaskStkLengh-1],Main_PRIO); OSStart(); //此函數(shù)永遠不會返回 return 0; } |
| 2樓: | >>參與討論 |
| 作者: mikezhong 于 2005/7/7 17:34:00 發(fā)布:
懇請大俠指點。 懇請大俠指點。 |
|
| 3樓: | >>參與討論 |
| 作者: mikezhong 于 2005/7/8 7:33:00 發(fā)布:
我已經(jīng)找到了解決的方法 各位好,我已經(jīng)找到了解決的方法,但是問題的真正原因還有待解釋。 1)我在0SStart();開了節(jié)拍中斷。----書上有講,不可以在此中斷。 2)將任務堆棧減小為512后,3個任務全部運行。----為什么1024不行??? 謝謝! |
|
| 4樓: | >>參與討論 |
| 作者: 深思 于 2005/7/8 9:31:00 發(fā)布:
1024時的RAM可能不夠,節(jié)拍定時器最好是第一個任務里面初始化 |
|
| 5樓: | >>參與討論 |
| 作者: gyf2000 于 2005/7/8 11:31:00 發(fā)布:
請問樓主 你所說的在OSStart()前開了節(jié)拍中斷,是不是就是在OSStart()之前調(diào)用了TargetInit ();函數(shù),將此函數(shù)放到void Main_Task(void *pdata)中調(diào)用,就解決了你出現(xiàn)的問題。還有一個疑問請教:TargetInit ()函數(shù)中的srand((uint32) TargetInit);為什么要用來產(chǎn)生隨機數(shù),有何作用?謝謝! |
|
| 6樓: | >>參與討論 |
| 作者: mikezhong 于 2005/7/8 13:25:00 發(fā)布:
我還得看看書 TO:gyf2000 呵呵,你問我這樣的問題,我還得看看書,本人初學者也。 |
|
| 7樓: | >>參與討論 |
| 作者: goodguy 于 2005/7/20 7:58:00 發(fā)布:
re: arm7 core 的堆棧是滿遞減的,可能是你任務堆棧的起始地址設(shè)的太低,跟變量去有重疊,所以跑不起來! |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |