

FacebookのSPRESENSEグループとの二重投稿です( _\- -)(_ _ _)ペコリ

rsp_sample.inoのメインスケッチをAdafruit GFX
Libraryのサンプルスケッチのmock_ili9341.inoで入替えたものです。  
最初の様々なパターンの描画は問題なく実行されますが、最後のloop()処理の繰返して下記のような例外が発生します。  
（loop() 38回目を終了した後に発生します）  
何かのセマフォ獲得に失敗しているように思えますが、  
・どのような例外なのでしょうか？  
・例外発生を取除く方策はありますか？

ハードウェア構成：SPRESENSE Main board + CXD5602PWBEXT1 + 2.8" Adafruit TFT
shield(ILI9341 SPI)  
実行時のシリアルコンソール表示

[code]

    ILI9341 Test!
    Display Power Mode: 0xCA
    MADCTL Mode: 0xA4
    Pixel Format: 0x82
    Image Format: 0xC0
    Self Diagnostic: 0x80
    Benchmark                Time (microseconds)
    Screen fill              160184
    Text                     93901
    Lines                    1018494
    Horiz/Vert Lines         20293
    Rectangles (outline)     15838
    Rectangles (filled)      335584
    Circles (filled)         255061
    Circles (outline)        446452
    Triangles (outline)      218124
    Triangles (filled)       234086
    Rounded rects (outline)  141263
    Rounded rects (filled)   446006
    Done!
    up_assert: Assertion failed at file:semaphore/sem_post.c line: 118 task: init
    up_dumpstate: sp:     0d04cc0c
    up_dumpstate: IRQ stack:
    up_dumpstate:   base: 0d044600
    up_dumpstate:   size: 00000800
    up_dumpstate:   used: 000000f8
    up_dumpstate: User stack:
    up_dumpstate:   base: 0d04ccb8
    up_dumpstate:   size: 00001fec
    up_dumpstate:   used: 000002b8
    up_stackdump: 0d04cc00: 0000007c 00000098 00000001 00000014 00000000 0d007fb7 0d03f4c8 0d011d09
    up_stackdump: 0d04cc20: 0d042a40 0d004e2d 0d0429c4 0d00185f 000007e0 000007e0 00000001 0d001805
    up_stackdump: 0d04cc40: 0d0382d2 0d0429c4 0d0382bd 0d005759 000f4240 0d0429c4 0d0429c4 0d000000
    up_stackdump: 0d04cc60: 0d03cb68 0d005795 000f4240 0d0429c4 0c295529 0d002e71 00000000 00000001
    up_stackdump: 0d04cc80: 0d042690 0d002ee7 0d053a98 0d03cb7c 0d03cb7c 0d0053c9 0d01fcdf 00000101
    up_stackdump: 0d04cca0: 00000000 00000000 00000000 0d008763 00000000 00000000 deadbeef 0d04ccc4
    up_taskdump: Idle Task: PID=0 Stack Used=0 of 0
    up_taskdump: hpwork: PID=1 Stack Used=584 of 2028
    up_taskdump: lpwork: PID=2 Stack Used=352 of 2028
    up_taskdump: lpwork: PID=3 Stack Used=352 of 2028
    up_taskdump: lpwork: PID=4 Stack Used=352 of 2028
    up_taskdump: init: PID=5 Stack Used=696 of 8172
    up_taskdump: cxd56_pm_task: PID=6 Stack Used=320 of 996
    up_taskdump: <pthread>: PID=7 Stack Used=312 of 1020
    
[/code]

よろしくお願いします。


CC BY-SA 4.0
2018-12-25T05:19:16.580
51495
2018-12-27T11:11:43.457
2018-12-25T05:33:16.320
3060
31574
question
spresense
例外の発生（up_assert: Assertion failed at file:semaphore/sem_post.c）


> up_assert: Assertion failed at file:semaphore/sem_post.c line: 118 task:
> init

とのメッセージが出ているのですから、semaphore/sem_post.cというファイルの118行目に書かれている
assert文の内容を確認してください。

そして、その前提(Assertion)が成り立たなかった原因を調べていくと、問題解決の糸口が捕まえられると思います。


CC BY-SA 4.0
2018-12-25T05:50:43.887
51497
2018-12-25T05:50:43.887
217
51495
answer


ソニーのSPRESENSEサポート担当です。  
お問い合わせいただきました件について、調査をいたしました。

問題の原因は、ハンズオンで配布した LCDライブラリにありました。

配布したファイルの中の "Adafruit_SPITFT_Macros.h"の 134行目～143行目の、次の記述を

* * *
[code]

    #if defined(ARDUINO_ARCH_SPRESENSE)
        #undef HSPI_BEGIN_TRANSACTION
        #define HSPI_BEGIN_TRANSACTION() HSPI_SET_CLOCK(); SPI_OBJECT.setBitOrder(MSBFIRST); SPI_OBJECT.setDataMode(SPI_MODE3)
    
        #undef SPI_BEGIN
        #define SPI_BEGIN()             if(_sclk < 0){SPI_OBJECT.begin(); HSPI_BEGIN_TRANSACTION();}
    
        #undef SPI_BEGIN_TRANSACTION
        #define SPI_BEGIN_TRANSACTION()
    #endif
    
[/code]

* * *

以下のように２行追加してください。

* * *
[code]

    #if defined(ARDUINO_ARCH_SPRESENSE)
        #undef HSPI_BEGIN_TRANSACTION
        #define HSPI_BEGIN_TRANSACTION() HSPI_SET_CLOCK(); SPI_OBJECT.setBitOrder(MSBFIRST); SPI_OBJECT.setDataMode(SPI_MODE3)
    
        #undef SPI_BEGIN
        #define SPI_BEGIN()             if(_sclk < 0){SPI_OBJECT.begin(); HSPI_BEGIN_TRANSACTION();}
    
        #undef SPI_BEGIN_TRANSACTION
        #define SPI_BEGIN_TRANSACTION()
    
        #undef SPI_END_TRANSACTION
        #define SPI_END_TRANSACTION()
    #endif
    
[/code]

* * *

これで問題は解決いたします。  
この度は、ご報告ありがとうございました。

引き続き、Spresense をよろしくお願いいたします。


CC BY-SA 4.0
2018-12-27T11:05:18.417
51561
2018-12-27T11:11:43.457
2018-12-27T11:11:43.457
29520
29520
51495
answer