int DSP_Reset(void)
{
printf(">>> RESET DSP ................../n");
GPIO_Init();
GPIO_SetIO(0, GPIO_OUTPUT);
GPIO_SetIO(1, GPIO_OUTPUT);
GPIO_SetIO(2, GPIO_OUTPUT);
GPIO_Clr(0);
GPIO_Clr(1);
GPIO_Clr(2);
Delayms(200);
GPIO_Set(0);
GPIO_Set(1);
GPIO_Set(2);
SystemSleep(16000);
return 0;
}
问题一
该函数用于主CPU复位DSP,等待DSP复位完毕,booting、运行到准备状态。
简单的delay一个时间并不是一个更好的选择,时间长了则延长整机的启动时间,短了则DSP还没ready,导致后面的控制命令无效。而且还不能发现DSP故障、通信线路故障。
建议:
通过串口的双向通道来查询彼此状态,实现同步机制。
对DSP:
while (1) {
Send echo request to uart;
Delay awhile;
Poll uart receive buffer;
if (got echo replay)
break;
}
对主CPU:
while (1) {
Delay awhile;
Poll uart receive buffer;
if (got echo request) {
Send echo reply to uart;
break;
}
if (Delayed too long) {
report error;
break;
}
}
如果考虑的再复杂点,DSP也有可能收不到CPU的reply的情况(比如,DSP的TX信号线是好的,但是RX信号线断了),那么DSP还应该在收到reply的时候再回馈一个reply2信息给主CPU。
想一想,这和你见过的什么协议比较相似?对了,TCP的3次握手。
问题二
GPIO_0是DSP的复位信号,
GPIO_1和GPIO_2是用于控制加密芯片读写的时钟信号和数据信号。作者可能不知道这里的严重性:错误的操作时序有可能导致该芯片锁死,也即报废。
从这个问题中应该学习到一点:在编程中只做你该做的部分,不要触及无关的部分。