1.ä»»å¡ç®¡ççå
¶ä»
2.在μC/OS中,源码OSTaskCreateExt();这个函数的分析微信拼图游戏源码每一个参数都应该填什么?
ä»»å¡ç®¡ççå ¶ä»
4.4.1ä»»å¡ç¶æå转æ¢æ¶åºå¨ä¸é¢çç« èä¸ï¼æè¿°äºä»»å¡çä¸ç§åºæ¬ç¶æï¼ä¸è¬å¨å®ç°æ¶ä¼åºäºè¿ä¸ç§è½¬ææ·»å æ°çç¶æãå¾4-4æè¿°äºå®é å®ç°çä»»å¡ç¶æ转æ¢å¾ãå¨ç»å®çæ¶å»ï¼ä»»å¡çç¶æä¸å®å¤å¨è¿å ç§ç¶æä¹ä¸ï¼ä¸é¢ç论述åªæ¯å¯¹æ¬ç³»ç»å®ç°çæè¿°ï¼ä¸åçå æ ¸å¯¹è¿äºé¨åçå®ç°æå¾å¤§å·®å¼ï¼ä½åºæ¬åçä¸åã
å¾4-4å¨æè¿°ä»»å¡ç¶æè¿ç§»çåæ¶ï¼ä¹æè¿°äºä»»å¡ççåå¨æï¼ä»»å¡ççå½æä»æ°å»ºææ¶å¼å§ç´å°ç»æææ¶ç»æãå¨ä¸åçæä½ç³»ç»ä¸ï¼è¿äºç¶æçå®ç°æ¯æå·®å¼çï¼æçå æ ¸è¿æå ¶ä»ç¶æãæ°å»ºç¶ææ¯æä»»å¡è¢«å建çè¿ç¨ï¼å¨è¿ä¸ªè¿ç¨ä¸ä¸»è¦å·¥ä½æï¼ä¸ºä»»å¡åé TCBåæ 空é´ä»¥åå ¶ä»èµæºãå½ä»»å¡å建å®æ以åï¼ä»»å¡å°±å ·å¤è¿è¡çè½åäºï¼ä¸æ¤åæ¶ï¼ä»»å¡è¿å ¥å°±ç»ªç¶æï¼å¹¶çå¾ è°åº¦å¨ä¸ºå®åé è¿è¡çæºä¼ãå½ä»»å¡å¾å°è¿è¡çæºä¼ï¼ä»»å¡å¼å§æ§è¡ãå¤äºè¿è¡æçä»»å¡ä¼å¨ä»»ææ¶å»ç±è¿è¡æè¿å ¥ä¼ç æã就绪ææç»æç¶æãå ¶ä¸è¿å ¥ä¼ç ææ¯ä»»å¡ç主å¨è¿ç¨ï¼è¿ä¸»è¦æ¯ä»»å¡è°ç¨äºå æ ¸æä¾çä¼ç å½æ°ï¼ä»»å¡å¨ä¼ç ç¶æï¼å¦æ没æå ¶ä»ä»»å¡å¤éå®ï¼å®å°æ°¸è¿ä¼ç ä¸å»ç´å°ç³»ç»å ³éï¼è¿ç§æ¹å¼ä¹å¯ç¨äºä»»å¡åæ¥ãçå¾ ç¶æ主è¦ç±ä¸¤ç§åå å¼èµ·ï¼ä¸ç§æ¯çå¾ æäºä»¶çåçï¼å¦çå¾ ä¿¡å·éï¼ç¬¬äºç§ä¸ºä»»å¡ä¸»å¨çå¾ å¤å°ä¸ªtickãæåï¼ä»»å¡å¯ä»¥å°èªå·±ææ»è¿å ¥ç»ææã
4.4.2ä»»å¡æ§å¶
ä»»å¡æ§å¶åï¼TCBï¼å¯ä¸å°æè¿°äºä¸ä¸ªä»»å¡çå±æ§ãä¸æ¦ä»»å¡å»ºç«äºï¼ä»»å¡æ§å¶åä¸çå个å¼å°è¢«èµå¼ãä»»å¡æ§å¶åæ¯ä¸ä¸ªæ°æ®ç»æï¼å½ä»»å¡çCPU使ç¨æ被å¥å¤ºæ¶ï¼TCBä¿åäºè¯¥ä»»å¡çç¶æåå ¶ä»ä¿¡æ¯ãå½ä»»å¡éæ°å¾å°CPU使ç¨ææ¶ï¼TCBè½ç¡®ä¿ä»»å¡ä»è¢«ä¸æçç¹ä¸æ¯«ä¸å·®å°ç»§ç»æ§è¡ãTCBå ¨é¨é©»çå¨RAMä¸ãTCBå¨ä»»å¡åå§åçæ¶å被建ç«ãä»»å¡æ§å¶åæ°æ®ç»æå¦ä¸æ示ï¼
typedef struct task_ctrl_blk{
stk_t *pstack;
stk_t *pstk;
list_t link;
uword_t id;
uword_t prio;
uword_t slice_time;
uword_t exe_time;
word_t delay_time;
uword_t status;
list_t task_link;
}tcb_t;
å ¶ä¸ï¼
·pstackï¼æåå½åä»»å¡çæ 顶ãæ¯ä¸ªä»»å¡æèªå·±çæ ï¼å°¤ä¸ºéè¦çæ¯ï¼æ¯ä¸ªä»»å¡çæ ç容éå¯ä»¥æ¯ä»»æçãæäºåä¸å æ ¸è¦æ±ææä»»å¡æ ç容éé½ä¸æ ·ï¼é¤éç¨æ·åä¸ä¸ªå¤æçæ¥å£å½æ°æ¥æ¹åä¹ãè¿ç§éå¶æµªè´¹äºRAMï¼å½åä»»å¡éè¦çæ 空é´ä¸åæ¶ï¼ä¹å¾æä»»å¡ä¸é¢ææ 容ééæ±æå¤çåé æ 空é´ãpstackæ¯TCBæ°æ®ç»æä¸å¯ä¸ä¸ä¸ªè½ç¨æ±ç¼è¯è¨æ¥å¤ç½®çåéï¼å¨ä»»å¡åæ¢æ®µç代ç ä¹ä¸ä½¿ç¨ï¼æpstackæ¾å¨æ°æ®ç»æçæåé¢ï¼ä½¿å¾ä»æ±ç¼è¯è¨ä¸å¤çè¿ä¸ªåéæ¶è¾ä¸ºå®¹æï¼
·pstkï¼æåä»»å¡çæ 顶ï¼å¨ä»»å¡ç»æèåæ¶ä»»å¡æ 空é´æ¶ä½¿ç¨ï¼è¿ä¸»è¦ç±å å管çé¨åç缺é·æå¼èµ·çï¼
·linkï¼ç¨äºè¿æ¥ä»»å¡æ§å¶åãå æ ¸å¨è¿è¡æ¶ï¼é¤äºä»»å¡æ§å¶åå¤ï¼ç³»ç»ä¸åå¨å¾å¤ç±»åçé¾è¡¨ï¼æ¯å¦ä¿¡å·éé¾è¡¨ã为äºå¯¹è¿äºé¾è¡¨æä¸ä¸ªç»ä¸çæä½ï¼æ以å®ä¹äºlist_tç±»åæ¥ç»ä¸è¿äºæä½ãå¦æä¸ä½¿ç¨list_tï¼TCBé¾è¡¨æä½éè¦å®ç°ä¸ç»é¾è¡¨æä½å½æ°ï¼ä¿¡å·ééè¦å¦å¤ä¸ç»é¾è¡¨æä½å½æ°ï¼è¿æ ·ä½¿ç¨åºåå¾åé¿ï¼
·idï¼ä»»å¡çIDå·ï¼ç¨äºå¯ä¸æ è¯ä¸ä¸ªä»»å¡ãæ¯ä¸ªä»»å¡é½æä¸ä¸ªå¯ä¸çIDå·ï¼éè¦å¨ä»»å¡å建çæ¶åæå®IDï¼å¦ææå®çIDå·å·²ç»åå¨ï¼åæ¤ä»»å¡ä¸è½è¢«å建ï¼
·prioï¼ä»»å¡çä¼å 级ï¼æ¤å¼èå´ä¸º0ï½ï¼å¼è¶å°ä»£è¡¨ä¼å 级è¶é«ãå æ ¸å°å°½åä¿è¯é«ä¼å 级çä»»å¡ä¼å è¿è¡ï¼å¹¶ä¸å 许任å¡å¯ä»¥æ¯ç¸åçä¼å 级ï¼
·slice_timeï¼è¡¨ç¤ºä»»å¡åºè¯¥è¿è¡çæ¶é´çæ°ãè½ç¶å æ ¸ä¿è¯é«ä¼å 级çä»»å¡ä¼å å¾å°è¿è¡çæºä¼ï¼ä½å¯¹äºç¸åä¼å 级çä»»å¡æ¥è¯´ï¼æ¶é´çæ¹å¼æ¯æ¯è¾å¥½çè°åº¦çç¥ï¼
·exe_timeï¼ä¿åäºä»»å¡å·²ç»è¿è¡çæ¶é´ç个æ°ãè¿ä¸ªåéå¨æ¯æ¬¡ç³»ç»æ¶éä¸æ产çæ¶è¢«ç´¯å 1ï¼å¦æexe_timeçå¼è¾¾å°slice_timeï¼å说æ该任å¡å·²ç»è¿è¡äºç»å®æ¶é´ççæ¶é´ï¼è¿æ¶ï¼å æ ¸å°æè¿è¡æºä¼è®©ç»å ¶ä»çï¼ä¸ä¼å 级çäºæ¤ä»»å¡çå ¶ä»ä»»å¡ãå¦ææ¤ä¼å 级ä¸æ²¡æå ¶ä»ä»»å¡ï¼ä¸æ¤ä»»å¡æ²¡æèªå·±æ¾å¼è¿è¡æºä¼ï¼æ¤ä»»å¡å°ç»§ç»è¿è¡ï¼
·delay_timeï¼ç¨äºè®°å½ä»»å¡çå¾ çæ¶é´çæ°ï¼æ¯ä¸ªç³»ç»æ¶éä¸æ产çæ¶ï¼æ¤å¼èªå1ï¼å¦ædelay_timeçå¼ä¸º0ï¼è¯´æ该任å¡ççå¾ æ¶é´å·²ç»è¶ æ¶ãå æ ¸å°æ¤ä»»å¡ä»çå¾ éåä¸å é¤ï¼å¹¶ç§»å¨å°±ç»ªéåä¸ï¼è¿æ ·è¯¥ä»»å¡å°±ä¼è¢«è°åº¦å¨å¨éå½çæ¶åè°åº¦ï¼
·statusï¼æ示äºä»»å¡çè¿è¡ç¶æï¼ç®åï¼æ¤å¼è¡¨ç¤ºçå«ä¹æ就绪ï¼ä¼ç ï¼çå¾ åé»å¡ï¼å¨ä»»å¡ç¶æ转æ¢å¾4-4ä¸çè¿è¡ææªè½è¡¨ç¤ºåºæ¥ï¼è¿æ¯å 为å¨å®ç°æ¶ï¼å°±ç»ªæåæ¶ä¹è¡¨ç¤ºäºè¿è¡æï¼
·task_linkï¼ç¨äºå°ç³»ç»ä¸ææçä»»å¡è¿æ¥æ循ç¯åé¾è¡¨ã
4.4.3 ByCoreä¸çåç§éå
å¨å¾4-4ä¸æè¿°çæ¯ä¸ªç¶æé½å¯¹åºä¸ä¸ªæä¸ç»éåãå¦å¤äºå°±ç»ªç¶æä¸ç就绪éåï¼å¤äºçå¾ æä¸ççå¾ éåççã
4.4.3.1 就绪éå
就绪éåä¸çä»»å¡å·²ç»å¾å°é¤CPU以å¤çææèµæºãè°åº¦å¨ä¹å°å¨å®ä»¬ä¸æç §ä¼å 级åæ¶é´çç»åççç¥éæ©ä¸ä¸ªå°±ç»ªä»»å¡è·å¾CPUãå¨å®ç°ä¸ï¼ä»»å¡è¢«åæï¼0ï½ï¼ç§ä¼å 级ï¼ä¸ä¸åçä»»å¡åä¼æç¸åä¼å 级ãå æ ¸å°ç¸åä¼å 级çä»»å¡ç»æä¸ä¸ªåé¾è¡¨ã为äºå¨è°åº¦è¿ç¨ä¸è½å¿«éçæ£ç´¢åºæé«ä¼å 级çä»»å¡éåï¼å°æ´ä¸ªå°±ç»ªéåç¨ä¸ä¸ªå ¨å±æ°ç»list_t ptask[MAX_PRIO]ï¼å ¶ä¸MAX_PRIO=ï¼æ¥ä½ä¸ºä¸åä¼å 级就绪éåçé头ï¼å¦ptask为ä¼å 级æ¯iç就绪éåçé头ãæ´ä¸ªå°±ç»ªéåå¦å¾4-5æ示ã
4.4.3.2 çå¾ åä¼ç éå
å½ä»»å¡å¤äºçå¾ æä¼ç ææ¶ï¼å æ ¸å¿ é¡»å°è¯¥ä»»å¡çTCBä»å°±ç»ªéåä¸å é¤ï¼ç¶åæå ¥å°çå¾ æè ä¼ç éåãå¨å½åçå®ç°ä¸ï¼å æ ¸åªåå«ç»´æä¸ä¸ªçå¾ éååä¼ç éåï¼è¿ä¸¤ä¸ªéåä¸å就绪éåæç §ä¼å 级çé«ä½è¢«åç»ï¼æ¢å¥è¯è¯´ï¼çå¾ éååä¼ç éåå°ææçä»»å¡TCBè¿æä¸ä¸ªåé¾è¡¨ã
pdelayåpsleepåå«ä¸ºçå¾ éååä¼ç éåç对头æéãè¿ä¸¤ä¸ªéåçç»ç»è½ç¶ä¸æ ·ï¼ä½æ¯å®ä»¬åèªéåä¸çä»»å¡è¢«æ¿æ´»çæ¶æºå´ä¸åï¼pdelayææéåä¸çä»»å¡ä¼è¢«å æ ¸çtickæ¿æ´»ï¼èå¤å¨psleepéåä¸çä»»å¡åªè½ç±å ¶ä»çä»»å¡å°å ¶å¤éãå©ç¨è¿ä¸¤ç§éåé åä¿¡å·éçä»»å¡åæ¥ãéä¿¡æºå¶å¯ä»¥å®ç°è¾ä¸ºå¤æãçµæ´»çä»»å¡æ§å¶æºå¶ã
å½ä»»å¡å¤å¨çå¾ ææ¶ï¼ä»»å¡è¿å¯è½å¤å¨å¦å¤çéåä¸ï¼è¿ä¸ªéåå°±æ¯ä¸ºçå¾ æ个信å·éèç»ç»æçéåãè¿ä¸ªéåå°å¨ä¿¡å·éå®ç°çå 容ä¸è®ºè¿°ã
4.4.4è°åº¦å¨å®ç°
å¨æ´ä¸ªä»»å¡ç®¡çä¸ï¼ä»»å¡è°åº¦æ çæ¯ç³»ç»çæ ¸å¿ï¼ä»»å¡è°åº¦é常ç±å æ ¸ä¸çè°åº¦å¨å®ç°ãè°åº¦å¨çå®ç°ä¸ä»»å¡è¿è¡ç¶æè¿ç§»ï¼ä»»å¡éåæå¯åçèç³»ï¼å¯ä»¥è¯´ä»»å¡è¿è¡ç¶æè¿ç§»åä»»å¡éåå³å®äºè°åº¦å¨çå®ç°ãè°åº¦å¨ç主è¦ä½ç¨æ¯å¨å°±ç»ªéåä¸éæ©ä¼å 级æé«çä»»å¡è¿è¡ï¼å¦æä¼å 级æé«çä»»å¡ä¸æ¢ä¸ä¸ªï¼åéæ©é头çä»»å¡è¿è¡ãè½ç¶æ´ä¸ªè°åº¦å¨çåè½å¯ä»¥ç¨ä¸é¢çå å¥è¯æ¦æ¬ï¼ä½è°åº¦å¨çå®ç°è¿è¿æ²¡æé£ä¹ç®åï¼ä¸»è¦å°é¾æ¥æºä¸é¢çåå ï¼
1ï¼ç¡®å®è°åº¦å¨è¿è¡çæ¶æºï¼
2ï¼ä¸æå¤çç¨åºå®äºåï¼æ¯æ§è¡å½åä»»å¡ï¼è¿æ¯é©¬ä¸è°åº¦ï¼
3ï¼è°åº¦å¨çæ§è½ï¼
4ï¼è°åº¦ä¸ä¼´éçä»»å¡ä¸ä¸æçåæ¢ï¼å°¤å ¶å¯¹å¤çå¨æ¶ææå ³çä¸ä¸æï¼åºè¯¥è®¾è®¡è¯å¥½çæ¥å£ä»¥ä¾¿ç§»æ¤ã
以ä¸è¿äºåºæ¬é®é¢é½æ¯åºè¯¥èèçï¼éçå æ ¸åè½çæ©å åå®åï¼è°åº¦å¨å¯è½ä¼å¨åå 没æ¶åå°çå°æ¹è¢«è°ç¨ï¼è½ç¶å¨è¿äºæ°å°æ¹ä¸è¦æ±è½æ£ç¡®è°åº¦ï¼ä½è³å°ä¸è½å¼èµ·ç³»ç»å´©æºã对äºå®æ¶ç³»ç»æ¥è¯´ï¼ä¸æå¤çç¨åºæ§è¡å®æ¯åï¼åºè¯¥é©¬ä¸æ§è¡è°åº¦ï¼è¿æ¯å 为ä¸æ常常伴éçææ°çä»»å¡å¤äºå°±ç»ªéåä¸ï¼å¨è¿äºä»»å¡ä¸å¯è½ä¼æé«ä¼å 级çä»»å¡å°±ç»ªï¼æ以å¨å®æ¶å æ ¸ä¸è¦æ±å¿ é¡»æ¯æå¨ä¸æå马ä¸è¿è¡ä»»å¡è°åº¦ãä¸ç®¡æ¯å¨å®æ¶ç³»ç»ï¼è¿æ¯å¨å ¶ä»ç³»ç»ä¸ï¼è°åº¦å¨æ§è½æ¾å¾é常éè¦ï¼å¸¸å¸¸è¦æ±è°åº¦å¨çæ¶é´å¤æ度è³å°åºè¯¥ä¸ºçº¿æ§ï¼å½ç¶å¸¸æ°æ¯æ好çã对äºä¸åçå¤çå¨æ¶æï¼å ¶æä¾çå¯åå¨ï¼ç¶æå¯åå¨é½æå¾å¤§çåºå«ï¼è°åº¦å¨åºè¯¥çåºè¯å¥½çæ¥å£ç»ä¸åçå¤çå¨ï¼ä»¥ä¾¿ä»¥åæ¹ä¾¿ç§»æ¤ã
å¨å®ç°è°åº¦å¨æ¶ï¼åºæ¬ä¸èèäºä¸é¢çå 个åºæ¬é®é¢ãæ ¹æ®ä¸ä¸¤è论述çä»»å¡ç¶æè¿ç§»ãå æ ¸éåçæ¹é¢çå 容ï¼å¨byCoreä¸å®ç°äºä¸ä¸ªå«scheduler( )çè°åº¦ç¨åºãå¨scheduler( )ä¸è°ç¨å 个ä¸ç¡¬ä»¶ç¸å ³çå½æ°ï¼è¿å 个å½æ°ä¸»è¦ç¨äºå®ç°ä»»å¡ç¡¬ä»¶ä¸ä¸æçåæ¢ï¼è¿é¨å代ç ç¨æ±ç¼å®æï¼å¹¶ä¸ä¸å¤çå¨æå ³ãå¨ç°ä»£æä½ç³»ç»ä¸ï¼ä¼æå¾å°ä¸é¨å使ç¨æ±ç¼è¯è¨å®ç°ï¼è¿æ¯å 为åç§å¤çå¨æ¶æçå¯åå¨é½æ²¡æ被æ å°å°å¯è§çä½ç½®ï¼ä¹å³è±¡Cè¿æ ·çé«çº§è¯è¨ä¸è½ç´æ¥å¯¹å ¶æä½ï¼ç¶èï¼å¨ä»»å¡åæ¢æ¶ï¼ç¡¬ä»¶ä¸ä¸æä¼ä¿åå°ä»»å¡å æ ä¸ï¼è¿ç§æä½ä½¿å¾é«çº§è¯è¨æ è½ä¸ºåã
该è°åº¦ç¨åºçç®æ³é常ç®åï¼é¦å ï¼å¨å 许è°åº¦çæ åµä¸ï¼å¦ææé«ä¼å 级任å¡å°±ç»ªï¼åè¿è¡ä»»å¡åæ¢ãä»»å¡åæ¢ä¼åçå¨ä¸¤ç§å¤çå¨æ¨¡å¼ä¸ï¼ä¸ç§æ¯å¤çå¨å¤äºæ£å¸¸çè¿è¡æï¼å¦ä¸ç§åçå¨ä¸ææä¸ãå æ¤ï¼å æ ¸ä½¿ç¨ä¸¤ç»å½æ°åå«å¤çè¿ä¸¤ç§æ åµãå¨ä¸¤ç§å¤çå¨ç¶æä¸é½æâå¯å¨æ°ä»»å¡âåâæ°æ§ä»»å¡åæ¢âå½æ°æ¥å£å®ç°æåçä»»å¡åæ¢å·¥ä½ï¼è¿ä¸¤ç»å½æ°ä¸å¤çå¨æå ³ï¼å¹¶ç±æ±ç¼å®ç°ãå¨åé¢çå æ ¸ç§»æ¤ä¸èå°è¯¦ç»è®ºè¿°è¿äºå½æ°æ¥å£çå®ç°ã
å¯å¨æ°ä»»å¡ç主è¦åè½æ¯å°ä»»å¡çåå§ä¸ä¸æå¤å¶ç»å¤çå¨çå个å¯åå¨ï¼è¿å æ¬éç¨å¯åå¨ãå æ æéå¯åå¨ãç¶æå¯åå¨åæ令æéå¯åå¨çãè¿äºåå§å¼å¨æ°ä»»å¡å建æ¶è¢«åå§åãå¯å¨æ°ä»»å¡åççæ¶æºæ两ç§æ åµï¼ç¬¬ä¸ç§æ åµæ¯å æ ¸åå§åå®æ¯åï¼å¯å¨ç¬¬ä¸ä¸ªä»»å¡ï¼ç¬¬äºç§æ åµä¸ºä»»å¡ä¸»å¨ç»æåï¼å½åä»»å¡æé被置ä½NULLæ¶ã
ä»»å¡åæ¢åçå¨ä¸¤ä¸ªä»»å¡ä¹é´ï¼ä¸ä¸ªæ¯è¢«æ¢åæ¢åºå»çä»»å¡ï¼å¦ä¸ä¸ªæ¯å°è¦æ§è¡çä»»å¡ãä»»å¡åæ¢å½æ°ä¹ç±æ±ç¼ä»£ç å®ç°ãå®æè¦å®æçå·¥ä½ä¸»è¦æ两个ï¼ç¬¬ä¸æ¯å°æ§ä»»å¡ï¼è¢«æ¢åæ¢åºå»çä»»å¡ï¼çä¸ä¸æä¿åå°èªå·±çæ ä¸ï¼ç¬¬äºæ¯æ°ä»»å¡ï¼å°è¦æ§è¡çä»»å¡ï¼å°ä¿åå¨æ ä¸çä¸ä¸æå¤å¶å°å¤çå¨çç¸å ³å¯åå¨ä¸ãä»»å¡åæ¢çåçæ¶æºæï¼
· å½åä»»å¡æ§è¡æ¶é´å°ï¼
· å½åä»»å¡è¢«é«ä¼å 级任å¡æ¢å ï¼
· å½åä»»å¡ä¼ç ï¼æçå¾ æäºä»¶åçã
ç±äºä»»å¡åæ¢ä¸å¤çå¨å ³ç³»ç´§å¯ï¼æ¬ç« åªä»ç»ä¸å¤çå¨æ å ³é¨åçå®ç°ï¼ä¸å¤çå¨æå ³çé¨åå°å¨å æ ¸ç§»æ¤ä¸ç« ä¸è¯¦ç»è®ºè¿°ã
4.4.5 å æ ¸æ¶éå®ç°
å¨å æ ¸æ¶éä¸èä¸ï¼è®ºè¿°äºå æ ¸æ¶éçä½ç¨ä»¥ååè½ãä½å¨å½åå®ç°ä¸ï¼æ ¹æ®å®é çæ åµå¯¹å æ ¸æ¶éçåè½åäºè£åï¼å æ ¸æ¶éåè½ä¸»è¦ç±systick( )å½æ°å®ç°ã
4.4.6 ä»»å¡ç®¡çAPIå®ç°
ä»»ä½å æ ¸é½åºè¯¥æä¾ä¸ç»ä¸°å¯çAPIå½æ°ä¾ç¨æ·ä½¿ç¨ãåUNIXãLinuxãWindowsè¿äºå¤§åæä½ç³»ç»æä¾äºå¤§éçAPIãå½ç¶è¿äºAPIçæ°éãç§ç±»ï¼ç¨æ³çé½ä¼éçç³»ç»çä¸åèä¸åãä½å¨ä»»å¡ç®¡çæ¹é¢ä¸é¢å 个APIæ¯å¿ ä¸å¯å°çï¼ä»»å¡å建ãæ¤éãä¼ç ãçå¾ åå¤éçæä½ãä¸é¢å°æè¿°å个APIçå®ç°ç®æ³ã
4.4.6.1 ä»»å¡å建
å½ç¨æ·è°ç¨ä»»å¡å建å½æ°æ¶ï¼å æ ¸åºè¯¥å®æåªäºå·¥ä½å¢ï¼è¿åå æ ¸çå®ç°æ¹å¼ï¼å¤æç¨åº¦å¯åç¸å ³ãå½åä»»å¡ç®¡çå®ç°ä¸ï¼æä¾ä¸¤ä¸ªä»»å¡å建å½æ°osInitTask( )åosCreateTask( )ãè¿ä¸¤ä¸ªå½æ°çååå¦ä¸æ示ï¼
void osInitTask(void (*pTask)()ï¼ uword_t TaskIDï¼ uword_t Prioï¼ uword_t Timeï¼ uword_t StkSize);
void osCreateTask(void (*pTask)()ï¼ tcb_t *pTcbï¼ uword_t TaskIDï¼ uword_t Prioï¼ uword_t Timeï¼ stk_t *pStkï¼ uword_t StkSize);
è¿ä¸¤ä¸ªå½æ°ç主è¦åºå«ä¸ºä»»å¡éè¦çTCBåæ 空é´æ¯å¦ä¸ºå¨æå建ãosInitTask( )å½æ°åªéè¦ä¼ éä»»å¡èµ·å§å°å((*pTask)())ï¼ä»»å¡ID(TaskID)ï¼ä¼å 级(Prio)ï¼è¿è¡æ¶é´ç(Time)åæ 大å°(StkSize)ï¼ä»»å¡çæ åTCB空é´é½ä¸ºå¨æå建ï¼æ åTCB空é´å¤äºç³»ç»çå åºãosCreateTask( )å½æ°é¤äºä»¥ä¸çåæ°å¤è¿æ ¼å¤éè¦*ptcbå*pstk两个åæ°ï¼è¿ä¸¤ä¸ªåæ°åå«æåä»»å¡çTCBèµ·å§å°ååæ èµ·å§å°åï¼è¿ä¸ªå½æ°ç空é´éè¦å¨ç¼è¯æ¶å¶å®ï¼æ åTCB空é´å±äºå æ ¸åºãè½ç¶å®ä»¬éè¦çåæ°ä¸åï¼ä½å®ä»¬çå®ç°ç®æ³æ¯ç¸åçã
å¨æè¿°ç®æ³ä¹åéè¦å¯¹ä»»å¡æ åç®åç论述ï¼æ çä½ç¨æ¯ä¿è¯ä»»å¡æ£å¸¸è¿è¡ï¼å®ä¿åäºä»»å¡ä¸å个å½æ°çè°ç¨è½¨è¿¹åè¿åå°åã对äºå¤çå¨æ¥è¯´é½æä¾ä¸ä¸ªç¬ç«çå¯åå¨æè å ¶ä»ç©ºé´ä¿åçæ 顶çä½ç½®ï¼åç§å¤çå¨æ¶æ对æ 顶åæ åºçå®ä¹ä¹ä¸ç¸åï¼è¿ä¸»è¦æ两ç§ï¼ä¸æ¯æ 顶çå°åå¼å¤§äºæ åºï¼å ¶äºç¸åã第ä¸ç§ä¼´éçæ å¾ä¸å¢é¿ï¼ç¬¬äºç§æ å¾ä¸å¢é¿ã为äºä¾¿äºç§»æ¤å æ ¸ï¼å æ ¸åºè¯¥å¤çè¿ä¸¤ç§æ åµãé¤äºè¿ä¸¤ç§æ åµï¼æ è¿å为满æ å空æ 两ç§ï¼æ以å æ ¸å¿ é¡»èèè¿å ç§æ æ¹å¼ãå æ¤å¨å®ç°ä¸æä¾ä¸ç»å®æ¥åºå¯¹è¿äºæ åµï¼å¦ä¸æ示ï¼
#define UP 1
#define DOWN 0
#define FULL 1
#define EMPTY 0
#define STACK DOWN
#define STACK_STYLE FULL
UPåDOWNå®ä¹äºæ çå¢é¿æ¹åï¼FULLåEMPTY说æäºæ¯æ»¡æ è¿æ¯ç©ºæ ãæåç¨STACKåSTACK_STYLEèå说æçæ£çæ å·¥ä½æ¹å¼ã
论述å®äºä»»å¡å建æ¹é¢éè¦æ³¨æçä¸äºé®é¢ï¼ä¸é¢è®ºè¿°ä»»å¡å建çç®æ³ãä»»å¡å建è¿ç¨ä¸»è¦å å«åå§åTCBåæ åºï¼å¦æè°ç¨osCreateTask( )å½æ°ï¼å¨åå§ååè¿éè¦åå æ ¸ç³è¯·TCBåæ 空é´ãå¾4-9为osInitTask( )å½æ°å建æ°ä»»å¡çæµç¨å¾ã
4.4.6.2 ä»»å¡æ¤é
æ¯ä¸ªä»»å¡é½æä¸ä¸ªçå½å¨æï¼å æ¬ä»»å¡å建ãè¿è¡ä¸æ¤éãä»»å¡æ¤éä¹å¯ç§°ä¸ºå¨å¤ä»»å¡ç³»ç»ä¸ï¼ä»»å¡ä¹å¯ä»¥è¢«ä»»ä½ç¨æ·ææ»ï¼ä¹å¯ä»¥æç¹æ®ç¨æ·ææ»ãæ¯å¦ï¼ææ»ä»»å¡ãä»»å¡æ¤éçæ¹å¼æå¾å¤ç§å®ç°æ¹å¼ãä¸è¬æ åµä¸ï¼ä»»å¡å¯ä»¥è¢«å æ ¸ææ»ãå¨Linuxä¸æäºä»»å¡å¯ä»¥è¢«ä»»ä½ç¨æ·ææ»ï¼æäºååªè½ç±rootç¨æ·ææ»ãå¨åç¨æ·ç³»ç»ä¸ï¼ç¨æ·ä»»å¡è½è¢«å æ ¸ææ»ï¼ä¹å¯ä»¥è¢«å ¶ä»ç¨æ·ä»»å¡ææ»ï¼ä½åç§æ åµä¸å¤è§ãæ ¹æ®å®é çæ åµï¼å½å对任å¡æ¤éçå®ç°ä¸ºåªæä»»å¡èªå·±ä¸»å¨ææ»èªå·±ã
å¨å½åå®ç°ä¸ï¼ä»»å¡æ¤éçå½æ°ä¸ºosKill( )ï¼å¦æå½åä»»å¡å®æäºèªå·±ç使å½ï¼å¯ä»¥è°ç¨è¯¥å½æ°ãosKill( )ä¼éæ¾æ该任å¡çç¸å ³èµæºï¼å¦TCBåæ 空é´çãosKill( )åªéæ¾æå æ ¸åé çèµæºï¼å¦æä»»å¡çè¿è¡è¿ç¨ä¸ç³è¯·äºå ¶ä»èµæºï¼åºè¯¥å¨è°ç¨osKill( )åéæ¾æè¿äºèµæºãä»»å¡å¨å建æ¶æ两个å建å½æ°osInitTask( )åosCreateTask( )ï¼osKill( )åªè½éæ¾osInitTask( )çèµæºï¼èosCreateTask( )çèµæºä¼è¢«ä¿çä¸æ¥ãè¿æ¯å 为osCreateTask( )æ使ç¨ç空é´å±äºå æ ¸ç©ºé´ï¼èä¸å±äºç³»ç»å¨æå å管ççå åºï¼è¿é¨ååºå没æç¸å ³çæ°æ®ç»æ管çï¼ä¸æ¦éæ¾ç³»ç»å°±ä¼å´©æºãæ ¹æ®ä¸é¢çæè¿°å¯ä»¥è®¾è®¡åºosKill( )çç®æ³ï¼è¯¥ç®æ³å¦å¾4-æ示ã
4.4.6.3 ä»»å¡ä¼ç ä¸å¤é
å½ä»»å¡éè¦çå¾ æäºèµæºçæ¶åï¼å¯ä»¥å°èªå·±è®¾ä¸ºä¼ç ç¶æï¼æè¿è¡çæºä¼è®©ç»å ¶ä»ä»»å¡ï¼å½æçå¾ çèµæºæè äºä»¶åçæ¶ï¼ä»»å¡å被å¤é继ç»è¿è¡ãè¿ç§æ¹å¼ä¹æ¯è§£å³ä»»å¡åæ¥çä¸ç§åæ³ï¼å¦ä»»å¡Aä¸ä»»å¡Båä½å®ææ项任å¡ï¼ä¸Aå®æåBæè½è¿è¡ï¼ä¼ç ä¸å¤éæºå¶å¯ä»¥å¾å®¹æå°è§£å³æ¤é®é¢ãå æ ¸å®ç°äºä¸¤ä¸ªå½æ°åå«å®æè¿ä¸¤é¡¹å·¥ä½ï¼ä»ä»¬æ¯osSleep( )åosWakeUp( )ï¼osSleep( )æ¯ä»»å¡ç主å¨è¡ä¸ºï¼å æ¤ä¸éè¦åæ°ï¼osWakeUp( )éè¦ä¸ä¸ªåæ°TaskIDï¼è¯¥åæ°æå®äºéå¤éä»»å¡çIDå·ã
å½ä»»å¡è°ç¨osSleep( )åï¼è¯¥ä»»å¡çTCBä»å°±ç»ªéåä¸å é¤ï¼å¹¶æå ¥å°ä¼ç éåï¼å¦å¾4-6æ示ï¼ï¼ç¶åéæ°è°åº¦ãå¦æä»»å¡Aéè¦å¤éæ£å¨ä¼ç çä»»å¡Bï¼é£ä¹Aå¯ä»¥è°ç¨osWakeUp( )å½æ°ï¼å¹¶ä¼ å ¥BçIDãosWakeUp( )å°±ä¼æ¥æ¾ä¼ç éåï¼å¦ææ¾å°ä»»å¡Bï¼åå°å®çç¶æ置为就绪ï¼å¹¶ä»ä¼ç éåå é¤æå ¥å°±ç»ªéåã
4.4.6.4 ä»»å¡çå¾
ä»»å¡çå¾ ä¸ä»»å¡ä¼ç çå®ç°åçé½ä¸æ ·ãä»»å¡å¨çå¾ ä¸æ®µæ¶é´ååè·å¾è¿è¡çæºä¼ï¼è¿ä¸ªæ¶åå®æçå¾ çäºä»¶æè èµæºæå¯è½ä¸å¯ç¨ï¼è¿ç¹åä»»å¡ä¼ç æ¯æå·®å¼çãä¾å¦ä»»å¡Aéè¦ä¸ä¸²å£I/Oéä¿¡ï¼ç±äºä¸²å£é度ç¸å¯¹è¾æ ¢ï¼ä»»å¡A大é¨åæ¶é´é½éè¦çå¾ ï¼å¦æä»»å¡Aå¨æ²¡ææ°æ®ä¼ è¾çæ¶åè¿å ¥çå¾ ç¶æï¼å°ä¼æ¾èæé«CPUå©ç¨çã
å æ ¸æä¾äºosWait( )å½æ°æ¥å®ç°æ¤åè½ï¼è¯¥å½æ°æ¥åä¸ä¸ªæ¶é´åæ°ï¼è¯¥åæ°è¯´æå½åä»»å¡çå¾ æ¶é´é¿çï¼è¯¥æ¶é´ä»¥ç³»ç»tick为åä½ãå½åä»»å¡è°ç¨æ¤å½æ°åï¼ä»»å¡ç¶æ被置为çå¾ æï¼TCBä»å°±ç»ªéåä¸å é¤ï¼å¹¶æå ¥å°çå¾ éåï¼æåè°åº¦scheduler( )ãçå¾ éåä¸ä¼ç éåç¸åï¼è§å¾6-7æ示ãosWait( )å½æ°çæµç¨å¾ä¸osSleep( )ç®æ³ç¸ä¼¼ï¼è¿éä¸åèµè¿°ã
æ¯æ¬¡ç³»ç»tickåçä¸ææ¶ï¼å æ ¸æ¶éä¸æå¤çç¨åºæ´æ°çå¾ éåä¸ä»»å¡ççå¾ æ¶é´åï¼ä¹å°±æ¯ä»»å¡æ§å¶åTCBçdelay_timeåä½å1æä½ï¼å½æ¤ååå°å°0æ¶ï¼è¡¨ç¤ºè¯¥ä»»å¡ççå¾ æ¶é´å·²å°ï¼è¿æ¶å®å°ä»çå¾ éåä¸å é¤ï¼å¹¶æå ¥å°å°±ç»ªéåä¸ãè¿äºå·¥ä½ä¹æ¯å æ ¸æ¶éä¸æå½åå¯ä¸éè¦åçäºæ ã
在μC/OS中,OSTaskCreateExt();这个函数的源码tpshop商城app源码每一个参数都应该填什么?
INT8U OSTaskCreateExt (void (*task)(void *pd), //建立扩展任务(任务代码指针)
void *pdata, //传递参数指针
OS_STK *ptos, //分配任务堆栈栈顶指针
INT8U prio, //分配任务优先级
INTU id, //(未来的)优先级标识(与优先级相同)
OS_STK *pbos, //分配任务堆栈栈底指针
INTU stk_size, //指定堆栈的容量(检验用)
void *pext, //指向用户附加的数据域的指针
INTU opt) //建立任务设定选项
{
#if OS_CRITICAL_METHOD == 3 //中断函数被设定为模式3
OS_CPU_SR cpu_sr;
#endif
OS_STK *psp; //初始化任务堆栈指针变量,返回新的栈顶指针
INT8U err; //定义(获得定义初始化任务控制块)是否成功
#if OS_ARG_CHK_EN > 0 //所有参数必须在指定的参数内
if (prio > OS_LOWEST_PRIO) { //检查任务优先级是否合法
return (OS_PRIO_INVALID); //参数指定的优先级大于OS_LOWEST_PRIO
}
#endif
OS_ENTER_CRITICAL(); //关闭中断
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //确认优先级未被使用,即就绪态为0
OSTCBPrioTbl[prio] = (OS_TCB *)1; //保留这个优先级,将就绪态设为0
OS_EXIT_CRITICAL(); //打开中断
//以下两为1堆栈才能清0
if (((opt & OS_TASK_OPT_STK_CHK) != 0x) || //检验任务堆栈,CHK=1
((opt & OS_TASK_OPT_STK_CLR) != 0x)) { //任务建立时是否清0,CLR=1
#if OS_STK_GROWTH == 1 //堆栈生长方向
(void)memset(pbos, 0, stk_size * sizeof(OS_STK)); //从下向上递增
#else
(void)memset(ptos, 0, stk_size * sizeof(OS_STK)); //从下向下递减
#endif
}
psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, opt); //初始化任务堆栈
err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt); //获得并初始化任务控制块
if (err == OS_NO_ERR) { //任务控制初始化成功
OS_ENTER_CRITICAL(); //关闭中断
OSTaskCtr++; //任务计数器加1
OS_EXIT_CRITICAL(); //打开中断
if (OSRunning == TRUE) { //检查是否有(某个)任务在运行
OS_Sched(); //任务调度,最高任务优先级运行
}
} else { //否则,任务初始化失败
OS_ENTER_CRITICAL(); //关闭中断
OSTCBPrioTbl[prio] = (OS_TCB *)0; //放弃任务,设此任务就绪态为0
OS_EXIT_CRITICAL(); //打开中断
}
return (err); //返回(获得并定义初始化任务控制块是否成功)
}
OS_EXIT_CRITICAL(); //打开中断
return (OS_PRIO_EXIST); //具有该优先级的任务已经存在
}
#endif