●●●くみこの組み込み相談室1.0●●●at TECH
●●●くみこの組み込み相談室1.0●●● - 暇つぶし2ch484:デフォルトの名無しさん
08/12/24 23:36:24
移植性ってあったの?

485:デフォルトの名無しさん
08/12/25 13:47:45
>>483
16ビットモードという意味では起動時だけだな。

ていうか479は釣り。加算命令とか基本的な命令はレガシーかつ現役。
そういう命令の互換性が必要なんだし、遺物のような命令は使われなく
なってる(LOOPだとか)。

486:デフォルトの名無しさん
08/12/26 06:10:46
セグメントのあたりも初期化以外に使われないのが色々ありそうだが。



487:デフォルトの名無しさん
08/12/26 06:51:55
>>486

セグメント関係は、メモリ管理でバリバリ使うよ。
OSの実装にもよるけど。

つーか、そろそろスレ違いだろ。


488:デフォルトの名無しさん
08/12/26 22:43:12
折角高速化を期待してアセンブリ言語で書いてるのに
LOOP とか遅い命令使ってもしゃーないしな。

489:デフォルトの名無しさん
08/12/27 08:33:04
>>487

セグメントをメモリ管理でバリバリ使うOSって何?

セグメントは面倒なだけであまりメリットがないと思うんだよな。
32bit 以上のOSでは、初期化以外には使っていないっていうのは
俺も同じ認識なんだが。

8086/80186/80286みたいなアドレッシングできる範囲が実アドレス
空間より狭い場合にやむをえず使うって感じじゃないの?

490:デフォルトの名無しさん
08/12/27 08:44:08
OS-2

491:デフォルトの名無しさん
08/12/27 10:12:57
>>490

OS-2ってOS/2のこと? OS/2 もWarp からは32ビットなんで
セグメントは使ってなかったのでは。

すでにサポート終了したOSしか例がないんだったら、
現在はセグメントをバリバリ使ってプログラムするOSなんて
ないって結論でいいのかな。


492:デフォルトの名無しさん
08/12/27 11:06:55
そりゃぁ、「プログラムするOS」なんてないだろ。
セグメントを使って管理していたとしても。

493:デフォルトの名無しさん
08/12/27 11:41:20
それは誤解ですね。

x86の16ビットOSの場合、64Kを超えるプログラムを作る場合は
セグメントを意識せずにプログラムの作成はできないよ。

正確には、コードとデータそれぞれ64Kまで、それを超えると
コードは、セグメントの関数CALL、データはセグメントの切り替えが
必要になる。

ライブラリで覆い隠している場合はあるかもしれないが、OSだけが
管理すれば良いって話ではない。

494:デフォルトの名無しさん
08/12/27 11:57:22
>>493
それは8086などの16ビットCPUに限定された話だろ。
今の話題は、セグメントレジスタを使ったプログラムをOSがするかどうかじゃないのか?

495:デフォルトの名無しさん
08/12/27 16:00:03
Linuxの何かで、32ビットモードで実メモリ4Gオーバーを扱えるようにした
拡張バージョンとかやってなかったっけ?

496:デフォルトの名無しさん
08/12/27 23:53:13
もしかして、OS がメモリ管理にセグメントを使うって話じゃなくて、
アプリケーション側がメモリ管理にセグメントを使うかどうかって話なのか?
現状では普通アプリケーション側にセグメントをいじる権限は与えないのが普通だな。

497:デフォルトの名無しさん
08/12/28 12:19:10
じゃなくて、セグメントを利用した2次元アドレッシングを活用してるかどうか、という話。

498:デフォルトの名無しさん
08/12/29 03:09:32
NetBSDやLinuxの移植って難しいよね…
まず何から勉強したらいいのかな…
BootLoaderは何がいいのかな…


499:デフォルトの名無しさん
08/12/29 23:32:53
>>498
GPLが気にならないならU-Bootでいいだろ

500:デフォルトの名無しさん
08/12/30 01:16:30
ありがと、まずはU-Bootの移植頑張ってみる

501: 【小吉】 【215円】
09/01/01 02:40:43
あけおめ!ただいまクロスコンパイル環境を構築中!

502:デフォルトの名無しさん
09/01/17 12:48:43
static uchar replybuf[8];
usbMsgPtr = replybuf;
int i_adch;
int i_adcl;
double ret;

//ADC開始
DDRC = 0x00;
ADCSRA=0b11000111;
ADMUX= 0b01000101;

while((ADCSRA & 0x10)==0){;}
i_adcl=ADCL;
i_adch=ADCH;
ret = (ADCW>>2);

ADCSRA=0x96;
//ADC終了

このようなプログラムでAD変換を行っているのですが、低い値を取得した際にADCLの値(i_adcl)が246や255といったおかしい値になってしまいます。
例でいうと、70-47-32-17-4-246-7-3-239...といった具合です。
ノイズ源なども取り除いたのですが、値が突然暴走するのはプログラムに問題があるような気がします。
できれば0-1024でしっかり値をとりたいのですが、何か方法はありませんか?

使用チップはmega88で、環境はWinAVRを使用です。


503:デフォルトの名無しさん
09/01/17 13:01:05
コードが判らない
ちょっと1行ずつ何がしたいか解説して見ろ

i_adcl=ADCL;
i_adch=ADCH;
ret = (ADCW>>2);
何しとんの?

504:デフォルトの名無しさん
09/01/17 13:01:09
>>502
>i_adcl=ADCL;
まず、ここに時差がある。
>i_adch=ADCH;

505:デフォルトの名無しさん
09/01/17 13:09:40
>>503
確かにその部分は不要ですね・・・消します

>>504
時差があるとまずいでしょうか?


506:デフォルトの名無しさん
09/01/17 13:15:31
↓adcの遷移はリニア
0x0FFF >i_adcl=ADCL;
0x1000 >i_adch=ADCH;

こうなる、ことがある。

507:デフォルトの名無しさん
09/01/17 13:17:52
>>506
なるほど・・・とすると、同時性を確保するにはADCWだけ読み出せばよいのでしょうか?
しかし、ADCWを使って0-1024までの整数に表現する方法が分からないんです。

508:デフォルトの名無しさん
09/01/17 13:18:24
>>502
フツーにソースの信号が実際に安定してないんじゃないの?

関係ないけどADCxと、その値をキャッシュしてる変数のビット幅って
それで一致してるの?

あと、504がたぶん言いたいことだと思うんだけど、(もし割り込みを使ってるなら)
サンプリングの間隔にもよるけど、2つのレジスタをアトミックに読み取るように
しないとまずいかもね。
今回の問題とは関係ないと思うけど。

509:デフォルトの名無しさん
09/01/17 13:20:24
>>508
ソースはLEDを入力に使った距離センサーですし、値が低いときだけ暴走するので良く分からないです。
ノイズ源なども極力取り払いましたが・・・。

変数のビット幅は良く分かりません、参考にした本にはこれ以上のことが書いてなかったので良く分からないのですが、
少なくとも本の通りにやるとおかしな値になることだけは確かなんですよ・・・

510:デフォルトの名無しさん
09/01/17 13:23:59
データシートによるとADCLを読み出したらADCHを読み出すまでは値は変化しないらしいぞ。
他の問題じゃないか?

511:デフォルトの名無しさん
09/01/17 13:25:56
これか、
レジスタ名 bit7:0
ADCH ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2
ADCL ADC1 ADC0 - - - - - -

512:デフォルトの名無しさん
09/01/17 13:26:32
情報が小出しになってしまって申し訳ないです。

uchar usbFunctionSetup(uchar data[8])
{

(上記のプログラム)

static uchar replybuf[8];
replybuf[0]=data[7];
replybuf[1]=ADCL;
replybuf[2]=ADCH;
replybuf[3]=ADCL + (ADCH<<8);
replybuf[4]=~(ADCW>>2);
replybuf[5]=i_adcl|i_adch;
replybuf[6]=data[6];
ADCSRA=0x96;

return 7;
}

今こんな状況で色々な値を読み出して比べているのですが、もしかしてそもそもuchar型で返していること自体に問題があるのでしょうか?
だとすると、どのようにすればuchar型にはめ込んで値を取得できますでしょうか?

513:デフォルトの名無しさん
09/01/17 13:29:33
>>509
まあ一番可能性が高そうなのは、符号付1xビットのAD変換値の下位8ビットを、
unsigned charとして扱ってしまってるってところじゃないの?

ADCxはどう定義されてる?

514:デフォルトの名無しさん
09/01/17 13:34:43
>>513
AD系の定義は、io.hの

#define ADCW _SFR_MEM16 (0x78)
#define ADCL _SFR_MEM8 (0x78)
#define ADCH _SFR_MEM8 (0x79)

という記述がありました。
数字から察するに16bit,8bit,8bitということなのでしょうか?

515:デフォルトの名無しさん
09/01/17 13:36:27
>>510
なるほど。
となるとADCLだけじゃなく、ADCHの遷移とかもないとわからないな・・。

516:デフォルトの名無しさん
09/01/17 13:38:23
>>515
上のを実際にPCで見て見るとこんな感じになりました。
buf[2](ADCH)が0のときにおかしな値を吐くことくらいは分かりましたが、他はなんとも・・・。

buf[1]= 35 buf[2]= 1 buf[3]= 35 buf[4]=183 buf[5]= 35
buf[1]= 40 buf[2]= 1 buf[3]= 40 buf[4]=181 buf[5]= 41
buf[1]= 83 buf[2]= 1 buf[3]= 83 buf[4]=171 buf[5]= 83
buf[1]= 26 buf[2]= 1 buf[3]= 26 buf[4]=185 buf[5]= 27
buf[1]=255 buf[2]= 0 buf[3]=255 buf[4]=192 buf[5]=255
buf[1]= 39 buf[2]= 1 buf[3]= 39 buf[4]=182 buf[5]= 39
buf[1]= 75 buf[2]= 1 buf[3]= 75 buf[4]=173 buf[5]= 75
buf[1]= 72 buf[2]= 1 buf[3]= 72 buf[4]=173 buf[5]= 73
buf[1]= 10 buf[2]= 1 buf[3]= 10 buf[4]=189 buf[5]= 11
buf[1]= 25 buf[2]= 1 buf[3]= 25 buf[4]=185 buf[5]= 25
buf[1]= 44 buf[2]= 1 buf[3]= 44 buf[4]=180 buf[5]= 45


517:デフォルトの名無しさん
09/01/17 13:40:32
>>512
ちょっとまて、
コードが無茶苦茶だぞ

replybuf[3]=ADCL + (ADCH<<8);
replybuf[4]=~(ADCW>>2);
replybuf[5]=i_adcl|i_adch;
ADCSRA=0x96;
これらはほんとに正しいのか?
まるで意味判ってないだろ
こんなんでは質問しても時間の無駄
C言語仕様書とデータシート100回読み直して出直してこい


518:デフォルトの名無しさん
09/01/17 13:49:19
>>516
なんだこれ見る限り、AD変換値は何も問題なさそうじゃん。

bug[1]がADCの下位8ビット、buf[2]が上位8ビットだよね?
ひょっとして「ビットの並びでどうやって数を表現するか?」から知らない人?

519:デフォルトの名無しさん
09/01/17 13:50:04
>>516
buf[1]= 83 buf[2]= 1 -->83+256
buf[1]= 26 buf[2]= 1 -->26+256
buf[1]=255 buf[2]= 0 -->255+0
ばらつきはあるけど、別におかしくないんじゃないか?

520:デフォルトの名無しさん
09/01/17 13:53:24
>>518
うっく・・・よく分からんです・・・

>>519
なるほど・・・!
ということは両方の値を足してやって、256を引けば良いということですか・・・


521:デフォルトの名無しさん
09/01/17 14:00:49
>>520
(ADCH<<8);

これ、
ADCH=1 とか、ADCH=2
のとき、計算結果がどうなるかわかるか?

522:デフォルトの名無しさん
09/01/17 14:00:49
いいから出直してこいよ
お前には無理だ
>>516
これではテストにもならない

基本的なことが欠けている
例えばADCのようなレジスタをアトミックに参照する場合
一時変数を使うことがまず考えられる
uchar lo, hi;
lo = ADCL;
hi = ADCH;
//以後 lo hiを参照
buf[0] = lo;
buf[1] = hi;

wordが必要なら
uint16_t word = (hi<<8)|lo;
8ビットMCUはビットを意識できないとどうしようもないぞ

523:デフォルトの名無しさん
09/01/17 14:04:13
お前等やさしいなw

524:デフォルトの名無しさん
09/01/17 14:10:30
>>521
ビットパターンの表を見て、今やっと上位ビットと下位ビットの意味を理解しました。

>>522
恐れ入ります。
本当はもっと勉強したいのですが、月曜に最終発表なのでとにかく少しでも進めないといけないんですよ。
でもおかげさまで参考になりました。値の取得は結構うまく出来てるようなので、ビット表とにらめっこしながら正しい値を取れるようにしてみます。

525:デフォルトの名無しさん
09/01/17 14:18:07
学生か? 悪いことは言わないから一年やり直せ。

526:デフォルトの名無しさん
09/01/17 14:20:39
まあそう必要以上に煽るなよ。
逆切れしてる訳でもない奴を一方的に煽るのはちょっとみっともないぞ。

でもマイコン弄るのにバイナリによる整数表現も理解してないのは
かなりマズいのは確かだねw

527:デフォルトの名無しさん
09/01/17 14:20:57
replybuf[0]=data[7];
replybuf[6]=data[6];
・・わけわからん
あまり時間は無さそうだが、
変数名ぐらいはきちんと考えてつけた方がいいぞ
おれがこんなの受け取ったら作り直せと言うがなあ

一度tiny辺りのギリギリの環境で修行した方がいい
mega88はもったいない

528:デフォルトの名無しさん
09/01/17 14:26:29
>>525
まだ1年なのでそれはきついっす。

>>526
ですよね。。
しかしこれだけでも少しは勉強になったので、次回以降は同じことでつまずかないようにします。

>>527
1から作る力がないんで、元々教授が作ったソースを改変して作ってるので、多分その名残だと思います。
USBで123456と送ると、612345にして返すとかいう単純なプログラムだった記憶があります
megaにしたのも「AD変換するならmegaのほうがいい」といわれて決めただけなので、入門どころか門前で土下座してるような状態です。


529:デフォルトの名無しさん
09/01/18 22:10:48
Linuxがどうとかって話があったよな
URLリンク(www.technobahn.com)

530:デフォルトの名無しさん
09/01/18 23:32:32
Palmに飽き足らず、
こんどはlinuxを潰す気か


531:デフォルトの名無しさん
09/01/19 20:21:20
Linuxに法則発動か。
ナンマイダブナンマイダブ。

532:デフォルトの名無しさん
09/01/19 20:26:10
上の方じゃcharにword押し込んでるのに指摘しない人ばっかだし。
組込み業界に法則発動してるんじゃね?ww

533:デフォルトの名無しさん
09/01/19 20:29:12
小出しにされたから

534:デフォルトの名無しさん
09/01/22 13:16:29
SH2で2chのシリアル受信を同時に行いたいんです。

データの取りこぼしがないようにDTCとDMAを
使おうと思ってます。
大筋でどんな感じにすればいいでしょうか?

535:デフォルトの名無しさん
09/01/22 15:16:14
ブー

536:デフォルトの名無しさん
09/01/22 15:52:24
>>534 H8系はたくさんやってるから助言はできるとおもうが、レートを書いてくれないことには
方針が確認できないじゃん。イックニか384くらいまでなら割り込みでも取りこぼさないし。
俺はふつうに割り込みで書いて、耐久性はringバッファのサイズで調整したぞ。

537:534
09/01/22 17:02:55
ボーレートは38400です。
参考までにリングバッファのサイズは
どれくらいまで大丈夫でしたでしょうか?

538:534
09/01/22 17:27:41
シリアルの割り込み関数にはこんな感じに書いてます。
リングバッファのサイズは256バイトです。

------------------------------------------------
INTDI  //割り込み許可
ucW = SCI2.RDR;
SCI2.SSR.BIT.RDRF = 0;
if (uiSCI2_RecCount < MAX_REC_BUF) {
ucSCI2_RecBuf[uiSCI2_RecPut] = ucW;
uiSCI2_RecCount += 1;
uiSCI2_RecPut += 1;
if (uiSCI2_RecPut >= MAX_REC_BUF) {
uiSCI2_RecPut = 0;
}
}
INTEI    //割り込み許可
------------------------------------------------

539:534
09/01/22 17:28:11
連投すみません。

INTDI  //割り込み禁止

の間違いです。

540:デフォルトの名無しさん
09/01/22 18:20:24
384なら普通に割り込みで問題ないと思う


541:デフォルトの名無しさん
09/01/22 18:34:50
割り込み突入時は割り込み禁止状態だよ。

542:デフォルトの名無しさん
09/01/22 18:35:57
SH2だと割り込みレベルで考えなきゃいけないんだった。

543:デフォルトの名無しさん
09/01/22 19:01:33
多重割り込みしないと取りこぼすよ
禁止にしない方向で


544:デフォルトの名無しさん
09/01/22 19:06:29
割り込み以外のところで長めの割り込み禁止があったら、地獄行きだろうな?

545:534
09/01/22 19:12:29
みんなありがとう!
とりあえず割り込み関数の中の割り込み禁止は無くしました。
が、やっぱり取りこぼしが発生しているみたいです。(;;)

受信したデータをmainループで回して処理していて、
その度にRecCount をデクリメントしてるんだけど、
処理が追いつかずにRecCountの値が
MAX_REC_BUFを超えてしまうんです。
これは、DMA&DTCを使っても同じことなんでしょうか・・・

546:デフォルトの名無しさん
09/01/22 19:14:31
RecCount をデクリメントしてるところで
SCIの割り込みがかからないようにしてる?

547:534
09/01/22 19:18:52
>546さん
してます。
具体的には、こんな感じに。

-----------------------------------------------
INTDI
if(uiCH==0){
ucW = ucSCI0_RecBuf[uiSCI0_RecGet];
uiSCI0_RecCount -= 1;
uiSCI0_RecGet += 1;
if (uiSCI0_RecGet >= MAX_REC_BUF) {
uiSCI0_RecGet = 0;
}
}else{
ucW = ucSCI2_RecBuf[uiSCI2_RecGet];
uiSCI2_RecCount -= 1;
uiSCI2_RecGet += 1;
if (uiSCI2_RecGet >= MAX_REC_BUF) {
uiSCI2_RecGet = 0;
}
}
INTEI
-------------------------------------------

548:デフォルトの名無しさん
09/01/22 19:26:50
INTDI
uiSCI0_RecCount -= 1;
INTEI
って、感じかな?
それでだめなら、SCIのエラーを調べてみるとか
1CHだけで動かして処理が間違ってないか確認するとか

549:デフォルトの名無しさん
09/01/22 20:12:50
RecCountっているの?

#define MAX_REC_BUF 256
割り込み側:
ucSCI2_RecBuf [Put++ & & (MAX_REC_BUF-1)] = ucW;
メインルーチン側:
ucW = ucSCI2_RecBuf [Get++ & (MAX_REC_BUF-1)];
#define IsEmpty (Get == Put)
こんなんでいいのでは


550:デフォルトの名無しさん
09/01/22 20:35:08
それだとPutがGetを追い越さない判定が必要?

551:デフォルトの名無しさん
09/01/22 20:42:03
追い越してもいい作り
256バイトの間読まなかったらそれはリードの責任ということで

552:デフォルトの名無しさん
09/01/22 21:18:25
それと、受信割り込みが2つあるなら>>549のセットも2つ用意するべき
1つのバッファで受けようとすると予期しないことが起こる
2つのバッファで受けて、メインルーチンで順番に処理する
フロー制御する場合は割り込み側でバッファのポインタを見て行う

553:デフォルトの名無しさん
09/01/22 21:25:04
フロー制御するなら、別にカウンタがいるのでは?

554:534
09/01/22 21:46:33
>>548さん
試してみましたが、駄目でした。
片CHのみの動作は各ch共にOKで、
SCIエラーなどは発生していないです。

>>549さん
ご指摘のような感じにも書き直してみましたが、
状況変わらずです。
やはりメインルーチン側の読み取りが
追いつかないようです。
ちなみバッファは各ch用意しています。

外部からのシリアルデータは2つのCHに
常に同時に入ってくるような動作をするのが
ネックのような気もします。

555:デフォルトの名無しさん
09/01/22 21:50:18
マイコンの動作クロックは上げられないの?
もしくはフロー制御は出来ないの?

556:デフォルトの名無しさん
09/01/22 21:54:15
もしくは受信バッファのサイズを大きくしてみるとか?

557:デフォルトの名無しさん
09/01/22 21:59:00
追いつかないってことは割り込みが連続で発生して
メインルーチンに処理が戻ってこないとかかね
もしそうなら見積もりが甘かったな
マイコンの選定からやり直しだ

558:デフォルトの名無しさん
09/01/22 22:09:49
せめて割り込み部分はアセンブラでギチギチに書いてクロックを稼ぐ
多分何も考えずにCに吐かせると、えらい無駄なコードになってるだろうから


559:デフォルトの名無しさん
09/01/22 22:10:32
なんか論点ズレてると思うんだよね。

俺は恐らく>>534の書いたコードのアルゴリズムが根本的に下手なだけだとおもう。
「RecCount をデクリメント」なんて書いてる時点で変だと思う奴が誰もいないのかよ。

何かのフラグをメインでポーリングして1バイトずつチビチビ処理するような
コードになってるんだろうけど、そりゃそんなやり方じゃダメだろ。

デリミタ方式かSTX,ETXみたいなやり方かわからんけど、
一区切りのデータがバッファに入った時点で丸ごとバッファからデキューして
処理するように書かないと。

560:デフォルトの名無しさん
09/01/22 22:18:16
最適化してコンパイルしてなかったとか?

561:534
09/01/23 01:05:59
皆さん、アドバイスありがとうございます!
>>555さん
動作クロックをあげたり、フロー制御を入れたりというのは
出来ないんです。
>>556さん
バッファのサイズはもっといろいろと試してみたいと思います。
>>557さん
メインに全く戻らないという訳ではないです。
ただ受信のピークに取りこぼしが発生しちゃっている感じですね。
>>558さん
アセンブラ・・・出来ることなら避けたいです・・・
>>559さん
ご指摘の通りでポーリングで回して
受信したデータを解析、処理させています。

決まったデリミタがなく、通信の長さがまちまちのものから、
必要な一部のデータだけ抜き取らないといけないので、
どう区切るかが難しいのですけども。

メインでちまちまとデータを解析するなら、DTC使おうが、
DMA使おうが状況は同じでしょうか?
>>560さん
そんなことはないです。


562:デフォルトの名無しさん
09/01/23 01:22:59
>>561
だから一番誰でも思いつく単純でわかりやすい方法は、
少なくともデータの区切りかどうかの判定まではISRの中でやってしまうこと。

一区切りのデータを受信した時点で初めてフラグを立てるんだよ。
で通常ルーチンでバッファの中のひとまとまりのデータを解析すればいい。

563:デフォルトの名無しさん
09/01/23 01:28:03
2CH分のデータ解析処理を同時に動くように工夫した方がいいような。

564:デフォルトの名無しさん
09/01/23 04:00:23
他の割り込みは使ってる?タイマとか。SCIの割り込みレベルを最優先にしてる?
256というサイズは何から決めた?通信の1バーストがそれより短いことは確実?
バーストとバーストの間のお休みはどの位?
決まったデリミタが無い状況で何を手がかりに切り出してるの?

俺が書いたpgmでは、デリミタを認識して状態遷移する部分はメインループに書いたな。
割り込みはringに蓄積するのみ。遅いレートならメインループ1回に1文字取り出す方式でも
充分ついていったし。384なら、while(今ringに溜まってる分)取り出す方式のがいいかもだが、
2ch並行処理がぎくしゃくすると思うから、前者を奨めるなあ。

565:564
09/01/23 04:06:50
こんな感じ:
for(;;)
 if( uiSCI0_RecCount )
  chtask0();  // CH0の取り出し・解析
 if( uiSCI1_RecCount )
  chtask1();  // CH1の取り出し・解析
}
3MHzの8085で、4.8Kを4CH同時に処理できたよ。38400でも割り込み間隔1/8でしょ。
32bit機で、clockが10倍ぐらいなら十分以上に余裕があるはず。

566:デフォルトの名無しさん
09/01/23 05:00:23
>>538
1バイトしか読んでないような気がするんだが、
なぜ FIFO が空になるまで読み出さない?


567:デフォルトの名無しさん
09/01/23 16:31:27
解析が始まると終了するまで処理続けてるとか?

568:534
09/01/23 18:19:49
皆さんから頂いたアドバイスに基づいて、
シリアル受信部で一定の処理の後、
フラグを立て、そのフラグをメインループで
見て解析を行うように変更してみました。

しかしながら、片方のCHは動作してくれるものの、
もう片方はデータを取りこぼしてしまい
正常に動きません。

やはり、シリアルの受信をDMA、DTCで
バッファに格納しないとだめなのではないでしょうか?
(もし理解に誤りがありましたら、ご指摘ください。)

タクトタイムは1秒間に20回ほど、
1回につき両CHにそれぞれ240バイトほどの
データが送られてきます。

569:デフォルトの名無しさん
09/01/23 18:47:41
データを取りこぼしてしまいって、
通信エラーじゃなくて解析が間に合わないってこと?

570:534
09/01/23 18:54:36
受信したバッファとラインモニタの内容を
比較すると受信したバッファが飛び飛びに
なっているんです。

571:デフォルトの名無しさん
09/01/23 19:06:39
試しにシリアルの速度落としてみれば?
速度化ロジックかすら分からないのだとしたら。

572:デフォルトの名無しさん
09/01/23 19:07:08
>>571
速度かロジックか、ね。

573:デフォルトの名無しさん
09/01/23 19:36:08
マイコンの動作クロックが気になる。

574:534
09/01/23 20:00:01
水晶が12.288Mhzで
動作モードはモード2。
クロックモードは3(MD2=1、MD3=1)です。

送信元の速度は固定なので、速度は落とせないんです・・・

575:デフォルトの名無しさん
09/01/23 20:36:43
取りこぼすCHの割り込み優先順位を上げてみる。

576:H.K
09/01/23 20:41:46
[5]
#include<stdio.h>
main()
{
int x,ans;
char y;
printf("年号と年:");
scanf("%c%d",&y,&x); /*文字型*/
while(y=='m'||y=='t'||y=='s'||y=='h')
{
if(y=='m')
ans=1868+x-1;
else if(y=='t')
ans=1912+x-1;
else if(y=='s')
ans=1926+x-1;
else if(y=='h')
ans=1989+x-1;
printf("%d\n\n",ans);
printf("年号と年:");
scanf("%c%d",&y,&x);
}
printf("プログラムを終了します。");
}
までできているのですが、2回目にならず終了してしまうため直してください


577:デフォルトの名無しさん
09/01/23 20:46:30
嫌です

578:534
09/01/23 20:50:36
>>575さん
CH1を優先すれば、CH2が取りこぼれ
CH2を優先すれば、CH1が・・・

579:デフォルトの名無しさん
09/01/23 20:56:03
>>566の指摘が正解かも?

580:デフォルトの名無しさん
09/01/23 21:12:28
割り込み処理をいじって負荷が掛かるようになったんじゃないの?

581:デフォルトの名無しさん
09/01/23 22:11:37
>>578
対向機の速度を変えられないならダミーを作ればいいじゃない。
Windowsにも相変わらず端末エミュレータがついているんだから。

582:デフォルトの名無しさん
09/01/24 00:47:11
RecCountにvolatileつけないとコードによっては最適化でとんでもないことになってるかも?

583:デフォルトの名無しさん
09/01/24 03:09:01
>>547
uiCHってどうなってんの?
両chでenqueueされたら、もちろん両chでdequeueしてるんだよね?

584:534
09/01/24 19:39:19
>579
シリアルの割り込み時に、まとめて受信する。
なんて出来ましたでしょうか?
>580
上に書いたのそんなに変わらないです。
>582
RecCountにVolatileはついてないですが、
同時にデータが入ってこなければ、ちゃんと動いているんですよね・・・
>583
メインループでCH1とCH2を交互に呼んでいるだけですよ。

585:デフォルトの名無しさん
09/01/24 19:49:24
割り込み処理中にSCI2.SSR.BIT.RDRFが再度立つ可能性がある。
今の状況だと、割り込み処理が悪いのかデータ解析処理が悪いのかわからないので、
片CHをデータ処理しないで空読みだけして、
バッファの内容がおかしくならないかどうか確認してみては?

586:583
09/01/24 20:08:16
>>584
>>547では各chバッファにデータが入っているかどうかを
main側がどのように判定しているのかが読み取れない。
>>547のコードをCH1(uiCHが0)とCH2(uiCHが0以外)で交互に呼ぶだけだったら、
とても正常に動くようには見えないよ。

587:デフォルトの名無しさん
09/01/25 03:53:36
だな。>>565みたいに、それぞれのCHのringにデータがあるときは切り出し処理をする、
っていうふうに書いてあるのかな?

>>584 SH2のそのシリーズがどうかはワカラナイけど、シリアルがFIFOを持っていて、
FIFOに幾つ溜まるとRDRFが立つのか、その敷居値を設定するレジスタがある奴もある。
ここではふつうにFIFO無しで、1バイト受信があったらRDRFが立つシリーズだと思ってる。
SH2の型番書いてくれたら、ルネサスのサイトでマニュアル読めるのだが。FIFO付きかどうか
ここで答えてくれれば、つぶす方向がひとつ減るね。

INTDI/INTEIが必要なのは、割り込み処理の入り口・出口ではなくて、メインtask側で
それぞれのCHのRecCountを--する時だけだよ。そのことは解ってる?
ringbuffer[リードポインタ]からバイトread
INTDI
uiCHx.RecCount--;
INTEI
こういうふうに書くのがいちばん負荷が少ない。

588:534
09/01/25 11:31:39
>585さん
試してみたいと思います。
>586さん
547の前に
--------------------------------
  if (uiSCI0_RecCount==0){
     return(-1);
}
----------------------------
と書いてます。
>587さん
SH2-7144を使っています。

INTDI/INTEIに関しては、前にもご指摘をいただいたので、
・割り込みの入り口・出口にはなし
・RecCount--にだけ書く
はやっています。

589:デフォルトの名無しさん
09/01/25 13:13:27
>>588
それだと、CH1が受信していないあいだは、CH2はチェックされないのだが。

590:534
09/01/25 13:18:34
>589さん
いや、当然CH2も同じようにチェックしてますよ。


591:デフォルトの名無しさん
09/01/25 13:56:35
>>590
「547の前に書いている」と言っているが、いったいどういうコードになってるんだ?
こちらとしてはコードがバグってる可能性を疑っているのであって、
「当然正しく作ってますよ」的な説明では全く意味が無いのです。
もしコードのレビューが必要なら、できるだけ無加工なものをどこかに貼っておけば、誰かが見るでしょう。

592:534
09/01/25 14:46:38
とりあえず、547の関数全部書いて見ますね。
この関数をメインループの関数から呼び出して
コードを解析する流れとなっています。

593:534
09/01/25 14:47:44
int sio_rec(_UBYTE ucCH){
_UCHAR ucW;
if (ucCH==0){
if (uiSCI0_RecCount==0){
return(-1);
}
}else{
if (uiSCI2_RecCount==0) {
return(-1);
}
}
if(ucCH==0){
ucW = ucSCI0_RecBuf[uiSCI0_RecGet];
INTDI
uiSCI0_RecCount -= 1;
INTEI
uiSCI0_RecGet += 1;
if (uiSCI0_RecGet >= MAX_REC_BUF) {
uiSCI0_RecGet = 0;
}
}else{
ucW = ucSCI2_RecBuf[uiSCI2_RecGet];
INTDI
uiSCI2_RecCount -= 1;
INTEI
uiSCI2_RecGet += 1;
if (uiSCI2_RecGet >= MAX_REC_BUF) {
uiSCI2_RecGet = 0;
}
}
return(ucW);
}

594:デフォルトの名無しさん
09/01/25 15:15:55
>>588 MyDocumentsに rjj09b0026_sh7144.pdf があった。 このシリーズでいいよね?
593のコードは自分のテキストエディタに貼って、自分の書いたコードと見比べてみるよ。

595:デフォルトの名無しさん
09/01/25 15:19:37
>>593
if (uiSCI0_RecCount==0){
return(-1);
}
}else{
if (uiSCI2_RecCount==0) {
return(-1);
}
これは・・・いいのか?

596:デフォルトの名無しさん
09/01/25 15:26:41
>>593
uiSCI0_RecCount と uiSCI2_RecCount をvolatileにしないと危ないが、
そこ以外は良さそうだ。

そもそもリングバッファのサイズは256で足りてるのだろうか。
enqueue側でオーバーフローした場合に検知できるようにしてみたら?

597:534
09/01/25 15:28:24
>594さん
はい。そのシリーズです。
>595さん
返り値が-1の時は解析処理を行わない。という風にしてます。

598:デフォルトの名無しさん
09/01/25 15:34:31
pdfの、SCIのとこざっと読んだ。FIFOは無いタイプ。だからRDRFの度に1バイト読み取り、
ringに蓄積する方式でいい。 593の、int sio_rec(_UBYTE ucCH) をメインloopから呼ぶには
たぶん、ucCHを0かそれ以外で呼んでいるよね。上の方でCH0/CH1で使っていると書いてた
ように思うが、sio_rec()関数の中ではCH0でないとき、SCI2_xxxxxの資源を読んでいる。
ハードの接続条件をもう一度確認してみて。2CHというのは、CH0/CH1なの?CH0/CH2なの?

599:デフォルトの名無しさん
09/01/25 15:34:46
>>597
そうじゃなくて
uiSCI0_RecCount==0
uiSCI2_RecCount!=0
になることはないってこと?

600:598
09/01/25 15:39:20
おお、俺以外にも暇人が多数。>>597 良かったね。

それにしても関数の設計が冗長だな。なんでmainから呼ぶのに「このCHのデータ返してね」
と呼んで、しかも返却値に「無かったよ」とか作るんだ。>>565のように作ればイベントドリブン
な作りにできるし、「無かったよ」 なんていうリターンコードも無しにできるのに。

601:598
09/01/25 15:45:47
割り込み処理は、CH毎に別個に用意してるよね?=ベクタが指すルーチンは
(コードが似ていても)物理的に別ルーチンにしてあるよね?
それぞれのCH毎に、ライトポインタ・リードポインタ・RecCountを持っているよね?
ライトポインタの更新は割り込み側からのみ、リードポインタの更新はメインループ側からのみ
行っているよね? RecCountの更新については既に確認したけど。

602:598
09/01/25 15:56:57
まだ「冗長」というだけで間違いは見つからないが、とりあえず、呼び出すときに各CHの
RecCountが0でないときのみ呼び出す形にするだけで、return(-1)が要らなくなる。
sio_rec1( )とsio_rec2( )に分けると引数のucCHが要らなくなるしそれを判定するif文も要らない。
残る本質はリードポインタ(RecGetがそうだよね?)からのgetとRecCount--だけになる。
コンパイラによっては-=1;と--;で違うコードを吐くものもあるので、減算は--;でやって欲しい。
また何か気が付いたら書く。チェックして欲しいコードは貼ってくれ。ちょっとお茶タイム。

603:598
09/01/25 16:38:06
>>599の指摘について考えてみた。どちらかのCHについてreturn(-1);を返す条件が成立した時
にも、もう一方のCHについては処理すべきデータがあるかもしれないわけだ。そちらは次の
メインループで引っかかると考えているのだろうが、そこに遅れが入り込む余地があるね。

呼び出し側で(565のように)RecCountを判定するのも、呼ばれ側で判定するのも、僅かな
タイミングの違いだけで同じ、と考えたみたいだけど・・・違うのかもしれない。

604:598
09/01/25 16:45:41
メイン側は、sio_rec( )の結果を(-1でない場合は)受信したバイトとして解析処理に渡すのだと
おもう。この推測で合ってる? とりあえず、上で冗長と指摘した部分を刈り込んでみては?
sio_rec( )を呼び出す前にRecCountを判定する。sio_rec( )はRecCountがある(=非0)場合のみ
呼び出されるのだから、必ず減算処理をしてよい。CH0と2でルーチンを別にすれば引数も
それに対する判定も要らない。

605:デフォルトの名無しさん
09/01/25 16:51:23
1レスにまとめて書いてくれよ

606:598
09/01/25 17:31:07
もう就寝時間・・・あとは明日未明にです。お休みなさいZZz.・・・

607:デフォルトの名無しさん
09/01/25 18:32:31
ucW = SCI2.RDR;
SCI2.SSR.BIT.RDRF = 0;
if (uiSCI2_RecCount < MAX_REC_BUF) {
ucSCI2_RecBuf[uiSCI2_RecPut] = ucW;
uiSCI2_RecCount += 1;
uiSCI2_RecPut += 1;
if (uiSCI2_RecPut >= MAX_REC_BUF) {
uiSCI2_RecPut = 0;
}
}
else
for(;;);
って、やってみたらどうよ。

608:598
09/01/26 03:22:33
私の、製品になっている(確認済みの)割り込み処理は:
void rxrdy1(void) {  /* CH1受信 int. */
 ucSCI1_RecBuf[uiSCI1_RecPut] = SCI1.RDR; /* 1文字バッファリング */
 SCI1.RDRF = 0;    /* RXready flag reset */
 uiSCI2_RecCount++;  /* データカウント UP */
 uiSCI1_RecPut = (uiSCI1_RecPut+1)&(sizeof ucSCI1_RecBuf-1); /* リングポインタ更新 */
} これだけですよ。ringバッファサイズを2**nにしておけば、ifで循環させなくてもいい。
 一時変数ucWにRDRを読んでからringバッファに格納するコードも無駄ですよね。
受信エラー割り込みはベクタが別ですよね。そちらではエラーフラグをリセットしてますか?

内蔵RAMは8Kと思っていいですか? ringサイズを256にした理由をまだ回答もらってないけど
RAMが潤沢でないから、でいいのかな?

609:デフォルトの名無しさん
09/01/26 15:17:52
>1回につき両CHにそれぞれ240バイトほどの
>データが送られてきます。

610:534
09/01/26 15:21:39
皆さん、本当にありがとうございます。
そして、微妙にレスポンスが悪くて申し訳ないです。

>597さん
>uiSCI0_RecCount と uiSCI2_RecCount をvolatileにしないと危ない

コードの変更を検討してみますね。

>そもそもリングバッファのサイズは256で足りてるのだろうか

非常にかつかつなので、足りてない可能性も否定出来ません。
現在は、512にしていますが、それでも両CHからの受信は出来ない状態です。
1024にすると本体RAM容量が潤沢でないこともあって、
動かなくなってしまいます。

>599さん
引数がCH==0の時は、uiSCI0_RecCountだけチェックして、
引数がCH!=0の時に、uiSCI2_RecCountをチェックしています。

>607さん
なるほど。バッファサイズが妥当なのかどうか、切り分けが出来ますね。

611:534
09/01/26 15:30:44
>598さん
たくさんのレス本当にありがとうございます。

>2CHというのは、CH0/CH1なの?CH0/CH2なの?
CH0 → SIO0使用
CH1 → SIO2使用
となっています。

>関数の設計が冗長だな
指摘されて、すごく勉強になっています。
コードが冗長部分も見直していきたいと思います。

>割り込み処理は、物理的に別ルーチンにしてあるよね?
はい。それぞれ別ルーチンで持っています。

>CH毎に、ライトポインタ・リードポインタ・RecCountを持っているよね?
はい。持っています。

>メイン側は、sio_rec( )の結果を(-1でない場合は)受信したバイトとして解析処理に渡すのだとおもう。この推測で合ってる?
はい。その通りです。

>受信エラー割り込みはベクタが別ですよね。
>そちらではエラーフラグをリセットしてますか?
はい。しています。
ここらへんは別ソフトでの動作実績があることと、
各CHの独立した動作で問題ないことから大丈夫だと思うんですが。

612:598
09/01/26 15:55:35
>1回につき両CHにそれぞれ240バイトほどの
>データが送られてきます。
いやこれは覚えていますが、その1回ごとの間のお休みがどの位、ってのはまだ未回答かと。
お休みが2mSぐらいだったりしたら、切れ目無しと変わらないし(w
1回240バイトほどで、「次が来るまでに解析処理が取り出し終わる程度に十分間隔が長ければ」
処理が間に合うんですよね。

>>611の回答からすると、ドライバ層は(多少冗長でも)だいじょぶっぽいですね。
するとメインの切り出しのほうを疑うべきじゃないかな。ringバッファにデータがあればそこから
バイトを取り出したあと、状態遷移をするような造りを、CH毎に書いてると思うのですが、
その辺はここに出すのはヤバいの? なんならメールで貰って見てあげてもいいよ。

613:デフォルトの名無しさん
09/01/26 16:05:07
とりあえずポインタとカウンタ変数、計6つ?をregisterにしとき。
それとバッファサイズを256にしておけば、unsigned char宣言で
>if (uiSCI2_RecPut >= MAX_REC_BUF) {
>uiSCI2_RecPut = 0;
>}
こんな処理は必要なくなる。

614:598
09/01/26 18:07:06
>>534 613は信じちゃダメだよ。 今日はもう寝ます。また明日未明Zzz・・・

615:613
09/01/26 18:13:22
は?なんでだよ。255(0xff)をインクリメントしたらオーバーフローして0(0x00)になるだろうが。
そんなことも分からん人がアドバイスしてていいのか?

616:デフォルトの名無しさん
09/01/26 18:38:02
データ解析後の処理って、データ解析処理と平行して処理できるようになってる?

617:デフォルトの名無しさん
09/01/27 00:29:27
>>613は後でバッファサイズを増やしたくなったとき、
もしくは減らしたくなったときどうするんだろうな

618:デフォルトの名無しさん
09/01/27 03:36:29
>>617
リングバッファ知らんの?
既に>>549でも指摘したが、バッファサイズを2の累乗にして
インデックスをそのバッファサイズ-1でマスクすると、
値はバッファの範囲(128なら0-127)を取る。
write : buf[pos++ & (BUFSIZE-1)] = data;
read : data = buf[pos++ & (BUFSIZE-1)];
posはBUFSIZEの範囲を表現できる型にしておく。
例えばBUFSIZEが1024ならposは16bit変数として宣言。
これ、リングバッファ作る時の常識ね。

619:598
09/01/27 04:00:48
リングのmaskのことじゃないよ。>レジスタにしとき。←その6つはメモリであるべきでしょ。
リングのmaskなら608の書き方で615と同じに最適化されますよ。
もうじき朝飯食って出勤だから、また534と話ができるのは午後になっちゃうんだよな。
とりあえず、612の最後の行のためにメアド入れとく。

620:デフォルトの名無しさん
09/01/27 04:01:51
>>618
その「常識」とやらはリングバッファを知ってるかどうかとは関係ない。

明示的にラップさせたほうがバッファサイズの調整が柔軟にできるだろ。
2の累乗サイズに固定することにたいした意味は無い。

たまたまバッファサイズが2の累乗になっていれば、明示的にラップさせる
コードをコンパイラが最適化の一部としてマスクなりオーバーフロー任せなりに
することもできる、かもしれない。そんなことはほとんどの場合ではどうでも
いいだろう。

本当に数命令の違いに意味があるなら、目立つコメントでバッファサイズの
制約を記載すべきだ。えらそうに「常識」なんて言わずにな。

621:デフォルトの名無しさん
09/01/27 04:18:27
Linuxerにとっては常識。
ドザは常識が無い。
バカに組み込みが無理な好例と言えよう。

622:デフォルトの名無しさん
09/01/27 04:21:24
nintendo ds と psp でlinux動かしたり出来るみたいですけどこれも組み込みなんでしょうか?
どうもusbドライバをハックしたり、ファームフェアをアップするときに自作のカーネルを入れてようなんですけど。

623:デフォルトの名無しさん
09/01/27 06:05:53
>>620
>>618はな、>>608が示した
> uiSCI1_RecPut = (uiSCI1_RecPut+1)&(sizeof ucSCI1_RecBuf-1); /* リングポインタ更新 */

これと同じ意味なんだよ。
たまたま、じゃねーの。
常識なんだよカス。

624:デフォルトの名無しさん
09/01/27 06:18:59
>>622
ゲーム機がARM使ってるからlinuxで動かせるねってだけ。

625:デフォルトの名無しさん
09/01/27 06:45:37
LINとかの1線インターフェース(GND線含めて2本)
を試してみたいんですが、参考になるサイトが少ないです。
誰か知ってる人いませんか?
非同期のI2Cみたいな考え方でいいんでしょうか?

626:613
09/01/27 11:02:13
>>534
データを取りこぼす原因としては
1)割り込みが間に合わずシリアルレジスタから読み込めなかった
2)データ処理が追いつかず受信バッファがフローした
のどちらかだと思うけど、今回は多分2)の方だよね
(本当は、そんなこと簡単に見極められるんだから>>534さんが調べて示さなきゃならんけど)

で、1回分の受信サイズを240として、2回分以上の512にバッファサイズを設定しても
取りこぼすってのは、根本的にデータ処理が間に合ってないということなので、
>>534さんがするべきことはとにかく高速化の1点。

なので高速化の一手法として>>613を書いたわけなんで、まぁ参考にしてください。
仮にレジスタ変数として使うことが出来たら今回のケースじゃ割込禁止/許可もいらんのじゃないか。
一度、コンパイル結果のアセンブリソースを見てみるといいよ。どういう無駄な処理が入ってるとか
すぐ分かるよ。

627:デフォルトの名無しさん
09/01/27 11:28:10
uiSCI1_RecPut はどこで更新されるの?

628:デフォルトの名無しさん
09/01/27 14:42:41
このスレ人は居るみたいだけど
話にならんレベル

629:デフォルトの名無しさん
09/01/27 15:18:47
>>627 ringの書き込みポインタだから、受信割り込み処理の中。そこだけでいい。
mainで取り出すほうは読み出しポインタ(_RecGet)をring状に使って読み出す。
どれだけringに滞留しているかのカウンタが_RecCountで、この変数だけが割り込みと
メインループ両方から更新される。

>>628 もうちょっと遊びたかったのに、534も呆れて逃げちゃったみたい。

630:デフォルトの名無しさん
09/01/27 16:21:49
DTC、DMA使っても同じ結果になるじゃないの、今回の場合?

631:534
09/01/27 16:38:10
>613,626さん
確信犯的にオーバーフローさせるとは。メモメモ。
状況に応じて使ってみたいです。
アセンブリコードも眺めながら、最適化やってみますね。

>616さん
なっていますよ。
解析の進行具合をフラグで持つようにしています。

>598さん
>その1回ごとの間のお休みがどの位か
お休みは短くて60msくらい、長ければ100msくらいでしょうか。

>メインの切り出しのほうを疑うべきじゃないかな。
なるほど。
コードの記載はもう少し冗長な部分を省いて、
それで解決出来なかった時にさせてください。

実は今日から1週間ほど治具を貸し出すことになってしまい、
今は十分なテストが出来ないんです。
治具が戻ってきたら、また結果を書かせていただこうと思いますので、
どうぞよろしくお願いいたします。

>627さん
>629さんのおっしゃっている内容で合っています。

632:598
09/01/27 17:42:30
おお、よかった。まだ呆れられてはいなかったか。ではまた明朝Zzz・・・

633:534
09/01/27 17:55:46
>630さん
DMA、DTCの使用も試みているんですけど、
別の理由でまだうまく行きません。

DMA・・・受信は出来たけど、
    解析処理ルーチンが未完成。
DTC・・・ベクタの設定とか書いてみたけど、
    転送先に何も送られて来ず。
    何か間違っているみたい。

>598さん
呆れてなんてないですよ。
一人で煮詰まった状態で作業しても捗らないですし、
とても参考になっています。

634:598
09/01/28 04:45:00
DMAは、受信する長さがきっちり決まってないと使えないよね。その辺はだいじょうぶなの?
石がSH2で38400が2CHなら、割り込みに食われる比率なんて屁みたいなもんだから、
今回はringバッファでいいと思うけどなあ・・・ 受信の物理層を速くしても、そこじゃないって
ことなら、アプリ層の改善は必須だし。

水晶は12.288とのことでしたが、RISC方式の説明の所には40MHz動作時・・・とかある。
SHで12M程度の動作のわけないなと感じてたが、実際の動作周波数はどの位?

635:598
09/01/29 15:09:34
メインタスク側で受信フレームを再構成するときの常套手段:
・フレームにタイマ張る。「頭」バイトを検出して「中身待ち」に遷移するときに、bitrate*フレーム長
 から想定される時間*(1.5~2.5)ぐらいのタイマを張り、break時には「頭待ち」へ戻す。
 フレームの途中でコネクタが抜けるなどしたときの回復手順。

受信エラーバイトを含むフレームを捨てるようにしてある?
・コードがASCIIとかの、8bitの中でも限定された文字セットなら、受信エラー時の文字を
 (FFとかの)使わない文字に変えてringに入れる。
・通信がバイナリとかで、8bit全ての文字を使うなら上の手法は使えないので、割り込みから
 メインに伝えるイベントコードを16bitにして、0000~00FFは受信バイト、80xxは受信エラー
 のバイト、とかやる。
メイン側では、フレーム再構成の際に上記の「受信エラー文字」を読みとったら「頭待ち」へ
遷移する。

636:598
09/01/29 15:15:56
「尻尾」文字を検出したら、「頭」とは違う長さのタイマを張り、「回線切れ」 を監視する。
「お休み時間」の2~2.5倍ぐらいにするのが一般的。break時には 「受信したデータ」を消し
「受信無し」状態に戻る。( 状態は「頭待ち」 だが、受信済みデータも無し(=起動時と一緒) )

一般的な手法助言はこんなもんかと。あとは具体例が出されたら考える。

637:デフォルトの名無しさん
09/01/29 17:16:13
以上、2ch無料サポートセンターでした

638:598
09/01/30 15:46:40
んま~、なんとフォローのいいこと♪ 534さんが出てこないのは、そうとう悩んでるな

639:デフォルトの名無しさん
09/02/01 07:12:51
8bitMCUで、割り込みルーチン内で32bit変数をカウントし、
メイン側からその変数を読み出したいのですが、
割り込みを停止せずにアトミックに読み出す方法はあるでしょうか?

割り込み間隔(割り込み中時間ではなく)は、
メイン側の1回の変数参照完了時間よりも長いと仮定します。
割り込み中のカウントはで32bit変数を+1インクリメント
する単純なものです。変数がオーバーフローしても特に処置なしです。

640:デフォルトの名無しさん
09/02/01 13:34:46
>>639
この場合は単純な二度読みして一致しているかどうかでいいんじゃないの?
(チャタリング除去の場合は無駄だ~なんていうとまた誰か発狂する奴が出そうだがw)

リトルエンディアンとして、読み出しの最初と最後に1バイト目(8~15bit)を読んで、
一致していればアトミックに読めたと判断する。

もちろん2回のリードの間に256以上インクリメントされる可能性がある場合は
この方法は使えない。

641:デフォルトの名無しさん
09/02/01 13:59:10
>>640 の手法に感動した。 でも、>>639 の必然性は何なのだろうか?
読み出しの前に割込禁止して読み出し、すぐ割込許可、で素直な手法だと思うが。
ringバッファの滞留数だったりしたら、32bitは「やりすぎ」だとおもう。16bitで充分。
8bitMCUということを考えたら、ringは256までにして8bitでもできるぞ。
それなら割込禁止とか考えないでもアトミックにできる。

642:デフォルトの名無しさん
09/02/01 14:35:03
>>639
アトミックでない方法でカウンタを2回読み出して、
その値が一致するまで繰り返し読み出す。
一致したらその値が正解。

643:642
09/02/01 14:41:47
ごめん、リロードせず書いたら既出だった。

>>641
起動後の時間をタイマ割り込みで例えば1msごとにカウントするなら、32bitくらい欲しい。
このタイマカウンタが1つあれば、個別用途のタイマはその差分で計れるしね。

644:デフォルトの名無しさん
09/02/01 16:36:35
起動後の時間が必要な場合もあるのか~。俺の作ったのは 「時刻」 か、インターバルしか
なかったから、その発送はなかったわ。

645:デフォルトの名無しさん
09/02/01 16:38:39
RTCと起動後の時間だけあればいい。
そこから派生して時刻やインターバルがとれるのだから。

646:デフォルトの名無しさん
09/02/01 16:55:11
まあ起動後の時間云々はちょっと例外的というかなんかシュールな例えのような
気もするけど、ラッチがついてないHWカウンタやタイマは(場合によってはADCあたりも)
非同期的な更新を止めてアトミックに読むというのは物理的に不可能だからねえ。

647:デフォルトの名無しさん
09/02/01 20:35:43
タイマーの割り込み許可を一時的に止めるとか?

648:デフォルトの名無しさん
09/02/05 12:05:26
組み込み系の募集広告で「エレキとソフトの間の作業をお任せします」と記載
「エレキとソフトの間の作業」ってどんなですか?
やはりプログラム言語は使うのでよね?

649:デフォルトの名無しさん
09/02/05 12:52:57
エレキとソフト両方判る人募集ってとこか?
間ってさっぱりわからんが

650:デフォルトの名無しさん
09/02/05 13:11:03
因みに私はエレキの意味も分りません。
すいませんが、教えて頂けないでしょうか? m(__)m


651:デフォルトの名無しさん
09/02/05 13:12:48
>>650
URLリンク(www.google.co.jp)

652:デフォルトの名無しさん
09/02/05 13:43:08
エレキって、回路図とか読めますかってことでは?

653:デフォルトの名無しさん
09/02/05 14:36:38
エレキてつまりハード(回路)屋かな?

チップから割り込みが入らないからオシロで調べるとか、
デバドラ書くとかそんなんじゃね。

654:デフォルトの名無しさん
09/02/05 15:05:33
>>648
応募する気なのかどうか分からないけど、意味が理解できないなら
無理だよ

概ね >>653 の通りだよ


655:デフォルトの名無しさん
09/02/12 22:42:37
初心者以前の者です。質問させて下さい。
CodeWarriorの評価版でCソースをコンパイルしてARM9用の実行プログラムを
生成したいのですが、評価版のダウンロードページにある、どれを使えば
いいのでしょうか。(CodeWarrior for XXで分かれ、バージョンも9.2まである)
すみませんがお分かりの方、ご回答いただけると有り難いです。


656:デフォルトの名無しさん
09/02/14 09:02:53
>>655

ざっと見たとこ、ARM9用はない希ガス。
FreeScaleに聞くほうが手っ取り早いんじゃね?


657:デフォルトの名無しさん
09/02/14 11:12:23
ARMで安い環境ないですか
3千円ぐらいで

658:デフォルトの名無しさん
09/02/14 22:09:46
>>657

何の環境?
開発環境なら、gcc+Emacsだと只だぞ。


659:デフォルトの名無しさん
09/02/15 05:33:42
親戚のガキをぶん殴ってDSを取り上げれば0円だぞ?

660:デフォルトの名無しさん
09/02/17 03:17:48
>>656
ありがとうございます!!!!
大昔に業務アプリケーション方面のCプログラミング経験があるぐらいで
ICEにさわる必要ができてしまいました。数年前の資料ではCodeWarrior
を使用しているようでしたが、評価版がよくわからないのでIAR(30日)
を試しました。が無礼九ポイントで停止しません;;

661:デフォルトの名無しさん
09/02/17 03:21:32
660です。ICEは別製品を使っています。マニュアルに書いてあるとおりの
設定はした(つもり)なのですが。泣きたい。

662:デフォルトの名無しさん
09/02/17 04:34:36
情報を小出しにする奴は市ね

663:デフォルトの名無しさん
09/02/17 11:41:07
一人で存分に泣いた後、上司にしかられてまた泣けばいい。

664:デフォルトの名無しさん
09/02/17 17:33:24
ごめんな、H8系なら助言できることは多々あるのだが・・・

665:デフォルトの名無しさん
09/02/17 18:46:45
無礼九ポイントを通過してないのでは?

666:デフォルトの名無しさん
09/02/21 08:45:04
>>661
CodeWarriorでARMだとi.MX用だと思うが
あのIDEってCodeWarrior用のJTAG Pod以外対応してないんじゃないのか?

あの製品の仕様はアプライドマイクロシステムズ時代から
買収されるたびに迷走してるんで、今はfreescale製のCPU以外は
最新版でサポートされてるか怪しいぞ

667:デフォルトの名無しさん
09/02/25 22:44:34
電気系大学卒業で現在回路設計をやっているものですが、

組み込みプログラムの世界にいきたいのですが、
この世界は未経験でも雇ってくれるものなのでしょうか?
会社の規模や、給料にはこだわりませんが、スキルを身に付けたいのです・・

668:デフォルトの名無しさん
09/02/25 23:18:09
規模や給料にこだわり無いなら探せばあるだろ。

669:デフォルトの名無しさん
09/02/25 23:20:12
>>667
25以下ならyes

670:デフォルトの名無しさん
09/02/25 23:21:01
>>667
回路設計側は、ある意味良質な人材が激減してるよ
つか、プログラムもハードも目的を達成するための 1 手段

まぁ、がんがれ


671:デフォルトの名無しさん
09/02/26 01:35:21
>>667
組み込みでもソフトよりFPGAとか扱えるようになったほうが、仕事あるんじゃね?
オレはソフト系だけど、来月から仕事はいってないわ

672:デフォルトの名無しさん
09/02/26 04:40:30
弊社では経験の有無を問わず広く技術者を募集しています。
首都圏にお住まいでしたら社内広告に出ている適職フェアにも
参加していますので、ぜひ脚をお運びください。

673:デフォルトの名無しさん
09/02/26 23:16:44
組み込みソフトの勉強したいんですけど、何かいい教材ないでしょうか?
組み込みソフトっつても、WindowsCE、ITRON、Linuxなどの組み込みOSです。
書籍だけならいっぱいあるけど。できれば実機が付いてて、実際に動かせるものがいいです。
WindowsCEのeBox-2は販売終了になってるし、、
興味があるのは、OSならWindowsCE、CPUならARMかSHあたりかな。
はじめはITRONのが判りやすいとは言われてるけど。
予算は3~4万程度は出してもいいかなと思ってます。


674:デフォルトの名無しさん
09/02/26 23:20:06
そんなもん勉強して何がしたんだよ
3~4万程度しか出せないならやめとけ

675:デフォルトの名無しさん
09/02/27 03:28:36
WindowsCEもLinuxも環境が整いすぎているから、動かしただけで満足して終わる可能性は高い。

676:デフォルトの名無しさん
09/02/27 07:24:52
ドライバとか低い所に手を出さない限りPCとほとんど同じだからなあ…


677:デフォルトの名無しさん
09/02/27 09:54:47
まぁそんなこと聞いてくる時点で組込みへの適正 0 に近いって事を自覚しろ。

678:デフォルトの名無しさん
09/02/27 14:35:10
>>673

ちょっと予算オーバーだけど
URLリンク(www.apnet.co.jp)

679:デフォルトの名無しさん
09/02/27 14:45:26
とりあえずFonでいいよ。
2千円の投資でLinuxとGPIOとシリアルと有線・無線LANのお勉強ができるよ。

SHがやりたいならみついわボードかな。8千円ぐらい。
URLリンク(web.kyoto-inet.or.jp)
ARMならストロベリーリナックス辺りで適当なの買えばいい。

680:デフォルトの名無しさん
09/02/27 20:02:12
ARMならCQの付録基板待ちでいいじゃない、どんな出来かわからないけどw

681:デフォルトの名無しさん
09/02/27 20:05:51
今回は誰がやってるんだろう。
某氏が関わってるとは聞いてないけど

682:デフォルトの名無しさん
09/02/28 08:04:47
EZ-ARM7よりスペック上で価格がどんなことになるのか楽しみだわ

683:デフォルトの名無しさん
09/02/28 09:18:09
URLリンク(eetimes.jp)
これって完成してもまたアメリカに潰されるんでしょ?

684:デフォルトの名無しさん
09/02/28 10:09:35
TRON関係者の被害妄想を加速させないでください。

685:デフォルトの名無しさん
09/02/28 16:27:18
リアルタイム性を出すのって難しいよね

686:デフォルトの名無しさん
09/02/28 17:20:40
>>685
リアルタイムという定義をもうすこし勉強するよろし

687:デフォルトの名無しさん
09/02/28 22:01:10
>>683

すでに製品が出ているわけだが。
URLリンク(www.esol.co.jp)


688:デフォルトの名無しさん
09/02/28 23:37:43
俺はOSなしの仕事ばかりなんで、ドライバ開発者の仕事が逆に見えないんだけど、ある程度OSレベルでインターフェースが決まってて、その中身をコーティングする感じなの?

689:デフォルトの名無しさん
09/02/28 23:59:37
>>688
ドライバはOS次第だな。

690:デフォルトの名無しさん
09/03/01 00:18:07
>>688
通常 itron あたりだと, ハードを叩くタスクのコーディング規約的なもの

だけど, TCP/IP スタックとか, ファイルシステムとかの賢いライブラリが
既にあって, そのライブラリで使用可能な新規デバイスを動作させようと
思った場合は, そのライブラリのコーディング規約に従う必要がでてくる.

で, Unix とか Linux とか Windows とかのドライバ開発者は,
上記コーディング規約とか上位層用のインターフェースに従ったものを
作る必要が発生するため, 若干めんどうなことになる

だけど, 実質的にデバイスに対する制御は一緒だよ


691:デフォルトの名無しさん
09/03/01 01:14:15
>>690

そういうのを「コーディング規約」とは言わんと思うが。


692:デフォルトの名無しさん
09/03/01 01:22:07
>>691
API とも言いにくいよな. まぁ, それ的なものって事で許してくれ


693:デフォルトの名無しさん
09/03/01 03:54:36
>>691
うるさいはげっが

694:デフォルトの名無しさん
09/03/01 04:37:50
コーリングコンベンションのことかな? 俺もOS無しばっかりなので、ドライバ層がタスクで
だいじょぶなのかな? とかいつも心配になる。余計なタイムアウト処理がついてくるような。

695:デフォルトの名無しさん
09/03/01 09:20:14
>>690
コーディング規約というのは(ry

696:デフォルトの名無しさん
09/03/01 11:13:26
>>692
ドライバインタフェースて言ってる。
これが一般的かどうかは知らんが。

>>694
それは違うと思うぞ。


697:デフォルトの名無しさん
09/03/01 11:47:20
>>689-690
688だがありがとー。
タスクにするのか。制御するデバイスが外付けのADCやDACだったりすると特に大変だな。
ドライバタスクに制御が渡るまでの遅延がそのままLFPになるし。

698:デフォルトの名無しさん
09/03/01 11:48:51
LPF、ローパスフィルタだ…すまん。

699:デフォルトの名無しさん
09/03/01 12:34:20
>>697
ならないでしょw
っていうか、遅延がLPFになっちゃうって根本的にHWの設計おかしいよ。
1バイトか4バイトか知らんけど、サンプリング毎に逐次的にPCのCPUが処理するHWなわけ?
工業高校の落ちこぼれでもそんな糞設計しないよ。
普通にバッファぐらい付けようよw

700:デフォルトの名無しさん
09/03/01 14:46:44
>>697 じゃないんだが
その昔 FIFO すら付かない素の DAC 渡すアホなハードを渡してくれた奴がいた
これじゃ音が歪むって言って突っ返したがwW


701:デフォルトの名無しさん
09/03/01 16:54:05
>>699
ああ。なんか俺が色々誤解していることが分かったwwwwwサンクス。
なお、俺はOSのドライバ開発をしたことないので質問したので、
ADCとDACの話は俺の想像であって、実際にある基板の話ではないよ。
PCの話は分からないけど、俺はSH+組込みOSのシステムを想像してた。

で、ワンチップマイコンで良くやるような、タイマ割り込みをトリガにした
周期的なデバイスへの直接制御を、tickに縛られる(しかも1tickはmsec単位?)
OSのタスクでどうやって実現するのだろうかと疑問に思ってた(^^;

だが、そもそもそういうことではなくて、OSを使うようなシステムものの仕事では
上のような処理はFIFOつきバッファを使ったりFPGAを使ったりして、
CPUのソフトウェアの影響を出来る限り排除するように設計されてるってことだな。

702:デフォルトの名無しさん
09/03/01 19:34:46
>>701

そんなにスピードを求められない(tick単位で処理できればいい)デバイスの場合、ソフトで制御することもあるよ。
割り込みハンドラなら最優先で処理されるし、RTOSならタスクに優先度を細かくつけれるし。


703:デフォルトの名無しさん
09/03/01 22:26:11
>>700
メガドライブですね?

704:デフォルトの名無しさん
09/03/01 23:24:31
FIFOと言われると、FirstInが何のことなのか判らなくなる時がある
LIFOを頭に浮かべて、ああ、FIFOは待ち行列だったか・・と思い出すわけだ
これが非常にまわりくどい
最初からきゅーとか待ち行列と言って欲しい


705:デフォルトの名無しさん
09/03/01 23:45:34
俺的にはスタック、キューって言ってくれないとわかんない

706:デフォルトの名無しさん
09/03/01 23:45:40
>>704
変な人だな。
それはひょっとして頭の中に「ところてん押し出し器」的な図式が
イメージできてないからじゃないの?

707:デフォルトの名無しさん
09/03/01 23:58:46
>>704
うちら界隈だと、チップのマニュアルで FIFO 表記の方が多いから、
ハードで実現されてる奴はキューとはあんまり言わんな


708:デフォルトの名無しさん
09/03/02 11:03:20
[FL]I[FL]O のほうが抽象的な感じだな。
スタックとかキューというと実装が少し見える感じだ。

709:デフォルトの名無しさん
09/03/02 11:36:01
ここは古典的に
FIFO=ところてん
LIFO=積み○○
とか


710:デフォルトの名無しさん
09/03/02 19:19:29
FIFO=貫通式オナホール
LIFO=巾着式オナホール


711:デフォルトの名無しさん
09/03/02 19:49:31
おまえ生きてて恥ずかしくないか?

712:デフォルトの名無しさん
09/03/02 20:01:45
ワラタw

713:710
09/03/02 20:08:37
『奥が深い』とはまさにこのことよ。

714:デフォルトの名無しさん
09/03/02 21:01:48
全然たとえとして成立してないと思うけど。
頭悪すぎないか。

715:デフォルトの名無しさん
09/03/04 04:17:02
>>710のチンコが着脱式であると仮定すれば無理な話でも無いな

716:デフォルトの名無しさん
09/03/29 13:26:03 BE:1249790786-2BP(1028)
41歳から 組み込みエンジニアって ありでつか?
RTOSならやったことあるけど・・・ 
アセンブラも出来るけど・・・

717:デフォルトの名無しさん
09/03/29 14:08:28
ありかって聞いてる時点で駄目なんじゃね?それなりのキャリアがあればありかなしかなんて自分でわかると思うけど。

718:あぼーん
あぼーん
あぼーん

719:デフォルトの名無しさん
09/03/29 14:17:15
>>718
いまいくおー ε=ε=(っ・∀・)っ ゴーゴー♪

720:デフォルトの名無しさん
09/03/29 22:08:25 BE:1249791168-2BP(1028)
ここ10年鯖系やってたんだ
今、FPGAのカスタムCPU向けの派遣やってるんだけど
なんか、この業界って システムの分析とか設計とかインタフェ~スも決めないでなぁなぁで仕事してるし
業界慣行違うなと・・・
社内試験もユ~ザ~向けドキュメントも 超いい加減で 楽で Indeed調査によると 給与もいいみたいだし・・・

721:デフォルトの名無しさん
09/03/30 09:37:08
人手が常に足りてないからぬるいんだよ。
良くも悪くも「動けばOK」な面も、てそれは鯖も同じか。

722:デフォルトの名無しさん
09/03/30 11:03:06
弊社では、年齢経験を問わず広くエンジニアを募集しております。適職フェアで、是非お会いしましょう。
# とは言え、年齢がそれなりの人はそれなりの報酬のためにはそれなりに上流工程もこなせないと厳しいけど。

723:デフォルトの名無しさん
09/03/30 20:19:43
リク板じゃないからちょっと板違いかもですが
外注募集してるとこないですかね?
当方、経験15年以上なんですが

724:デフォルトの名無しさん
09/03/31 10:34:32
>>723
>722

725:723
09/03/31 10:47:21
>>724
トン

726:デフォルトの名無しさん
09/04/06 06:41:27
へうでH8S/2000シリーズ使っての質問です。

resetprgで、SP初期化・割禁の後、_INITSCT()でRAMにゼロまたはコードされた初期値を入れ、
それからHardwareSetup()を呼び出して内蔵レジスタ類の初期化という順序がお奨めらしい。
この順序である必然性みたいのはあるのでしょうか?

内蔵レジスタの設定に、入力クロックを2倍する設定とかもあるので、RAMの初期化は
レジスタ類初期化の後のほうがいいように思えるのですが。

727:デフォルトの名無しさん
09/04/06 06:44:45
sageで書いてしまったorz・・・上げます

728:デフォルトの名無しさん
09/04/06 07:12:43
うぜえなこいつ

729:デフォルトの名無しさん
09/04/06 07:25:26
>>726
そこまでわかってるなら、必然性はない。
単にHardwareSetup()内でグローバル変数などが初期化済みになるようにしてるだけ。

730:726
09/04/06 09:01:15
ああ、なるほど。そういう配慮もあり得ますね。なんかへうが出したとこ触るのって畏れ多くて(w
解ってやる分には後でもだいじょぶってことですね。 ありがとうございます。

731:デフォルトの名無しさん
09/04/06 12:20:26
>>730
畏れ多い?
すぐにそんな気持ちは無くなるよ。ヒヒヒ

732:デフォルトの名無しさん
09/04/06 13:13:49
>>730
オレも最初そうだった。
へうのやることは、「親切心でやってみた」程度に考えておいたらよいと思う。
付き合いが長くなると、気が利かなかったりする面も見えてくるが、片目をつぶって辛抱しなさい。

どおしても~ダメだったら~帰っておいで~♪

733:デフォルトの名無しさん
09/04/06 14:10:26
妹よ~

734:デフォルトの名無しさん
09/04/06 14:47:28
たまには三人で酒でも飲もうや

735:デフォルトの名無しさん
09/04/07 04:29:09
H8Sから上のシリーズって、入力クロックを増速するレジスタがありますよね。
これをデフォのまま=増速せずに使ったら、何か利点があるんですか?
例えば消費電力が小さいとか・・・

736:デフォルトの名無しさん
09/04/07 16:33:38
ハードウェアマニュアルをよく読みませう。

737:デフォルトの名無しさん
09/04/07 22:05:07
クロックが遅ければ消費電流が少ない
別に早い必要が無ければ早くする必要はない

738:735
09/04/08 05:20:44
>>737 ありがとです。 実際クロック2倍で消費電流も2倍になるのでしょうか?

>>736 例えばH8S/2378の 23. クロック発振器 の章をよく読んでも、メリット・デメリット・電力等に
ついての言及が無いので聞いてみたのです。逆に低消費電力状態の説明の章にはクロック発振器
との関連は言及されていません。この記述がそうだよという箇所がありましたら示唆ください。

739:デフォルトの名無しさん
09/04/08 10:58:11
なぜメーカに聞かない

740:デフォルトの名無しさん
09/04/08 13:35:45
ユーザーじゃなくても答えてもらえますか?

741:デフォルトの名無しさん
09/04/08 13:43:23
二倍じゃないし、使用状況によるとしか書けないだろ

742:デフォルトの名無しさん
09/04/08 15:15:05
>>738
DC特性の下の方に消費電流(max)の計算の仕方が書いてあるでしょ。

743:デフォルトの名無しさん
09/04/08 18:09:58
>>742 そこ見てみました。ワケワカメ(w

744:デフォルトの名無しさん
09/04/08 18:16:53
インターフェース5月号をかって、組み込みについて勉強したいです。

でも、明確に何が作れるのかわかりません。
教えて得ろ胃人!

745:デフォルトの名無しさん
09/04/08 18:28:00
くみこさんキスしていい?

746:デフォルトの名無しさん
09/04/08 18:33:38
>>743
f=33MHz,Vcc=3.6Vで計算してみたら

747:デフォルトの名無しさん
09/04/08 19:44:43
>>744
まずは本読めよアホ

748:デフォルトの名無しさん
09/04/08 21:47:59
データシート見ると

Iccmax = 15 + 0.37 × Vcc × f

小学生でもできる計算じゃん

749:デフォルトの名無しさん
09/04/08 22:02:33
>>744
こんなの
URLリンク(kumikomi.typepad.jp)

750:デフォルトの名無しさん
09/04/08 23:17:05
>>744

まずはこれを嫁。
URLリンク(www.cqpub.co.jp)


751:デフォルトの名無しさん
09/04/09 04:41:33
>>748 やっと見つけた。そこにたどりつく前に挫折してました(w
動作周波数依存で変わる部分は、消費電流の2.5%ぐらいと理解すればよさそうですね。
レジスタの設定なんかのとこは読むけど、電気的特性って標題見ただけでここは読まない
と決めてました。

752:デフォルトの名無しさん
09/04/09 09:20:10
ここまで馬鹿だといっそ清清しいな。
>746の条件を>748に入力したら約60mA、クロックを半分に落としたら約40mAで、
仮にクロックを1MHzにまで落としたら約16mAってことなんだけどねぇ。

それとも、15[mA]+0.37*Vcc[V]*f[MHz]って計算式の意味が判らないんだろうか。

753:デフォルトの名無しさん
09/04/09 17:02:33
15mA+0.37*3.3*33-->55.29 15mA+0.37*3.3*16.5-->35.15 1MHzだと0.37*3.3が1ぐらいか。
やっとわかった~\(*o*)/ ありがとうございます。
その基本料金の15mAってところは、スリープのいくつかのモードで小さくするんですね?
周辺モジュールまで止めるか、クロックまで止めるか、とか。

754:デフォルトの名無しさん
09/04/09 17:04:16
みんな優しいな

755:デフォルトの名無しさん
09/04/12 04:42:14
H8S/2378シリーズのアドレス空間は、内蔵RAM00FF4000~00FFBFFFです。(RAM32K)
RAM16Kの2368シリーズのRAMアドレスは、00FF8000~00FFBFFFだろうと思い、
ルネサスのサイトで2368シリーズのpdfを見たら、3.4 各動作モードのアドレスマップ の章の
アドレスが全て□OM:□□バイト □AM:□□バイト アドレスも□'□□□□□□ とかに
なっていて、確認できませんでした。 どなたか実際の数値を確認した人いらっしゃいますか?
2行目で合ってますか?

756:デフォルトの名無しさん
09/04/12 07:16:10
もっと後の方に内蔵RAMの章があるだろう。
そこに書いてないか?


757:デフォルトの名無しさん
09/04/12 07:52:41
それフォントの問題だよな。Windowsのpdfリーダーは用意出来ないんか?
まぁ確認しといてやったけど、2ちゃんなんか信用しないでpdfをちゃんと見られる環境を作った方がいいよ。

2360F/2363/2365
リザーブ領域: H'FF4000-FF7FFF
内蔵RAM: H'FF8000-FFC000

758:デフォルトの名無しさん
09/04/12 07:54:18
-FFBFFFの間違い。
つーか>>756の言うように13章を参照せれ

759:デフォルトの名無しさん
09/04/12 07:56:21
なんどもごめん、よく見たら18章だった。

760:755
09/04/12 08:09:50
>>756-759 ありがとうございます。18章で確認できました。ホントここは2chとは思えない位
優しい人たちですね。 環境はXPhomeで、2378のpdfを落とした時は3章もふつうに見られた
んです。 vista向けにフォント更新しちゃったのかな? あ(*o*)adobe更新してないかも!

またまた質問です。このシリーズの石って、33MHzのと34MHzのとありますよね。
16.5888を2倍して33.1776で動かす場合は33MHz越えるから、34MHzのほう、ってことになりますか?

761:デフォルトの名無しさん
09/04/12 18:37:49
どうせなら、35MHzにしてみたら

762:デフォルトの名無しさん
09/04/13 02:35:23
まあ、ハイスペック側を使う分には制約が少ないのは分かりますが、この1MHzの違いが
幾らにつくのかな? と思いまして。ちなみに必要なのはメーカー要求のロットより2桁ぐらい
少ない数なので、最低ロットでまとめ買いな路線です。

763:デフォルトの名無しさん
09/04/13 04:18:04
クロックに影響されるSIOなどの部分や消費電力が無視できる環境ならどうだっていいよ

764:デフォルトの名無しさん
09/04/13 07:31:06
CPU一個の値段が\50ぐらい違うとかないですか?

765:デフォルトの名無しさん
09/04/13 11:56:37
サーバー運用管理者ですが、くみこみにいきたいと考えています。

現在もっともポピュラーな開発言語はCですか?
また、電気工学の知識はどれくらい必要でしょうか?

766:デフォルトの名無しさん
09/04/13 13:55:09
本屋にでも行って最低限の知識を得てからにしてくれ

767:デフォルトの名無しさん
09/04/13 15:28:35
>>765 cとASMが半々ぐらいかな。俺は電気も電子も皆無。回路図渡されても、port表は別に
要求する。portxxは何の入力/出力って奴。それだけでも足りなくて、バスコントローラーの
設定なんかハード屋さんからいちいち聞く(w

768:デフォルトの名無しさん
09/04/13 17:53:46
>>767
ポート表やバスコントローラの設定は、普通ハード屋がだすもんじゃね?
俺は毎回資料作って渡してるよ

769:デフォルトの名無しさん
09/04/13 18:44:10
>>762
型番によっちゃ売れ筋でないのは廃盤になって
入手できなくなったりするから注意しろ。

770:デフォルトの名無しさん
09/04/13 22:14:41
量産するんじゃなくて職人の手による一品モノならシーケンサで充分

771:デフォルトの名無しさん
09/04/13 23:20:25
>>770

シーケンサって何?

772:デフォルトの名無しさん
09/04/13 23:25:18
ACCESSとかSQLとかDBアプリはインとアウトがわかれば全て作れるレベルです。
さて、Cとかはほんと軽く触った程度でポインタにはアドレスが入るということは理解しています。

組み込みのCって、UNIXのCプログラム(システムPG)とくらべてどう違うのでしょうか?
また、書籍で独学で、仕事もらえるレベルに到達することは可能でしょうか?

また、超お勧めの書籍を教えてください

773:デフォルトの名無しさん
09/04/13 23:30:18
ガタガタ言ってないで本屋へ行って何冊か買ってこい
その程度すらやれないんだからお前に才能は無い

774:デフォルトの名無しさん
09/04/13 23:36:15
学生さんなのでしょう。勉強は誰かが教えてくれると思ってるんでしょ。
もし社会人だったらクズですけど。

775:デフォルトの名無しさん
09/04/14 07:33:25
>>769-770 少ないけどいちおう量産品です。でも、石1個が高いか安いかより、無くならないか
の観点のほうで選ぶみたいですね。ハード屋さんがそう言ってました。

776:デフォルトの名無しさん
09/04/14 07:38:38
>>772

> 組み込みのCって、UNIXのCプログラム(システムPG)とくらべてどう違うのでしょうか?

・標準関数が使えなかったりする
・マルチタスクや割込みを意識したプログラミングが必須
・メモリリーク厳禁
・デバッガがわりと貧弱


> また、書籍で独学で、仕事もらえるレベルに到達することは可能でしょうか?


無理。ただし、Cの仕事の経験があれば、雇ってくれる会社はある。
あとは、組込み技術者養成してる派遣会社で研修受けて、派遣で働くとか。


777:デフォルトの名無しさん
09/04/14 23:54:55
>>771
URLリンク(nttxstore.jp)
こんなやつ

778:デフォルトの名無しさん
09/04/15 05:27:38
柑橘類の一種じゃなかったのか・・・

779:デフォルトの名無しさん
09/04/15 16:32:06
それはシークヮーサーw

780:デフォルトの名無しさん
09/04/15 20:06:42
>>779
よくわかったなw 感心したわ

781:デフォルトの名無しさん
09/04/16 13:15:44
>>776
> ・メモリリーク厳禁
全部スタティックに置くからリークなんかしないお
でもたまにほかの変数を上書きしてしまったりするお
スタックのを上書きしたら変なところに飛ぶからすぐわかるお

>>779
わかってたけど野暮だからと思って書かないでおいたのに…

782:デフォルトの名無しさん
09/04/16 21:24:00
ヒープするときもあるべ

783:デフォルトの名無しさん
09/04/17 00:04:14
いやいや、生まれついたときから組み込みの仕事をやってた僕に言わせればそうじゃないんだなぁ。
つまりどういうことかと言うと、ヒープは使うときもある。だけど使わないときもある。

784:デフォルトの名無しさん
09/04/17 04:04:29
>>783
誰に言わせてもその答えにしかならんだろうが、アホめ。

785:デフォルトの名無しさん
09/04/17 04:41:31
>>783
君はバカだな
全然違うよ
ヒープは使うときもあるし、使わないときもある

786:デフォルトの名無しさん
09/04/17 06:04:50
ちょっと質問です。

SHとH8の開発環境をひとつのマシンにつくりたいのですが
現在は、SH用のHEW4が入っています。
H8用は、HEW(1.0)がお客様からとりあえず支給されました。
HEWのツールチェインに、H8のコンパイラをいれるとかできるんでしょうか?
みなさんはどうしてます?

787:デフォルトの名無しさん
09/04/17 07:19:04
URLリンク(tool-support.renesas.com)

788:デフォルトの名無しさん
09/04/17 12:08:16
組込みで、音声ICチップをさがしています。
簡単に実装出来て、値段が安く実績のあるメーカーが良いです。

値段は、1個500~1500円の間で考えていますが、

エプソン・OKI等のLSIは1個~購入可能?
そう言う所知っていません?
例 S1V30300等 とか?
URLリンク(www.epson.jp)

出来れば個人購入で、個人でも相手にしている所ありません?
最新でなくても良いです。

用途は、販売機等の「いらっしゃいませ~」みたいなものです。
スレチ?

789:デフォルトの名無しさん
09/04/17 14:01:58
アキバへ行っちゃったほうが早いような・・・

790:786
09/04/17 14:40:07
>>787
ありがとうございます。
新しいバージョンに自動的になるわけですね。
なんか怖いな
コンパイラだけのインスコとかできるといいのになあ。



791:デフォルトの名無しさん
09/04/19 12:24:29
>>784
スネークマ・・・いやなんでもない

792:デフォルトの名無しさん
09/04/20 19:38:12
共存させると嫌なことが起こったような...
あれはR8Cだったかな?

793:デフォルトの名無しさん
09/04/22 07:03:23
FIFOとLIFOのちがいがわかるようになったぼくはすごいですか?

794:デフォルトの名無しさん
09/04/22 07:05:00
えらいねぇ~よちよち

795:デフォルトの名無しさん
09/04/22 07:43:06
>>710読んで解った気になってるんじゃないだろうな。

796:デフォルトの名無しさん
09/04/22 10:43:04
コーナリングの基本はSIFOだ

797:デフォルトの名無しさん
09/04/23 17:02:33
つまり前戯はネチネチやるってことですね?

798:デフォルトの名無しさん
09/04/24 21:49:54 BE:1275828277-2BP(1028)
>>793
厨房 その調子でがんばれよ

799:デフォルトの名無しさん
09/06/06 04:28:45
1.5ヶ月ぶりにまともな質問です。H8/300H TinyシリーズにH8Sで書いたソフトを移植する仕事
の引き合いが来ました。 36064のpdfをダウンして読みながらへうで雛形を書いています。
こんな小さい石までルネサス共通のアーキテクチャに合わせてERnになってるんですね(*o*)

文字列を渡すサブルーチンを見たら、void func(*src) { の中で、
   MOV.W   R0,R2    引数の文字列アドレス
L110:     (doのラベル)
   MOV.B   @ER2+,R0L (*引数++のアドレッシング)   ・・・となっていました。

前置きが長くてすいません。では質問: あれ?ER2の上位は?と気になったので聞きにきました。
この石ではアドレス空間は0~FFFFですから、ERnの上位が何であってもメモリアドレスは
この空間にラップアラウンドしてアクセスされる、 と理解してよいですか?

初期化でEnを全部ゼロに、とかも考えたのですが、計算の一時記憶としてEnが使われたり
したらずっとゼロの保証はありませんよね。

800:デフォルトの名無しさん
09/06/06 04:39:22
もう1個:H8系の石のパワーONリセット処理は、
  MOV.W または MOV.L  #stackの末尾,SP
  ORC.B            #-128,CCR    となっていますが、
リセットのときはIマスクは1であると書かれています。2行目の割禁命令はなぜ必要なのでしょう?

801:デフォルトの名無しさん
09/06/06 08:40:02
>>799
上は無視される。

>>800
なにかの間違いで飛んできた時のためにおまじない。


802:800
09/06/06 16:39:13
ありがとうございます。 対照的にすごく簡潔な答

803:800
09/06/07 03:52:00
TinyでEEPMOVができるかお試しコード書きました。 _builtin_eepmov(dst,"abcde",5) のコードが
    MOV.W    #LWORD L76,R5    "abcde"のラベル
    MOV.B    #5,R4L
    PUSH.W   R6
    MOV.W    #LWORD _dst,R6
    EEPMOV.B
    POP.W    R6
で、いちおうできるみたいですが、EEPMOV前後のR6のpush/popは何のためなんでしょう?
これと、string.hのmemcpy(dst,"abcde",5); 使って関数呼び出しでやるのとで、得失は
ありますか?

804:デフォルトの名無しさん
09/06/12 11:43:44
>>803
単に、R6は破壊しないと言う呼び出し規約でもあるんじゃないの。

805:800
09/06/13 04:27:58
関数中で破壊しないという規約はありませんでしたが、その目で読んでいったら解りました。
この関数の入り口=遙か彼方の上の方でR6にある変数のアドレスを入れていました。
関数中で何度かアクセスする変数なので、最適化でこのようにしているようです。
ということは、EEPMOV.B 命令自体にはR6の保存云々は関係ないと理解できそうですね。
EEPMOV.W 命令の場合は、その後ろでR4をテストして、BNZ EEPMOV.Wのラベル が必要
ですよね? あ、はしゃいでお試しコード書いている間に、Tinyの企画自体がポシャりましたorz

806:デフォルトの名無しさん
09/06/13 10:11:55
SH2の遅延スロット不当命令って型番によって仕様が変わってるようだけど、
GCCって対応しているの?
現状スロット不正例外頻発してんだけど。

807:デフォルトの名無しさん
09/06/13 10:34:56
ldc r0,sr?

808:デフォルトの名無しさん
09/06/13 10:39:14
それ。

809:デフォルトの名無しさん
09/06/13 10:46:39
cならinlineアセンブラとか使わない限りsrさわるコードは生成されないと思う。
気になるなら、sh.mdにパッチを当てるとか?

810:デフォルトの名無しさん
09/06/13 10:56:54
>スロット不正例外
あれ?じゃあ原因違うのかなぁ?

もう少し調べてみます。
ありがとう。

811:810
09/06/13 12:07:24
ディスパッチャに思いっきり、
jsr @r2
ldc r1,sr
ってのがいました...お騒がせして申し訳ない。

疑ってごめん >GCC


orz

812:デフォルトの名無しさん
09/06/13 12:26:41
ram8kbじゃ、地獄見るんじゃないの?

813:デフォルトの名無しさん
09/06/13 14:26:16
どれへのレスなんだろう?4800のuart4CHの合流なんてのを8085で書いたときには、
8KBでやりくりしたぞ。

814:デフォルトの名無しさん
09/06/13 15:58:05
スタックの切り替えとかないOSなしならね。

815:デフォルトの名無しさん
09/06/26 16:39:03
うん、俺素っ裸大好きだし。4CH分の取り出し処理を、「タスク」 もどきに書いてmainから
呼び出す形に作ってなんとかしたぞ。スタックなんか128バイトぐらいしか使わなかった。

816:デフォルトの名無しさん
09/07/14 09:54:13
Arduinoも組み込み系ですか?

817:デフォルトの名無しさん
09/07/16 13:56:01
レゴと同じ玩具。
対象年齢10才~

818:デフォルトの名無しさん
09/07/16 20:39:51
>>816-817
それ何?
Androidじゃないよな?


819:デフォルトの名無しさん
09/07/16 20:58:08
ググレカスとしか

820:デフォルトの名無しさん
09/07/16 21:22:48
>>819
なるほど、本当にあるのか
(実はtypoだと思ってた)

821:デフォルトの名無しさん
09/08/15 21:11:30
プロトコルスタック実装してみたいんだけど
なんかいい資料ないですか?

interfaceとかに書いてあるかな?

822:デフォルトの名無しさん
09/08/16 01:47:50
>>821
なんのプロトコルスタック?

823:デフォルトの名無しさん
09/08/16 10:35:29
>>822
ネットワーク関連ならなんでもいいっす
TCPとか好きです

824:デフォルトの名無しさん
09/08/16 12:02:59
やる気が無いならやめてしまえ

825:デフォルトの名無しさん
09/08/16 16:21:41
とりあえずLinuxとかの実装見てみろ。
多分コード量見て嫌になるから。


826:デフォルトの名無しさん
09/08/17 03:34:44
linuxのソースは当てにしない方がいい
見るならBSDの方で

827:デフォルトの名無しさん
09/08/17 07:25:31
>>826
BSDは糞だろLinux最高だバカヤロウ

828:222.248.109.70
09/08/17 17:45:39
Q. 自動保守#K9K?_D[L とは一体何なのか?
A. 外部サイトへの突撃大好きな真性厨房

韓国突撃でお馴染みの自動保守
最近は自動焼人 ★として2ちゃんねるのボランティアにも精を出す日々
だがそんな彼にも、人間らしい部分はあったのだ…

名言集
『アパッチ砲はワシが作った』
『お前が規制系キャップ取れるか審査してやるよ』
『いつもサボってばかりのキャップがウゼえ』
『俺、100人規模の集団サイバーテロの主犯だったこともあるんだぜ』
『俺の経歴カックイイだろ?』

最近のニュース
 8月15日の韓国突撃の際に歴史的大敗を喫する。ラジオでの敗戦宣言のときに声が震えていた
 本人は体調不良と言っているが…


----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
スレリンク(sec2chd板)
にて自動焼人 ★までご連絡ください

829:デフォルトの名無しさん
09/08/17 20:14:12
コピペ君って馬鹿だな、まで読んだ。

830:デフォルトの名無しさん
09/08/17 20:24:09
ボキュは馬鹿なコピペ君です、まで読んだ。

831:デフォルトの名無しさん
09/08/18 00:21:57
そのコピペにレスする馬鹿は?
組み込みの人ってやけにキチガイ度が高いよね
他のキチガイとは何か臭いが違うというか・・

832:デフォルトの名無しさん
09/08/19 21:57:37
>>827
学習用でプロトコルスタック廻りとデバイスドライバなら
絶対BSDの方がいい

Linuxのは汚くて”こうなってる筈”とあたりをつけられないと
ソースツリーの何処にあるか探しあてて中身をみただけで
気力が萎える可能性が高い

BSDは設計がガチガチな分、コードとソースツリーが読みやすい。
その分、新しいデバイスのドライバが書き辛いったらないが

833:デフォルトの名無しさん
09/08/19 22:05:06
ライセンスの問題もある
下手にlinuxのコードを参考にするとGPL厨がやってくる


834:デフォルトの名無しさん
09/08/20 00:39:34
Linuxは来年カルト認定される可能性があるので
利用してはいけない

835:デフォルトの名無しさん
09/09/08 14:24:59
0番地にリセット処理のベクタがあるとき、そのアドレスにジャンプするのは、cで
どう書けばいいですか? ルネサスのcで石はH8/300H TINYです。
void cmdhoge(void) {  /* hogeコマンド処理 */
 register void (*funca)(void) = (void*)(0);
 set_imask_ccr((_UBYTE)1);
 (*funca)();
} これだと0番地へジャンプしちゃいますよね?

836:デフォルトの名無しさん
09/09/08 14:27:17
age忘れすいません

837:デフォルトの名無しさん
09/09/08 14:41:51
>>835
こうだろ ((void (*)(void))(*((uint32_t const*)0)))() 常識的に考えて。

838:デフォルトの名無しさん
09/09/08 14:51:25
uint32t無しで、const*でコンパイルは通りました。ありがとうございます。
他のエラーつぶしたらlst見てみます。

839:デフォルトの名無しさん
09/09/08 20:09:35
const *だけかよw
せめてint const *にしてやれ。

840:デフォルトの名無しさん
09/09/08 20:21:24
void cmdhoge(void) {
void (**funca)(void)=0;
(**funca)();
}

841:デフォルトの名無しさん
09/09/09 03:34:21
あ~そういうのもありか。ありがとです。*が2個以上になると頭がついてかない(w

話変わって、UWORD*UWORD→ULONGとULONG/UWORDの関数を↓のように書きました
_ul_mul_wd:         ; ulong ul_mul_wd(ushort E0,ushort R0) {
    mulxu.w e0,er0  ; return ulong(E0*R0)
    rts         ; cでwd*wdをするとわざわざMSWをクリヤするので。
_ul_div_wd:        ; ulong ul_div_wd(ulong ER0,ushort R1) {
    divxu.w r1,er0
    sub.w  e0,e0  ; return ER0 / R1
    rts
短いから、関数にして呼ぶより、インライン展開したいのですが、マクロ定義をどのように
したらいいでしょうか? machine.h読んでも、__builtin_何とかばかりで、
機械語出させる定義みたいじゃなかったし。

842:デフォルトの名無しさん
09/09/09 04:19:44
>>837-840 .lstではこうなっていました。@0:16だから、0番地にあるアドレスにJMPしてますね。
598:    ((void (*)(void))(*((const*)0)))();
0A16  6B000000    MOV.W   @0:16,R0
0A1A  5900       JMP     @ER0

843:デフォルトの名無しさん
09/09/09 07:31:44
>>841
#define ul_mul_wd(e0,r0) ((ulong)(e0)*(ushort)(r0))
#define ul_div_wd(er0,r1) ((ulong)(ushort)((ulong)(er0)/(ushort)(r1)))
この程度、アセンブラで書く必要無し。
てか除算はE0を0にしていいのか?戻り値がulongなのだが。

844:841
09/09/09 14:21:05
MULXUは出ますね。DIVXUが出ずにulongの割り算を呼ぶコードが出てます。
131: void ul_div_wd_test(_UWORD f, _UWORD x) {// long/ushort 呼び出しtest
0234 _ul_div_wd_test: ; function: ul_div_wd_test
0234 5E000000 JSR @$sp_rgsv3$3:16
0238 0D85 MOV.W E0,R5
133: void sub(_UDWORD);
134: _UDWORD l;
135: nx = ul_mul_wd(f,x);
023A 5250 MULXU.W R5,ER0
023C 0F86 MOV.L ER0,ER6
136: l = ul_div_wd(nx,x);
023E 0D51 MOV.W R5,R1
0240 1771 EXTU.L ER1
0242 5E000000 JSR @$DIVUL$3:16
0246 1770 EXTU.L ER0
0248 01006B860000 MOV.L ER6,@_nx:16
137: sub(l);
024E 5E000000 JSR @_sub:16
138: }
0252 5A000000 JMP @$sprgld23$3:16
>てか・・・ 結果は16bitだと判っているからいいのです。32bitのほうが使い回しが、とか
考えて32bitにしたのですが、深い意味はありません。

845:デフォルトの名無しさん
09/09/09 15:08:26
最適化オプションとかはつけてる?

846:841
09/09/09 15:38:51
ビルド-standard tool chain-コンパイラ の最適化タグで、
サイズ優先(レジスタ退避・回復をpush/popで・switch文高速化・シフト演算の高速化・
構造体代入式の高速化・四則演算、比較、代入式の高速化・ループ文での帰納変数削除・
ループ文での帰納変数削除、ループ展開)の全部にチェック付いてます。

たしかH8/300xで書いたときも、関数呼び出しならレジスタがはっきりしているから、という
理由で関数にしました。

847:デフォルトの名無しさん
09/09/09 16:03:58
何かの条件あるとコンパイラが割り算命令を使わないとかかも?

848:841
09/09/09 16:09:28
う~ん、それがはっきりしないから、やっぱり関数呼び出しのが確実ですよね。

849:デフォルトの名無しさん
09/09/09 16:42:47
$DIVUL$3ってのを調べてみたら

850:デフォルトの名無しさん
09/09/09 19:49:23
32bit÷16bitだから

851:841
09/09/10 04:57:15
$DIVUL$3は、ulongER0÷ulongER1です。cの標準の仕様ではulong÷ushotは、両方
長いほうの精度に切り上げて演算する、とされていますので、間違ってはいないのですが、
32bit÷16bitだと判っている所で、せっかくDIVXU機械語があるのに使えないのがシャク
だなあ、と(w >>843の2行目の定義、私が実際に書いたのは↓です。確認のため:
#define ul_div_wd(er0,r1) ((_UDWORD)(_UWORD)((_UDWORD)(er0)/(_UWORD)(r1)))

852:841
09/09/10 05:11:47
H8/300xのとき、メモリのbitのあちこちをportのあちこちに出力するコードを書くのに、
sfr wreg = 0xFFFFFF1F; // この辺の空間はレジスタとして扱える
  wreg = メモリの変数;
  P9DR.1 = wreg.0;
  P9DR.0 = wreg.1;
  P6DR.4 = wreg.4;
  ・・・ とかやってました。 ルネサスのcでTINYだとこれが使えないので、(続く)

853:841
09/09/10 05:19:43
typedef struct {
union {
unsigned char BYTE; /* Byte Access */
struct { /* Bit Access */
unsigned char B7:1; /* Bit 7 */
unsigned char B6:1; /* Bit 6 */
unsigned char B5:1; /* Bit 5 */
unsigned char B4:1; /* Bit 4 */
unsigned char B3:1; /* Bit 3 */
unsigned char B2:1; /* Bit 2 */
unsigned char B1:1; /* Bit 1 */
unsigned char B0:1; /* Bit 0 */
} BIT; /* */
} BITS; /* */
} t_wreg;
void portout(void) {
  t_wreg wreg;
  wreg.BITS.BYTE = メモリの変数;
  IO.PDR6.BIT.B0 = wreg.BITS.BIT.B0;  /* リレーn番*/
  IO.PDR6.BIT.B1 = wreg.BITS.BIT.B1;  /* リレーm番*/
  ・・・ のように書いたら、wregは適当なレジスタに割り振られて、bitロード、bitストア命令
を吐いてくれました。 もっとお奨めの手法ご存じでしたら示唆お願いします。
typedefの書き方が冗長な気もするのですが、typedef union { で書き始めていいものか
自信がなかったので、iodefineにあったtypedef struct をパクって書きました。

854:デフォルトの名無しさん
09/09/10 06:20:05
gccならunionのタグは省略できるよ
ビットフィールドの位置は本来保障されないから使わない方がいいいよ
結果的に動けばいいってことみたいだからお好きにどうぞ

855:841
09/09/10 08:35:47
gccじゃないんですけど、コンパイルオプションでビットフィールドが右から/左からを選択
できるようになっています。

>>854の2行目 では、portのある1bitにI/Oするのに、どのような手法がお奨めですか?
iodefine.h のようなファイルがメーカー提供になってるのは、メーカーお奨めってことかと
理解しています。portの名称はiodefine.h に従うとして、変数のほうは、右シフトで右端に
持ってきて1bitのportに出す、とかは考えつきますけど、bitロードが右端からになるだけで
シフト演算が余分だと思います。

856:デフォルトの名無しさん
09/09/10 11:52:59
何がやりたいのか分からないけど、適当に
IO.PDR6.BYTE=メモリの変数;

DIVXUの使い方はソフトウェアマニュアルを確認してみれ

857:841
09/09/10 16:59:46
>>856 それじゃ8bitパラレルの出力でしょ。メモリのbitのあちこちをportのbitのあちこちに
1bit単位で出したいんです。で、853のような手法を試してみました。

DIVXUの使い方はCPUマニュアルのインストラクションの章で見てます。ER/Rだと理解
しましたが違ってますか?cの構文でDIVXUを吐かせるやり方は無いので>>841を考えた
のですが、インライン展開できるマクロが書ければそうしたいです。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch