OSTimeDly(2); (1) OS_ENTER_CRITICAL();
OSIdleCtr = 0L; (2) OS_EXIT_CRITICAL();
OSTimeDly(OS_TICKS_PER_SEC); (3) OS_ENTER_CRITICAL();
OSIdleCtrMax = OSIdleCtr; (4) OSStatRdy = TRUE; (5) OS_EXIT_CRITICAL(); }
1.07.03 TaskN£¨£©
OSStatInit()½«·µ»Øµ½TaskStart()¡£ÏÖÔÚ£¬Óû§¿ÉÒÔ½¨Á¢10¸öͬÑùµÄÈÎÎñ£¨ËùÓÐÈÎÎñ¹²Ïíͬһ¶Î´úÂ룩¡£ËùÓÐÈÎÎñ¶¼ÓÉTaskStart()Öн¨Á¢£¬ÓÉÓÚTaskStart()µÄÓÅÏȼ¶Îª0£¨×î¸ß£©£¬ÐÂÈÎÎñ½¨Á¢ºó²»½øÐÐÈÎÎñµ÷¶È¡£µ±ËùÓÐÈÎÎñ¶¼½¨Á¢Íê³Éºó£¬TaskStart()½«½øÈëÎÞÏÞÑ»·Ö®ÖУ¬ÔÚÆÁÄ»ÉÏÏÔʾͳ¼ÆÐÅÏ¢£¬²¢¼ì²âÊÇ·ñÓÐESC¼ü°´Ï£¬Èç¹ûûÓа´¼üÊäÈ룬ÔòÑÓʱһÃ뿪ʼÏÂÒ»´ÎÑ»·£»Èç¹ûÔÚÕâÆÚ¼äÓû§°´ÏÂÁËESC¼ü£¬TaskStart()½«µ÷ÓÃPC_DOSReturn()·µ»ØDOSϵͳ¡£
³ÌÐòÇåµ¥L1.10¸ø³öÁËÈÎÎñµÄ´úÂë¡£ÈÎÎñÒ»¿ªÊ¼£¬µ÷ÓÃOSSemPend()»ñÈ¡ÐźÅÁ¿RandomSem [³ÌÐòÇåµ¥L1.10(1)]£¨Ò²¾ÍÊǽûÖ¹ÆäËûÈÎÎñÔËÐÐÕâ¶Î´úÂ롪ÒëÕß×¢£©£¬È»ºóµ÷ÓÃBorland C/C++µÄ¿âº¯Êýrandom£¨£©À´»ñµÃÒ»¸öËæ»úÊý[³ÌÐòÇåµ¥L1.10(2)]£¬´Ë´¦Éèrandom£¨£©º¯ÊýÊDz»¿ÉÖØÈëµÄ£¬ËùÒÔ10¸öÈÎÎñ½«ÂÖÁ÷»ñµÃÐźÅÁ¿£¬²¢µ÷Óøú¯Êý¡£µ±¼ÆËã³öxºÍy×ø±êºó[³ÌÐòÇåµ¥L1.10(3)]£¬ÈÎÎñÊÍ·ÅÐźÅÁ¿¡£ËæºóÈÎÎñÔÚ¼ÆËãµÄ×ø±ê´¦ÏÔʾÆäÈÎÎñºÅ£¨0-9£¬ÈÎÎñ½¨Á¢Ê±µÄ±êʶ£©[³ÌÐòÇåµ¥L1.10(4)]¡£×îºó£¬ÈÎÎñÑÓʱһ¸öʱÖÓ½ÚÅÄ[³ÌÐòÇåµ¥L1.10(5)]£¬µÈ´ý½øÈëÏÂÒ»´ÎÑ»·¡£ÏµÍ³ÖÐÿ¸öÈÎÎñÿÃëÖ´ÐÐ200´Î£¬10¸öÈÎÎñÿÃëÖÓ½«Çл»2000´Î¡£
³ÌÐòÇåµ¥ L 1.10 ÔÚÆÁÄ»ÉÏÏÔÊ¾Ëæ»úλÖÃÏÔʾÊý×ÖµÄÈÎÎñ¡£ void Task (void *data) {
UBYTE x; UBYTE y; UBYTE err;
for (;;) {
OSSemPend(RandomSem, 0, &err); (1) x = random(80); (2) y = random(16);
OSSemPost(RandomSem); (3) PC_DispChar(x, y + 5, *(char *)data, DISP_FGND_LIGHT_GRAY); (4) OSTimeDly(1); (5) } }
1.08 Àý2
Àý2ʹÓÃÁË´øÀ©Õ¹¹¦ÄܵÄÈÎÎñ½¨Á¢º¯ÊýOSTaskCreateExt£¨£©ºÍuCOS-IIµÄ¶ÑÕ»¼ì²é²Ù×÷£¨ÒªÊ¹ÓöÑÕ»¼ì²é²Ù×÷±ØÐëÓÃOSTaskCreateExt£¨£©½¨Á¢ÈÎÎñ¡ªÒëÕß×¢£©¡£µ±Óû§²»ÖªµÀÓ¦¸Ã¸øÈÎÎñ·ÖÅä¶àÉÙ¶ÑÕ»¿Õ¼äʱ£¬¶ÑÕ»¼ì²é¹¦ÄÜÊǺÜÓÐÓõġ£ÔÚÕâ¸öÀý×ÓÀÏÈ·ÖÅä×ã¹»µÄ¶ÑÕ»¿Õ¼ä¸øÈÎÎñ£¬È»ºóÓöÑÕ»¼ì²é²Ù×÷¿´¿´ÈÎÎñµ½µ×ÐèÒª¶àÉÙ¶ÑÕ»¿Õ¼ä¡£ÏÔÈ»£¬ÈÎÎñÒªÔËÐÐ×ã¹»³¤Ê±¼ä£¬²¢Òª¿¼ÂǸ÷ÖÖÇé¿ö²ÅÄܵÃ
µ½ÕýÈ·Êý¾Ý¡£×îºó¾ö¶¨µÄ¶ÑÕ»´óС»¹Òª¿¼ÂÇϵͳ½ñºóµÄÀ©Õ¹£¬Ò»°ã¶à·ÖÅä10£¥£¬25£¥»òÕ߸ü¶à¡£Èç¹ûϵͳ¶ÔÎȶ¨ÐÔÒªÇó¸ß£¬ÔòÓ¦¸Ã¶àÒ»±¶ÒÔÉÏ¡£
uCOS-IIµÄ¶ÑÕ»¼ì²é¹¦ÄÜÒªÇóÈÎÎñ½¨Á¢Ê±¶ÑÕ»ÇåÁã¡£OSTaskCreateExt()¿ÉÒÔÖ´ÐдËÏî²Ù×÷£¨ÉèÖÃÑ¡ÏîOS_TASK_OPT_STK_CHKºÍOS_TASK_OPT_STK_CLR´ò¿ª´ËÏî²Ù×÷£©¡£Èç¹ûÈÎÎñÔËÐйý³ÌÖÐÒª½øÐн¨Á¢¡¢É¾³ýÈÎÎñµÄ²Ù×÷£¬Ó¦¸ÃÉèÖúÃÉÏÊöµÄÑ¡Ïȷ±£ÈÎÎñ½¨Á¢ºó¶ÑÕ»ÊÇÇå¿ÕµÄ¡£Í¬Ê±ÒªÒâʶµ½
OSTaskCreateExt()½øÐжÑÕ»ÇåÁã²Ù×÷ÊÇÒ»ÏîºÜ·ÑʱµÄ¹¤×÷£¬¶øÇÒÈ¡¾öÓÚ¶ÑÕ»µÄ´óС¡£Ö´ÐжÑÕ»¼ì²é²Ù×÷µÄʱºò£¬uCOS-II´ÓÕ»µ×ÏòÕ»¶¥ËÑË÷·Ç0ÔªËØ(²Î¿´Í¼F 1.1)£¬Í¬Ê±ÓÃÒ»¸ö¼ÆÊýÆ÷¼Ç¼0ÔªËØµÄ¸öÊý¡£
Àý2µÄ´ÅÅÌÎļþΪ\\SOFTWARE\%uCOS-II\\EX2_x86L£¬Ëü°üº¬9¸öÈÎÎñ¡£¼ÓÉÏuCOS-II±¾ÉíµÄÁ½¸öÈÎÎñ£º¿ÕÏÐÈÎÎñ£¨idle task£©ºÍͳ¼ÆÈÎÎñ¡£ÓëÀý1Ò»ÑùTaskStart£¨£©ÓÉmain£¨£©º¯Êý½¨Á¢£¬Æä¹¦ÄÜÊǽ¨Á¢ÆäËûÈÎÎñ²¢ÔÚÆÁÄ»ÉÏÏÔʾÈçϵÄͳ¼ÆÊý¾Ý£º
? ÿÃëÖÖÈÎÎñÇл»µÄ´ÎÊý£» ? CPUÀûÓÃÂʵİٷֱȣ» ? µ±Ç°ÈÕÆÚºÍʱ¼ä£» ? uCOS_IIµÄ°æ±¾ºÅ£»
ͼF 1.1 ¦ÌC/OS-II stack checking.
1.08.01 main()
Àý2µÄmain()º¯ÊýºÍÀý1µÄ¿´ÆðÀ´²î²»¶à£¨²Î¿´³ÌÐòÇåµ¥L1.11£©£¬µ«ÊÇÓÐÁ½´¦²»Í¬¡£µÚÒ»£¬main()º¯Êýµ÷ÓÃPC_ElapsedInit()[³ÌÐòÇåµ¥L1.11(1)]À´³õʼ»¯¶¨Ê±Æ÷¼Ç¼OSTaskStkChk()µÄÖ´ÐÐʱ¼ä¡£µÚ¶þ£¬ËùÓеÄÈÎÎñ¶¼Ê¹ÓÃOSTaskCreateExt()º¯ÊýÀ´½¨Á¢ÈÎÎñ[³ÌÐòÇåµ¥L1.11(2)]£¨Ìæ´úÀϰ汾µÄOSTaskCreate£¨£©£©£¬ÕâʹµÃÿһ¸öÈÎÎñ¶¼¿É½øÐжÑÕ»¼ì²é¡£
³ÌÐòÇåµ¥ L 1.11 Àý2ÖеÄMain£¨£©º¯Êý. void main (void) {
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS, OSCtxSw);
PC_ElapsedInit(); (1) OSTaskCreateExt(TaskStart, (2) (void *)0,
&TaskStartStk[TASK_STK_SIZE-1], TASK_START_PRIO, TASK_START_ID, &TaskStartStk[0], TASK_STK_SIZE, (void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); OSStart(); }
³ýÁËOSTaskCreate()º¯ÊýµÄËĸö²ÎÊýÍ⣬OSTaskCreateExt()»¹ÐèÒªÎå¸ö²ÎÊý£¨Ò»¹²9¸ö£©£ºÈÎÎñµÄID£¬Ò»¸öÖ¸ÏòÈÎÎñ¶ÑÕ»Õ»µ×µÄÖ¸Õ룬¶ÑÕ»µÄ´óС£¨ÒÔ¶ÑÕ»µ¥ÔªÎªµ¥Î»£¬80X86ÖÐΪ×Ö£©£¬Ò»¸öÖ¸ÏòÓû§¶¨ÒåµÄTCBÀ©Õ¹Êý¾Ý½á¹¹µÄÖ¸Õ룬ºÍÒ»¸öÓÃÓÚÖ¸¶¨¶ÔÈÎÎñ²Ù×÷µÄ±äÁ¿¡£¸Ã±äÁ¿µÄÒ»¸öÑ¡Ïî¾ÍÊÇÓÃÀ´É趨uCOS-II¶ÑÕ»¼ì²éÊÇ·ñÔÊÐí¡£Àý2Öв¢Ã»ÓÐÓõ½TCBÀ©Õ¹Êý¾Ý½á¹¹Ö¸Õë¡£ 1.08.02TaskStart()
³ÌÐòÇåµ¥L1.12ÁгöÁËTaskStart()µÄαÂ롣ǰÎåÏî²Ù×÷ºÍÀý1ÖÐÏàͬ¡£TaskStart£¨£©½¨Á¢ÁËÁ½¸öÓÊÏ䣬·Ö±ðÌṩ¸øÈÎÎñ4ºÍÈÎÎñ5[³ÌÐòÇåµ¥L1.12(1)]¡£³ý´ËÖ®Í⣬»¹½¨Á¢ÁËÒ»¸öרÃÅÏÔʾʱ¼äºÍÈÕÆÚµÄÈÎÎñ¡£
³ÌÐòÇåµ¥ L 1.12 TaskStart()µÄαÂë¡£. void TaskStart (void *data) {
Prevent compiler warning by assigning ?data¡® to itself; Display a banner and non-changing text; Install uC/OS-II¡®s tick handler; Change the tick rate to 200 Hz; Initialize the statistics task;
Create 2 mailboxes which are used by Task #4 and #5; (1) Create a task that will display the date and time on the screen; (2) Create 5 application tasks; for (;;) {
Display #tasks running; Display CPU usage in %;
Display #context switches per seconds; Clear the context switch counter; Display uC/OS-II¡®s version; If (Key was pressed) {
if (Key pressed was the ESCAPE key) { Return to DOS; } }
Delay for 1 second; } }
1.08.03 TaskN()
ÈÎÎñ1½«¼ì²éÆäËûÆß¸öÈÎÎñ¶ÑÕ»µÄ´óС£¬Í¬Ê±¼Ç¼OSTackStkChk()º¯ÊýµÄÖ´ÐÐʱ¼ä[³ÌÐòÇåµ¥
L1.13(1)¨C(2)]£¬²¢Óë¶ÑÕ»´óСһÆðÏÔʾ³öÀ´¡£×¢ÒâËùÓжÑÕ»µÄ´óС¶¼ÊÇÒÔ×Ö½ÚΪµ¥Î»µÄ¡£ÈÎÎñ1ÿÃëÖ´ÐÐ10´Î[³ÌÐòÇåµ¥L1.13(3)]£¨¼ä¸ô100ms£©¡£
³ÌÐòÇåµ¥ L 1.13 Àý2, ÈÎÎñ1 void Task1 (void *pdata) {
INT8U err; OS_STK_DATA data; INT16U time; INT8U i;
char s[80];
pdata = pdata; for (;;) {
for (i = 0; i < 7; i++) {
PC_ElapsedStart(); (1) err = OSTaskStkChk(TASK_START_PRIO+i, &data)
time = PC_ElapsedStop(); (2) if (err == OS_NO_ERR) {
sprintf(s, \ %3ld %3ld ]\ data.OSFree + data.OSUsed, data.OSFree, data.OSUsed, time);
PC_DispStr(19, 12+i, s, DISP_FGND_YELLOW); } }
OSTimeDlyHMSM(0, 0, 0, 100); (3) } }
³ÌÐòÇåµ¥L1.14ËùʾµÄÈÎÎñ2ÔÚÆÁÄ»ÉÏÏÔʾһ¸ö˳ʱÕëÐýתµÄÖ¸Õ루ÓúáÏߣ¬Ð±ÏßµÈ×Ö·û±íʾ¡ªÒëÕß×¢£©£¬Ã¿200msÐýתһ¸ñ¡£
³ÌÐòÇåµ¥ L 1.14 ÈÎÎñ2 void Task2 (void *data) {
data = data; for (;;) {
PC_DispChar(70, 15, '|', DISP_FGND_WHITE + DISP_BGND_RED); OSTimeDly(10);
PC_DispChar(70, 15, '/', DISP_FGND_WHITE + DISP_BGND_RED); OSTimeDly(10);
PC_DispChar(70, 15, '-', DISP_FGND_WHITE + DISP_BGND_RED); OSTimeDly(10);
PC_DispChar(70, 15, '\\\\', DISP_FGND_WHITE + DISP_BGND_RED); OSTimeDly(10); } }
ÈÎÎñ3(³ÌÐòÇåµ¥ L1.15)Ò²ÏÔʾÁËÓëÈÎÎñ2ÏàͬµÄÒ»¸öÐýתָÕ룬µ«ÊÇÐýתµÄ·½Ïò²»Í¬¡£ÈÎÎñ3ÔÚ¶ÑÕ»ÖзÖÅäÁËÒ»¸öºÜ´óµÄÊý×飬½«¶ÑÕ»Ìî³äµô£¬Ê¹µÃOSTaskStkChk()Ö»Ð軨·ÑºÜÉÙµÄʱ¼äÀ´È·¶¨¶ÑÕ»µÄÀûÓÃÂÊ£¬ÓÈÆäÊǵ±¶ÑÕ»ÒѾ¿ìÂúµÄʱºò¡£
³ÌÐòÇåµ¥ L 1.15 ÈÎÎñ3 void Task3 (void *data) {
char dummy[500]; INT16U i; data = data;
for (I = 0; i < 499; i++) { dummy = '?'; }
for (;;) {
PC_DispChar(70, 16, '|', DISP_FGND_WHITE + DISP_BGND_BLUE); OSTimeDly(20);