µÄÖµËù¶ÔÓ¦µÄµØÖ·£¬ÕÒµ½Ëü±£´æµÄSPÖµ£¬¸ÃÖµ¶ÔÓ¦µÄÊÇ´æ´¢PU¼Ä´æÆ÷µÄ¶ÑÕ»Çø£¬¸ù¾ÝÕâ¸ö¶ÑÕ»ÇøµÄÖµ£¬¿ÉÒÔ¿´µ½±£´æµÄX£¬Y£¬A£¬B£¬ÒÔ¼°ÈÎÎñº¯ÊýµÄÊ×µØÖ·ÊÇ·ñÕýÈ·ÁË¡£ÔÚÕâÀÕâ¸öµØÖ·ÒªÖ¸ÏòOS_TaskIdle()£¬ÕâÑùÔÚOSStartHighRdy()ÔËÐк󣬳ÌÐò²ÅÄÜÌø×ªµ½OS_TaskIdle()ÔËÐС£
Èç¹ûûÓÐÌø×ª£¬Ôò˵Ã÷OsTaskStkInit()ÍÆÈë¶ÑÕ»³ö´íÁË¡£Õâʱ£¬¿ÉÒÔÖØÐµ¥²½Ö´ÐУ¬ÔÚ¿ÕÏÐÈÎÎñ´´½¨º¯ÊýOS_InitTaskIdle()¼ÓÈë¶Ïµã£¬ÔÙµ¥²½Ö´ÐУ¬Ö±µ½ÔËÐе½OSTaskStkInit()£¬½øÈë¸Ãº¯Êý£¬¹Û²ìµ÷ÊÔÆ÷ÖеĴ洢Æ÷ÇøÖжÔÓ¦µÄ¶ÑÕ»´¦£¬ÊÇ·ñ¶ÔCPU¼Ä´æÆ÷½øÐÐÁËÕýÈ·µÄ±£´æ£¬ÓÈÆä×¢ÒâÈÎÎñº¯ÊýµØÖ·µÄ´æ´¢¡£
ÔÚÎÒµ÷ÊÔ¹ý³ÌÖУ¬·¢ÏÖÈÎÎñº¯ÊýµÄµØÖ·Ã»Óб»ÕýÈ·µÄ±£´æ£¬µ¥²½Ö´ÐУ¬·¢ÏÖ³ÌÐòÖУ¬ÈÎÎñ´æ´¢Ò»¾äÓÐÎÊÌ⣬֮ºó¼ÓÒÔ¸ÄÕý£¬³ÌÐòÔËÐÐÕý³£¡£ ´úÂëÈçÏ£º
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt) {
INT16U *wstk; INT8U *bstk;
opt = opt; /* 'opt' is not used, prevent warning */ wstk=(INT16U *)ptos /* Load stack pointer */
wstk=(INT16U)p_arg;/* Simulate call to function with argument */ Ô³ÌÐò³ö´í´¦
//*--wstk = (INT16U)(((INT32U)task) >> 8); /* Put task return address on top of stack */
//*--wstk = (INT16U)(((INT32U)task) >> 8); /* Put task return address on top of stack */ Ð޸ĺó
*--wstk = (INT16U)((INT32U)task); /* Return address of simulated call¡£ Format: PCH:PCL */
*--wstk=(INT16U)0x2222; /* Y Register */
20
*--wstk=(INT16U)0x1111; /* X Register */ *--wstk=(INT16U)0xBBAA; /* D Register */
*--wstk = (INT16U)0x0080; /* CCR: Disable STOP, Int¡£ Level = 0¡£ User Mode */
bstk = (INT8U *)wstk; /* Convert WORD ptr to BYTE ptr to set CCR */
*--bstk = *(INT8U *)0x10;/* Save the GPAGE register */ *--bstk = *(INT8U *)0x17;/* Save the EPAGE register */ *--bstk = *(INT8U *)0x16;/* Save the RPAGE register */
*--bstk = (INT8U )task;/* Save the task's PPAGE register value*/ return ((OS_STK *)bstk);/* Return pointer to new top-of-stack */ }
2 ÑéÖ¤OSCtxSw()º¯Êý
ÔÚÒѾ֪µÀOSTaskStkInitº¯ÊýÕýÈ·ºó£¬¾Í¿ÉÒÔÔÚ³ÌÐòÖмÓÈëÒ»¸öÈÎÎñ£¬²¢²»¶ÏµÄÇл»µ½¿ÕÏÐÈÎÎñ¡£ÕâÀïÊÇʹÓõÄÈíÖжÏswiÀ´µ÷ÓÃOSCtxSwº¯ÊýµÄ¡££¨±ØÐë±£Ö¤³ÌÐòÖеÄÖжÏÏòÁ¿±íÖÐswiÖжÏÏòÁ¿µÄµØÖ·ÒѾÁ´½Óµ½ÁËOSCtxSwº¯ÊýÉÏ£© ´úÂëÈçÏ£º
#define TASK_STK_SIZE 1024
OS_STK TaskStartStk[TASK_STK_SIZE]; /* ¶¨ÒåÈÎÎñ¶ÑÕ» */ INT8U err;
TASKDATA TaskStartData; TASKDATA *pdata;
void TaskStart(TASKDATA *pdata); void main(void) {
Init_Settings();
TaskStartData¡£PPAGE1 = 0xFE; DisableInterrupts;
21
OSInit();
OSTaskCreateExt(TaskStart,
(void *)&TaskStartData, /* Arguments passed to TaskStart() */ (void *)&TaskStartStk[TASK_STK_SIZE-1], /* Set Top-Of-Stack */
9, /* Lowest priority level */ 0, /* Task ID,no use */ &TaskStartStk[0], /* Set Bottom-Of-Stack */ TASK_STK_SIZE,
(void *)0, /* No TCB extension */ OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking and clear stack */ OSStart(); }
void TaskStart(TASKDATA *pdata) {
pdata = pdata; while(1) {
OSTimeDly(1); } }
ÔÚÈÎÎñTaskStartÖÐÖ»ÓÐÒ»¸öOSTimeDly(1)£¬ÒòΪûÓÐÔÊÐíÖжϣ¬Ò²Ã»Óдò¿ªÊ±ÖÓ½ÚÅÄ£¬ËùÒÔOSTimeDly(1)²»»á·µ»Øµ½TaskStart¡£
µ¥²½Ö´ÐнøÈëOSTimeDlyº¯Êý£¬Ëü½Ó×ŵ÷ÓÃOS_Sched()£¬Èç¹ûÖжÏÏòÁ¿±íÕýÈ·£¬Ôò»áÔÙµ÷ÓÃOSCtxSw()£¬Ôڸú¯Êý·µ»Øºó£¬Ó¦¸Ã½øÈëOS_TaskIdle()¡£ 3 ÑéÖ¤OSIntCtxSw()ºÍOSTickISR()º¯Êý
ÔÚ²âÊÔ֮ǰ£¬ÐèÒª±£Ö¤Ê±ÖÓÖжÏÏòÁ¿Ö¸ÏòÁËʱÖÓ½ÚÅÄÖжϷþÎñ×Ó³ÌÐòOSTickISR()£¬È»ºó±ØÐëÔÚµÚÒ»¸öÈÎÎñ³ö£¬³õʼ»¯Ê±ÖÓ²¢¿ªÖжϣ¬¾ø¶Ô²»ÄÜÔÚ
22
OSStart()֮ǰ¿ªÆôʱÖÓÖжϡ£ ´úÂëÈçÏ£º
#define TASK_STK_SIZE 1024
OS_STK TaskStartStk[TASK_STK_SIZE]; /* ¶¨ÒåÈÎÎñ¶ÑÕ» */ OS_STK Task1Stk[TASK_STK_SIZE]; INT8U err;
TASKDATA TaskStartData; TASKDATA Task1Data; TASKDATA *pdata;
void TaskStart(TASKDATA *pdata); void Task1(TASKDATA *pdata); void main(void) {
Init_Settings();
TaskStartData¡£PPAGE1 = 0xFE; Task1Data¡£PPAGE1 = 0xFE; DisableInterrupts;
OSInit();
OSTaskCreateExt(TaskStart,
(void *)&TaskStartData, /* Arguments passed to TaskStart() */ (void *)&TaskStartStk[TASK_STK_SIZE-1], /* Set Top-Of-Stack */ 9, /* Lowest priority level */ 0, /* Task ID,no use */ &TaskStartStk[0], /* Set Bottom-Of-Stack */ TASK_STK_SIZE,
23
Ïà¹ØÍÆ¼ö£º