|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
μC/OS-II下的任務(wù)初始化? |
| 作者:上善若水 欄目:嵌入式系統(tǒng) |
在μC/OS-II中很多任務(wù)的初始化(包括一些只在這個任務(wù)中用到的變量)必須放到整個程序的開頭,如果放在這個任務(wù)里就會報錯,甚至是為了這個任務(wù)中將要調(diào)用的μC/OS-II的函數(shù)聲明個err也要挪到整個程序的頭上才不報錯! 這個任務(wù)就只能寫成: void Taskx (void *pdata) { 在這里什么都不讓定義。。。。。。。。。。 pdata = pdata; for(;;) { } } 的形式 但是有的任務(wù)卻可以這么處理。請問這到底是為什么? |
| 2樓: | >>參與討論 |
| 作者: 上善若水 于 2006/2/25 20:31:00 發(fā)布:
看00的博客 但其它的任務(wù)里都沒什么,唯獨(dú)這個有問題,這是為什么啊。真是奇怪。我收藏起00的博客地址了。 |
|
| 3樓: | >>參與討論 |
| 作者: computer00 于 2006/2/25 21:09:00 發(fā)布:
編譯的錯誤信息是什么? * - 本貼最后修改時間:2006-2-28 20:15:57 修改者:computer00 |
|
| 4樓: | >>參與討論 |
| 作者: 上善若水 于 2006/2/25 21:46:00 發(fā)布:
謝謝00,編譯的錯誤: 主要是說定義的變量應(yīng)該是個extern之類的,我都定義到程序的頭上就好了,我一看屏幕就惡心了,恕我不能把這些再改回去,下次一定及時貼出錯誤。 |
|
| 5樓: | >>參與討論 |
| 作者: 上善若水 于 2006/2/26 11:45:00 發(fā)布:
出錯的代碼 OS_FLAGS v明明是task2 里的局部變量,但是當(dāng)我在task2里聲明的時候就會報錯,定義在程序頭的時候就正常,程序附于下面,后面的是它編譯時的錯誤: ********************************************************************************************************/ #include "config.h" #include "stdlib.h" #define TASK_STK_SIZE 64 // 定義用戶任務(wù)的堆棧長度 #define L 0x01 //OS_FLAGS v; 在這里定義不會報錯。 OS_STK TaskStartStk[TASK_STK_SIZE]; //(2) OS_STK TaskStk[TASK_STK_SIZE]; //(3) OS_FLAG_GRP *A; uint8 err; void Task1(void *pdata); void Task2(void *pdata); void BeeMoo(void); void BeeNoMoo(void); uint32 GetKey(void); #define KEY1 1 << 16 // P0.16-KEY1 #define BEEP 1 << 7 // P0.7-BEEP /* ********************************************************************************************************* ** 函數(shù)名稱 :main() ** 函數(shù)功能 :uC/OS-II主函數(shù),啟動多任務(wù)環(huán)境。 ********************************************************************************************************* */ int main (void) { uint8 err; OSInit(); A=OSFlagCreate(0x00, &err); OSTaskCreate(Task1, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0); OSTaskCreate(Task2, (void *)0, &TaskStk[TASK_STK_SIZE - 1], 10); OSStart(); return 0; } /* ********************************************************************************************************* ** 任務(wù)1-Task1() ** 鍵盤掃描(具有去抖動功能) ********************************************************************************************************* */ void Task1(void *pdata) { pdata = pdata; /* 避免編譯警告 */ TargetInit(); /* 目標(biāo)板初始化 */ for (;;) { OSTimeDly(OS_TICKS_PER_SEC / 50); /* 延時20毫秒 */ if (GetKey() != KEY1) /* GetKey用于獲取鍵盤當(dāng)前狀態(tài) */ { continue; /* 不是KEY1不理會 */ } OSTimeDly(OS_TICKS_PER_SEC / 50); /* 延時20毫秒,用于去抖 */ if (GetKey() != KEY1) /* 還是KEY1才正確 */ { continue; } err = OSFlagPost(A,L,OS_FLAG_SET, &err); while (GetKey() != 0) /* 等待松開按鍵 */ { OSTimeDly(OS_TICKS_PER_SEC / 50); /* 延時20毫秒 */ } err = OSFlagPost(A,L,OS_FLAG_SET, &err); } } /* ********************************************************************************************************* ** 任務(wù)2-Task2() ** 蜂鳴器鳴叫 ************************************************************************** |
|
| 6樓: | >>參與討論 |
| 作者: computer00 于 2006/2/26 12:19:00 發(fā)布:
OS_FLAGS 是個什么樣的東西? void Task2(void *pdata) { OS_FLAGS v; //把它弄到這里來試試? PINSEL0 = 0; // 設(shè)置管腳連接 IO0DIR = BEEP; // 蜂鳴器控制口輸出 你把 OS_FLAGS 的定義弄上來看看……………… * - 本貼最后修改時間:2006-2-28 20:15:58 修改者:computer00 |
|
| 7樓: | >>參與討論 |
| 作者: 上善若水 于 2006/2/26 13:23:00 發(fā)布:
00好神。 00你說的沒錯,我剛試了試,沒問題了,能不能給我講一下設(shè)在下面和設(shè)在下面的道理。真是糊涂了。 |
|
| 8樓: | >>參與討論 |
| 作者: hotpower 于 2006/2/26 13:27:00 發(fā)布:
哈哈,21IC水王連這個也搞不定???---暈到~~~ |
|
| 9樓: | >>參與討論 |
| 作者: ferry 于 2006/2/26 14:17:00 發(fā)布:
編譯器提示 變量聲明要放在開頭。放在后面編譯器把OS_FLAGS當(dāng)作表達(dá)式了,而這是一個已定義的類型名,沖突。編譯器又說表達(dá)式語句后面應(yīng)加;后面的v也成了一個未定義類型的變量,于是要求加extern int之類的聲明。 |
|
| 10樓: | >>參與討論 |
| 作者: computer00 于 2006/2/26 14:31:00 發(fā)布:
這是C語言的規(guī)定,沒辦法改的。 標(biāo)準(zhǔn)的C只能放在函數(shù)剛進(jìn)去的地方聲明,而對于C++,則可以在中間的地方聲明,但也必須要緊接著大括號‘{’之后。 * - 本貼最后修改時間:2006-2-28 20:16:06 修改者:computer00 |
|
| 11樓: | >>參與討論 |
| 作者: 上善若水 于 2006/2/27 10:54:00 發(fā)布:
Million thanks to 00 對!我真是葷頭了,不在任務(wù)里還能很清醒,一到任務(wù)里居然就分不清聲明和定義的區(qū)別了!要成為“水王”路還好長啊。 |
|
| 12樓: | >>參與討論 |
| 作者: 陳雙君 于 2006/2/28 9:52:00 發(fā)布:
上面說得有道理的。 上面說得有道理的。 樓上的說得不錯,可以這樣認(rèn)為的。 |
|
| 13樓: | >>參與討論 |
| 作者: computer00 于 2006/2/28 11:15:00 發(fā)布:
其實(shí)我也經(jīng)常不分定義和聲明的 像我上面那個帖子,我本意是想說定義的。 標(biāo)準(zhǔn)的C只能放在函數(shù)剛進(jìn)去的地方定義,而對于C++,則可以在中間的地方定義,但也必須要緊接著大括號‘{’之后。 |
|
| 14樓: | >>參與討論 |
| 作者: ferry 于 2006/2/28 14:17:00 發(fā)布:
新標(biāo)準(zhǔn)沒限制了 最新的c語言標(biāo)準(zhǔn)(c99)已經(jīng)沒有必須把聲明放在入口處的限制了,有c編譯器仍然沿用舊的標(biāo)準(zhǔn)。C++遵循了新標(biāo)準(zhǔn)。 |
|
| 15樓: | >>參與討論 |
| 作者: fushaobing 于 2006/3/2 8:44:00 發(fā)布:
關(guān)注:) |
|
| 16樓: | >>參與討論 |
| 作者: cmswc 于 2006/3/3 18:44:00 發(fā)布:
這是C語言的問題! 在C語言中,“是先定義,后使用”! |
|
| 17樓: | >>參與討論 |
| 作者: am780717 于 2006/3/5 16:07:00 發(fā)布:
μC/OS-II下的任務(wù)初始化? 好像跟編譯器也有關(guān)系 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |