2016年07月31日

Renesas Synergy情報2016年7月(2)

Renesas SynergyでSSPとかSSCとかEW for Synergyとか馴染みの無い言葉が出てきます。
私なりの理解をまとめて見ました(間違っていても怒らないでください)。
SynergyB_004.png

まず、開発環境が2つのうちから選択できる事を理解する必要があります。
ルネサスのe2studioとIARのEW for Synergyがあります。どちらを使っても開発出来ますが、コンパイラがgccなのかIARのiccarmなのかを最初に決める必要があります。

e2studioを使う場合にはSSCのインストールは不要で、SSPをインストールすればOKです。
EW for Synergyを使う場合には、まずSSCのインストールを実施し、そのあとにSSPをインストール、そしてEW for Synergyのインストールをする必要があります。

なので、どちらも使えるので後は勝手に使えばよいのですが、コンパイラのコード効率では、EW for Synergyの方が通常はメリットがあるようです。





ラベル:Synergy
posted by EWARMJP at 12:00| Comment(0) | TrackBack(0) | Renesas | このブログの読者になる | 更新情報をチェックする

2016年07月30日

Renesas Synergy情報2016年7月(1)

Renesas Synergyの話です。
Renesas Synergyのいくつかアップデータとあったようなのですこし整理をしてみましょう。
それで自分の環境のアップデートなどもしたいと思います。

そもそもRenesas Synergyとは何か?というところから復習すると、Renesasが提供する新しいマイコンになります。
マイコンとしてはCortex-M4およびCortex-M0+をCPUコアに採用したことが大きな特徴です。

また、通常は個別で選定する必要があるコンパイラやRTOSやミドルウェアライブラリが一緒に提供されています。
このコンパイラ、RTOS、ミドルウェアを個別で購入する必要はなく、チップの価格に含まれています。
マイコンを少量しか使わないケースには大きなメリットとなってきます。

2016年の7月に開発環境のEmbedded Workbench for SynergyとSynergy Software Package(SSP)が更新されたようです。
これを見ていきます。正確にはSSPは6月に更新されています。。。

Renesas SynergyのGalleryに行きましょう。アドレスはこちら→ https://synergygallery.renesas.com/
アカウントなどを作っていない場合には作成ください。

そこで、Development ToolsでIAR EW for Synergyを選択すると、いかのようなページになります。
ダウンロードしましょう!

SynergyB_001.png

そして、SSPはSynergy Software Packageのページに行き、
SynergyB_002.png

ここもダウンロードしましょう。

そこそこダウンロードに時間がかかりますので、このまま寝ます。
続きはまた今度。
SynergyB_003.png
ラベル:Synergy
posted by EWARMJP at 12:00| Comment(0) | TrackBack(0) | Renesas | このブログの読者になる | 更新情報をチェックする

2016年07月28日

EWARM+Unityで単体テストをやってみる(20)

多少不完全なところありますが、これまでに試したプロジェクトをアップします。


出力結果は、デバッグ中に表示>ターミナルI/Oで見てください。
EWARM7.70.1ベースです。

Unityで単体テストを使ってみての総括です。

最初は確かに取っつきにくかったのですが、なれればめちゃめちゃ開発効率上がりそうです。

従来だと、製品コードを書いていて、適当なパラメータ入れて、ステップ実行で動かして、大丈夫そうだったら次のコード、というプロセスだったのが、Unityのようばフレームワークを使うことで、どういうテストをするべきかも意識できるし、1度仕込んでしまえば、何度でも動かすことができます。


今回はチュートリアルプロジェクトのありものに対してテストコードを書く、当然動作しているコードなので、
問題なく通ってしまったのですが、最近アジャイル系を中心にTDD(Test Driven Development)、テスト駆動開発というのが
流行っていて、仕様に対して、テストコードを先に書いて、テストが通るように実コードを書いていくというアプローチになっています。


確かにV字プロセスにのっとれば、仕様定義とテスト定義は一致なので、リーズナブルですよね。

アジャイルだけでなく、組込み系もスピードが求められていて、開発者自らがテストする(もちろん製品テストはあるでしょうが)というケースも多いと思います。

後ろ向きになりがちなテストですが、後からバグだしをするより、先に、受け入れ条件を決めておくことで
精神的にも確実にゴールが近づくので、楽しいかと。

ちなみにテストパターンは、今回は適当にピックアップしましたが、
やはり境界値と正常系の中間値等はやっておくべきでしょうね。

知識ゼロから学ぶソフトウェアテスト :高橋寿一著 が非常に参考になりました。


単体テストだけで信頼性を100%確保する、ということはできませんが、
※タイミング問題など
だからといって、やらない理由にはならないので、ぜひ、試してみてください。


posted by EWRXJP at 12:00| Comment(0) | TrackBack(0) | EWARM | このブログの読者になる | 更新情報をチェックする

2016年07月27日

EWARM+Unityで単体テストをやってみる(19)

Utilitiesで定義されているPutFibは引数を標準出力に出力する、関数です。

/* Sends a number between 0 and 65535 to stdout. */
void PutFib(unsigned int out)
{
  unsigned int dec = 10, temp;

  if (out >= 10000)  /* Value too large. */
  {
    putchar('#');    /* Print a '#'. */
    return;
  }

  putchar('\n');
  while (dec <= out)
  {
    dec *= 10;
  }

  while ((dec /= 10) >= 10)
  {
    temp = out / dec;
    putchar('0' + temp);
    out -= temp * dec;
  }

  putchar('0' + out);
}


このままでは単体テストできません。
発想の転換をして、テストできるようにコードを書いてみます。


char buf[10];
void PutFib(unsigned int out)
{
  buf[0] = '\0';
  
  unsigned int dec = 10, temp;

  if (out >= 10000)  /* Value too large. */
  {
    sprintf(buf,"%c",'#');
    putchar('#');    /* Print a '#'. */
    return;
  }

  putchar('\n');
  while (dec <= out)
  {
    dec *= 10;
  }

  while ((dec /= 10) >= 10)
  {
    temp = out / dec;
    sprintf(buf,"%s%c",buf,'0' + temp);
    putchar('0' + temp);
    out -= temp * dec;
  }

  sprintf(buf,"%s%c",buf,'0' + out);
  putchar('0' + out);
}

要は、出力前に、文字列に溜めてみましょう、ということです。


TestUtilitiesの方はこちら。

extern char buf[10]; //グローバル変数化

TEST(Utilities, PutFib_ShouldPrintData)
{
  PutFib(0);
  TEST_ASSERT_EQUAL_STRING("0",buf);
  PutFib(1);
  TEST_ASSERT_EQUAL_STRING("1",buf);
  PutFib(9999);
  TEST_ASSERT_EQUAL_STRING("9999",buf);
}

TEST(Utilities, PutFib_ShouldPrintSharpIfIndexIsGreaterThan10000)
{
  PutFib(10000);
  TEST_ASSERT_EQUAL_STRING("#",buf);

}

ここで出てきたTEST_ASSERT_EQUAL_STRINGは、数値の比較ではなく、文字列の比較をするアサートです。
グループランナーも追記してみます。

TEST_GROUP_RUNNER(Utilities)
{
  RUN_TEST_CASE(Utilities, InitFib_ShouldInitializeCorrectly);
  RUN_TEST_CASE(Utilities, GetFib_ShouldReturnDataOfTheIndex);
  RUN_TEST_CASE(Utilities, GetFib_ShouldReturnZeroForInvalidIndex);
  RUN_TEST_CASE(Utilities, PutFib_ShouldPrintData);
  RUN_TEST_CASE(Utilities, PutFib_ShouldPrintSharpIfIndexIsGreaterThan10000);
}

これで、Utilitiesのテストパターンが揃いました。

実行してみるとエラーがなくなりました。

Image 496.png

TestUtilitiesの全体はこんな感じになりました。

#include "Utilities.h"
#include "unity.h"
#include "unity_fixture.h"

TEST_GROUP(Utilities);

extern unsigned int Fib[MAX_FIB];

TEST_SETUP(Utilities)
{
  for(int i = 0;i<MAX_FIB;i++)
  {
    Fib[i] = i;
  }
}

TEST_TEAR_DOWN(Utilities)
{
}

TEST(Utilities, InitFib_ShouldInitializeCorrectly)
{
  InitFib();
  TEST_ASSERT_EQUAL(1, Fib[0]);
  TEST_ASSERT_EQUAL(1, Fib[1]);
  TEST_ASSERT_EQUAL(55, Fib[9]);
}

TEST(Utilities, GetFib_ShouldReturnDataOfTheIndex)
{
  TEST_ASSERT_EQUAL(0, GetFib(1));
  TEST_ASSERT_EQUAL(1, GetFib(2));
  TEST_ASSERT_EQUAL(8, GetFib(9));
}

TEST(Utilities, GetFib_ShouldReturnZeroForInvalidIndex)
{
  TEST_ASSERT_EQUAL(0, GetFib(0));
  TEST_ASSERT_EQUAL(0, GetFib(-1));
  TEST_ASSERT_EQUAL(0, GetFib(MAX_FIB+1));
}

extern char buf[10];

TEST(Utilities, PutFib_ShouldPrintData)
{
  PutFib(0);
  TEST_ASSERT_EQUAL_STRING("0",buf);
  PutFib(1);
  TEST_ASSERT_EQUAL_STRING("1",buf);
  PutFib(9999);
  TEST_ASSERT_EQUAL_STRING("9999",buf);
}

TEST(Utilities, PutFib_ShouldPrintSharpIfIndexIsGreaterThan10000)
{
  PutFib(10000);
  TEST_ASSERT_EQUAL_STRING("#",buf); 
}



試行錯誤でやったので、少し大変でしたが、慣れればペースアップできそうです。

Tutor.cも基本的には同じコンセプトでテストできるんだと思います。


posted by EWRXJP at 12:00| Comment(0) | TrackBack(0) | EWARM | このブログの読者になる | 更新情報をチェックする

2016年07月26日

EWARM+Unityで単体テストをやってみる(18)

もうちょっとテストコードを追記してみましょう。


GetFibのテストコードを作ってみます。
unsigned int GetFib(int n)
{
  if ((n > 0) && (n <= MAX_FIB))
  {
    return (Fib[n-1]);
  }
  else
  {
    return 0;
  }
}


TestUtilities.c

いわゆる正常系のテスト。
決められたインデックス内であれば、配列の値を返す。

TEST(Utilities, GetFib_ShouldReturnDataOfTheIndex)
{
  TEST_ASSERT_EQUAL(0, GetFib(1));
  TEST_ASSERT_EQUAL(1, GetFib(2));
  TEST_ASSERT_EQUAL(8, GetFib(9));
}

異常系。配列外の場合は0を返す。
TEST(Utilities, GetFib_ShouldReturnZeroForInvalidIndex)
{
  TEST_ASSERT_EQUAL(0, GetFib(0));
  TEST_ASSERT_EQUAL(0, GetFib(-1));
  TEST_ASSERT_EQUAL(0, GetFib(MAX_FIB));
}

両方ともSETUP関数でFib配列は0,1,2,・・9の状態になっています。


実行してみると、エラーになりました。

Unity test run 1 of 1
...C:\unity_test\arm\tutor\test\TestUtirities.c:42:TEST(Utilities, GetFib_ShouldReturnZeroForInvalidIndex):FAIL: Expected 0 Was 9

-----------------------
3 Tests 1 Failures 0 Ignored 
FAIL

GetFibの中身をちゃんと確認してみると、引数MAX_FIBは正常系の範囲でしたね。

TEST(Utilities, GetFib_ShouldReturnZeroForInvalidIndex)
{
  TEST_ASSERT_EQUAL(0, GetFib(0));
  TEST_ASSERT_EQUAL(0, GetFib(-1));
  TEST_ASSERT_EQUAL(0, GetFib(MAX_FIB+1));
}

書き換えることで、OKになりました。
エラーが出たときは、アプリケーションコードが間違っているときか、あるいは
テストが間違っているときです。
いずれにせよチェック機能としては、有益ですね。

さて、次は、PutFibです。
これは文字列の出力なので、単純に戻り値などで評価はできません。
対策を考えてみます。


posted by EWRXJP at 12:00| Comment(0) | TrackBack(0) | EWARM | このブログの読者になる | 更新情報をチェックする