DSP

可靠的同步机制、通信机制

2019-07-13 12:46发布


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是用于控制加密芯片读写的时钟信号和数据信号。作者可能不知道这里的严重性:错误的操作时序有可能导致该芯片锁死,也即报废。
从这个问题中应该学习到一点:在编程中只做你该做的部分,不要触及无关的部分。