/*<br /> * File: main.c<br /> *<br /> * uC/OS Real-time multitasking kernel for the ARM processor.<br /> *<br /> * This program is an example of using semaphore to<br /> * implement task rendevous.<br /> *<br /> * Created by Marco Graziano (marcog@crl.com).<br /> *<br /> */<br /><br />#include "includes.h" /* uC/OS interface */<br /><br />/* allocate memory for tasks' stacks */<br />#ifdef SEMIHOSTED<br />#define STACKSIZE (SEMIHOSTED_STACK_NEEDS+64)<br />#else<br />#define STACKSIZE 128<br />#endif<br />unsigned int Stack1[STACKSIZE];<br />unsigned int Stack2[STACKSIZE];<br />unsigned int Stack3[STACKSIZE];<br /><br />/* semaphores event control blocks */<br />//OS_EVENT *Sem1;<br />//OS_EVENT *Sem2;<br />//OS_EVENT *Sem3;<br /><br />OS_EVENT *KeyPress;<br />void *KeyMsg[10];<br />/*<br />* Task running at the highest priority. <br />*/<br /><br />void Task1(void *i)<br />{<br /> unsigned char key[5];<br /> unsigned char i1,temp;<br /> unsigned char NewKey,OldKey;<br /> ARMTargetStart();<br /> for (;;)<br /> {<br /> NewKey=rPDATG&0xf0;<br /> if(NewKey!=OldKey)<br /> {<br /> OldKey=NewKey;<br /> if((NewKey&0x10)==0) temp='a';<br /> else if((NewKey&0x20)==0) temp='b';<br /> else if((NewKey&0x40)==0) temp='c';<br /> else if((NewKey&0x80)==0) temp='d';<br /> else temp=0;<br /> if(temp!=0)<br /> {<br /> for(i1=0;i1<5;i1++) if(key[i1]==0) break;<br /> key[i1]=temp;<br /> OSQPost(KeyPress,&(key[i1]));<br /> }<br /> }<br /> OSTimeDly(20); //20ms<br /> }<br />}<br /><br />void Task2(void *i)<br />{<br /> unsigned char key[5];<br /> unsigned char i1;<br /> unsigned char NewKey;<br /> for (;;)<br /> {<br /> NewKey=Uart_GetKey();<br /> if(NewKey!=0)<br /> {<br /> for(i1=0;i1<5;i1++) if(key[i1]==0) break;<br /> key[i1]=NewKey;<br /> OSQPost(KeyPress,&(key[i1])); <br /> }<br /> OSTimeDly(10);<br /> }<br />}<br /><br />void Task3(void *i)<br />{<br /> unsigned char *ip;<br /> INT8U err;<br /> for (;;)<br /> {<br /> ip=OSQPend(KeyPress,0,&err);<br /> if(*ip=='a') Uart_Printf("\nYou Press a!");<br /> else if(*ip=='b') Uart_Printf("\nYou Press b!");<br /> else if(*ip=='c') Uart_Printf("\nYou Press c!");<br /> else if(*ip=='d') Uart_Printf("\nYou Press d!");<br /> *ip=0;<br /> }<br />}<br /><br />/*<br /> * Main function.<br /> */<br />void Main(void)<br />{<br /> char Id1 = '1';<br /> char Id2 = '2';<br /> char Id3 = '3';<br /> Port_Init();<br /> Uart_Init(0,57600);<br /> <br /> Delay(1000);<br /> Uart_Select(0); //Select UART0<br /><br /> Uart_Printf("Uc-OS ii will run at once!");<br /> <br /><br /> /* do target (uHAL based ARM system) initialisation */<br /> ARMTargetInit();<br /><br /> /* needed by uC/OS */<br /> OSInit();<br /><br /> OSTimeSet(0);<br /> /* <br /> * create the semaphores<br /> */<br /> //Sem1 = OSSemCreate(1);<br /> //Sem2 = OSSemCreate(1);<br />//Sem3 = OSSemCreate(1);<br /> /* <br /> * create the tasks in uC/OS and assign decreasing<br /> * priority to them <br /> */<br /> OSTaskCreate(Task1, (void *)&Id1, (void *)&Stack1[STACKSIZE - 1], 1);<br /> OSTaskCreate(Task2, (void *)&Id2, (void *)&Stack2[STACKSIZE - 1], 2);<br /> OSTaskCreate(Task3, (void *)&Id3, (void *)&Stack3[STACKSIZE - 1], 3);<br /> /* Start the (uHAL based ARM system) system running */<br /> //ARMTargetStart();<br /> KeyPress=OSQCreate(KeyMsg,10); //创建一个按键的消息队列<br /><br /> /* start the game */<br /> OSStart();<br /><br /> /* never reached */<br />} /* main */<br /> |
|