元スレGCCについて part9
gcc覧 / PC版 /みんなの評価 : ○
451 = :
4.5.0 ということは ports ? 野良ビルド?
452 = :
うん
453 = :
結局どっちなんだよと思ったのは私だけじゃないはず
454 = :
結局どっちなんだよ!
455 = :
>>451
http://ftp.riken.go.jp/の.tbzと野良の両方で再現した。
ただ、OSXからのFreeBSDクロスコンパイル→転送して実行、ではAdaのほうでも再現したのに、
FreeBSD上のセルフコンパイルでは野良ではAdaでは再現しない(C++では再現、gcjはビルドできなかった……)と
結構ばらつく。よくわからん。
456 = :
うーむ
457 = :
gccデベロッパーライトで、プログラミングを勉強・作成しています。
cとc++は少々経験あります。
ロボットを動かすために、マイコンボードのレジスタに書き込むのですが、
サンプルにDDRx |= (1 << PC0)という部分があり、こちらはDDRx(8bit)の0000 0000に書き込むということだと思います。
0000 0001みたいな感じに
次のPORTx &= ~(1 << PC0)が良く分からないのですが、
こちらは初回は動作させないために0にして動かないようにしておくだと思うのですが、その場合
PORTx &= (0 << PC0)ではないのでしょうか?
~をつけてNOTにしてしまうと ↑の例だと1111 1110になってしまうと思います。
どうしてここはNOTになっているのでしょうか?
それとも初期値のレジスタは1111 1111(FullBit)と決まっているのでしょうか?
ちなみにPC0にはサーボモーターが接続されています。
458 = :
0 << PC0 ってなんなんでしょうか?
0 はシフトしても 0 でしょう?
おかしいと思いませんか?
459 = :
>>458確かに0をシフトしても0ですね。
んー…となると動きとしてはどうなってるんでしょう?
0000 0001に対して 左シフトで 0000 0010にして、それをPORTx 0000 0000だとした場合
1111 1101にするってことですよね
ん…違うのか、 PC0の場所が最初、 PC1が次だと仮定して
0000 0001を左シフト 0000 0010 PC1が0000 0010左シフトで 0000 0100
で、現在のPORTx が0000 0110になっているからこれをNOTしてあげれば
1111 1001で、使用するPC0とPC1は停止状態になりますよってことか
でもその場合残りの部分がビット立っている状態になってますが、問題ないのですか?
使わないのであれば全てビットをlowにしておかないと何かもやっとするのですが
460 = :
書いてきて混乱してきた
PORTxっていうのは、常時フルビット0xFFになっていて
例えばPORTAであれば、対応するのはPA0~7になり
0xFFの0ビット=PA0, 1=PA1 ... 7=PA7って割り当てられている…?
シフトする理由が分からない…シフトする場合↑の通りであるのならば
PA7はオーバーフローして、消えてなくなってしまうし、循環シフトになっているのなら
シフトしてけばしていくほどおかしくなるような…
461 = :
&= ってなんの記号? わかってる?
それから、他人とのコミュニケーションにフルビットとか妙な用語は使わないように。
運転免許マニアの間では全ビットが立ってる、という意味で使われるようだけど。
462 = :
>>461
フルビットって使わないの?すまん、知らなかった
&=ってANDって意味じゃないの?
cで言えば、 a = a & b;といった形だと思ってたんだけど
PORTx = PORTx & ~(1 << PCx);
今回チルダが付いているから、NOTANDだと思うけど
463 = :
トリップ付けておきます
基本情報とか、c勉強した時に例えば2の補数とか説明する・されるときに
フルビットって使ってたんで一般的だと思ってました。
464 = :
>PORTx = PORTx & ~(1 << PCx);
ここまで解ってて何故わからないのかがわからない
そのまま「PORTx の PCx ビット目を0にする(PCxビット目以外はそのまま)」って読めるだろ
465 = :
>>464
うーん…
何となくこのやり取りをしている間に、考えてたら分かってきたような
気もするのだけれども、
NOTANDがかかるのはPORTx全体ではなくて、 & ~(1 << PCx)と書かれているPCxの場所
だけをNOTANDするってことで大丈夫? PORTxに対して行っているからPORTx全体にNOTANDがかかってると思ってた。
後は、シフトする部分がいまいち…
これは、0001を0010にするとかではなくて、ビットをずらすのではなく
0000を0001にしますよ、的な感じでいいです?(1を立てる
466 = :
軽く自分なりにまとめると、
&~がかかる部分は、PCxの場所だけで
シフトするというのは倍々にしていくシフトと違い
1であれば、その場所に1ビットを立てるということで問題ないでしょうか?
467 = :
連投ごめん
ぐむむ、でもそれだとやっぱり(1 << PCx)の1が1を立てるであれば、
へし折るという意味で(0 << PCx)でもいけるような…orz
テンプレっていうか、こういうものだっていう意味で0を作るのならばチルダ(NOT)して
作れってことでしょうか?orz
468 = :
gcc全く関係ない
470 = :
なんていうか…もうノートにビットパターン書きながらひとつづつ考えてください。
8ビットで PORTx : 0x0f, PCx : 3 と仮定するね。
「(1 << PCx)」 ってのは (1 << 3)だから 00000100 になるよね?すると
「~(1 << PCx)」 は 11111011 と 3ビット目だけが0の値になる。
「PORTx & ~(1 << PCx)」 は 00001111 & 11111011 だから 00001011 でこれをPORTxに代入する。
PORTx の値は 00001111 だったものが 00001011 になってる。つまり3ビット目が0になった。
あとはPORTxやPCxの値をいろいろ変えながらノートに書いて考えてくれ…
# これでわからないなら適当な初心者スレでたのむ
471 = :
Cとかの質問スレだな
473 = :
こいつの制御するロボットには絶対に近づきたくないなw
474 = :
>>470
やっと理解した、ありがとう
シフト演算激しく勘違いしてたわ (1 << PCx)の1は1ビットずらすのではなく
1をPCx分ずらすでしたね。過去ログ見てると恥ずかしい
>>470見て、テストケースで100を2ビットシフトして400作って見てやっと分かった
NANDに関しても、0シフトすればいいんじゃね?って思ってたのが非常に恥ずかしい
0した後に残った結果は0じゃないか…0x0F & 0x00 = 0
もやもや解消されました。頑張る
id出てないから分からないけど答えてくれた人たちthx
>>473
ロボに罪ハナイ…
475 = :
>>474
がんがれ。ロボがコサックダンス踊れるようになるくらいまで。
476 = :
GCC使ってりゃこのスレってことなら
PS3やWii、Androidの開発もこのスレになるな
477 = :
携帯じゃなくても良いからMIDIのシーケンサーつくってみろ。
ずれるかずれないかわかる。
479 = :
>>478
__asm の内側はアセンブラの世界。
gas の擬似命令を含むことも出来る。
C/C++ では隣接する文字列リテラルは連結される。
480 = :
>>478
http://www.ne.jp/asahi/hishidama/home/tech/c/preproc.html
この辺りの「文字列化」を参照してください。
gcc の -E オプションもマクロの理解を助けてくれると思う。
481 = :
ここで聞くよりTOPPERSのメイリングリストで聞いたほうがいいような気がするんだけど。
482 = :
どうだろう。
あくまでも gcc 側の機能についての質問だからこっちでいいような気もする。
483 = :
>>479
文字の連結は理解しているつもりですが、IA-32の命令や疑似命令のようにも思えない。
と言う訳で手元のMacOSXでTOPPERSをコンパイルしてそのマクロを使うkernel_chk.cを
生成しようと思ったけど、LINUXではないのでやはりできず。
来週、会社へ行くまでkernel_chk.cを生成できそうにありません
>>481
TOPPERSの機能に関する質問ではないのでそれはできません
484 = :
TOPPERSってそもそもIA-32をサポートしているのでしょうか。
インテルのCPUで組み込みってあまり聞かない気がします。
私も仕事でTOPPERSを触りましたけど、そのときはルネサスのSHでした。
コンパイルに使用したコンパイラは、もちろんSH用のgccです。
485 = :
ていうか、どんなasm命令に展開されるかは
単純にそのマクロ定義部と呼び出している箇所いくつかを拾い出して
それをcppかければ良いだけでは。
486 = :
>>483
評価版のVMwareを手元のMacにインスコしてLinuxインスコしろ。
487 = :
>>484
Linuxのシミュレーション環境に対応しています。
このパッチをあてて
http://www.northern-cross.info/download.html
$ perl ../jsp/configure -C linux
$ make depend
$ make
これで動かせます。
488 = :
>>485
それやりたいけどLINUXないお
>>486
面倒ぽ・・・
489 = :
マクロ名からしてラベル作ってるんじゃね?
490 = :
>>488
いやLinuxでなくてもGCCは使える
っていうか、プリプロセッサの出力、というだけなら
機能を持たないC/C++コンパイラは皆無だろ。
cppを別途持っているかは別として
491 = :
Linux固有のヘッダファイルが1つでもインクルードされてたらアウトですよ。
492 = :
>>490
というかTOPPERSで実際にどのようにマクロが使われているのを調べるにはGCCが使えるだけではダメなんです。
cfg,chkというTOPPERS独自のバイナリプログラムがアプリケーションの設定ファイル*.cfgを参照して
kernel_cfg.cとkernel_chk.cを生成するんです。
kernel_chk.cが実際の使用例になるのですが、これを生成するにはLINUXが必要なんです。
手元のMacOSX(FreeBSDベース)だと生成できなくて・・・
493 = :
というわけで、来週会社に行ってkernel_chk.cを入手するまでこの件は保留させて下さい
みなさんお騒がせしました
494 = :
>>492
そういう状況では、さすがにスレ違いですね。
空きマシンにUbuntuなどをインストールして
Linux環境を構築する以外に、抜け道はないと思います。
498 = :
質問の意図はasm自体がよく分かっていないってことでは?
499 = :
>>498
>>479に書いてあるし、>>483を見る限り理解してるでしょ。
500 = :
つーかメーリングリストが嫌ならOS板にスレがあるからそっちで聞け
みんなの評価 : ○
類似してるかもしれないスレッド
- GCCについて part8 (763) - [95%] - 2009/3/11 8:47 ☆
- GCCについて part10 (538) - [90%] - 2018/7/5 20:30
- 【激遅】AppleGCC【絶望】 (111) - [18446744073709551607%] - 2010/1/15 10:31
トップメニューへ / →のくす牧場書庫について