はじめてのFlutter -開発環境構築-
はじめに
こちらのFlutterのCodelabシリーズをやって行きたいと思います。
Write Your First Flutter App, part 1
今回はまず開発環境の設定まで。
インストール手順
公式ドキュメントはこちら。 - MacOS install - Flutter
AndroidStudioを利用する前提で解説していきます。 AndroidStudioをインストール済みならば、Set up an editor - Flutterを参照してFlutter Pluginsを導入しておきましょう。
Flutter SDKのダウンロード
- https://storage.googleapis.com/flutter_infra/releases/stable/macos/flutter_macos_v1.0.0-stable.zip からダウンロード。
- unzipして、ファイルを移動しておく
$ unzip ~/Downloads/flutter_macos_v1.0.0-stable.zip $ mv ~/Downloads/flutter ~/bin/
- PATHを通す
# fishの場合 $ vim ~/.config/fish/config.fish set -x PATH ~/bin/flutter/bin $PATH
実行環境の確認
flutterを実行するための依存ライブラリを確認します。
(詳細なログを見たい場合は、-v
を付けるといい)
$ flutter doctor
エラーがある場合は、↓の様に☓マークがつくので解消しよう!
Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, v1.0.0, on Mac OS X 10.14 18A391, locale ja-JP) [!] Android toolchain - develop for Android devices (Android SDK 28.0.3) ✗ Android SDK file not found: /Users/sichien/Library/Android/sdk/platforms/android-28/android.jar. [!] iOS toolchain - develop for iOS devices (Xcode 10.1) ✗ libimobiledevice and ideviceinstaller are not installed. To install with Brew, run: brew update brew install --HEAD usbmuxd brew link usbmuxd brew install --HEAD libimobiledevice brew install ideviceinstaller ✗ ios-deploy not installed. To install with Brew: brew install ios-deploy [✓] Android Studio (version 3.2) ✗ Flutter plugin not installed; this adds Flutter specific functionality. ✗ Dart plugin not installed; this adds Dart specific functionality. [!] VS Code (version 1.30.1) [!] Connected device ! No devices available
依存環境の解消①: Android toolchain
Android Studio->SDK Manager->Android 9をダウンロード
$ flutter doctor --android-licenses
依存環境の解消②: iOS toolchain
エラーに出ているbrew
コマンドを実行していく。
依存環境の解消③: VS Code (version 1.30.1)
Flutter pluginをインストール
依存解消後
flutter doctor -v [✓] Flutter (Channel stable, v1.0.0, on Mac OS X 10.14 18A391, locale ja-JP) • Flutter version 1.0.0 at /Users/sichien/bin/flutter • Framework revision 5391447fae (5 weeks ago), 2018-11-29 19:41:26 -0800 • Engine revision 7375a0f414 • Dart version 2.1.0 (build 2.1.0-dev.9.4 f9ebf21297) [✓] Android toolchain - develop for Android devices (Android SDK 28.0.3) • Android SDK at /Users/sichien/Library/Android/sdk • Android NDK location not configured (optional; useful for native profiling support) • Platform android-28, build-tools 28.0.3 • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06) • All Android licenses accepted. [✓] iOS toolchain - develop for iOS devices (Xcode 10.1) • Xcode at /Applications/Xcode.app/Contents/Developer • Xcode 10.1, Build version 10B61 • ios-deploy 1.9.4 • CocoaPods version 1.5.3 [✓] Android Studio (version 3.2) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin version 31.3.1 • Dart plugin version 181.5656 • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06) [✓] VS Code (version 1.30.1) • VS Code at /Applications/Visual Studio Code.app/Contents • Flutter extension version 2.21.1 [!] Connected device ! No devices available
プロジェクト作成
- AndroidStudioを開いて、
File > New Flutter Project.
を選択。
- 「Flutter Application」を選択し「Next」を押下。
- Project Nameを好きなものに変更。
- Flutter SDKのPATHが正しいか確認し、「Next」を押下。
- company domainを任意で変更して最後に「Finish」を押下。
しばらくすると、プロジェクトが立ち上がるので、これで作成完了:+1:
iOS・Androidでビルドしてみよう
AndroidStudioで対象のデバイスを選択して、Runボタンを押下します。
iOS Simulator、Android Emulatorでビルド環境できるとこんな画面になります。 下の「+」ボタンを押すと画面中央の数字がカウントアップされます。
次回からCodelab part1の内容に入っていきます。
MacでVimからNeoVimに移行してみる
NeoVimとは
巷では、次世代のVimと言われているNeoVim。 公式のGithubを見てみると、
とのこと。
今Vimのパッケージ管理がNeoBundleを使っていて、これが作者から「もうオワコンだよ、今後はバグフィックスだけ更新するね」ってなっていることもあり、NeoVim + dein.vimで環境を作り直すことに決めた。
インストール
さっそく、NeoVimをインストールしましょう。
$ brew install neovim $ nvim -v NVIM v0.3.3 Build type: Release ...
簡単!😁
プラグイン管理マネージャー: dein.vim 導入
Shougo/dein.vim: Dark powered Vim/Neovim plugin manager
闇の力を利用した最強のプラグインマネージャーdein.vimを導入しましょう。 こちらも簡単で、↓の様にshellスクリプトを落としてきて、実行するだけ。
curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh # ~/.cache/deinにプラグインのソースコードが入ってくる。パスは任意です。 sh ./installer.sh ~/.cache/dein
次に、NeoVimの設定ファイルを作っていきます。
NeoVimでは、XDG Base Directoryに対応しているので、~/.config/nvim/init.vim
に書いていきます。
dotfileが大量発生してしまっているので、ツールごとにディレクトリにまとめる仕様になったと簡単に理解しています。
Vimと互換性があるので、 .vimrc
を使ってもいいのですが、かなりカオスになっているので移行と同時にさよならします。😇
XDG Base Directoryを環境変数として設定しておく場合はこんな感じ。
# fish shell set XDG_CONFIG_HOME ~/.config # bash shell export XDG_CONFIG_HOME=~/.config
~/.config/nvim/init.vim
に設定を記入していきます。
その前に、ディレクトリを作っておきましょう。
mkdir -p ~/.config/nvim/
↓がinit.vimの内容です。 一部プラグインの設定が入っていますが、インストールするものについては次に説明します。
set number "行番号を表示 set autoindent "改行時に自動でインデントする set tabstop=2 "タブを何文字の空白に変換するか set shiftwidth=2 "自動インデント時に入力する空白の数 set expandtab "タブ入力を空白に変換 set clipboard=unnamed "yank した文字列をクリップボードにコピー set hls "検索した文字をハイライトする set termguicolors "TrueColor対応" "=========================================" " plugin Manager: dein.vim setting "=========================================" if &compatible set nocompatible endif " プラグインが実際にインストールされるディレクトリ let s:dein_dir = expand('~/.cache/dein') " dein.vim 本体 let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim' " dein.vim がなければ github から落としてくる if &runtimepath !~# '/dein.vim' if !isdirectory(s:dein_repo_dir) execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir endif execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p') endif " 設定開始 if dein#load_state(s:dein_dir) call dein#begin(s:dein_dir) " プラグインリストを収めた TOML ファイル " 予め TOML ファイル(後述)を用意しておく let g:rc_dir = expand('~/.config/nvim/rc') let s:toml = g:rc_dir . '/dein.toml' let s:lazy_toml = g:rc_dir . '/dein_lazy.toml' " TOML を読み込み、キャッシュしておく call dein#load_toml(s:toml, {'lazy': 0}) call dein#load_toml(s:lazy_toml, {'lazy': 1}) call dein#end() call dein#save_state() endif " もし、未インストールものものがあったらインストール if dein#check_install() call dein#install() endif let g:dein#install_max_processes = 16 "=========================================" " setting "=========================================" filetype plugin indent on syntax enable colorscheme one let g:airline_theme = 'one' " powerline enable(最初に設定しないとダメ) let g:airline_powerline_fonts = 1 " タブバーをかっこよく let g:airline#extensions#tabline#enabled = 1 " 選択行列の表示をカスタム(デフォルトだと長くて横幅を圧迫するので最小限に) let g:airline_section_z = airline#section#create(['windowswap', '%3p%% ', 'linenr', ':%3v']) " gitのHEADから変更した行の+-を非表示(vim-gitgutterの拡張) let g:airline#extensions#hunks#enabled = 0
プラグインの追加
dein.vimでは設定ファイルを別ファイルから読み込むことができるので、プラグイン管理ファイルを作成しておく。
$ mkdir -p $XDG_CONFIG_HOME/nvim/rc/ $ touch $XDG_CONFIG_HOME/nvim/rc/dein.toml $ touch $XDG_CONFIG_HOME/nvim/rc/dein_lazy.toml
使うプラグインを dein.toml
に記述していきます。
[[plugins]] repo = 'Shougo/dein.vim' [[plugins]] repo = 'Shougo/deoplete.nvim' [[plugins]] repo = 'rakr/vim-one' [[plugins]] repo = 'vim-airline/vim-airline' [[plugins]] repo = 'airblade/vim-gitgutter'
そのあと、nvim
で起動すると、自動的にプラグインを読み込んでくれます。設定後の画面はこんな感じになります。
Android DataBinding 入門 ① ~オブジェクト変化を監視するぞ~
はじめに
最近Androidで,Viewを取ってくるときによく使うfindViewByIdをぶっとばすために ButterKnifeを使うことを検討していた.
しかしButter Knife、今までありがとう。 Data Binding、これからよろしく。の記事を見たり,「DataBindingいいよ」という話を聞き,
標準で使えるDataBindingを使ってみようと思ったので,
連載形式で勉強していきたいと思う.
(RxAndroidもやっていく予定...宣言しておく!)
DataBindingとは?
まず,DataBindingについて整理していこう. 公式ドキュメントはここ. developer.android.com
DataBindingの言葉の意味はwikipediaによると,
XMLなどのデータソースとアプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術である。
分離されたデータソースとユーザインタフェースの間を橋渡しする役割を果たし、データが変更されるとそれに応じてユーザインタフェースが変更される一方向なデータバインディングと、 併せてユーザインタフェースの変更または操作に応じてデータが変更される双方向のデータバインディングがある。
重要な点としては,分離されたデータソースとUIの間の橋渡しをする役割であること.
これを最小限のコード量で実現できるのがDataBinding Libraryだと締めておく.
DataBindingを導入
Android StudioのプロジェクトでDataBindingを使えるようにするには, appディレクトリ以下のbuild.gradleにこれを追加するだけ!
android { ...... dataBinding{ enabled = true } }
※Android Studio 1.3以降がサポートしています. https://developer.android.com/topic/libraries/data-binding/index.html?hl=ja#studio_support
findViewByIdをぶっとばせ
今回はサンプルとして,Hello worldを表示しているアプリを少しいじって,INABAボタンだけがあるだけのアプリを作成しました.
ここでは,INABAボタンにテキストをセットするところまでやります.
まず,レイアウトファイルを編集します.
サンプルファイルを以下に示しておきます.
// activity_main.xml <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.example.shin.test.model.User"/> </data> <RelativeLayout xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.shin.test.MainActivity"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> </RelativeLayout> </layout>
やったこととしては,
1. レイアウトファイルのルートを<layout>
に
2. Bindさせたいデータオブジェクトを<data>
で宣言する
- typeが型で,nameは変数名
3. Bindさせたい場所に@{}
構文でセット
BindさせるデータオブジェクトはUser
として作りました.
// User.java public class User{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
次に,ActivityでBindingオブジェクト取得してみましょう.
// MainActivity.java public class MainActivity extends AppCompatActivity { private ActivityMainBinding mActivityMainBinding; private User mUser1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); mUser1 = new User(); mUser1.setName("inaba"); mActivityMainBinding.setUser(mUser1); } }
mActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
でレイアウトとBindされたオブジェクトを得ることができる.
このオブジェクトのクラス名のルールとしては, レイアウトファイル名の_
を抜いてパスカルケースで単語を連ね,末尾にBinding
がつく.
mActivityMainBinding.setUser(mUser1);
で Bindingオブジェクトとレイアウトファイルの<data>
タグ内で宣言されているデータオブジェクトと紐付ける.
ここでButtonのViewを取ってきたいときは,findViewById
+ キャストでなく,以下のようにしてとれる.
Button button = mActivityMainBinding.button;
(これが一番うれしい点!!)
ここまでで,ボタンにテキストをいれるとこまでできた.
オブジェクト監視
次にINABAボタンを押したら,MATSUMOTOボタンに変化するようにしてみよう.
普通にやるとしたら,ButtonオブジェクトにClickListenerをセットして,setTextすることになると思う.
Data Bindingで実現するには,先程作ったUserオブジェクトの変化を監視できるようにし,Bindingオブジェクトに通知してあげる必要がある.
まず,Userクラスを監視できるようにするにはBaseObservable
を継承し,監視するフィールドのゲッターに@Bindable
をつける.
変更をBindingオブジェクトに通知するため,notifyPropertyChanged(BR.name);
を監視するフィールドのセッターで呼んであげる.これでOK.
public class User extends BaseObservable{ private String name; @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name); }
監視の設定がおわったので,ボタンが押された時の動作を記述する.
// activity_main.xml <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}" android:onClick="@{activity.onNameClick}"/>
Buttonにandroid:onClick="@{activity.onNameClick}"/>
のよう,onClick
属性を追加し,
onNameClick
メソッドを定義しておく.
// MainActivity.java public void onNameClick(View view){ Toast.makeText(this, "name click", Toast.LENGTH_SHORT).show(); mUser1.setName("matsumoto"); } }
これで完成! 基本的な使い方はこれで
参考
ファシリテートをする際に気をつけたいこと
はじめに
最近,会議でファシリテートをすることが多くなり,自分でノウハウを持ちたいと思っていた.
そこで,出会ったのがこちらの本
www.amazon.co.jp
世界一やさしいと銘打つだけあって,小説形式ですごく読みやすく,内容もわかりやすかった.
意識したいことの備忘録として,書いておきます.
まず,ファシリテータの役割
会議とは何かを決める場である.
ファシリテートとは,何かを決めることを促進する・容易にすること.
気をつけるべきこと
- 自分の意見を押し通しすぎるな.意見を言う自分と客観点にファシリテーションする自分を使い分けろ
- やるべきことを決める場合,誰が いつまでに 何をするかまで決めよう
- ファシリテータとは,必ずしも司会者として,場を仕切るだけではない.参加者として会議を進行する隠れファシリテータもある
- 決まったこと,やるべきことを確認したら,会議のあとに参加者にメールといった手段で確認するようにしよう.記録になるし,催促する効果あり.
- 会議をはじめる前に,会議の目的の明確化と会議の終了条件を参加者皆で共有すべし.目指すべき方向を定めておく.
- 会議で無駄な時間は,資料を読み上げる時間だ.個々で黙読したほうが遥かに早い.
- 書くファシリをはじめよ.議論を可視化し,噛み合わせられるようにすることがメインで,キレイにまとめることではない.
- 会議の前には準備せよ.4つのPをまとめよ.
・Purpose:会議で達成したい目標
・Process:会議の終了条件にどうやってたどり着くのか,どの順番で何を議論するか.会議の流れを考える.
・People:会議に必要な人間を漏らさず呼んでいるか.貢献しない人は呼ばない.
・Property:会議に必要なものの用意.部屋,ホワイトボード,付箋とか - 会議は主催者が作るものではなく,参加者全員に会議をよくする責任があり,少しでも生産性を高め,よい会議とする責任があることを忘れるな.
Softbank iPhone6のSIMカードをNexus5xで使えるようにしてみた
こちらの記事をみてやったらできた。
Nexus5にSoftBankのiPhoneSIMを刺して使ってみた
手順をまとめると、
1. Softbank用のAPNの設定
2. 通信事業者を変更する
って感じ。
ちなみにNexus5xのOSは7.0.0。
APN(Access Point Name)とは、モバイルネットワークでデータ通信をする際に必要となる接続先を指定する識別子のこと。
1. Softbank用のAPNの設定
設定 -> 「無線とネットワーク」からもっと見る -> モバイルネットワーク -> アクセスポイント名 -> 右上のプラスボタンから追加。
以下の値を設定する。
名前:softbank
APN: jpspir
Username: sirobit
Password: amstkoi
MCC: 440
MNC: 20
認証タイプ: PAP
2. 通信事業者の変更
設定 -> 「無線とネットワーク」からもっと見る -> モバイルネットワーク -> 通信事業者 画面に移動して、
Softbankを選択する。
はじめての組込みOS (3) ~ 静的変数の読み書き ~
今回は12ステップで作る組み込みos自作入門のステップ3を進めていく.
ステップ3では,ROMやRAMの違いやデータ領域,スタック,リンカスクリプトなどメモリ周りの学習がメイン.
組込みOSでのメモリ利用
通常のアプリケーションプログラミングでは,CPUのメモリ構成やメモリマップを把握する必要はほぼない.というのも汎用OSには仮想メモリという機構があるからである.
一方で組込みOSにはメモリを管理する機能が存在しないので,メモリの利用について考慮する必要がある. 具体的には
といった3点がある.
メモリの種類
今回でてきた用語は以下の3つ
用語 | 説明 |
---|---|
ROM(Read Only Memory) | read専用でプログラムからはwrite不可..しかし電源OFFでも内容を保持. |
フラッシュROM | 電気的に内容の書き換えが可能なROM |
RAM(Random Access Memory) | read, write可能だが,電源OFFで消失. |
ROMもRAMもCPUとは独立した別モジュールではあるけれど,ある程度の容量を確保したものがCPUに予め内蔵されている場合が多い.
メモリと領域
プログラム実行の際,実行形式ファイルはメモリ上に展開されるわけだが,ただコピーされるわけではなくメモリ上の担当領域に分割して配置される.
領域名 | 保持する内容 |
---|---|
テキスト領域 | CPUが実行する機械語のコード |
データ領域 | 初期値を持つstatic変数など |
BSS領域 | 初期値を持たないstatic変数 |
wikipediaのページによるとBSS領域のBSSとは
だそうだ.これぐらいの理解でそっとしておく.
BSS領域について更に補足をすると,確保時にCPUやコンパイラ次第ではあるが,多くの場合で変数はゼロ,ポインタはNULLに初期化される.組込みシステムではあえてゼロクリアさせることで,コード上での初期化処理をなくし,データサイズを節約する場合によく使われる手段だそうだ.
実行形式ファイルのセクション
実行形式ファイルも同様に領域が分けられている.どんな領域に分かれているのかについては詳しく書かれていなかったが,複数の領域情報やファイルの情報を「ヘッダ」として持っている.これはお馴染みの通り,ファイルや領域の先頭に付加される.
変数や関数がどのようにメモリ上に配置されているのか確認してみる.
今回利用しているgccは実行形式ファイルをELF(Executable and Linkable Format)形式というフォーマットで出力する.
ELF形式はreadelfコマンドで解析できるのだが,Macにはデフォルトではいっていないため導入からやった. ↓のようにbrewコマンドを叩く.El Captain(10.11)はサポートしてないよと注意されるが試した所,動いていたので無視(´・ω・`)
$ brew install binutils Warning: You are using OS X 10.11. We do not provide support for this pre-release version. You may encounter build failures or other breakage.
インストールが完了したら,
$ greadelf -a kzload.elf
と叩く.brewでいれたbinutilsのコマンドの先頭にはgがつくようだ.
↑のコマンドの結果の一部だが,↓のようなセクションに分かれていることがわかる. .textはテキスト領域に,.dataはデータ領域に対応している.
セクションヘッダ: [番] 名前 タイプ アドレス Off サイズ ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .vectors PROGBITS 00000000 000074 000100 00 WA 0 0 4 [ 2] .text PROGBITS 00000100 000174 0002dc 00 AX 0 0 2 [ 3] .rodata PROGBITS 000003dc 000450 00001f 01 AMS 0 0 1 [ 4] .data PROGBITS 000003fc 000470 00000c 00 WA 0 0 4 [ 5] .shstrtab STRTAB 00000000 00047c 000038 00 0 0 1 [ 6] .symtab SYMTAB 00000000 0005f4 0003c0 10 7 44 4 [ 7] .strtab STRTAB 00000000 0009b4 000167 00 0 0 1
また,変数の配置場所もこのコマンドから確認できる. ↓から_regという構造体の配列がアドレス:000003fcに配置されている. ここから↑のセクションヘッダヘッダを見てみると,.data領域のアドレスが000003fcなのでdata領域に配置されていることが確認できる. 同様にして見てみると,main関数(アドレス:0000010c)は.text領域(00000100)に配置されていることがわかる.
シンボルテーブル '.symtab' は 60 個のエントリから構成されています: 番号: 値 サイズ タイプ Bind Vis 索引名 ︙ ︙ 42: 000003fc 12 OBJECT LOCAL DEFAULT 4 _regs ︙ ︙ ︙ 59: 0000010c 66 NOTYPE GLOBAL DEFAULT 2 _main
リンカスクリプト
実行形式ファイルのデータのメモリ上への配置はリンクの段階で行われる.
つまり,リンクの際にはプログラムのどの部分がどのメモリアドレスに配置されるかをリンカに指定しなければならないが,これを行うのがリンカスクリプトである.
書籍においては,ステップ2の時点でのコードでは変数がROMに配置がされてしまっており,値の変更ができない. 変更できるようリンカスクリプトを書いて,プログラムをh8へ転送する際にはROMに書き込み,プログラム起動時には変数の初期値をROMからRAMにコピーし更に変数アクセスの際には,RAM上のアドレスに対しアクセスするように設定する.
その他でてきた用語を整理しておく.
- 変数の初期値が配置されるアドレス
- プログラムが変数にアクセスする際のアドレス
ここでの物理アドレスや仮想アドレスは厳密には相応しくないように思えるが,readelfの出力からこう呼んである.
プログラムヘッダ: タイプ オフセット 仮想Addr 物理Addr FileSiz MemSiz Flg Align LOAD 0x000074 0x00000000 0x00000000 0x003fb 0x003fb RWE 0x1 LOAD 0x000470 0x000003fc 0x000003fc 0x0000c 0x0000c RW 0x1
ELF形式はセッションの他にセグメントという管理単位を持つ.
↑はセグメント一覧である..プログラム実行時セグメント情報が参照され,メモリ上に展開される作業をロード(load)と呼び,ロードを行うプログラムをローダ(loader)と呼ぶ.
ここでELF形式のセッションとセグメントをまとめると
- セッション
- リンク時に同じ内容の領域をリンカがまとめるためのもの
- セグメント
- プログラム実行時にローダが参照してメモリ上に展開するためのもの
参照
静的変数の書き換え対応
コンパイルからh8へのプログラム転送までの作業メモ
(書籍のP.36-参照)
$ pwd ~/workspace/12step/src/03/bootload # ファームウェア作成 $ make # h8writeでフラッシュROMに書き込むため,.mot形式に変換 $ make image
h8をwriteモードに.
ディップスイッチを左からON,ON,OFF,ONにする.
この状態で電源ON.
# h8writeの実行 $ make write # シリアル接続する # 接続解除する場合は「~.」を押下する. $ sudo cu -l /dev/tty.usbserial-FTZ4UUFE
フラッシュROMからの起動起動には ディップスイッチを左からON,OFF,ON,OFFにした状態で電源ON. で横にあるリセットボタンを押す.
C言語メモ
- extern 修飾子
- memcpy 関数
- memset 関数
書籍の通りにごねごね進めて,プログラム実行して変数の変更まで完了 ・ω・!
参照
一言
ただの変数の読み書きといえども0からやるとなかなか手間がかかる.