us_ticker.cのus_ticker_read()に不具合を見つけました。(1時間11分30秒の件です)
us_ticker.c(80)
val = (uint32_t)(val64 / count_clock);
とありますが、2^32-1を越える(work_arround>32)と、ずっと4294967295を返します。
擬似コードを作成して実行してみましたが、Cortex-Mでも同じ動作なので、ARMコンパイラの仕様でしょうか。
※x86のgcc(gcc version 4.1.2 20080704 (Red Hat 4.1.2-54))だと、ラップします。
検証用擬似コードはこちら
#include "mbed.h"
#define US_TICKER_CLOCK_US_DEV (1000000)
#define CM0_RENESAS_RZ_A1_P0_CLK ( 33333333u)
Serial pc(USBTX, USBRX);
int main()
{
uint32_t val = 0;
uint64_t val64;
double count_clock = 0;
uint32_t wrap_arround = 0;
count_clock = ((double)CM0_RENESAS_RZ_A1_P0_CLK / (double)US_TICKER_CLOCK_US_DEV);
while(wrap_arround < 40){
wrap_arround++;
val64 = ((uint64_t)wrap_arround << 32) + val;
/* clock to us */
val = (uint32_t)(val64 / count_clock);
pc.printf("%u %u\n\r", wrap_arround, val);
}
}
work_arroundがオーバーフローしたときの動作までは検証していないので、そちらの動作は不明です。
※2015.1.12 21:39追記
以下だと期待通りの動作をするようです。
us_ticker.c(77)
val64 = (((uint64_t)wrap_arround << 32) + val) / count_clock;
/* clock to us */
val = (uint32_t)val64;
(タイトル間違い。delay_ms()ではなく、wait_ms()でした。m()m)
wait_ms(1)を繰り返し実行した結果をロジアナで測定したところ、一定のパターンで0.5msec.と1msec.よりも大幅に短い動作が見受けられました。
Lチカのバラツキと関係あるかも? ご確認願います。