ucos-ii²Ù×÷ϵͳϰÌâ
Ò»£® Ìî¿ÕÌâ
1£® uC/OS-IIÊÇÒ»¸ö¼ò½à¡¢Ò×ÓÃµÄ »ùÓÚÓÅÏȼ¶µÄǶÈëʽ¡¾ ÇÀռʽ ¡¿¶àÈÎÎñ
ʵʱÄںˡ£
2£® ÈÎÎñÊÇÒ»¸öÎÞ·µ»ØµÄÎÞÇîÑ»·¡£uc/os-ii×ÜÊÇÔËÐнøÈë¾ÍÐ÷״̬µÄ¡¾ ×î¸ß
ÓÅÏȼ¶ ¡¿µÄÈÎÎñ ¡£
3£® ÒòΪuc/os-ii×ÜÊÇÔËÐнøÈë¾ÍÐ÷״̬µÄ×î¸ßÓÅÏȼ¶µÄÈÎÎñ¡£ËùÒÔ£¬È·¶¨Äĸö
ÈÎÎñÓÅÏȼ¶×î¸ß£¬ÏÂÃæ¸ÃÄĸöÈÎÎñÔËÐУ¬Õâ¸ö¹¤×÷¾ÍÊÇÓÉ¡¾µ÷¶ÈÆ÷£¨scheduler£©¡¿À´Íê³ÉµÄ¡£
4£® ¡¾ ÈÎÎñ¼¶ ¡¿µÄµ÷¶ÈÊÇÓɺ¯ÊýOSSched()Íê³ÉµÄ£¬¶ø¡¾ Öжϼ¶ ¡¿µÄµ÷¶ÈÊÇ
Óɺ¯ÊýOSIntExt() Íê³É¡£¶ÔÓÚOSSched()£¬ËüÄÚ²¿µ÷ÓõÄÊÇ¡¾ OS_TASK_SW()¡¿ Íê³Éʵ¼ÊµÄµ÷¶È£»OSIntExt()ÄÚ²¿µ÷ÓõÄÊÇ¡¾ OSCtxSw() ¡¿ÊµÏÖµ÷¶È¡£
5£® ÈÎÎñÇл»ÆäʵºÜ¼òµ¥£¬ÓÉÈçÏÂ2²½Íê³É£º
£¨1£©½«±»¹ÒÆðÈÎÎñµÄ´¦ÀíÆ÷¼Ä´æÆ÷ÍÆÈë×Ô¼ºµÄ¡¾ ÈÎÎñ¶ÑÕ» ¡¿¡£
£¨2£©È»ºó½«½øÈë¾ÍÐ÷״̬µÄ×î¸ßÓÅÏȼ¶µÄÈÎÎñµÄ¼Ä´æÆ÷Öµ´Ó¶ÑÕ»Öлָ´µ½¡¾¼Ä´æÆ÷ ¡¿ÖС£
6£® ÈÎÎñµÄ5ÖÖ״̬¡£
¡¾Ë¯Ãß̬(task dormat) ¡¿£ºÈÎÎñפÁôÓÚ³ÌÐò¿Õ¼ä£¨rom»òram£©ÖУ¬ÔÝʱû½»¸øucos-ii´¦Àí¡£
¡¾¾ÍÐ÷̬£¨task ready£©¡¿£ºÈÎÎñÒ»µ©½¨Á¢£¬Õâ¸öÈÎÎñ¾Í½øÈëÁ˾ÍÐ÷̬¡£
¡¾ÔËÐÐ̬£¨task running£©¡¿£ºµ÷ÓÃOSStart£¨£©¿ÉÒÔÆô¶¯¶àÈÎÎñ¡£OSStart£¨£©º¯ÊýÖ»Äܵ÷ÓÃÒ»´Î£¬Ò»µ©µ÷Óã¬ÏµÍ³½«ÔËÐнøÈë¾ÍÐ÷̬²¢ÇÒÓÅÏȼ¶×î¸ßµÄÈÎÎñ¡£
¡¾µÈ´ý״̬£¨task waiting£©¡¿£ºÕýÔÚÔËÐеÄÈÎÎñ£¬Í¨¹ýÑÓ³Ùº¯Êý»òpend£¨¹ÒÆð£©Ïà¹Øº¯Êýºó£¬½«½øÈëµÈ´ý״̬¡£
1
¡¾ÖжÏ״̬£¨ISR running£©¡¿£ºÕýÔÚÔËÐеÄÈÎÎñÊÇ¿ÉÒÔ±»Öжϵ쬳ý·Ç¸ÃÈÎÎñ½«ÖжϹرջòÕßucos-ii½«ÖжϹرա£
7£®¡¾ ²»¿É°þ¶áÐÍ ¡¿ÄÚºËÒªÇóÿ¸öÈÎÎñ×ÔÎÒ·ÅÆúCPUµÄËùÓÐȨ¡£²»¿É°þ¶áÐ͵÷¶È·¨Ò²³Æ×÷ºÏ×÷ÐͶàÈÎÎñ£¬¸÷¸öÈÎÎñ±Ë´ËºÏ×÷¹²ÏíÒ»¸öCPU¡£
8£®µ±ÏµÍ³ÏìӦʱ¼äºÜÖØÒªÊ±£¬ÒªÊ¹Óá¾ ¿É°þ¶áÐÍ ¡¿Äںˡ£×î¸ßÓÅÏȼ¶µÄÈÎÎñÒ»µ©¾ÍÐ÷£¬×ÜÄܵõ½CPUµÄ¿ØÖÆÈ¨¡£
9£®Ê¹Óÿɰþ¶áÐÍÄÚºËʱ£¬Ó¦ÓóÌÐò²»Ó¦Ö±½ÓʹÓò»¿ÉÖØÈëÐͺ¯Êý¡£µ÷Óò»¿ÉÖØÈëÐͺ¯Êýʱ£¬ÒªÂú×㻥³âÌõ¼þ£¬ÕâÒ»µã¿ÉÒÔÓá¾ »¥³âÐÍÐźÅÁ¿ ¡¿À´ÊµÏÖ¡£
10£®¡¾ ¿ÉÖØÈëÐÍ ¡¿º¯Êý¿ÉÒÔ±»Ò»¸öÒÔÉϵÄÈÎÎñµ÷Ó㬶ø²»±Øµ£ÐÄÊý¾ÝµÄÆÆ»µ¡£
11£®¿ÉÖØÈëÐͺ¯ÊýÈκÎʱºò¶¼¿ÉÒÔ±»Öжϣ¬Ò»¶Îʱ¼äÒÔºóÓÖ¿ÉÒÔÔËÐУ¬¶øÏàÓ¦Êý¾Ý²»»á¶ªÊ§¡£¿ÉÖØÈëÐͺ¯Êý»òÕßֻʹÓá¾ ¾Ö²¿±äÁ¿ ¡¿£¬¼´±äÁ¿±£´æÔÚCPU¼Ä´æÆ÷Öлò¶ÑÕ»ÖС£Èç¹ûʹÓÃÈ«¾Ö±äÁ¿£¬ÔòÒª¶ÔÈ«¾Ö±äÁ¿ÓèÒÔ¡¾ ±£»¤ ¡¿¡£
12£®Ã¿¸öÈÎÎñ¶¼ÓÐÆäÓÅÏȼ¶¡£ÈÎÎñÔ½ÖØÒª£¬¸³ÓèµÄÓÅÏȼ¶Ó¦¡¾ Ô½¸ß ¡¿¡£
13£®¦ÌC/OS-¢ò³õʼ»¯ÊÇͨ¹ýµ÷ÓÃϵͳº¯Êý¡¾OSIint()¡¿ÊµÏֵģ¬Íê³É¦ÌC/OS-¢òËùÓеıäÁ¿ºÍÊý¾Ý½á¹¹µÄ³õʼ»¯¡£
14£®¶àÈÎÎñµÄÆô¶¯ÊÇÓû§Í¨¹ýµ÷Óá¾OSStart()¡¿ÊµÏֵġ£È»¶ø£¬Æô¶¯¦ÌC/OS-¢ò֮ǰ£¬Óû§ÖÁÉÙÒª½¨Á¢Ò»¸öÓ¦Óá¾ÈÎÎñ¡¿¡£
15. ¦ÌC/OS-¢òµÄ²ÎÊýÅäÖÃÎļþÃûΪ¡¾OS_CFG.H¡¿¡£
16£® ɾ³ýÈÎÎñ,ÊÇ˵ÈÎÎñ½«·µ»Ø²¢´¦ÓÚ¡¾ÐÝÃß״̬¡¿£¬²¢²»ÊÇ˵ÈÎÎñµÄ´úÂ뱻ɾ³ýÁË£¬Ö»ÊÇÈÎÎñµÄ´úÂë²»ÔÙ±»¦ÌC/OS-¢òµ÷Óá£
17£®¦ÌC/OS-¢òÒªÇóÓû§Ìṩ¡¾¶¨Ê±Öжϡ¿À´ÊµÏÖÑÓʱÓ볬ʱ¿ØÖƵȹ¦ÄÜ¡£
18£®¶¨Ê±ÖжÏÒ²½Ð×ö¡¾Ê±ÖÓ½ÚÅÄ¡¿£¬ËüÓ¦¸ÃÿÃë·¢Éú10ÖÁ100´Î¡£
19. ʱÖÓ½ÚÅĵÄʵ¼ÊƵÂÊÊÇÓÉÓû§µÄÓ¦ÓóÌÐò¾ö¶¨µÄ¡£Ê±ÖÓ½ÚÅĵįµÂÊÔ½¸ß£¬ÏµÍ³µÄ¸ººÉ¾Í¡¾Ô½ÖØ¡¿¡£
20£®¦ÌC/OS-IIÖеÄÐźÅÁ¿ÓÉÁ½²¿·Ö×é³É£ºÒ»¸öÊÇÐźÅÁ¿µÄ¡¾¼ÆÊýÖµ¡¿£¬ËüÊÇÒ»¸ö16λµÄÎÞ·ûºÅÕûÊý£¨0 µ½65,535Ö®¼ä£©£»ÁíÒ»¸öÊÇÓɵȴý¸ÃÐźÅÁ¿µÄÈÎÎñ×é³ÉµÄ¡¾µÈ´ýÈÎÎñ±í¡¿¡£Óû§ÒªÔÚOS_CFG.HÖн«OS_SEM_EN¿ª¹ØÁ¿³£ÊýÖóɡ¾ 1 ¡¿£¬ÕâÑù¦ÌC/OS-II²ÅÄÜÖ§³ÖÐźÅÁ¿¡£
21. ¦ÌC/OS-IIÖбíʾµ±Ç°ÒѾ´´½¨µÄÈÎÎñÊýÈ«¾Ö±äÁ¿ÃûΪ£º¡¾ OSTaskCtr ¡¿¡£
2
21. ¦ÌC/OS-IIÖбíʾµ±Ç°ÄÚºËÔËÐеıê¼ÇÈ«¾Ö±äÁ¿ÃûΪ£º¡¾ OSRunning ¡¿¡£ 22£®ÔÚʹÓÃOSTaskCreate´´½¨ÈÎÎñʱ£¬ÈôÐèÒªTaskData×÷α²ÎÊý´«µÝ¸øÈÎÎñTask,²¢´ÓÈÎÎñTaskÖлñµÃ´«ÈëµÄ×Ö·û²ÎÊýÖµ£¬ÇëÔÚÏÂÃæ¡¾ ¡¿ÌîÉϺÏÊʵĴúÂë¡£ char TaskData=?A?; OSTaskCreate(Task, ¡¾(void *)& TaskData ¡¿, &TaskStk[0][TASK_STK_SIZE - 1], 1);
void Task (void *pdata) {
char value = ¡¾ *(char *)pdata ¡¿; for (;;) {
OSSemPend(RandomSem, 0, &err); y = (int) (*(char *)pdata - 'A');
OSSemPost(RandomSem); PC_DispChar(10, 25, value, DISP_FGND_WHITE + DISP_BGND_BLUE);
OSTimeDly(1); } }
23. ÔÚ¦ÌC/OS-IIÔÚÈÎÎñTask1ÖÐʹÓÃÓÊÏ亯ÊýOSMboxPost£¨£©·¢ËÍ×Ö·û£»¶øÔÚTask2ÖнÓÊÕOSMboxPost£¨£©×Ö·û, ÇëÔÚÏÂÃæ¡¾ ¡¿ÌîÉϺÏÊʵĴúÂë¡£
void Task1 (void *data) {
char txmsg;
INT8U err; ¡
txmsg = 'A'; for (;;) {
OSMboxPost(TxMbox, ¡¾ (void *)&txmsg¡¿); /* Send message to Task2*/
OSMboxPend(AckMbox, 0, &err);
txmsg++; if (txmsg == 'Z') {
txmsg = 'A'; } } }
void Task5 (void *data) {
3
char *rxmsg; INT8U err; data = data; for (;;) {
rxmsg = ¡¾(char *)¡¿OSMboxPend(TxMbox, 0, &err); PC_DispChar(70, 18, *rxmsg, DISP_FGND_YELLOW + DISP_BGND_BLUE);
OSMboxPost(AckMbox, (void *)1); } }
24. ÔÚTask1ÖÐʹÓÃÏûÏ¢¶ÓÁÐOSQPend£¨£©º¯Êý½ÓÊÕÏûÏ¢¡°Hello World!¡±£¬¶øÔÚTask2ÖÐʹÓÃÏûÏ¢¶ÓÁÐOSQPost£¨£©º¯Êý·¢ËÍÏûÏ¢¡°Hello World!¡±, ÇëÔÚÏÂÃæ¡¾ ¡¿ÌîÉϺÏÊʵĴúÂë. void Task1 (void *pdata) {
char *msg; INT8U err; pdata = pdata; for (;;) {
msg = ¡¾(char *)¡¿OSQPend(MsgQueue, 0, &err); PC_DispStr(70, 13, msg, DISP_FGND_YELLOW + DISP_BGND_BLUE);
OSTimeDlyHMSM(0, 0, 0, 100); } }
void Task2 (void *pdata) {
char msg[20]; pdata = pdata;
strcpy(&msg[0], \ for (;;) {
OSQPost(MsgQueue, ¡¾(void *)¡¿&msg[0]); OSTimeDlyHMSM(0, 0, 0, 500); } }
25. ¦ÌC/OS-II²Ù×÷ϵͳʹÓÃOSSchedLock()º¯ÊýºÍOSSchedUnlock()º¯Êý½øÐÐËø¶¨£¨²»ÔÊÐíÈÎÎñ¼¶µ÷¶È£©ºÍ½âËø£¨ÖØÐÂÔÊÐíÈÎÎñ¼¶µ÷¶È£©µ÷¶ÈÆ÷£¬ÔÚÓû§Ó¦ÓóÌÐòÖЪ¨OSSchedLock()ºÍOSSchedUnlock()ÊÇ ¡¾³É¶Ô³öÏֵġ¿£¬·ñÔòϵͳÓпÉÄܳö´í¡£
26.OSTaskSuspend(self)¿É°ÑÕýÔÚÔËÐеÄÈÎÎñ¡¾£¨____¹ÒÆð____£©¡¿£¬²ÎÊýselfÖ¸¡¾£¨__ÈÎÎñ±¾Éí____£©¡¿¡£Óô˺¯Êý¹ÒÆðµÄÈÎÎñ¿Éͨ¹ý¡¾£¨ OSTaskResume £©¡¿º¯Êý»½ÐÑ¡£
4