2016/12/17

[esp8266][rtos]driver_libのビルド

UoWでビルド環境は作ったが、RTOS版のサンプルがビルドできるかを確認していなかった。

examples/project_templateをどこかにコピーして、SDK_PATHとBIN_PATHを環境変数として設定し(gen_misc.shを変更するよりも、環境変数設定用のスクリプトを用意してsourceなどで読ませた方が都合がよさそう)、実行するたびにQIOとか40MHzなどの入力をするのが面倒だからgen_misc.shを変更。

githubのESP8266_RTOS_SDKはNTFS側にcloneしているが、ビルドはできた。
project_templateはSDKバージョンをprintfするだけのようなので動かしたのだが・・・化ける。
そう、ESP8266のUARTはデフォルトで変な速度なので、USBシリアル変換チップがその速度に対応していないうちの環境では見るのがめんどくさい(ロジアナなどで見ることはできるが)。

UARTの速度変更はuart_init()でできるのだが、使うにはUARTドライバがいる。
というわけで、driver_libをビルドすることにした。


以前はuart.cだけをプロジェクトにコピーして使っていたが、今回はdriver_libに入っているmake_lib.shを使うことにした。
README.mdを読むと、これでビルドできるそうだ。

$ ./make_lib.sh driver

 

が、最初はビルドに失敗していた。。。
どうも、includeパスなどが見えていないようで、コンパイルしている様子を見ても確かにパスがおかしい。

で、環境変数SDK_PATHの設定が必要だった、ということに気付いたわけだ。
gen_misc.shに設定して使っていたので、いっそのこと設定用のスクリプトを作るようにした。

そうすると、コンパイルは進むようになったが、i2c_master.cでまたエラーになった。
これは、RTOS版とNonOS版のバージョン違いによるものかもしれないが、今回はRTOS版のdriver_libにあるi2c_master.cに以下を追加することで対応した。

#include "esp8266/eagle_soc.h"
#include "esp8266/gpio_register.h"

 

これでlibdriver.aができ、RTOSのlib/にコピーされた。


では、これでuart_init()が使えるかと思ったが、リンクでエラーになった。
uart_init(SPEED0, SPEED1)の形式はNonOS版のドライバで、RTOS版はそういうのがないのだ。

やるなら、uart_init_new()をまねして、UART_ParamConfig()を使うほうがよさそうだ。

void user_init(void)
{
    UART_ConfigTypeDef uart_config;

    UART_WaitTxFifoEmpty(UART0);
    uart_config.baud_rate    = BIT_RATE_115200;
    uart_config.data_bits    = UART_WordLength_8b;
    uart_config.parity       = USART_Parity_None;
    uart_config.stop_bits    = USART_StopBits_1;
    uart_config.flow_ctrl    = USART_HardwareFlowControl_None;
    uart_config.UART_RxFlowThresh = 120;
    uart_config.UART_InverseMask = UART_None_Inverse;
    UART_ParamConfig(UART0, &uart_config);
    printf("\n\n\n");
    for (int lp = 0; lp < 10; lp++) {
        printf("SDK version:%s\n", system_get_sdk_version());
    }
}

なんでforで回しているかというと、最初の「SDK」が出力されなかったので、どこから速度が変わったのか確認するためだ。

version:1.5.0-dev(950076a)
SDK version:1.5.0-dev(950076a)
SDK version:1.5.0-dev(950076a)
SDK version:1.5.0-dev(950076a)
SDK version:1.5.0-dev(950076a)
SDK version:1.5.0-dev(950076a)
SDK version:1.5.0-dev(950076a)
SDK version:1.5.0-dev(950076a)
SDK version:1.5.0-dev(950076a)
SDK version:1.5.0-dev(950076a)

10個は出ているので、最初の数文字分が間に合っていないというところか。

しかし、TXFIFOのemptyを待っているのにダメということは、最初がHWフロー制御になっているということだろうか?
この、システムが勝手に出力するというやつがやっかいなのよねぇ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。