C++ volatile forループ変数の効果を目で見る(備忘録)

最適化を抑止する volatile を空ループのループ変数に使用した場合の効果を目で見えるようにして確認しました。

下記のforの比較です。

for (volatile int n = 0;5000 > n;n++){};

for (int n = 0;5000 > n;n++){};



テストの概要


1.Raspberry Pi のGPIO端子に信号を出し、それをオシロスコープで観測する。
2.forループの直前でGPIO27をONにし、
3.forループを実行
4.forループの直後にGPIO27をOFFとする。
5.テストの最初には、オシロスコープでトリガを掛けやすいように基本パルスを発生させる。
6.それぞれの間にsleepで時間をとる。

ソース概要


int main(int argc, char *argv[], char *envp[])
{

//メモリマップ取得
    sel = get_gpio_map();
    if ((int)sel == -1) {
        return 1;
    }

    //GPIO27をOUTPUTに設定
    GPFSELOUTPUT(sel,27);  //sel->fsel27 = GPIOOUTPUT;

    for (int i = 0;1000000>i;i++){
        //基本パルス幅確認用
        GPSETN(sel,27); //ポートをON
        nano_sleep(100000);
        GPCLRN(sel,27); //ポートをOFF
        nano_sleep(100000);

        //for 内
        GPSETN(sel,27); //ポートをON
        for (volatile int n = 0;5000 > n;n++){};
        GPCLRN(sel,27); //ポートをOFF

        nano_sleep(100000);

        //for 内
        GPSETN(sel,27); //ポートをON
        for (int n = 0;5000 > n;n++){};
        GPCLRN(sel,27); //ポートをOFF

        nano_sleep(1000000);
    }


    return 0;
}


※ GPSETN() GPCLRN() はGPIOポートのON,OFF制御用です。

結果


C++ volatile forループ変数の効果を目で見る(備忘録)
最初のパルはトリガ用のパルス。
中央のパルスがvolatileを指定したforループの実行期間。
三番目の細いパルスはvolatileなしのループの実行期間。

volatileを指定しない空ループはネグられている事がわかります。


※実行環境については省力します。
スポンサーサイト

名刺メタリック版

名刺メタリック版



名刺サイズではありませりが、一応名刺という事です。

テーマ : ディズニー・ギャラリー
ジャンル : 写真

名刺

名刺
(画像クリックで1786x1080サイズ)


やっぱりシーかな。

テーマ : ディズニー・ギャラリー
ジャンル : 写真

Raspberry Pi 3 Model B 到着

Raspberry Pi 3 Model B 到着

Raspberry Pi 3 Model B 到着

3月1日に注文したRaspberry Pi 3 が11日に到着しました。
船便で2ヶ月掛かると思っていたのに、AIR MAILで10日で受け取りました。よかったよかった。

竹ペーパーナイフ

竹ペーパーナイフ




爺爺の手習い」さんから頂いた材料と見本で竹のペーパーナイフを作りました。

左から、削る前、今回作成のペーパーナイフ、送って頂いた見本。
道具は小学生が学校で使っている小刀。砥石で研ぎました。

見本の様には綺麗に出来ませんでしたが、実用十分には出来ました。
写真の様に折った紙を切る場合、カッターナイフは折れ目通りには切れないのに、竹のカッターナイフは折れ目通りに切れます。
軽くて安全だし言う事なしです。

爺爺の手習いさんありがとうございました。


Raspberry Pi 3(ブログでツイート)

Raspberry Pi 3が発売されたと知り、Pimoroniで早速注文。税送料込みで£32.17でした。船便なので2ヶ月位掛かるそうな。楽しみだな。(追記 5,171円 (160.74円/£)でした)
次はRaspberry Pi Zero。

Raspberry Piと秋月I2C接続LCD(gnublin-api)(C++)(備忘録)

Raspberry Pi B Rev2 (china) に秋月の「I2C接続小型キャラクタLCDモジュール 8x2行」を繋いで、表示させてみる。

Raspberry Pi(Raspbian)の設定


raspi-configのAdvanced Optionsで設定。

Raspberry Piと秋月I2C接続LCD

Raspberry Piと秋月I2C接続LCD

Raspberry Piと秋月I2C接続LCD

Raspberry Piと秋月I2C接続LCD

Raspberry Piと秋月I2C接続LCD

Raspberry Piと秋月I2C接続LCD

RaspRaspberry Piと秋月I2C接続LCD

Raspberry Piと秋月I2C接続LCD

Raspberry Piと秋月I2C接続LCD

Raspberry Piと秋月I2C接続LCD

再起動して完了。

C++用 I2C API(gnublin-api)入手


I2C用APIライブラリーを下記より入手。

参考:https://www.raspberrypi.org/forums/viewtopic.php?f=33&t=43725

ダウンロード:https://github.com/embeddedprojects/gnublin-api

gnublin.cppとgnublin.hをダウンロードする。


LCD制御


■資料
I2Cを使用してLCDを制御する方法は、秋月のI2C接続小型キャラクタLCDモジュール 8x2行の頁に参考資料のリンクがあるので、そちらから入手する。


テスト


■ソース
#define BOARD RASPBERRY_PI
#include "gnublin.h"
#include <time.h>
#include <sys/time.h>
#include <unistd.h>

#define POWERONWAITTIME 50000000
#define EXECWAITTIME       30000
#define FOLLWAITTIME   200000000
#define CLEARWAITTIME    2000000

void nano_sleep(unsigned Anano_sec){
struct timespec req;
req.tv_sec = Anano_sec/1000000000;
req.tv_nsec = Anano_sec%1000000000 ;
nanosleep(&req, NULL);
}

int main() {
gnublin_i2c i2c;
unsigned char buffer[100];

i2c.setAddress(0x3e); // set the address of the slave you want to read/write

// init begin
nano_sleep(POWERONWAITTIME);
//Function SET IS=0
buffer[0] = 0x00;
buffer[1] = 0x38;
i2c.send(buffer, 2);
nano_sleep(EXECWAITTIME);

//Function SET IS=1
buffer[0] = 0x00;
buffer[1] = 0x39;
i2c.send(buffer, 2);
nano_sleep(EXECWAITTIME);

//Internal OSC frequency
buffer[0] = 0x00;
buffer[1] = 0x14;
i2c.send(buffer, 2);
nano_sleep(EXECWAITTIME);

//Contrast set
buffer[0] = 0x00;
buffer[1] = 0x70;
i2c.send(buffer, 2);
nano_sleep(EXECWAITTIME);

//Pwoer/ICON/Contrast control
buffer[0] = 0x00;
buffer[1] = 0x56;
i2c.send(buffer, 2);
nano_sleep(EXECWAITTIME);

//follower control
buffer[0] = 0x00;
buffer[1] = 0x6c;
i2c.send(buffer, 2);
nano_sleep(FOLLWAITTIME);

//nano_sleep(EXECWAITTIME);
//Function set
buffer[0] = 0x00;
buffer[1] = 0x38;
i2c.send(buffer, 2);
nano_sleep(EXECWAITTIME);

//Display ON/OFF control
buffer[0] = 0x00;
buffer[1] = 0x0c;
i2c.send(buffer, 2);
nano_sleep(EXECWAITTIME);

//Clear Display
buffer[0] = 0x00;
buffer[1] = 0x01;
i2c.send(buffer, 2);
nano_sleep(CLEARWAITTIME);

//DDRAM Address set
buffer[0] = 0x00;
buffer[1] = 0x80;
i2c.send(buffer, 2);

// init end


//disp char
buffer[0] = 0x40;
buffer[1] = 'A';
i2c.send(buffer, 2);

buffer[0] = 0x40;
buffer[1] = 'B';
i2c.send(buffer, 2);

}



■結果
LCD左上から「AB」と続けて表示した。

以下はロジックアナライザの画面
Raspberry Piと秋月I2C接続LCD


問題点


Raspberry Pi電源投入後、第一回目の実行では文字が表示されない。
二回目移行は問題なく動作する。

原因は下図の様に、「00」「56」に続いて送られる「00」「6C」が送出されていない。(時により、6Cのみ送出されない時もある)
Raspberry Piと秋月I2C接続LCD

現在、真の原因は不明。

環境


root@raspberrypi:/# uname -a
Linux raspberrypi 4.1.13+ #826 PREEMPT Fri Nov 13 20:13:22 GMT 2015 armv6l GNU/Linux

os-release(ファイル内容)
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"


Eclipse IDE for C/C++ Developers

Version: Mars.1 Release (4.5.1)
Build id: 20150924-1200


<?xml version="1.0"?>
<Toolchain xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ToolchainName>Raspberry PI</ToolchainName>
  <ToolchainType>Linux</ToolchainType>
  <PathDetectionKeyStrip>0</PathDetectionKeyStrip>
  <GNUTargetID>arm-linux-gnueabihf</GNUTargetID>
  <ToolchainID>com.visualgdb.raspberry_pi</ToolchainID>
  <BinaryDirectory>bin</BinaryDirectory>
  <Prefix>arm-linux-gnueabihf-</Prefix>
  <Make>make.exe</Make>
  <BSPIndexUrlFormat>http://visualgdb.com/hwsupport/BSP/?autofetch=1&amp;target=arm-linux-gnueabihf&amp;filter={0}</BSPIndexUrlFormat>
  <IsCygwinBased>false</IsCygwinBased>
  <GCCVersion>4.9.2</GCCVersion>
  <GDBVersion>7.10</GDBVersion>
  <Revision>1</Revision>
  <RelativeSysrootPath>arm-linux-gnueabihfsysroot</RelativeSysrootPath>
</Toolchain>


※2016/03 実施
お知らせ
■注意:Google Chrome以外のブラウザでは動作しない事もあります。
お好みに応じて
画像だけの表示でいいよ
やっぱり全部表示して
背景は黒がいいな
背景を元に戻して
サブジャンル
メモリアルマップ
My Favorite Photo
検索フォーム
プロフィール

otsu.usiwakamaru

Author:otsu.usiwakamaru
五条の橋でひらりひらりと欄干を飛び渡る牛若丸のように、興の向くまま電子回路にプログラミングに写真にと飛び回っています。

プロフィール詳細

カレンダー
02 | 2016/03 | 04
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
キーワード
クリックしたキーワードの記事のみ表示します。

電池 試み IXY デザイン  改造 3D ミッキー 

最新記事
月別アーカイブ
全記事表示リンク

全ての記事を表示する

おすすめプログ(新着記事)
リンク


にほんブログ村
カテゴリ
ART (1)
橋 (0)
PIC (2)
カウンタ
訪問者数(UU)

アクセス数

現在の閲覧者数

tael no013用