| 
  |||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe  | 
  
寫的第一個實時多任務的程序,請教! | 
  
| 作者:mikezhong 欄目:ARM技術 | 
各位好,這是我學習UCOSII和LPC2132后的寫的第一個程序,憧憬著能夠成功,可是現(xiàn)實確打擊的我體無完膚,沉痛中思索,我到底到哪里出來問題?可是自已總是無法找到原因,請各路好漢伸出你們的雙手,幫我看看! 下面是我的main程序的所有代碼,總共4個任務,分別指行同一個端口的狀態(tài),驅動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函數定義 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函數定義 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函數定義 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; //引腳設為GPIO功能 //IO1DIR =0XFFFFFFFF; //引腳設為輸出模式 IO1SET =0Xff00ffff; //引腳全部設為滅狀態(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); } } //主函數開始 int main() { //這里寫對目標初始化函數 OSInit(); TargetInit (); PINSEL1=0X00000000; //引腳設為GPIO功能 IO1DIR =0XFFFFFFFF; //引腳設為輸出模式 IO1CLR =0Xffffffff; //引腳全部設為滅狀態(tài) OSTaskCreate(Main_Task,(void *)0,&Main_Stack[TaskStkLengh-1],Main_PRIO); OSStart(); //此函數永遠不會返回 return 0; }  | 
  
| 2樓: | >>參與討論 | 
| 作者: mikezhong 于 2005/7/8 7:34:00 發(fā)布:
         真正原因還有待解釋 各位好,我已經找到了解決的方法,但是問題的真正原因還有待解釋。 1)我在0SStart();開了節(jié)拍中斷。----書上有講,不可以在此中斷。 2)將任務堆棧減小為512后,3個任務全部運行。----為什么1024不行??? 謝謝!  | 
  |
| 3樓: | >>參與討論 | 
| 作者: mikezhong 于 2005/7/8 13:28:00 發(fā)布:
         搞ARM的好像不多! 這個壇子,搞ARM的好像不多!  | 
  |
  | 
    
 
  | 
  
| 免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入 | 
Copyright © 1998-2006 udpf.com.cn 浙ICP證030469號  |