TTL7476の遅延と揺らぎ(備忘録)

以前買った秋月の超高精度・水晶発振器(12.8MHz)をアマゾンで買った「周波数カウンタ モジュール 8LED 0.1~60MHz 20MH~2.4GHz」でズレを見てみました。
12,800,024Hzでした。

秋月の超高精度・水晶発振器(12.8MHz)をヒートガンで10度以上温めても2Hzの変動でした。
カウンタも長時間安定していて、この組み合わせで4時間で1Hz程度しか動きません。

そこで、共に高精度に校正したいと思いGPSの1pps出力を利用したカウンタを作ろうと思っています。
パルスカウントはPICで、1ppsを利用したパルスゲートはTTL J-Kフリップフロップでと考えて、J-K/FFの精度を調べてみました。
※PICのみで1ppsを利用したカウント制御は今回検討対象外です。

TTL7476の遅延と揺らぎ(備忘録)


その結果は下記の通りです。

TTL7476の遅延と揺らぎ(備忘録)
黄色(CH1)が1ppsのパルスと想定したもの。 青色(CH2)がJK/FFのQ端子のTOGGLE出力(1秒パルス幅)。
このTOGGLE出力(1秒パルス幅)でもう一つのJK/FFのカウント制御を行い測定対象のfx(Hz)のパスルをゲート制御します。
ただし、出力はfx/2と1/2の周波数で出力されます。

この場合、1秒パスルの立ち上がりと立ち下がりの動作遅延の差と、次段のJK/FFのCLR端子の閾値の違いによる1秒パスルの実質的なゲート時間を知る必要があるので、上図のようにその時間差を測定しました。
立ち上がりの閾値は2V、立ち下がりの閾値は1Vと仮定しています。

その差は5.3nsなので1.0000000053秒となります。
この差は安定していれば、PICで計算により補正できます。

しかし、揺らぎがあるとその分は補正できないので、下図のように揺らぎを確認しました。
TTL7476の遅延と揺らぎ(備忘録)
30秒間の揺らぎの測定結果

揺らぎを含めて最大7.5nsの誤差が出るようです。
1秒ゲートはMAX 1.0000000075秒となり、5.3nsの補正をすれば、なんとか有効8桁のカウンタとなりそうです。

メモ


TTLは何処のメーカ製か、また品番も不明のものです。
オシロスコープはRIGOL DS1054Z
テスト用パスルはSIGLENT SDG1025

1ppsパルスの取得は秋月の「GPS受信機キット 1PPS出力付き 「みちびき」対応」を使う積りです。
この場合も、1pps出力は Typical accuracy: ±10 ns となっていますが、誤差は累積されないと思うので、1ppsをカウンタでn倍にすれば精度は更に上るかもしれません。
それもやってみたいと思っています。

ゲート制御を単純にAND回路にすればいいのですが、ICの数をケチったのとPICカウンタの動作可能周波数に余裕を持たせる為です。


完成してから、記事にしろっ!って....実行にしない可能性大なので途中結果だけでも残さないと。
以前はこんな記録はPCに備忘録として保存していましたが、やっぱりブログに入れておく方が残ります。






スポンサーサイト

PIC 16F18313 クロック週数と消費電流(備忘録)

PIC 16F18313 のクロック周波数と消費電流のメモです。


OSCFRQ = 0x0; //OSCFRQ: HFINTOSC FREQUENCY SELECTION HFFRQ<3:0> 0000:1MHz(NOSC = 110) 247.8uA
OSCFRQ = 0x1; //OSCFRQ: HFINTOSC FREQUENCY SELECTION HFFRQ<3:0> 0001:2MHz(NOSC = 110) 356.7uA
OSCFRQ = 0x3; //OSCFRQ: HFINTOSC FREQUENCY SELECTION HFFRQ<3:0> 0011:4MHz(NOSC = 110) 572.1uA
OSCFRQ = 0x4; //OSCFRQ: HFINTOSC FREQUENCY SELECTION HFFRQ<3:0> 0100:8MHz(NOSC = 110) 966.1uA
OSCFRQ = 0x5; //OSCFRQ: HFINTOSC FREQUENCY SELECTION HFFRQ<3:0> 0101:12MHz(NOSC = 110) 1.3mA
OSCFRQ = 0x6; //OSCFRQ: HFINTOSC FREQUENCY SELECTION HFFRQ<3:0> 0110:16MHz(NOSC = 110) 1.6mA
OSCFRQ = 0x7; //OSCFRQ: HFINTOSC FREQUENCY SELECTION HFFRQ<3:0> 0111:32MHz(NOSC = 110) 3.2mA
OSCFRQ = 0x8; //OSCFRQ: HFINTOSC FREQUENCY SELECTION HFFRQ<3:0> 1xxx:32MHz(NOSC = 110) 3.2mA
SLEEP(); //SLEEP: 25.68uA



測定用ソース


/* 
 * File:   main.c
 * Author: test
 *
 * Created on 2017/12/15
 */

/*
 * Config 設定上の注意
 * ICD3によるデバッグを行う場合、WDTは無効にする必要がある。
 * ICD3によるデバッグを行う場合、LVPは無効にする必要がある。
 */

// PIC16F18313 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1
#pragma config FEXTOSC = ECH    // FEXTOSC External Oscillator mode Selection bits ()
#pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz))
#pragma config CLKOUTEN = ON    // Clock Out Enable bit (CLKOUT function is enabled; FOSC/4 clock appears at OSC2)
#pragma config CSWEN = ON       // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

// CONFIG2
#pragma config MCLRE = ON       // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled )
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config WDTE = OFF       // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored)
#pragma config LPBOREN = OFF    // Low-power BOR enable bit (ULPBOR disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bits (Brown-out Reset enabled, SBOREN bit ignored)
#pragma config BORV = LOW       // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V)
#pragma config PPS1WAY = ON     // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a Reset)
#pragma config DEBUG = OFF      // Debugger enable bit (Background debugger disabled)

// CONFIG3
#pragma config WRT = OFF        // User NVM self-write protection bits (Write protection off)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (HV on MCLR/VPP must be used for programming.)

// CONFIG4
#pragma config CP = OFF         // User NVM Program Memory Code Protection bit (User NVM code protection disabled)
#pragma config CPD = OFF        // Data NVM Memory Code Protection bit (Data NVM code protection disabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

#include <stdio.h>
#include <stdlib.h>

#define _XTAL_FREQ 1000000

/*
 * 
 */

int delay(int t,int f){
    int n = t*10*f;
    for (int i=0;i<n;i++){
        __delay_ms(100);
    }
}

int main(int argc, char** argv) {
    OSCCON1 = 0x60; //OSCILLATOR CONTROL REGISTER  NOSC:110 HFINTOSC(1 MHz)

    while (1){
    OSCFRQ = 0x0;   //OSCFRQ: HFINTOSC FREQUENCY SELECTION  HFFRQ<3:0> 0000:1MHz(NOSC = 110) 247.8uA
    delay(10,1);
    OSCFRQ = 0x1;   //OSCFRQ: HFINTOSC FREQUENCY SELECTION  HFFRQ<3:0> 0001:2MHz(NOSC = 110) 356.7uA
    delay(10,2);
    OSCFRQ = 0x3;   //OSCFRQ: HFINTOSC FREQUENCY SELECTION  HFFRQ<3:0> 0011:4MHz(NOSC = 110) 572.1uA
    delay(10,4);
    OSCFRQ = 0x4;   //OSCFRQ: HFINTOSC FREQUENCY SELECTION  HFFRQ<3:0> 0100:8MHz(NOSC = 110) 966.1uA
    delay(10,8);
    OSCFRQ = 0x5;   //OSCFRQ: HFINTOSC FREQUENCY SELECTION  HFFRQ<3:0> 0101:12MHz(NOSC = 110) 1.3mA
    delay(10,12);
    OSCFRQ = 0x6;   //OSCFRQ: HFINTOSC FREQUENCY SELECTION  HFFRQ<3:0> 0110:16MHz(NOSC = 110) 1.6mA
    delay(10,16);
    OSCFRQ = 0x7;   //OSCFRQ: HFINTOSC FREQUENCY SELECTION  HFFRQ<3:0> 0111:32MHz(NOSC = 110) 3.2mA
    delay(10,32);
    OSCFRQ = 0x8;   //OSCFRQ: HFINTOSC FREQUENCY SELECTION  HFFRQ<3:0> 1xxx:32MHz(NOSC = 110) 3.2mA
    delay(5,32);
    SLEEP();        //SLEEP: 25.68uA
    }
    
    return (EXIT_SUCCESS);
}

PIC 16F1827 I2C-SLAVEモードとSLEEPの動作確認(備忘録)

PIC 16F1827をI2Cスレーブとして用い、かつ通常はスリープしている場合の動作メモです。
クロックは内部発振器16MHzで動作させています。

※注意 本記事に私的な解釈です。間違っている可能性は十分にありますので内容についての責任は持てません。

背景


Raspberry PiのGPIOで周辺ハードウェアーを制御するには、OSを介してのハード制御の為、信号のタイミング制御が難しいようです。
そちらはOSのないPICに任せ、Raspberry PiなどのOSの存在するハードは情報処理を行という機能分担が望ましいという結論になりました。

そこで、Raspberry PiとPIC間の通信をI2Cで行う場合の実機テストをする事にしました。

省電力の意味でPICのSLEEP(※1)を利用する場合のテスト結果のメモです。

※1 I2Cは機器内通信が前提の為、電源も同一系統でマスタ、スレーブ共に電源が立ち上がり、立ち下がりも同時になることが暗黙の了解であると思われます。
各電源が別系統の場合、例えば、Raspberry Piの電源がONでPICの電源がOFFの状態が長時間続く場合、I2Cの信号線を通じて、Raspberry Piの電源→プルフップ抵抗→PICの寄生ダイオードを通じてPICに電源が供給され、PICは起動してしまいます。もちろん、安定動作はしません。
その為、十分な電力が供給される事が前提のRaspberry Piシステムで、PICを節電目的でSLEEP動作させる必要性は大変少ないのではないかと思われますが、ここではあえてSLEEPさせた場合の動作をメモしています。

テスト環境


■PIC16F1827はI2Cスレーブとして動作
リード(R)を受信すると2byteのデータ(0xd0,0xd1)を順次送信する。
■I2CマスタはRaspberry Pi
1byteのデータ(0xAA)をスレーブ(16F1827)に送信し、その後2byteのデータを受信する。


結論


I2Cのスタートbitによる割り込みを受けた時から、ストップbit割り込みを受けるまでの間はSLEEPしてはならない。


テスト方法


■main()でSLEEPのルーブをする。SLEEPしない場合はNOPのループをする。
■割り込み処理時、各レジスタの値を記録する。
■RA0~4にパルスを出力し、ソース上の通過を外部に知らせる。

■ロジックアナライザ ZEROPLUS LAP-C(16064)により下記の信号を観測
(1)SCL I2Cクロック
(2)SDA I2Cデータ
(3)RA0 割り込み処理開始を知らせるパルス
(4)RA1 レジスタ値の記録完了を知らせるパルス
(5)RA2 I2C制御完了を知らせるパルス(この後、割り込み処理を抜ける)
(6)RA3 main()のループ内処理の開始を知らせるパルス(SLEEP前)
(7)RA4 main()のループ内処理の終了を知らせるパルス(SLEEP後)
(8)CLKOUT PICクロック

PIC ソースはこちらをクリック





テスト



割り込み終了の度にSLEEPした場合


この場合、クロックストレッチが発生しない箇所ができる。
その為、次の送信データをセットする時間的余裕がなく、本来送信すべきデータが送信されない。


■クロックストレッチが発生しない箇所がある
PIC 16F1827 I2C-SLAVEモードとSLEEPの動作確認(備忘録)



第一群はWモードでマスターのRaspberry Piが1byteのデータを送信してきます。
アドレス受信後、SCLがLOWになりクロックストレッチ(黄色矢印)が発生しています。

第二郡はRモードでPICは2BYTEのデータを送信します。
アドレスと1byte目の間のACKはクロックストレッチ(黄色矢印)が発生していますが、
1byte目と2byte目の間のACKではクロックストレッチ(赤色矢印)は発生していません。
下図は第二郡の部分を拡大したものです。


■クロックストレッチの生成は誰の責任
PIC 16F1827 I2C-SLAVEモードとSLEEPの動作確認(備忘録)

■PICハードがクロックストレッチの開始を行う例
例えば、上図の赤枠の部分はPICがアドレス+Rを受取り、A-ACKを返し、割り込みを生成し、割り込みルーチンに制御が移るシーンです。
ここでSCLをLOWにしクロックストレッチを行っているのはPICのハードです。

時間順に見ていくと、
(1)ACKのクロック(SCL)の立ち下がりで割り込みを生成し、PICのスリープを解除しています。
(2)それにより、PICのクロック(CLKOUT)(白い部分)が起動されています。
(3)PICハードでの割り込み遷移処理後、割り込みルーチに入った事を示す、RA0のパルス(5)が出力されています。

割り込み処理に入った時点で多くの時間が経っており、PICハードによるクロックストレッチがなければソフトにより直接クロックSCLをLOWにしてクロックストレッチするには間に合いません。
したがってクロックストレッチの開始はPICハードの責任です。ソフトでは直接SCLをLOWにしていません。
ソフトはSSP1CON1レジスタのCKPを1にする事により、停止されているクロックを有効化し再び転送動作を再開させる事(クロックストレッチの解除)のみです。上図の時間軸上では赤枠を過ぎた右側のRA2のパルスの位置です。

■クロックストレッチが開始されない例
上図の青枠の部分はPICがアドレス+Rを受取った後、1byte目のD-ACKを返す箇所です。
この例ではA-ACKの時のようなクロックストレッチは発生していません。

ACKのクロック(SCL)の立ち下がりで割り込みが生成された以後の動作はA-ACKの時と同じシーケンスを辿ります。
ソフトでCKP=1によるクロック有効化も行っていますが、既に意味はありません。

■各割り込み時点でのCKP(SSP1CON1-bit4)の状態
PIC 16F1827 I2C-SLAVEモードとSLEEPの動作確認(備忘録)
ssp1con1[0] unsigned char 0x3E
ssp1con1[1] unsigned char 0x2E
ssp1con1[2] unsigned char 0x2E
ssp1con1[3] unsigned char 0x3E
ssp1con1[4] unsigned char 0x3E
ssp1con1[5] unsigned char 0x2E
ssp1con1[6] unsigned char 0x2E
ssp1con1[7] unsigned char 0x3E
PIC 16F1827 I2C-SLAVEモードとSLEEPの動作確認(備忘録)ssp1con1配列の添字はRA0のパルス番号

クロックストレッチが発生するA-ACKの割り込み時点のssp1con[5]のbit4はOFFでクロックストレッチ中(Holds clock low (clock stretch))を示しています。
クロックストレッチが発生しない、1byte目のD-ACKの割り込み時点でもssp1con1[6]のbit4はOFFです。
にも、かかわらずクロックストレッチは発生しません。


I2Cスタートからストップ間はSLEEPを禁止した場合



レジスタの設定環境も正しいと思われ、ssp1con1[6]のbit4はOFFになっている事からハード上の環境としてSLEEPの影響を疑い、I2Cのスタートからストップの間、SLEEPをしない様にしました。

PIC 16F1827 I2C-SLAVEモードとSLEEPの動作確認(備忘録)

上図の様にクロックストレッチが発生しデータも目的通り0xD1が送信されました。

■最後のD-NACK
2byte目送信後のD-NACKではNACKの為、データの転送は終了であり、次の送信データセットの為の時間稼ぎは必要なく、クロックストレッチは発生しません。
マスター(Raspberry Pi)はこの時レシーバであり、必要量のデータを受信した事を送信者であるスレーブ(PIC)に伝える為にNACKを送っています。



感想


A-ACKの時とD-ACKの時の違いが何なのか遂に判りませんでした。
対処方法としてこれが正しいのかも判りません。
が、無理に割り込み終了都度、SLEEPさせる必要性もそれほど無いと思われるので、これでよしとします。

今までなら、記事にもせずに何処かにメモって置くだけなのですが、それだと整理もせずに結果だけで後で何だったか全く不明という状態でした。
当ブログのような僻地ブログでも公開するとなると少しは纏めようとするので、結果自分にとっても有益です。
万一、どなたかの役に立つなら望外の喜びです。

しかし、自分ならこんな長い記事は読む気がしません。

Eclipse Raspberry Pi(Raspbian) リモートデバック設定(備忘録)

Windows上のEclipseでRaspberry Pi用のC++作成時のデバッグ設定のメモ。


設定


Eclipse Raspberry Pi(Raspbian) デバック設定(備忘録)

Eclipse Raspberry Pi(Raspbian) デバック設定(備忘録)

■「Main」タブ
Eclipse Raspberry Pi(Raspbian) デバック設定(備忘録)
※Connection欄の新規設定は下方に別途書いています。
※コピペ用 sudo chmod a+x /home/pi/work/b ←転送するファイルはこのように(b)ファイル名を変えてもよい。

■「Debugger」タブ
Eclipse Raspberry Pi(Raspbian) デバック設定(備忘録)
※コピペ用 arm-linux-gnueabihf-gdb


■Connection欄の新規設定方法
Eclipse Raspberry Pi(Raspbian) デバック設定(備忘録)

Eclipse Raspberry Pi(Raspbian) デバック設定(備忘録)

Eclipse Raspberry Pi(Raspbian) デバック設定(備忘録)



Debug実行


「Debug Dconfigurations」ダイアログの「Debug」ボタンをクリックする。


Eclipse Raspberry Pi(Raspbian) デバック設定(備忘録)

「F6」ハー押下で1step進めると
Eclipse Raspberry Pi(Raspbian) デバック設定(備忘録)


環境


Eclipse IDE for C/C++ Developers

Version: Neon.3 Release (4.6.3)
Build id: 20170314-1500



感想


「#include 」を使用すと、「Debug」でエラーとなります。
原因については調べていません。

Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Windows上のEclipseでRaspberry Piのソフトを開発している時にIDE内でSSHにてRaspberry Piに接続する時に設定方法のメモ。

設定


Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

下記「My Home」をダブルクリックする
Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)



切断


Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)



再接続


Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)



Terminal接続


Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Eclipse Raspberry Pi(Raspbian) SSH接続方法(備忘録)

Indy10 Could not load SSL library 対応(Raspberry Pi)(備忘録)

Raspberry Pi Lazarusでindy10を使用して、SMTPでgmail送信をしようとした所、「Could not Load SSL Library」のエラーとなりました。
Indy10 Could not load SSL library 対応(Raspberry Pi)

indyのバージョンは indy-10.2.0.3 です。

原因は、OpenSSLのライブラリーバージョンが「システム > Indy10」とバージョンサポート範囲外でした。
システム側の利用出来るバージョンは 1.0.0 で Inyd10が対応しているバージョンは 0.9.9~0.9.6 でした。

■対策
Indy10側で対象バージョンを無理やり、 1.0.0 もLoadLibray()の対象としました。
バージョン違いによる弊害は「幸運を期待する」です。

※なお、この対策をしても、Lazarusのデバッグモードでは「例外クラス'Extemal:SIGILL'」が発生します。実行ファイルを直接実行させると例外は発生しませんでした。よって、この件は将来の叡智に任せる事にしました。(使えればいいじゃん!)



環境


ハード:Raspberry Pi 3 Model B V1.2
pi@rp3a:~ $ uname -a
Linux rp3a 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux
pi@rp3a:~ $ 

pi@rp3a:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 8.0 (jessie)
Release: 8.0
Codename: jessie
pi@rp3a:~ $ 

pi@rp3a:~ $ openssl version
OpenSSL 1.0.1t  3 May 2016
pi@rp3a:~ $ 

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

Indy10 : indy-10.2.0.3.tar.gz



テストプログラム



メイン
unit u_app;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, IdSMTP, IdSSLOpenSSL, FileUtil, Forms, Controls, Graphics,
  Dialogs, StdCtrls,
  IdMessage;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    IdSMTP1: TIdSMTP;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  idmessage: tidmessage;
begin
  memo1.Lines.add('send start.');

  idmessage := tidmessage.Create(nil);
  idmessage.attachmentencoding := 'MIME';
  idmessage.charset := 'UTF-8';
  idmessage.ContentTransferEncoding := 'BASE64';
  idmessage.contenttype := 'text/plain; charset=UTF-8';  //←ここがポイント

  idmessage.from.address := 'ffffff@gmail.com';
  idmessage.recipients.emailaddresses := 'rrrrrr@gmail.com';

  idmessage.subject := 'test ' + formatdatetime('yyyy/mm/dd hh:mm:ss', now);
  idmessage.body.Text := 'test body.' + #$0d#$0a + '日本語' + #$0d#$0a +
    formatdatetime('yyyy/mm/dd hh:mm:ss', now);

  idsmtp1.connect();
  try
    idsmtp1.send(idmessage);
  finally
    idsmtp1.disconnect;
    idmessage.Free;
  end;

  memo1.Lines.add('send end.');
end;

end.


TIdSMTPとTIdSSLIOHandlerSocketOpenSSL
  object IdSMTP1: TIdSMTP
    IOHandler = IdSSLIOHandlerSocketOpenSSL1
    Host = 'smtp.gmail.com'
    Password = 'xxxxx'
    Port = 465
    SASLMechanisms = <>
    UseTLS = utUseImplicitTLS
    Username = 'xxxxxx@gmail.com'
    Left = 96
    Top = 40
  end

  object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL
    Destination = 'smtp.gmail.com:465'
    Host = 'smtp.gmail.com'
    MaxLineAction = maException
    Port = 465
    DefaultPort = 0
    SSLOptions.Method = sslvSSLv23
    SSLOptions.Mode = sslmUnassigned
    SSLOptions.VerifyMode = []
    SSLOptions.VerifyDepth = 0
    Left = 120
    Top = 104
  end




経過


エラー発生時の経過を辿って行くと、下記の青枠の LoadLibrary() で複数のバージョンのロードを試みていますが、全て失敗しています。
Indy10 Could not load SSL library 対応(Raspberry Pi)

上記の赤枠の ALibVersions[] をみてみると、

Indy10 Could not load SSL library 対応(Raspberry Pi)

0.9.9~0.9.6 となっていました。
※先頭の「.」があるのとないのがありますが、これでよいのか不明です。

ldconfig -v で調べてみると

pi@rp3a:~ $ ldconfig -v

/usr/lib/arm-linux-gnueabihf:

   libssl.so.1.0.0 -> libssl.so.1.0.0

   libcrypto.so.1.0.0 -> libcrypto.so.1.0.0



.1.0.0 となっているので、

下記のように、 .1.0.0 を追加しました。

Indy10 Could not load SSL library 対応(Raspberry Pi)


これで、 gmai 送信できましたが、冒頭の記述のようにLazarusのデバッグモードでは「例外クラス'Extemal:SIGILL'」が発生します。
実行ファイルを直接実行させると例外は発生しませんでした。



例外クラス'Extemal:SIGILL'を追う


これを追っていくと、

こんな箇所に遭遇しました。
Indy10 Could not load SSL library 対応(Raspberry Pi)

{}のネスト不良がありました。
修正方法がわからないので、(* *)でコメント化し、万一この関数を呼ばれた時の為に、 raise を入れて置きました。
ただし、これを行っても結果はなんら変わりませんでした。

Indy10 Could not load SSL library 対応(Raspberry Pi)

※しかし、このような状態でコンパイルが通ったのかは判りません。これも「将来の叡智に任せる」ですね。



感想


色々探っているなかで、if xxx then begin xxx; exit; end; で exit; を通過しているにもかかわらず、exitしないで次の文に制御が移ります。
「コンパイラオプション」で「最適化なし」にすると、この現象は無くなりました。

色々、難問が残っていますがとりあえずこのまま使ってみます。



Lazarus ソースエディタで入力ダブリ(Raspberry Pi)(備忘録)

Raspberry Pi 3上のLazarusにおいて、ソースエディタで半角英文字を入力すると、
1文字入力で2文字表示される。
ただし、この現象は「オブジェクトインスペクター」や「Leafpad」では発生しない。

暫定対策は 「Raspberry Pi設定」のローカライゼーションを「en(Englich)」にして、この現象を逃げる。

ダブリが発生する時


Lazarus ソースエディタで入力ダブリ(Raspberry Pi)



正常に入力できる時


Lazarus ソースエディタで入力ダブリ(Raspberry Pi)
※Lazarusの「IDEオプション」→「環境」→「一般」→「言語」は「日本語[ja]」に設定しても正しく動作する。



環境


ハード:Raspberry Pi 3 Model B V1.2
pi@rp3a:~ $ uname -a
Linux rp3a 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux
pi@rp3a:~ $ 

pi@rp3a:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 8.0 (jessie)
Release: 8.0
Codename: jessie
pi@rp3a:~ $ 

pi@rp3a:~ $ openssl version
OpenSSL 1.0.1t  3 May 2016
pi@rp3a:~ $ 

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)(備忘録)

Raspberry Pi 3(Raspbian)に indy-10.2.0.3 をインストールした時のメモです。

■不具合との遭遇
(1)indy10をLazarusに組み込む為に、コンパイルをするとエラーとなります。
(2)indyとは無関係に、ソースエディタで半角文字を一文字入力すと二文字表示されます。(電動タイプライター風にいうとダブリます)
(3)indy10が対応しているSSLのバージョが古い為にSMTP利用時にSSLが使用できない不具合があります。(ライブラリーロードエラー)

(1)の対策は本記事で対策しています。
(2)の対策は、Lazarusのソースを修正する必要があると思われますが、困難なので暫定的に環境で対応しました。(別記事)
(3)の対策は、幸運を期待した対策をしました。(別記事予定)


要点版


indy10のダウンロードはコチラから
indy-10.2.0.3.tar.gz をダウンロードする。

■解凍後フォルダ名変更
「fpc」フォルダ → 「indy_fpc」
「lazarus」フォルダ → 「indy_lazarus」

■フォルダをコピー(windows上で作業の場合)
「indy_fpc」 → 「/usr/local/fpc/source/packages」に
「indy_lazarus」 → 「/usr/local/share/lazarus/components」に

■パーミッション変更
0777に変更する。
「/usr/local/share/lazarus」
「/usr/local/fpc」

■パッケージ lpk ファイル指定
メニュー「パッケージ」 → 「パッケージファイルを開く」
/usr/local/share/lazarus/components/indy_lazarus/indylaz.lpk

■パッケージOptions指定
「コンパイラオプション→パス」 → 「Other unit files(-Fu)」欄の横の「...」をクリックする。
「/usr/local/fpc/source/packages/indy_fpc」を指定

■パッケージコンパイル
「パッケージダイアログ」の「コンパイル」クリック

■バグ修正
idMessageの831行目の if Encoding = meMIME then でErrorとなるので、
これを if self.Encoding = meMIME then と修正する。

■再度コンパイル

■パッケージのインストール
「パッケージ」ダイアログの「Use」→「インストール」をクリックしてインストール。



画像付版


環境


ハード:Raspberry Pi 3 Model B V1.2
pi@rp3a:~ $ uname -a
Linux rp3a 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux
pi@rp3a:~ $ 

pi@rp3a:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 8.0 (jessie)
Release: 8.0
Codename: jessie
pi@rp3a:~ $ 

pi@rp3a:~ $ openssl version
OpenSSL 1.0.1t  3 May 2016
pi@rp3a:~ $ 

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)



準備


■indy10 ダウンロード

indy10のダウンロードはコチラから
Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)
indy-10.2.0.3.tar.gz をダウンロードする。

■indy10 解凍

windows上で解凍しました。
7-Zipでindy-10.2.0.3.tar.gzを解凍後、解凍されたindy-10.2.0.3.tarを更に解凍。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)
解凍されたファイル

■フォルダ名変更(任意)

解凍されたファイルの2つのフォルダの名前を下記のように変更する。
(indyである事と用途が分かるように)(他とダブらなければ任意の名前でよい)

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

■解凍したファルダをRaspberry Piに転送
windows上で作業しているので、解凍した内2つのフォルダをlazarusに転送する。
転送はWinSCPでしました。ログインはrootで。

(1)indy_lazarusファルダ

下記のようにcomponentsフォルダに転送する。
Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)
転送結果

componentsのフォルダの位置は環境により変わるので注意。
components中の他のフォルダに「.lpk」が存在する事で確認しました。

(2)indy_fpcフォルダ

下記のようにpackagesフォルダに転送する。
Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)
転送結果



作業性向上の為に


Lazarusのインストール等はrootで行いましたが、indyインストールの作業やアプリの作成はpiでするので、
色々面倒な事を避ける為 lazarus と fcp のフォルダのパーミッションは何でも可にして置きました。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

下記のエラーは「スキップ」で対応。
Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

/usr/local/fpcも同様に処置します。



パッケージのインストール



■Lazarusを起動し、 メニュー→パッケージ→パッケージファイルを開く をクリック。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

■indylaz.lpkを開く

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

パッケージダイアログが開いたところ
Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

■Option指定

上記画面の「Options」をクリックする。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

「コンパイラオプション」ダイアログで「コンパイラオプション→パス」を選択し、
「Other unit files(-Fu)」欄の横の「...」をクリックする。

表示された「パスエディタ」ダイアログの「検索パス」グループの検索用フォルダマークボタンをクリックして、
先程、コピーした「indy_fpc」を指定する。
その後、「追加」ボタンをクリックして、一覧に追加する。
Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)
追加後の画面

「OK」をクリックして戻る。

■パッケージをコンパイル

「コンパイル」ボタンをクリックしてコンパイルする。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

■バグ修正

idMessageの831行目の if Encoding = meMIME then でErrorとなるので、
これを if self.Encoding = meMIME then と修正する。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

赤枠が修正対象行。 水色枠は原因行でwithによる限定子省略の戻し忘れが原因と思われる。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)
修正後

■再度コンパイル

「コンパイル」ボタンをクリックしてコンパイルする。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

コンパイル成功

■パッケージのインストール

「パッケージ」ダイアログの「Use」→「インストール」をクリックしてインストール。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

Lazarus再構築の許可を与える。
「はい」ボタンをクリックする。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

パッケージのインストールが完了し、Lazarusが再起動される。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

indy登録完了。


C++ 名前マングリング(Name mangling)(備忘録)

「名前マングリング(Name mangling)」について、実機で挙動確認をした時のメモです。



名前マングリング(Name mangling)


■C++の場合、シンボル名に「名前マングリング(Name mangling)」と呼ばれる処理が施される為に、
共有ライブラリーを利用する時には、関数名の指定はその「名前マングリング」された名前を指定しなければならない。

もしくは、共有ライブラリー側で「名前マングリング」を抑止(デマングル)し、関数名のママとする必要がある。

■C言語の場合は、名前マングリングは行われない。



先にまとめ


■名前マングリングの結果
0000067c T _Z9SOtest005c ← SOtest005はこのようになる
00000680 T _Z9SOtest006i ← SOtest006はこのようになる

目的はオーバーロードの実現の為と思われる。



■デマングル
ヘッダファイルをCとC++で共有するために
#ifdef __cplusplus
extern "C" {
#endif
ここにexternの定義をする。複数可能。
#ifdef __cplusplus
}
#endif

結果は
00000668 T SOtest002
00000670 T SOtest003
00000678 T SOtest004
のように「名前マングリング」されない。



■CPP側のextern指定
ヘッダファイル側とCPPファイル側の両方でextern指定をすると、「名前マングリング」の抑止(デマングル)指定をしても、
「名前マングリング」された事があった。ただし、再現できなかった。記憶の片隅に置いておく事にします。



■extern指定なしのシンボル名(今回は関数名)
FreePascal側で宣言している

function SOtest006(a : integer) : integer; cdecl; external 'RaspbianSOtest001' name '_Z9SOtest006i';

はCPP,h側では extern は指定していない。
しかし、利用出来る。
ただし、シンポル名は「名前マングリング」された名前となる。



■FreePascal側でのオーバーロード

(1)宣言
function SOtest002(a : integer; b : integer) : integer; cdecl; external 'RaspbianSOtest001' name 'SOtest002';
function SOtest002(a : integer) : integer; cdecl; external 'RaspbianSOtest001' name 'SOtest007';

(2)呼び出し
c := SOtest002(3,6);
memo1.lines.add('SOtest002(3,6) : ' + inttostr(c));

c := SOtest002(2);
memo1.lines.add('SOtest002(2) : ' + inttostr(c));

(3)結果
SOtest002(3,6) : -3
SOtest002(2) : 702

この事から「デマングル」はしない方がよいかもしれない。



環境


■Eclipse IDE for C/C++ Developers
Version: Neon.3 Release (4.6.3)
Build id: 20170314-1500
(Windows 10 64bitで実行)

■ハード:Raspberry Pi 3 Model B V1.2

■pi@rp3a:~ $ uname -a
Linux rp3a 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux

■Lazarus
バージョン #:1.2.4+dfsg2-1
FPCバージョン 2.6.4
(Raspberry Pi 3で実行)




テスト


■ソース
(1)共有ライブラリー
xxx.cpp
#include "RaspbianSOtest001.h"

int SOtest002(int a,int b) {return a - b;}
int SOtest003(void) {return 3;}
extern void SOtest004(void){}
void SOtest005(char a){}
int SOtest006(int a){return a + 600;}
int SOtest007(int a){return a + 700;}



ヘッダファイル
RaspbianSOtest001.h

#ifdef __cplusplus
extern  "C"  {
#endif
extern int SOtest002(int a,int b);
extern int SOtest003(void);
extern void SOtest004(void);
//extern int SOtest007(int a);
#ifdef __cplusplus
}
#endif

extern void SOtest005(char a);
extern "C" {int SOtest007(int a);}




(2)共有ライブラリーを使用するFreePascal
unit u_app;

{$mode objfpc}{$H+}

interface

uses
  dl,
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

function SOtest002(a : integer; b : integer) : integer; cdecl; external 'RaspbianSOtest001' name 'SOtest002';
function SOtest006(a : integer) : integer; cdecl; external 'RaspbianSOtest001' name '_Z9SOtest006i';
function SOtest007(a : integer) : integer; cdecl; external 'RaspbianSOtest001' name 'SOtest007';
function SOtest002(a : integer) : integer; cdecl; external 'RaspbianSOtest001' name 'SOtest007';


type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  lib : pointer;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  c : integer;
begin
  c := 123;
  //c := SOtest002(10,5);
  //SOtest004;

  c := SOtest002(3,6);
  memo1.lines.add('SOtest002(3,6) : ' + inttostr(c));

  c := SOtest006(6);
  memo1.lines.add('SOtest006(6) : ' + inttostr(c));

  c := SOtest007(70);
  memo1.lines.add('SOtest007(70) : ' + inttostr(c));

  c := SOtest002(2);
  memo1.lines.add('SOtest002(2) : ' + inttostr(c));

end;
begin
end.




■実行結果
Memo1
SOtest002(3,6) : -3
SOtest006(6) : 606
SOtest007(70) : 770
SOtest002(2) : 702




■シンボル名確認 nm libRaspbianSOtest001.so 実行結果
root@rp3a:/usr/lib# nm libRaspbianSOtest001.so
00000668 T SOtest002
00000670 T SOtest003
00000678 T SOtest004
00000688 T SOtest007


0000067c T _Z9SOtest005c
00000680 T _Z9SOtest006i




Lazarus と FreePascalのインストール(Raspberry Pi)(備忘録)

雨降りセンサーや郵便投函センサーのサーバーとして現在PCはEZGO(手のひらサイズPC)とIP Powerを組み合わせているのですが、
これをRaspberry Pi 3に置き換えてみようと挑戦中です。

この記事は、開発言語としてWindowsとRaspbianの両方で使えるFree Pascal(FPC)を試す事にしてLazarusのインストールを試みた時の備忘録です。
古いバージョンなら比較的簡単にインストールできましたが、出来るだけ新しいバージョンを狙うとなかなか苦労します。

前提


■OS
Raspberry Pi 3のOSはRaspbianで、

RASPBIAN JESSIE WITH PIXEL
Image with PIXEL desktop based on Debian Jessie
Version:April 2017
Release date:2017-04-10
Kernel version:4.4

ここからダウンロードしました。

■開発言語とライブラリー
Free Pascal and Lazarus と indy10を使用する。



LazaFree Pascal and Lazarusのインストール


こちらについては、下記のサイトで非常にわかりやすく書かれています。(感謝)

Tweaking4All.com - How to install Lazarus Pascal on Raspberry Pi 2 (Raspbian)

■ただし、記事は2015年に書かれたものなので、最新のFree Pascal(FPC)をコンパイルする為に必要なFPCのバージョンが古く、コンパイルできませんでした。
この為、Step4に書かれている fpc-2.6.4.arm-linux.tar を fpc-3.0.2.arm-linux-eabihf-raspberry.tar に置き換えて実施しました。

fpc-3.0.2.arm-linux-eabihf-raspberry.tarはこちらからダウンロードしました。

■もう一迷った箇所は、
Step4で、fpc-3.0.2をインストールする時に、問い合わせがあります。
ideとかドキュメントなどインストールするかなどです。
これは、全て「n」で応答しました。....この記事を記述時点ではこの選択の影響は不明です。

■重要なポイント
「Increase the swap file size (required)」で書かれている、スワップファイルの拡張はRaspberry Pi 3でも必須です。
これをしないと、地獄を見ます。私のように。
※ 設定値は記事の通り、 CONF_SWAPSIZE=500 で成功しました。


参考にした記事が非常によく書かれていて、これ以上メモって置くことはありません。改めて感謝感謝です。


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

otsu.usiwakamaru

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

プロフィール詳細

カレンダー
01 | 2018/02 | 03
- - - - 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 - - -
キーワード
クリックしたキーワードの記事のみ表示します。

ダンサー ミニー ミッキー デイジー ドナルド グーフィー キャラクター  3D 試み MFP 電池 ティンカーベル デザイン クラリス 全天球 チップデール プルート パークテーマ キャスト IXY スクルージ マレフィセント スモールプラネット ダッフィー SPOT 改造 

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

全ての記事を表示する

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


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

アクセス数

現在の閲覧者数

tael no013用