# ä»»åŠ¡ç®¡ç† ## 基本概念 从系统角度看,任务是竞争系统资æºçš„最å°è¿è¡Œå•å…ƒã€‚任务å¯ä»¥ä½¿ç”¨æˆ–ç‰å¾…CPUã€ä½¿ç”¨å†…å˜ç©ºé—´ç‰ç³»ç»Ÿèµ„æºï¼Œå„任务的è¿è¡Œç›¸äº’独立。 OpenHarmony LiteOS-M的任务模å—å¯ä»¥ç»™ç”¨æˆ·æ供多个任务,实现任务间的切æ¢ï¼Œå¸®åŠ©ç”¨æˆ·ç®¡ç†ä¸šåŠ¡ç¨‹åºæµç¨‹ã€‚任务模å—具有如下特性: - 支æŒå¤šä»»åŠ¡ã€‚ - 一个任务表示一个线程。 - 抢å å¼è°ƒåº¦æœºåˆ¶ï¼Œé«˜ä¼˜å…ˆçº§çš„任务å¯æ‰“æ–低优先级任务,低优先级任务必须在高优先级任务阻塞或结æŸåŽæ‰èƒ½å¾—到调度。 - 相åŒä¼˜å…ˆçº§ä»»åŠ¡æ”¯æŒæ—¶é—´ç‰‡è½®è½¬è°ƒåº¦æ–¹å¼ã€‚ - 共有32个优先级[0-31],最高优先级为0,最低优先级为31。 ### 任务相关概念 **任务状æ€** 任务有多ç§è¿è¡ŒçŠ¶æ€ã€‚系统åˆå§‹åŒ–完æˆåŽï¼Œåˆ›å»ºçš„任务就å¯ä»¥åœ¨ç³»ç»Ÿä¸ç«žäº‰ä¸€å®šçš„资æºï¼Œç”±å†…æ ¸è¿›è¡Œè°ƒåº¦ã€‚ 任务状æ€é€šå¸¸åˆ†ä¸ºä»¥ä¸‹å››ç§ï¼š - 就绪(Ready):该任务在就绪队列ä¸ï¼Œåªç‰å¾…CPU。 - è¿è¡Œï¼ˆRunning):该任务æ£åœ¨æ‰§è¡Œã€‚ - 阻塞(Blocked):该任务ä¸åœ¨å°±ç»ªé˜Ÿåˆ—ä¸ã€‚包å«ä»»åŠ¡è¢«æŒ‚起(suspend状æ€ï¼‰ã€ä»»åŠ¡è¢«å»¶æ—¶ï¼ˆdelay状æ€ï¼‰ã€ä»»åŠ¡æ£åœ¨ç‰å¾…ä¿¡å·é‡ã€è¯»å†™é˜Ÿåˆ—或者ç‰å¾…事件ç‰ã€‚ - 退出æ€ï¼ˆDead):该任务è¿è¡Œç»“æŸï¼Œç‰å¾…系统回收资æºã€‚ **任务状æ€è¿ç§»** **图1** 任务状æ€ç¤ºæ„图  系统会åŒæ—¶å˜åœ¨å¤šä¸ªä»»åŠ¡ï¼Œå› æ¤å°±ç»ªæ€å’Œé˜»å¡žæ€çš„ä»»åŠ¡åˆ†åˆ«ä¼šåŠ å…¥å°±ç»ªé˜Ÿåˆ—å’Œé˜»å¡žé˜Ÿåˆ—ã€‚é˜Ÿåˆ—åªæ˜¯ç›¸åŒçŠ¶æ€ä»»åŠ¡çš„åˆé›†ï¼ŒåŠ 入队列的先åŽä¸Žä»»åŠ¡çŠ¶æ€è¿ç§»çš„顺åºæ— 关。è¿è¡Œæ€ä»»åŠ¡ä»…å˜åœ¨ä¸€ä¸ªï¼Œä¸å˜åœ¨è¿è¡Œæ€é˜Ÿåˆ—。 **任务状æ€è¿ç§»è¯´æ˜Ž** - 就绪æ€â†’è¿è¡Œæ€ 任务创建åŽè¿›å…¥å°±ç»ªæ€ï¼Œå‘生任务切æ¢æ—¶ï¼Œå°±ç»ªé˜Ÿåˆ—ä¸æœ€é«˜ä¼˜å…ˆçº§çš„任务被执行,从而进入è¿è¡Œæ€ï¼ŒåŒæ—¶è¯¥ä»»åŠ¡ä»Žå°±ç»ªé˜Ÿåˆ—ä¸ç§»å‡ºã€‚ - è¿è¡Œæ€â†’é˜»å¡žæ€ æ£åœ¨è¿è¡Œçš„任务å‘生阻塞(挂起ã€å»¶æ—¶ã€è¯»ä¿¡å·é‡ç‰ï¼‰æ—¶ï¼Œå°†è¯¥ä»»åŠ¡æ’入到对应的阻塞队列ä¸ï¼Œä»»åŠ¡çŠ¶æ€ç”±è¿è¡Œæ€å˜æˆé˜»å¡žæ€ï¼Œç„¶åŽå‘生任务切æ¢ï¼Œè¿è¡Œå°±ç»ªé˜Ÿåˆ—ä¸æœ€é«˜ä¼˜å…ˆçº§ä»»åŠ¡ã€‚ - 阻塞æ€â†’就绪æ€ï¼ˆé˜»å¡žæ€â†’è¿è¡Œæ€çš„å‰ç½®æ¡ä»¶ï¼‰ 阻塞的任务被æ¢å¤åŽï¼ˆä»»åŠ¡æ¢å¤ã€å»¶æ—¶æ—¶é—´è¶…æ—¶ã€è¯»ä¿¡å·é‡è¶…时或读到信å·é‡ç‰ï¼‰ï¼Œæ¤æ—¶è¢«æ¢å¤çš„ä»»åŠ¡ä¼šè¢«åŠ å…¥å°±ç»ªé˜Ÿåˆ—ï¼Œä»Žè€Œç”±é˜»å¡žæ€å˜æˆå°±ç»ªæ€ï¼›æ¤æ—¶å¦‚果被æ¢å¤ä»»åŠ¡çš„优先级高于æ£åœ¨è¿è¡Œä»»åŠ¡çš„优先级,则会å‘生任务切æ¢ï¼Œè¯¥ä»»åŠ¡ç”±å°±ç»ªæ€å˜æˆè¿è¡Œæ€ã€‚ - 就绪æ€â†’é˜»å¡žæ€ ä»»åŠ¡ä¹Ÿæœ‰å¯èƒ½åœ¨å°±ç»ªæ€æ—¶è¢«é˜»å¡žï¼ˆæŒ‚起),æ¤æ—¶ä»»åŠ¡çŠ¶æ€ç”±å°±ç»ªæ€å˜ä¸ºé˜»å¡žæ€ï¼Œè¯¥ä»»åŠ¡ä»Žå°±ç»ªé˜Ÿåˆ—ä¸ç§»å‡ºï¼Œä¸ä¼šå‚与任务调度,直到该任务被æ¢å¤ã€‚ - è¿è¡Œæ€â†’å°±ç»ªæ€ æœ‰æ›´é«˜ä¼˜å…ˆçº§ä»»åŠ¡åˆ›å»ºæˆ–è€…æ¢å¤åŽï¼Œä¼šå‘生任务调度,æ¤åˆ»å°±ç»ªé˜Ÿåˆ—ä¸æœ€é«˜ä¼˜å…ˆçº§ä»»åŠ¡å˜ä¸ºè¿è¡Œæ€ï¼Œé‚£ä¹ˆåŽŸå…ˆè¿è¡Œçš„任务由è¿è¡Œæ€å˜ä¸ºå°±ç»ªæ€ï¼Œä¾ç„¶åœ¨å°±ç»ªé˜Ÿåˆ—ä¸ã€‚ - è¿è¡Œæ€â†’é€€å‡ºæ€ è¿è¡Œä¸çš„任务è¿è¡Œç»“æŸï¼Œä»»åŠ¡çŠ¶æ€ç”±è¿è¡Œæ€å˜ä¸ºé€€å‡ºæ€ã€‚退出æ€åŒ…å«ä»»åŠ¡è¿è¡Œç»“æŸçš„æ£å¸¸é€€å‡ºçŠ¶æ€ä»¥åŠInvalid状æ€ã€‚例如,任务è¿è¡Œç»“æŸä½†æ˜¯æ²¡æœ‰è‡ªåˆ 除,对外呈现的就是Invalid状æ€ï¼Œå³é€€å‡ºæ€ã€‚ - 阻塞æ€â†’é€€å‡ºæ€ é˜»å¡žçš„ä»»åŠ¡è°ƒç”¨åˆ é™¤æŽ¥å£ï¼Œä»»åŠ¡çŠ¶æ€ç”±é˜»å¡žæ€å˜ä¸ºé€€å‡ºæ€ã€‚ **任务ID** 在任务创建时通过å‚数返回给用户。系统ä¸ä»»åŠ¡IDå·æ˜¯å”¯ä¸€çš„,是任务的é‡è¦æ ‡è¯†ã€‚用户å¯ä»¥é€šè¿‡ä»»åŠ¡ID对指定任务进行任务挂起ã€ä»»åŠ¡æ¢å¤ã€æŸ¥è¯¢ä»»åŠ¡åç‰æ“作。 **任务优先级** 优先级表示任务执行的优先顺åºã€‚任务的优先级决定了在å‘生任务切æ¢æ—¶å³å°†è¦æ‰§è¡Œçš„任务,就绪队列ä¸æœ€é«˜ä¼˜å…ˆçº§çš„任务将得到执行。 **任务入å£å‡½æ•°** 新任务得到调度åŽå°†æ‰§è¡Œçš„函数。该函数由用户实现,在任务创建时,通过任务创建结构体设置。 **ä»»åŠ¡æ ˆ** æ¯ä¸ªä»»åŠ¡éƒ½æ‹¥æœ‰ä¸€ä¸ªç‹¬ç«‹çš„æ ˆç©ºé—´ï¼Œæˆ‘ä»¬ç§°ä¸ºä»»åŠ¡æ ˆã€‚æ ˆç©ºé—´é‡Œä¿å˜çš„ä¿¡æ¯åŒ…å«å±€éƒ¨å˜é‡ã€å¯„å˜å™¨ã€å‡½æ•°å‚æ•°ã€å‡½æ•°è¿”回地å€ç‰ã€‚ **任务上下文** 任务在è¿è¡Œè¿‡ç¨‹ä¸ä½¿ç”¨çš„一些资æºï¼Œå¦‚寄å˜å™¨ç‰ï¼Œç§°ä¸ºä»»åŠ¡ä¸Šä¸‹æ–‡ã€‚当这个任务挂起时,其他任务继ç»æ‰§è¡Œï¼Œå¯èƒ½ä¼šä¿®æ”¹å¯„å˜å™¨ç‰èµ„æºä¸çš„值。如果任务切æ¢æ—¶æ²¡æœ‰ä¿å˜ä»»åŠ¡ä¸Šä¸‹æ–‡ï¼Œå¯èƒ½ä¼šå¯¼è‡´ä»»åŠ¡æ¢å¤åŽå‡ºçŽ°æœªçŸ¥é”™è¯¯ã€‚å› æ¤åœ¨ä»»åŠ¡åˆ‡æ¢æ—¶ä¼šå°†åˆ‡å‡ºä»»åŠ¡çš„任务上下文信æ¯ï¼Œä¿å˜åœ¨è‡ªèº«çš„ä»»åŠ¡æ ˆä¸ï¼Œä»¥ä¾¿ä»»åŠ¡æ¢å¤åŽï¼Œä»Žæ ˆç©ºé—´ä¸æ¢å¤æŒ‚起时的上下文信æ¯ï¼Œä»Žè€Œç»§ç»æ‰§è¡ŒæŒ‚起时被打æ–的代ç 。 **任务控制å—(TCB)** æ¯ä¸ªä»»åŠ¡éƒ½å«æœ‰ä¸€ä¸ªä»»åŠ¡æŽ§åˆ¶å—(TCB)。TCB包å«äº†ä»»åŠ¡ä¸Šä¸‹æ–‡æ ˆæŒ‡é’ˆï¼ˆstack pointer)ã€ä»»åŠ¡çŠ¶æ€ã€ä»»åŠ¡ä¼˜å…ˆçº§ã€ä»»åŠ¡IDã€ä»»åŠ¡åã€ä»»åŠ¡æ ˆå¤§å°ç‰ä¿¡æ¯ã€‚TCBå¯ä»¥åæ˜ å‡ºæ¯ä¸ªä»»åŠ¡è¿è¡Œæƒ…况。 **任务切æ¢** 任务切æ¢åŒ…å«èŽ·å–就绪队列ä¸æœ€é«˜ä¼˜å…ˆçº§ä»»åŠ¡ã€åˆ‡å‡ºä»»åŠ¡ä¸Šä¸‹æ–‡ä¿å˜ã€åˆ‡å…¥ä»»åŠ¡ä¸Šä¸‹æ–‡æ¢å¤ç‰åŠ¨ä½œã€‚ ### 任务è¿è¡Œæœºåˆ¶ 用户创建任务时,系统会åˆå§‹åŒ–ä»»åŠ¡æ ˆï¼Œé¢„ç½®ä¸Šä¸‹æ–‡ã€‚æ¤å¤–,系统还会将“任务入å£å‡½æ•°â€åœ°å€æ”¾åœ¨ç›¸åº”ä½ç½®ã€‚è¿™æ ·åœ¨ä»»åŠ¡ç¬¬ä¸€æ¬¡å¯åŠ¨è¿›å…¥è¿è¡Œæ€æ—¶ï¼Œå°†ä¼šæ‰§è¡Œâ€œä»»åŠ¡å…¥å£å‡½æ•°â€ã€‚ ## 接å£è¯´æ˜Ž OpenHarmony LiteOS-Må†…æ ¸çš„ä»»åŠ¡ç®¡ç†æ¨¡å—æ供下é¢å‡ ç§åŠŸèƒ½ï¼ŒæŽ¥å£è¯¦ç»†ä¿¡æ¯å¯ä»¥æŸ¥çœ‹APIå‚考。 **表1** 任务管ç†æ¨¡å—æŽ¥å£ | 功能分类 | 接å£æè¿° | | -------- | -------- | | åˆ›å»ºå’Œåˆ é™¤ä»»åŠ¡ | LOS_TaskCreateOnly:创建任务,并使该任务进入suspend状æ€ã€‚<br/>LOS_TaskCreate:创建任务,并使该任务进入ready状æ€ï¼Œå¦‚果就绪队列ä¸æ²¡æœ‰æ›´é«˜ä¼˜å…ˆçº§çš„任务,则è¿è¡Œè¯¥ä»»åŠ¡ã€‚<br/>LOS_TaskDeleteï¼šåˆ é™¤æŒ‡å®šçš„ä»»åŠ¡ã€‚ | | æŽ§åˆ¶ä»»åŠ¡çŠ¶æ€ | LOS_TaskResume:æ¢å¤æŒ‚起的任务,使该任务进入ready状æ€ã€‚<br/>LOS_TaskSuspend:挂起指定的任务,然åŽåˆ‡æ¢ä»»åŠ¡ã€‚<br/>LOS_TaskJoin:挂起当å‰ä»»åŠ¡ï¼Œç‰å¾…指定任务è¿è¡Œç»“æŸå¹¶å›žæ”¶å…¶ä»»åŠ¡æŽ§åˆ¶å—资æº<br/>LOS_TaskDelay:任务延时ç‰å¾…,释放CPU,ç‰å¾…时间到期åŽè¯¥ä»»åŠ¡ä¼šé‡æ–°è¿›å…¥ready状æ€ã€‚ä¼ å…¥å‚数为Tick数目。<br/>LOS_Msleep:任务延时ç‰å¾…,释放CPU,ç‰å¾…时间到期åŽè¯¥ä»»åŠ¡ä¼šé‡æ–°è¿›å…¥ready状æ€ã€‚ä¼ å…¥å‚数为毫秒数。<br/>LOS_TaskYield:当å‰ä»»åŠ¡æ—¶é—´ç‰‡è®¾ç½®ä¸º0,释放CPU,触å‘调度è¿è¡Œå°±ç»ªä»»åŠ¡é˜Ÿåˆ—ä¸ä¼˜å…ˆçº§æœ€é«˜çš„任务。 | | 控制任务调度 | LOS_TaskLock:é”任务调度,但任务ä»å¯è¢«ä¸æ–打æ–。<br/>LOS_TaskUnlock:解é”任务调度。<br/>LOS_Schedule:触å‘任务调度。 | | 控制任务优先级 | LOS_CurTaskPriSet:设置当å‰ä»»åŠ¡çš„优先级。<br/>LOS_TaskPriSet:设置指定任务的优先级。<br/>LOS_TaskPriGet:获å–指定任务的优先级。 | | 获å–ä»»åŠ¡ä¿¡æ¯ | LOS_CurTaskIDGet:获å–当å‰ä»»åŠ¡çš„ID。<br/>LOS_NextTaskIDGet:获å–任务就绪队列ä¸ä¼˜å…ˆçº§æœ€é«˜çš„任务的ID。<br/>LOS_NewTaskIDGet:ç‰åŒLOS_NextTaskIDGet。<br/>LOS_CurTaskNameGet:获å–当å‰ä»»åŠ¡çš„å称。<br/>LOS_TaskNameGet:获å–指定任务的å称。<br/>LOS_TaskStatusGet:获å–指定任务的状æ€ã€‚<br/>LOS_TaskInfoGet:获å–指定任务的信æ¯ï¼ŒåŒ…括任务状æ€ã€ä¼˜å…ˆçº§ã€ä»»åŠ¡æ ˆå¤§å°ã€æ ˆé¡¶æŒ‡é’ˆSPã€ä»»åŠ¡å…¥å£å‡½æ•°ã€å·²ä½¿ç”¨çš„ä»»åŠ¡æ ˆå¤§å°ç‰ã€‚<br/>LOS_TaskIsRunning:获å–任务模å—是å¦å·²ç»å¼€å§‹è°ƒåº¦è¿è¡Œã€‚ | | 任务信æ¯ç»´æµ‹ | LOS_TaskSwitchInfoGet:获å–任务切æ¢ä¿¡æ¯ï¼Œéœ€è¦å¼€å¯ç¼–译控制å®ï¼šLOSCFG_BASE_CORE_EXC_TSK_SWITCH。 | ## å¼€å‘æµç¨‹ 本节介ç»ä»»åŠ¡æ¨¡å—的典型场景开å‘æµç¨‹ï¼š 1. é”任务调度LOS_TaskLock,防æ¢é«˜ä¼˜å…ˆçº§ä»»åŠ¡è°ƒåº¦ã€‚ 2. 创建任务LOS_TaskCreate。 3. 解é”任务LOS_TaskUnlock,让任务按照优先级进行调度。 4. 延时任务LOS_TaskDelay,任务延时ç‰å¾…。 5. 挂起指定的任务LOS_TaskSuspend,任务挂起ç‰å¾…æ¢å¤æ“作。 6. æ¢å¤æŒ‚起的任务LOS_TaskResume。 >  **说明:** > - 执行Idle任务时,会对待回收链表ä¸çš„任务控制å—å’Œä»»åŠ¡æ ˆè¿›è¡Œå›žæ”¶ã€‚ > > - 任务å是指针,并没有分é…空间,在设置任务å时,ç¦æ¢å°†å±€éƒ¨å˜é‡çš„地å€èµ‹å€¼ç»™ä»»åŠ¡å指针。 > > - ä»»åŠ¡æ ˆçš„å¤§å°æŒ‰8å—节大å°å¯¹é½ã€‚ç¡®å®šä»»åŠ¡æ ˆå¤§å°çš„åŽŸåˆ™æ˜¯ï¼Œå¤Ÿç”¨å°±è¡Œï¼Œå¤šäº†æµªè´¹ï¼Œå°‘äº†ä»»åŠ¡æ ˆæº¢å‡ºã€‚ > > - 挂起当å‰ä»»åŠ¡æ—¶ï¼Œå¦‚果已ç»é”ä»»åŠ¡è°ƒåº¦ï¼Œåˆ™æ— æ³•æŒ‚èµ·ã€‚ > > - Idle任务åŠè½¯ä»¶å®šæ—¶å™¨ä»»åŠ¡ä¸èƒ½è¢«æŒ‚èµ·æˆ–è€…åˆ é™¤ã€‚ > > - 在ä¸æ–处ç†å‡½æ•°ä¸æˆ–者在é”任务的情况下,执行LOS_TaskDelay会失败。 > > - é”任务调度,并ä¸å…³ä¸æ–ï¼Œå› æ¤ä»»åŠ¡ä»å¯è¢«ä¸æ–打æ–。 > > - é”任务调度必须和解é”任务调度é…åˆä½¿ç”¨ã€‚ > > - 设置任务优先级时å¯èƒ½ä¼šå‘生任务调度。 > > - å¯é…置的系统最大任务数是指:整个系统的任务总个数,而éžç”¨æˆ·èƒ½ä½¿ç”¨çš„任务个数。例如:系统软件定时器多å 用一个任务资æºï¼Œé‚£ä¹ˆç”¨æˆ·èƒ½ä½¿ç”¨çš„任务资æºå°±ä¼šå‡å°‘一个。 > > - LOS_CurTaskPriSetå’ŒLOS_TaskPriSet接å£ä¸èƒ½åœ¨ä¸æ–ä¸ä½¿ç”¨ï¼Œä¹Ÿä¸èƒ½ç”¨äºŽä¿®æ”¹è½¯ä»¶å®šæ—¶å™¨ä»»åŠ¡çš„优先级。 > > - LOS_TaskPriGet接å£ä¼ 入的task ID对应的任务未创建或者超过最大任务数,统一返回-1。 > > - åœ¨åˆ é™¤ä»»åŠ¡æ—¶è¦ä¿è¯ä»»åŠ¡ç”³è¯·çš„资æºï¼ˆå¦‚互斥é”ã€ä¿¡å·é‡ç‰ï¼‰å·²è¢«é‡Šæ”¾ã€‚ ## 编程实例 本实例介ç»åŸºæœ¬çš„任务æ“作方法,包å«2个ä¸åŒä¼˜å…ˆçº§ä»»åŠ¡çš„创建ã€ä»»åŠ¡å»¶æ—¶ã€ä»»åŠ¡é”与解é”调度ã€æŒ‚èµ·å’Œæ¢å¤ç‰æ“作,é˜è¿°ä»»åŠ¡ä¼˜å…ˆçº§è°ƒåº¦çš„机制以åŠå„接å£çš„应用。示例代ç 如下: 本演示代ç 在 ./kernel/liteos_m/testsuites/src/osTest.c ä¸ç¼–译验è¯ï¼Œåœ¨TestTaskEntryä¸è°ƒç”¨éªŒè¯å…¥å£å‡½æ•°ExampleTask。 ``` #include "los_task.h" UINT32 g_taskHiId; UINT32 g_taskLoId; #define TSK_PRIOR_HI 3 /* 高优先级任务的优先级 */ #define TSK_PRIOR_LO 4 /* 低优先级任务的优先级 */ UINT32 ExampleTaskHi(VOID) { UINT32 ret; printf("Enter TaskHi Handler.\n"); /* 延时100个Ticks,延时åŽè¯¥ä»»åŠ¡ä¼šæŒ‚起,执行剩余任务ä¸æœ€é«˜ä¼˜å…ˆçº§çš„任务(å³TaskLo任务) */ ret = LOS_TaskDelay(100); if (ret != LOS_OK) { printf("Delay TaskHi Failed.\n"); return LOS_NOK; } /* 100个Ticks时间到了åŽï¼Œè¯¥ä»»åŠ¡æ¢å¤ï¼Œç»§ç»æ‰§è¡Œ */ printf("TaskHi LOS_TaskDelay Done.\n"); /* 挂起自身任务 */ ret = LOS_TaskSuspend(g_taskHiId); if (ret != LOS_OK) { printf("Suspend TaskHi Failed.\n"); return LOS_NOK; } printf("TaskHi LOS_TaskResume Success.\n"); return ret; } /* 低优先级任务入å£å‡½æ•° */ UINT32 ExampleTaskLo(VOID) { UINT32 ret; printf("Enter TaskLo Handler.\n"); /* 延时100个Ticks,延时åŽè¯¥ä»»åŠ¡ä¼šæŒ‚起,执行剩余任务ä¸æœ€é«˜ä¼˜å…ˆçº§çš„任务 */ ret = LOS_TaskDelay(100); if (ret != LOS_OK) { printf("Delay TaskLo Failed.\n"); return LOS_NOK; } printf("TaskHi LOS_TaskSuspend Success.\n"); /* æ¢å¤è¢«æŒ‚起的任务g_taskHiId */ ret = LOS_TaskResume(g_taskHiId); if (ret != LOS_OK) { printf("Resume TaskHi Failed.\n"); return LOS_NOK; } return ret; } /* 任务测试入å£å‡½æ•°ï¼Œåˆ›å»ºä¸¤ä¸ªä¸åŒä¼˜å…ˆçº§çš„任务 */ UINT32 ExampleTask(VOID) { UINT32 ret; TSK_INIT_PARAM_S taskParam1 = { 0 }; TSK_INIT_PARAM_S taskParam2 = { 0 }; /* é”任务调度,防æ¢æ–°åˆ›å»ºçš„任务比本任务高而å‘生调度 */ LOS_TaskLock(); printf("LOS_TaskLock() Success!\n"); taskParam1.pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleTaskHi; taskParam1.usTaskPrio = TSK_PRIOR_HI; taskParam1.pcName = "TaskHi"; taskParam1.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; taskParam1.uwResved = LOS_TASK_ATTR_JOINABLE; /* detach 属性 */ /* 创建高优先级任务,由于é”任务调度,任务创建æˆåŠŸåŽä¸ä¼šé©¬ä¸Šæ‰§è¡Œ */ ret = LOS_TaskCreate(&g_taskHiId, &taskParam1); if (ret != LOS_OK) { LOS_TaskUnlock(); printf("Example_TaskHi create Failed!\n"); return LOS_NOK; } printf("Example_TaskHi create Success!\n"); taskParam2.pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleTaskLo; taskParam2.usTaskPrio = TSK_PRIOR_LO; taskParam2.pcName = "TaskLo"; taskParam2.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; /* 创建低优先级任务,由于é”任务调度,任务创建æˆåŠŸåŽä¸ä¼šé©¬ä¸Šæ‰§è¡Œ */ ret = LOS_TaskCreate(&g_taskLoId, &taskParam2); if (ret != LOS_OK) { LOS_TaskUnlock(); printf("Example_TaskLo create Failed!\n"); return LOS_NOK; } printf("Example_TaskLo create Success!\n"); /* 解é”任务调度,æ¤æ—¶ä¼šå‘生任务调度,执行就绪队列ä¸æœ€é«˜ä¼˜å…ˆçº§ä»»åŠ¡ */ LOS_TaskUnlock(); ret = LOS_TaskJoin(g_taskHiId, NULL); if (ret != LOS_OK) { printf("Join Example_TaskHi Failed!, 0x%x\n", ret); } else { printf("Join Example_TaskHi Success!\n"); } return LOS_OK; } ``` **结果验è¯** 编译è¿è¡Œå¾—到的结果为: ``` LOS_TaskLock() Success! Example_TaskHi create Success! Example_TaskLo create Success! Enter TaskHi Handler. Enter TaskLo Handler. TaskHi LOS_TaskDelay Done. TaskHi LOS_TaskSuspend Success. TaskHi LOS_TaskResume Success. Join Example_TaskHi Success! ```