54929
GNSSを利用したアプリケーションをSPRESENSE SDKを使って開発しています。

`CONFIG_SDK_USER_ENTRYPOINT`を`nsh_main`とし、シェルからコマンドを実行した場合には、その後リセットボタンを押してリセットした後も問題なく何度でも起動が可能です。

一方で、`CONFIG_SDK_USER_ENTRYPOINT`を自分のアプリケーションに向けた場合、フラッシュ書き込み直後は正しく動作しますが、2回目の起動以降
(パワーオンリセットもリセットボタンによるリセットも) `ioctl(CXD56_GNSS_IOCTL_START)` が失敗し、GNSSが利用できません。

エントリーポイント内で `boardctl(BOARDIOC_INIT, 0);`
は実行していますが、nshから起動する場合と異なり、他にもすべき初期化などはありますでしょうか。

実際のエントリポイントはこちらです。  
<https://github.com/chibiegg/spresense-gnss-
logger/blob/8b812a6ace63f9d87cafc9f1bd77628e12a59518/logger/logger_main.c#L38>

# rcS を利用した場合

`CONFIG_SDK_USER_ENTRYPOINT`による起動ではなく、
`/etc/init.d/rcS`を作成し、起動スクリプトから実行した場合も同様の問題に当たりました。

# サンプルプログラムの場合

サンプルとして含まれている`gnss_factory`を有効にし、`gnss_factory_test`
をCONFIG_SDK_USER_ENTRYPOINTにした場合も以下のように2回目以降エラーになるため不思議です...

```

    Hello, FACTORY SAMPLE!!
    start error -1
    End of FACTORY Sample:-1
    
```
CC BY-SA 4.0
2019-05-02T06:47:59.807
54647
2019-05-13T12:03:41.173
2019-05-03T01:36:34.153
34158
34158
question
spresense
ENTRYPOINTを変更した場合、リセットした後にGNSSが開始できない
ソニーのSPRESENSEサポート担当です。

ご不便をお掛けしてしまって申し訳ございません。  
お問い合わせのGNSSの起動が失敗する件ついてお答えいたします。

`CONFIG_SDK_USER_ENTRYPOINT` の変更や `/etc/init.d/rcS` の利用による自動起動を行った場合、  
GNSS機能の準備が完了するよりも前にGNSSの操作が行われてしまうため、ご指摘のエラーが発生してしまいます。

この問題は、GNSSの機能を操作する前に1秒ほどsleepを挿入することで回避することができます。  
ご参考までに、修正案を示します。

```

    int gnss_factory_test(int argc, char *argv[]) {
       /* Initialize  */
    
       int ret = boardctl(BOARDIOC_INIT, 0);
    
    +  /* Workaround */
    +  sleep(1);
    
       if (ret == OK)
         {
           /* Call factory test */
    
           ret = gnss_factory_main(argc, argv);
         }
    
       return ret;
    }
    
```

現在、sleep が不要となるように、ソフトウェアの検討を行っております。  
ご不便をおかけしますが、いましばらくお待ちください。

今後ともSPRESENSEをどうぞよろしくお願いいたします。

SPRESENSEサポートチーム
CC BY-SA 4.0
2019-05-13T12:03:41.173
54929
2019-05-13T12:03:41.173
29520
54647
answer