下面这段代码是在建立任务时,进行任务的初始化,将任务堆栈模拟成发生过一次中断的情况,原来的代码(加红色的部分),先把栈底指针减一,浪费了一个堆栈空间,然后又两次把任务函数的入口地址压栈,又浪费了一个空间。因此,这里多浪费了两个空间。可以将它修改为新代码处的代码,节省两个堆栈空间(4个字节)。经过实际硬件测试,是可以的。 opt = opt; top = (INT16U *)ptos;
/* 源代码 top--; // 16位的指针在减,一次变化两个字节 *top = (INT16U)task; // 保存的是任务起始地址, top--; *top = (INT16U)task; // 保存的是任务起始地址 top--; */
/* 新代码 opt = opt; top = (INT16U *)ptos; *top = (INT16U)task; // 保存的是任务起始地址, top--; */ // 使能中断 *top = (INT16U)0x0008; // 出栈弹出到SR,将使能中断
// 以下压入的是立即数,除R12作为入口参数之外,其他没有实际意义 top--; *top = (INT16U)0x0404; top--; *top = (INT16U)0x0505; top--; *top = (INT16U)0x0606; top--; *top = (INT16U)0x0707; top--; *top = (INT16U)0x0808; top--; *top = (INT16U)0x0909; top--; *top = (INT16U)0x1010; top--; *top = (INT16U)0x1111; top--; //保存参数地址 *top = (INT16U)p_arg; /* Pass 'p_arg' through register R12 */ top--; *top = (INT16U)0x1313; top--; *top = (INT16U)0x1414; top--; *top = (INT16U)0x1515; return ((OS_STK *)top);
|