|
任务19负责处理485通信事务,我做了个指令通过485读取任务栈的工作情况,这个指令的代码如下:
void PrintKernelStackStatus(void)
{
OS_TCB *pTcb; //定义一个任务控制块指针
OS_STK_DATA sStackStatus; //用于读取任务栈使用情况
pTcb = &OSTCBTbl[0]; //指向第1个任务控制块
TX485();
usDelay(20);
sMyUart2.txNum = 0;
sMyUart2.txTotal = 47;
memcpy(sMyUart2.txBuf, "=============================================\r\n", 47);
USART_ITConfig(USART2, USART_IT_TC, ENABLE);
while(sMyUart2.txNum < sMyUart2.txTotal);
usDelay(2000);
TX485();
usDelay(20);
sMyUart2.txNum = 0;
sMyUart2.txTotal = 40;
memcpy(sMyUart2.txBuf, "优先级 栈使用 栈剩余 百分比 任务名\r\n", 40);
USART_ITConfig(USART2, USART_IT_TC, ENABLE);
while(sMyUart2.txNum < sMyUart2.txTotal);
usDelay(2000);
TX485();
usDelay(20);
sMyUart2.txNum = 0;
sMyUart2.txTotal = 47;
memcpy(sMyUart2.txBuf, "=============================================\r\n", 47);
USART_ITConfig(USART2, USART_IT_TC, ENABLE);
while(sMyUart2.txNum < sMyUart2.txTotal);
usDelay(2000);
while(pTcb != NULL)
{
memset(sMyUart2.txBuf, 0, 160);
//获得任务栈空间使用情况
OSTaskStkChk(pTcb->OSTCBPrio, &sStackStatus);
sprintf((char *)sMyUart2.txBuf,
"%03d %03d %03d %02d%% %s\r\n",
pTcb->OSTCBPrio,
sStackStatus.OSUsed,
sStackStatus.OSFree,
((sStackStatus.OSUsed * 100)/(sStackStatus.OSUsed + sStackStatus.OSFree)) + 1,
pTcb->OSTCBTaskName);
TX485();
usDelay(20);
sMyUart2.txNum = 0;
sMyUart2.txTotal = strlen((char *)sMyUart2.txBuf);
USART_ITConfig(USART2, USART_IT_TC, ENABLE);
while(sMyUart2.txNum < sMyUart2.txTotal);
usDelay(2000);
//指向上一个任务控制块
pTcb = pTcb->OSTCBPrev;
}
}
我用的波特率是1200,这个函数需要运行4.3秒的时间,从上面的源代码看,函数里面一直是独占CPU的控制权的,按说这时候所有其它任务都应该是被挂起了,但是我发现在这4.3秒的时间里,所有的高优先级任务确实还在运行,那么这里唯一的可能性就是在485发送数据的时候发生串口中断,在退出中断的时候进行了任务切换,难道真的是这样吗?
|
|