Team for GR-PEACH Producer Meeting

Serialの動作について

08 Dec 2014

RawSerial、使ってもいいですか?で話題にしていましたが、Serialの動作が正しく無いと思われます。
1. XBeeのTX/RXが逆
 serial_api.cのPinMap_UART_TX/RXでP7_4とP7_5が逆に定義されている

2. P5_6, P5_7で使えない
 P5_6,P5_7を指定してSerialのインスタンスを作成しても使えない。また、同時に他のSerialインスタンスでも通信できなくなる?

3. attach()が正常に動作しない
 以下のコードを実行すると、想定動作は「ずっとLEDが点滅し、何か送信するとエコーバックする」はず(少なくとも青mbedはそう動く)。
 が、GR-PEACHでは点滅しない。何か送信すると一つ進む。(waitが帰って来ない?)

#include "mbed.h"

//Serial pc1(USBTX, USBRX);
Serial pc(D1, D0);
DigitalOut myled(LED1);

void pc_rx () {
    pc.putc(pc.getc());
}

int main() {
    pc.attach(pc_rx, Serial::RxIrq);
    
    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}
09 Dec 2014

いくつか問題点を見つけました

2. P5_6, P5_7で使えない
の件は、

serial_api.c (34)

#define UART_NUM    6

が間違っていて、これは

serial_api.c (34)

#define UART_NUM    8 /* 6 */

であるべきですね(0~7なので)。

3. attach()が正常に動作しない
の件は、attach()すると、TXもRXも区別無く割り込みが有効に設定されていることが影響している様に見えます。
試しに、TX側の割り込みを有効化しないようにすると動作しました。

serial_api.c

static void serial_irq_set_internal(serial_t *obj, SerialIrq irq, uint32_t enable) {
    switch (obj->index){
        case 0:
            InterruptHandlerRegister(SCIFTXI0_IRQn, (void (*)(uint32_t))uart0_tx_irq);
            InterruptHandlerRegister(SCIFRXI0_IRQn, (void (*)(uint32_t))uart0_rx_irq);
            GIC_SetPriority(SCIFTXI0_IRQn, 5);
            GIC_SetPriority(SCIFRXI0_IRQn, 5);
//            GIC_EnableIRQ(SCIFTXI0_IRQn);
            GIC_EnableIRQ(SCIFRXI0_IRQn);
            break;

irqの値を見て、RxIrqであればRXのみ、TxIrqならばTXのみ有効化した方が良いのではないかと思います。
また、必要無いのかもしれませんがenableの値を見ておらず、割り込みを無効化するコードがありません。

修正案はこんな感じです(無効化は同じく未実装)。
https://gist.github.com/YuuichiAkagawa/7138d5c7f0c8f9a0aa70

それから、この辺はあまり詳しくないのでわからないのですが、割り込み優先度がみんな「5」(Etherだけ0?)に設定されているように見えますが、そいういうものなんでしょうか。

現時点では、まだmurataのType YDは動かないのでもう少し調査を続ける必要がありそうです...。

10 Dec 2014

本件、ご報告ありがとうございます。
RawSerial、使ってもいいですか?も含めて現在対応中です。

16 Dec 2014

遅くなりまして申し訳ありません。
Yuuichi Akigawaさんにご指摘いただいた、
Serialの問題点(1. 2. 3.)を修正いたしました。
ご自身のプロジェクトの mbed-src を右クリックして update を選択すると、変更が反映されます。

割り込み優先度に関しては、システムによって優先度を検討する必要があると考えます。
mbedとしては、5に設定しております。
Etherに関してはご指摘の通り、現状0になっており、5に修正予定です。
ご指摘ありがとうございます。

16 Dec 2014

Hagimotoさん
確認しました。修正ありがとうございます。
スッキリとした実装で気持ち良いですね。