X



トップページ電気・電子
1002コメント341KB
初めてのPIC 0x0f
レス数が1000を超えています。これ以上書き込みはできません。
0001774ワット発電中さん垢版2018/05/01(火) 23:12:13.97ID:o4U5k+Rn
PICをさわるのは今日が初めて、という超初心者のためのスレです。
  (O>――<O)    PIC選び、PICを使った回路は、誰でも最初は不安なものです。
  / (・) (・) ヽ    恥ずかしがらずに何でも聞いてください。速攻で教えてくれますよ。
  ○ /▼\ ○    質問のしかたは、初心者質問スレの発言1を見てくださいね。
  |(ヽ二フ ) |    
  /  ̄ ̄ ̄ ヽ  
 f ヽ     / |  PIC関係のスレは、レベルに合わせて以下のスレもありますので、活用しましょう。
 ヽ \  / ノ    ・PIC専用のスレ
  | \_ )(_/ !       本家本元のPICスレです。口の悪い人もいますが、楽しくやってるみたい。
  |       |       ここの話がわかるようになれば、あなたはもう一人前のPICerです。
  |       |    ・マイコンソフト 悩み事相談室
  |   | ̄ ̄|  |      マイコンソフトやツールの質問は、こちらでどうぞ。的確な回答があります。
 (_ノ    ヽ_)

 質問する時のコツ
  ・性格の悪い回答者はスルーしよう(相手すると逆効果)
  ・素人玄人などと 上から目線の回答者は、無視してください。相手してはいけません。
  ・そこそこ良い回答が出るまでしばらく再発言しないのもあり(良回答は後に出やすい)
  ・回答者のアドバイスで後日解決したら、結果報告しよう(とても喜ばれる)
  ・回答者は、僕たち初心者に優しくしてください。あなたも通ってきた道のはずです。


 必要なソフトなど(基本無料)
統合開発環境 MPLAB X ttp://www.microchip.com/mplab/mplab-x-ide
コンパイラ (XC8 XC16 XC32) ttp://www.microchip.com/mplab/compilers (高機能版は有料)
コード生成プラグイン (MCC) ttp://www.microchip.com/mplab/mplab-code-configurator
マイクロチップ ライブラリ (MLA) ttp://www.microchip.com/mplab/microchip-libraries-for-applications


 必要なハードなど
初心者はPIC16F1、PIC18F1以降の型番で始めると無理なく始められます。
プログラムの書き込みには書き込み器が必要です。持っていない場合はPICkit3(中華クローンでもまず大丈夫)を使いましょう。
PIC一覧、スペック検索 ttp://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1005


 さ、質問どうぞ〜っ
  0x0e 2018/02/13〜  ttps://rio2016.5ch.net/test/read.cgi/denki/1518524799/
  0x0d 2017/10/25〜  ttp://rio2016.5ch.net/test/read.cgi/denki/1508935254/
  0X0C 2017/07/27〜  ttp://rio2016.2ch.net/test/read.cgi/denki/1501157324/
  0x0B 2017/05/08〜  ttp://rio2016.2ch.net/test/read.cgi/denki/1494235320/
  0x0A 2017/01/04〜  ttp://rio2016.2ch.net/test/read.cgi/denki/1483498857/
  0x09 2016/09/07〜  ttp://rio2016.2ch.net/test/read.cgi/denki/1473238791/
  0x08 2016/04/30〜  ttp://rio2016.2ch.net/test/read.cgi/denki/1461994030/
  0x07 2016/02/05〜  ttp://wc2014.2ch.net/test/read.cgi/denki/1454648249/
  0x06 2015/07/18〜  ttp://wc2014.2ch.net/test/read.cgi/denki/1437151298/
  0x05 2015/04/07〜  ttp://wc2014.2ch.net/test/read.cgi/denki/1428391368
  0x04 2015/01/02〜  ttp://wc2014.2ch.net/test/read.cgi/denki/1420205108
0953774ワット発電中さん垢版2018/06/25(月) 12:46:28.44ID:sQsmhZbM
色々な使い方があるのに乏しい経験で「普通」とかいってわざわざ用途を絞っちゃう
お前ソフトに向いてない
0954774ワット発電中さん垢版2018/06/25(月) 19:12:15.18ID:GonHOTXi
アホカ
ただのグローバル変数に絶対アドレス指定したらそこが他で使われていないか、
リンカのマップファイルみて一々確認しなきゃならんだろ
そんなめんどくさいことやる馬鹿いねーよという意味だよ
(普通に共用体で宣言すればいい)
それともあれか、 @ 機能つかったらそのアドレスは他で使われないように
コンパイラが管理してくれるのか?
ヒープの真ん中でも避けてくれるのか?w
それに「普通」ってのが用途を絞っていると断言している根拠はなんだよ
勝手に決めつけるなよw
0957774ワット発電中さん垢版2018/06/25(月) 19:49:57.38ID:RbY6Qp1Q
だから >949
0958774ワット発電中さん垢版2018/06/25(月) 20:13:41.49ID:8zCYKMmx
アドレス指定したいっていう人に
アドレス管理誰がやるんだよって
頭おかしい
0959774ワット発電中さん垢版2018/06/25(月) 20:24:20.92ID:I7aJr4QL
>>954
普通のメモリマップドIOの割り当てをコンパイラやリンカがどうやると思ってるんだろ
0960774ワット発電中さん垢版2018/06/25(月) 21:25:38.07ID:tW+lH6r5
普通にアドレス指定してるが・・・・・何か?????
0962774ワット発電中さん垢版2018/06/25(月) 23:21:21.99ID:CdGAXxfw
IOやSFRのアドレスと、変数のアドレスをごっちゃにしてはややこしくなる。
変数のアドレスはコンパイラ、リンカに任せればいいという話でしょね。

いやいや、アドレス指定したいって話なんだから、という話もわかるのだけど、
共用体ではなんであかんのでしょ、って疑問はあるのかも。俺もまあそう思う。
0964774ワット発電中さん垢版2018/06/25(月) 23:24:03.21ID:8zCYKMmx
>>962
疑問に思ったとしても質問の前提だから

素直に共用体にしたくない理由はいくつか考えられるし
共用体はおまけでアドレス指定が主な目的かもしれない
0965774ワット発電中さん垢版2018/06/25(月) 23:26:06.77ID:8zCYKMmx
質問に答えるだけならその理由は不要
代替案を知りたいなら理由も書くでしょう
0966774ワット発電中さん垢版2018/06/25(月) 23:28:40.09ID:8zCYKMmx
変数のアドレスを指定したい理由も色々と考えられます
経験の浅い人はそういう発想もないでしょうけど
0967774ワット発電中さん垢版2018/06/25(月) 23:34:40.64ID:8zCYKMmx
質問者も、
やって見ればすぐわかることをいちいち質問しないでやってみればいいんですよ
出来たならここに理由と共にテクニックとして紹介する
初心者同士そうやって高め合えば良い
0968774ワット発電中さん垢版2018/06/26(火) 00:05:08.91ID:MH2X+Y+e
>>964, >>966
>素直に共用体にしたくない理由はいくつか考えられる
アドレス指定とは別にして、共用体にしたくない理由って具体的にどんなこと
でしょうか。


>変数のアドレスを指定したい理由も色々と考えられます
昔のパソコンでVRAMをワークエリアに使うようなときにはアドレス指定をしていた
けれど、8bit PIC で変数のアドレスを指定するほかないようようなことって
どんなことなんでしょうか。

いろいろ考えられるうちの3個4個ぐらいを教えていただけると勉強になります。

と、こういう疑問は持ってますが、技法としての元質問の価値はあると思ってます。
必要なら自分でやっつければ済むことですけど。
0969774ワット発電中さん垢版2018/06/26(火) 06:52:22.86ID:U2j8GMB0
>>968

●共用体
◇文字数の削減や移植の手間や見易さの為
(※無名共用体が使えない場合)

◇ファイルやモジュールの分離性確保の為
・同時にインクルード出来ないヘッダ
・コンパイル依存性(コンパイル時間)
・ライブラリ化

◇共用体に出来ない構造体への対応
(※C++の場合)
0970774ワット発電中さん垢版2018/06/26(火) 07:09:48.97ID:U2j8GMB0
>>968

●アドレス指定したい場合

◇部分ビルドする場合のインターフェース
ブートローダーとアプリケーションや
複数のアプリケーションなど
ROMの複数エリアを別々にビルドする場合のインターフェースとし
エントリーポイントのテーブルなど

◇周辺モジュールとのインターフェース
DMAのバッファなどで特定の番地にしたい場合

◇高速化や簡略化の為
配列の先頭や終端のアドレスが特定の値で有ることで高速化やコードの簡略化を行う
+と&でリングバッファのポインタを更新するなど

◇セクタ考慮
ROMのセクタやRAMのバンクなどを考慮したい場合
境界を跨ぎたくないとかセクタ先頭からはじめたいとか

◇デバッグ性
よくデバッガで書き換える変数の固定アドレス化
外部からアドレス指定でアクセスしたい変数の固定アドレス化
0972774ワット発電中さん垢版2018/06/26(火) 07:33:03.70ID:MH2X+Y+e
>>969-971
共用体を避ける理由については、正直なところ俺にはピンとこないものでしたが、
アドレス指定については思い当たるところもなくはなく。
ただ、とても個人的な事情にすぎないことで、俺のPICの使い方ではあまり縁がないものばかりでした。

あと、俺の思い込みもありました。8ビットPICってPIC18も含まれるのですね。

ありがとうございました。
0973774ワット発電中さん垢版2018/06/26(火) 08:11:42.65ID:W4z6KEwg
>>972
アドレス固定にすれば、エンディアンとかの考慮要らないから、移植しやすい とかかな?
0975774ワット発電中さん垢版2018/06/26(火) 09:48:57.87ID:oi/2MisI
>>973
アドレス指定をするとエンディアンの何が解決出来るって?
少なくとも考慮要らないなんてことはない
0976774ワット発電中さん垢版2018/06/26(火) 10:18:31.43ID:+FLk9oh3
>929
GCC (XC8含め) のリンカは別の名前が同じアドレスをさしていても問題ない。
だからやろうと思えば適当にリンカへの指示を加えることで可能にはなる。
ただ、リンカへの明示的な指示なしでコンパイラが、暗黙のうちにリンカでエラーにならないように
セクションや名前を選定してくれるかは別で、

ゼロ以外で初期してたらだめ、
ゼロで初期化するやつは初期化しないやつとならマップ OK、
初期化してなければOK、

とかそんな感じになると思うけど、
GCC でファイルをまたぐ名前の扱いが 2012年あたりからちょいちょい変わってるので
XC の元ネタの GCCの版によって挙動がかわるかもだから保証はしない。

あと、異なる名前が同じアドレスを占めていて、それを一つの関数内で両方の名前を扱うなら、最適化で O2 以上は禁止な。
gcc -O2 は異なる名前は異なるアドレスをアクセスする前提で最適化する。volatile 関係ない。
ここ 2年くらいエイリアスの最適化の動作確認してないけど変わっとらんと思う。
0977774ワット発電中さん垢版2018/06/26(火) 13:08:30.85ID:WR7nqvMw
XC8ってアドレス指定すると何の警告も無しに同じエリアに値を割り振るんだね
怖い怖い
0978774ワット発電中さん垢版2018/06/26(火) 13:18:35.17ID:WR7nqvMw
最適化に関してはunionでも悪影響が無い保証なんて無いよね

volatileは読み書きの順番や回数はバイナリ上では保証されるから意味が無いことは無いけど
最適化が非常に制限されるからなるべく使いたくない

そもそも、最適化で変わるような関連が密なデータであれば素直にunionにした方が便利な事が多いと思う
0980774ワット発電中さん垢版2018/06/26(火) 22:26:29.21ID:KQN0txZ5
>>976
>> gcc -O2 は異なる名前は異なるアドレスをアクセスする前提で最適化する。volatile 関係ない。

これ、gccドキュメントのどこに書いてある?
前に書いたように、異なるポインタタイプは同じものを指さないという仮定=strict-aliasingルールはドキュメント上にある。
-O2はstrict-aliasingを仮定して最適化するとドキュメントに書いてある。
GCCのドキュメント(gcc6のね)から、

'-fstrict-aliasing'
前略
In particular, an object of one type is assumed never to reside at the
same address as an object of a different type, unless the types are
almost the same. For example, an 'unsigned int' can alias an
'int', but not a 'void*' or a 'double'. A character type may alias
any other type.
中略
The '-fstrict-aliasing' option is enabled at levels '-O2', '-O3', '-Os'.

volatile周りも、理解してないね。
0981774ワット発電中さん垢版2018/06/26(火) 22:39:29.47ID:KQN0txZ5
>>976
念のため例つけとくと、

void f(int *x, int *y)
{
int a = *x;
// a == *x に決まっている。
*y = 0;
// これ以降は、a != *xかもしれないと考えて最適化する

ということだからね。
同一視の可能性は名前じゃなく、ポインタの型だよ。
なお、int *とunsigned int *は類似の型なので、同一型のように扱う。
0982774ワット発電中さん垢版2018/06/27(水) 00:47:47.51ID:Qlu5v5Vu
先輩方の高いレベルの雑談は、本スレでお願いします。
ここは、僕たち初心者が質問するスレです。

俺は詳しいんだ凄いだろう と言う雑談は、 あっちのスレでお願いします。
0983774ワット発電中さん垢版2018/06/27(水) 01:11:03.22ID:9TsXY6B2
>>976
>>980
話題がそれてるけど
ポインタじゃなくてスタティックな変数への直接アクセスの話
unionとunionじゃない同じ番地の変数が同じように扱えるか
が質問内容

一旦ポインタを経由したら最適化が同じになることは容易に想像がつく
コードはポインタの中身に依存しないので
0990774ワット発電中さん垢版2018/06/29(金) 18:23:25.68ID:VAjBY0do
きみに
10011001垢版Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 58日 19時間 39分 25秒
10021002垢版Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況