漏れは今までにC、C++、Pascal、HSP、JS、VBなど
数々の言語を極めてきたがやはり一番手にしっくりくる言語は機械語だ。
だから、機械語のことなら何でも質問しろ!
ただプログラムのコードなんかは長くなるがな。 あ、ASMの話でもいいよ。
機械語なら俺に質問しろ!その2
■ このスレッドは過去ログ倉庫に格納されています
2012/12/29(土) 08:00:24.36
101デフォルトの名無しさん
2013/02/07(木) 17:50:00.83 両方で128バイト境界って言ってるんだからそれに従えばいいじゃん
10295
2013/02/10(日) 04:55:01.52 へうのリンク制御文(ツールチェインのリンカタブ)とスタック(dbsct.c)の関係が判った。
スタックサイズ768がデフォで、これが変数領域のすぐ後ろに配置されてしまう。
「RAMの残りサイズ」がスタックになるような指定はできないのかな?
スタックサイズ768がデフォで、これが変数領域のすぐ後ろに配置されてしまう。
「RAMの残りサイズ」がスタックになるような指定はできないのかな?
103デフォルトの名無しさん
2013/02/10(日) 06:25:14.17 隣家スクリプトを書き換えればいい話ではなくて?
104デフォルトの名無しさん
2013/02/10(日) 15:39:18.3510595
2013/02/11(月) 01:39:19.32 >>104 この石では消去ブロックは全体で1個(実装分全部)です。1回の書込コマンド
に続いてデータを2/8/128バイト書けるんですが、その時の書き始めのアドレス
について、マニュアルの2箇所で矛盾した表現になっています。
マニュアルの元を書く技術屋さんは、自然言語で表現することが苦手な人が多いので
私は前者が間違いだろうと思っていますが、既に体験した人が居れば裏が取れると
思い、ここで聞いてみた次第です。お客さんを通じてルネには質問を投げて貰いましたが
オフィシャルな回答が返ってくるのは当分先かと。 判ったらここに書きます。
に続いてデータを2/8/128バイト書けるんですが、その時の書き始めのアドレス
について、マニュアルの2箇所で矛盾した表現になっています。
マニュアルの元を書く技術屋さんは、自然言語で表現することが苦手な人が多いので
私は前者が間違いだろうと思っていますが、既に体験した人が居れば裏が取れると
思い、ここで聞いてみた次第です。お客さんを通じてルネには質問を投げて貰いましたが
オフィシャルな回答が返ってくるのは当分先かと。 判ったらここに書きます。
106デフォルトの名無しさん
2013/02/11(月) 10:02:23.60 だから、その2ちゃんで裏取るってのはやめれww
2ちゃんでヒント・経験談を取るのは大アリ
その対称に、誰でも気軽に答えることができる。
2ちゃんでヒント・経験談を取るのは大アリ
その対称に、誰でも気軽に答えることができる。
10795
2013/02/11(月) 13:17:59.51 んじゃ、また別の話で、ROMに焼いてあって起動するとRAMにロードして動くような
コードの作り方ってのは? 古代のメインフレームだと、BALR 0,Reg using *.Reg
でセルフリロケーティングな動作が書けたんだけど、H8系でへうだとusingの概念が
無いし。ROMからRAMにコピーしても再配置情報はROM空間のままだからRAMへ
ジャンプしただけじゃ動かないよね。
コードの作り方ってのは? 古代のメインフレームだと、BALR 0,Reg using *.Reg
でセルフリロケーティングな動作が書けたんだけど、H8系でへうだとusingの概念が
無いし。ROMからRAMにコピーしても再配置情報はROM空間のままだからRAMへ
ジャンプしただけじゃ動かないよね。
108デフォルトの名無しさん
2013/02/11(月) 15:34:33.42 何のための相対ジャンプ命令だと思ってるんだよ馬鹿か。
109デフォルトの名無しさん
2013/02/11(月) 21:08:36.29 x86厨な俺としては、call $+(文字列長) ってのがすぐに思い浮かぶが
11095
2013/02/12(火) 05:30:38.04 相対ジャンプの機構は理解しています。プログラムの要素はそれだけじゃありません。
ある関数だけをRAMにコピーしてそこをコールするとします。引数は3個まで (これは
レジスタ渡しが保証されるから) その関数内のforループなどは相対ジャンプでできて
いるから動くでしょうが、その関数がROMのどこかにある関数を呼んでいたらそのBSRの
オフセットは元のROM位置からのオフセットであって、コピー先のRAM位置からの
オフセットではありません。ROMからRAMへのコピーはできても、元のコードの再配置
情報は実行コードになった時点で失われてしまいますね。JSR 絶対番地 を使えば可能
ですが、このコールはBSR、このコールはJSR をプログラマが選べるCはありませんね。
こういうことを話してみて欲しいわけです。起動時ベクタは固定・行った先のROMも固定
そこからRAMにコピーして動くプログラムはどんな制約があるのか、どんな作りになれば
いいのか・・・
ある関数だけをRAMにコピーしてそこをコールするとします。引数は3個まで (これは
レジスタ渡しが保証されるから) その関数内のforループなどは相対ジャンプでできて
いるから動くでしょうが、その関数がROMのどこかにある関数を呼んでいたらそのBSRの
オフセットは元のROM位置からのオフセットであって、コピー先のRAM位置からの
オフセットではありません。ROMからRAMへのコピーはできても、元のコードの再配置
情報は実行コードになった時点で失われてしまいますね。JSR 絶対番地 を使えば可能
ですが、このコールはBSR、このコールはJSR をプログラマが選べるCはありませんね。
こういうことを話してみて欲しいわけです。起動時ベクタは固定・行った先のROMも固定
そこからRAMにコピーして動くプログラムはどんな制約があるのか、どんな作りになれば
いいのか・・・
111デフォルトの名無しさん
2013/02/12(火) 11:12:10.96 アセンブリ出力を加工してからアセンブルすればいいじゃん。
ROMにある関数のリストがあるなら自動化できるんだし。
ROMにある関数のリストがあるなら自動化できるんだし。
11295
2013/02/12(火) 17:20:14.81 それも試みたことあります。JSRを手でBSRに直すとか。でも自動化できないし、
人的ミスを持ち込むことになるから、非・推奨な手法という評価になりました。
私が現在認識している制限は、単一関数で外部コールを含まないものなら可能。
複数の関数をリンクして作ったプログラムは、不確定要素が多くて不安、という段階。
Cコンパイラマニュアルのなかに、PIC/PID機能の利用 という章があり、ここで
一般的な注意事項が列挙されていました。usingの概念に似た手法が紹介されて
いましたので、そこを読んでいるところです。PICは Positionn Independent Code、
PIDは Position Independent Data のことだそうです。 紛らわしい略語ですね。
人的ミスを持ち込むことになるから、非・推奨な手法という評価になりました。
私が現在認識している制限は、単一関数で外部コールを含まないものなら可能。
複数の関数をリンクして作ったプログラムは、不確定要素が多くて不安、という段階。
Cコンパイラマニュアルのなかに、PIC/PID機能の利用 という章があり、ここで
一般的な注意事項が列挙されていました。usingの概念に似た手法が紹介されて
いましたので、そこを読んでいるところです。PICは Positionn Independent Code、
PIDは Position Independent Data のことだそうです。 紛らわしい略語ですね。
113デフォルトの名無しさん
2013/02/13(水) 00:14:18.69 >>110
> JSR 絶対番地 を使えば可能ですが、このコールはBSR、このコールはJSR をプログラマが
> 選べるCはありませんね。
絶対番地呼び出したいなら、関数ポインタ経由で呼べばいいだけ。
> JSR 絶対番地 を使えば可能ですが、このコールはBSR、このコールはJSR をプログラマが
> 選べるCはありませんね。
絶対番地呼び出したいなら、関数ポインタ経由で呼べばいいだけ。
114デフォルトの名無しさん
2013/02/13(水) 02:59:54.64 それはROM関数だけを関数テーブルにするしかないんじゃないの。
関数名(実アドレス)でコールするからBSRかJSRか選べないという
アホな話になるわけですよ。ROMを呼ぶとわかっている関数だけを
コールテーブルにすれば終わりでしょ。
関数名(実アドレス)でコールするからBSRかJSRか選べないという
アホな話になるわけですよ。ROMを呼ぶとわかっている関数だけを
コールテーブルにすれば終わりでしょ。
115デフォルトの名無しさん
2013/02/13(水) 03:11:22.7411695
2013/02/13(水) 03:19:46.39 では、割り込みはどう扱われるでしょうか? 今ターゲットにしている石は、
割り込みベクタテーブルの先頭番地をベクタベースレジスタに設定するタイプです。
LINKしたときの割り込みベクタテーブルはROMの中を指していますね。
これは関数ポインタのテーブルだから、割り込み処理は必ずROMコールとなります。
これと、ROMイレーズ/プログラム中はROMを読んではいけない、ということをどう
両立させればよいのか、その手法で悩んでいます。
割り込みベクタテーブルの先頭番地をベクタベースレジスタに設定するタイプです。
LINKしたときの割り込みベクタテーブルはROMの中を指していますね。
これは関数ポインタのテーブルだから、割り込み処理は必ずROMコールとなります。
これと、ROMイレーズ/プログラム中はROMを読んではいけない、ということをどう
両立させればよいのか、その手法で悩んでいます。
11795
2013/02/13(水) 03:28:12.72 >>100 の疑問、自分で考えた答は、後者が正しいと思います。 理由は、
第1、第2ステップでコマンドを書き込むアドレスが 「実装のどこでもよい」 と記述
されていること。それだと実際にデータを書き込むアドレスがどこかは、第3ステップの
書き始めのアドレスしか情報がありません。 終了コマンドも第1,2ステップと同じく
任意アドレスだし。 FCU側のプログラムを書くことを考えると、後者でないと整合性を
保てなくなります。
第1、第2ステップでコマンドを書き込むアドレスが 「実装のどこでもよい」 と記述
されていること。それだと実際にデータを書き込むアドレスがどこかは、第3ステップの
書き始めのアドレスしか情報がありません。 終了コマンドも第1,2ステップと同じく
任意アドレスだし。 FCU側のプログラムを書くことを考えると、後者でないと整合性を
保てなくなります。
118デフォルトの名無しさん
2013/02/13(水) 08:20:04.38 きっぱり言っておいてやるがな、
肩の力抜けwww
ROM書き換え中は、割込テーブルレジスタもRAMに移しちゃうんじゃないん?と
まずは思ったが、いまどきの石ってそこらへんややこしいんかな
あるいは、そこを書きかえるときだけは割込とめるとか
F3とかFBとか、「あのころ」はそんなことしてたな
肩の力抜けwww
ROM書き換え中は、割込テーブルレジスタもRAMに移しちゃうんじゃないん?と
まずは思ったが、いまどきの石ってそこらへんややこしいんかな
あるいは、そこを書きかえるときだけは割込とめるとか
F3とかFBとか、「あのころ」はそんなことしてたな
119デフォルトの名無しさん
2013/02/13(水) 20:18:53.75 >>116
ROMリライト中に動く前提のプログラムってのがまず理解できない。
ROMを書き直す=プログラムを更新するってことだから、その時点で
割り込みベクタテーブルに処理が飛んでくる可能性はゼロではないの。
後だしでプチプチ情報出されても振り回されるだけだよ。
ROMリライト中に動く前提のプログラムってのがまず理解できない。
ROMを書き直す=プログラムを更新するってことだから、その時点で
割り込みベクタテーブルに処理が飛んでくる可能性はゼロではないの。
後だしでプチプチ情報出されても振り回されるだけだよ。
120デフォルトの名無しさん
2013/02/13(水) 20:28:38.85 ROMリライト中に動いちゃまずい機能は
ROMリライトの処理中は行わないようにすべきじゃ
ROMリライトの処理中は行わないようにすべきじゃ
121119
2013/02/13(水) 21:42:52.69 風呂に入ってデバッグしてきた。なんとなく状況は理解できたと思う。
1)ROMの一部を書き換える組み込みアプリを作りたい
2)ROM書き換え中はROMへのリードアクセスは禁止
3)ゆえにコードをRAMにコピーしてRAM上で動作させたい
4)リンカーの出力するバイナリはROMからの相対アドレスである
5)RAMにコピーしたコードの関数アドレスを手作業でリロケーションはできない
6)さてどうしたものか
まず2が真の時点でROM上でコードを動作させるのは不可能だから
全てのコードをRAMにコピーする前提で考える。
普通はロケーターを使うんだろうけど、話の雰囲気ではロケーターも
使えないっぽいからそれは考えない。
ならば全ての関数呼び出しを関数テーブル経由にするしかない。
第一段階としてブートストラップローダーを作る。こいつの仕事はROMの
コードを全てRAMにコピーすることと、関数呼び出し用に全ての関数を
呼び出すためのコールテーブルを作ること。もちろんコールテーブルの
関数アドレスはRAM先頭のオフセットを加える。
割り込みベクタテーブルもブートストラップが作成する。
もちろんブートストラップ動作中は割り込み禁止。
次に、関数呼び出しを統括するスーパーバイザー関数を作る。この関数
はブートストラップがRAM上に作った関数テーブルを元に、引数で指定
された関数を呼び出す。こうすることで、関数名=アドレス値がコードに
ビルトインされるのを防ぐ。
ここまで終わったら、ブートストラップがメイン処理に制御を移すだけ。
全ての処理は関数呼び出しに関数名は使わず、スーパーバイザー関数
に対して
1)ROMの一部を書き換える組み込みアプリを作りたい
2)ROM書き換え中はROMへのリードアクセスは禁止
3)ゆえにコードをRAMにコピーしてRAM上で動作させたい
4)リンカーの出力するバイナリはROMからの相対アドレスである
5)RAMにコピーしたコードの関数アドレスを手作業でリロケーションはできない
6)さてどうしたものか
まず2が真の時点でROM上でコードを動作させるのは不可能だから
全てのコードをRAMにコピーする前提で考える。
普通はロケーターを使うんだろうけど、話の雰囲気ではロケーターも
使えないっぽいからそれは考えない。
ならば全ての関数呼び出しを関数テーブル経由にするしかない。
第一段階としてブートストラップローダーを作る。こいつの仕事はROMの
コードを全てRAMにコピーすることと、関数呼び出し用に全ての関数を
呼び出すためのコールテーブルを作ること。もちろんコールテーブルの
関数アドレスはRAM先頭のオフセットを加える。
割り込みベクタテーブルもブートストラップが作成する。
もちろんブートストラップ動作中は割り込み禁止。
次に、関数呼び出しを統括するスーパーバイザー関数を作る。この関数
はブートストラップがRAM上に作った関数テーブルを元に、引数で指定
された関数を呼び出す。こうすることで、関数名=アドレス値がコードに
ビルトインされるのを防ぐ。
ここまで終わったら、ブートストラップがメイン処理に制御を移すだけ。
全ての処理は関数呼び出しに関数名は使わず、スーパーバイザー関数
に対して
122デフォルトの名無しさん
2013/02/13(水) 21:46:31.11 >>121の最後2行は無視してください。
123デフォルトの名無しさん
2013/02/13(水) 23:45:07.83 RAMが狭小で、フルイメージRAMに来れないんじゃないかとエスパー
機械語っていうか、石の話だが、関連雑談だな
機械語っていうか、石の話だが、関連雑談だな
12495
2013/02/14(木) 05:55:20.77 >>119 おつきあい下さりありがとうございます。10数年前、H8/16bitでそのような物を
作りました。その時はブートローダーの場所はイレーズしない・ROM書き換え/イレーズ
する関数のみRAMに置く、という手法でした。ブートローダーは割込を一切使わず動く
ように作りました。今回は、RAMはブートローダー全部を載せるぐらいたくさんあります。
ブートの目的は、ROMイレーズ・アプリをROMに焼くこと、焼かれたアプリはふつうに
ROMで動作します。電源ONで動くのはブートなので、アプリがROMに入っているか
チェックして、アプリに分岐するか、ROM焼きモードでブートの中で待つかします。
この方式だと、121後半の設定は不要ですね。ブート動作中は割込を使わないのは
今回も採用することになると思います。
>>123 そうなんです。ROM256/RAM32 とか、機種で多少はありますがそんな感じ。
ブートが固定ベクタを占有しちゃうんで、焼かれるアプリは固定ベクタを持たないこと。
ROM実装サイズがいろいろだが末尾に寄せて実装されている。FFFF0000〜FFFFFFFF
とか、FFFC0000〜FFFFFFFF とか。なので、ブートからアプリにジャンプする際には
「固定の先頭番地」 という過去の手法が使えないので、固定の末尾付近(ベクタのすぐ前)
を使うことになるのかな、と考えています。
後出し小出しが嫌われるのは承知していますが、課題全部はまだ承ってないし、
承っても1,2レスで列挙できるものでもないので、そこはご容赦くださいませ。
目下の選択は、ブートはROMで動く事にするか、ブートの主要部をRAMに転送するかで、
前者は実績があります。後者だと121の前半みたいなお膳立てをPGがやるわけですね。
う〜ん、厄介そうだなあ。 インテルの再配置ローダーみたいなツールがあればいいのに。
作りました。その時はブートローダーの場所はイレーズしない・ROM書き換え/イレーズ
する関数のみRAMに置く、という手法でした。ブートローダーは割込を一切使わず動く
ように作りました。今回は、RAMはブートローダー全部を載せるぐらいたくさんあります。
ブートの目的は、ROMイレーズ・アプリをROMに焼くこと、焼かれたアプリはふつうに
ROMで動作します。電源ONで動くのはブートなので、アプリがROMに入っているか
チェックして、アプリに分岐するか、ROM焼きモードでブートの中で待つかします。
この方式だと、121後半の設定は不要ですね。ブート動作中は割込を使わないのは
今回も採用することになると思います。
>>123 そうなんです。ROM256/RAM32 とか、機種で多少はありますがそんな感じ。
ブートが固定ベクタを占有しちゃうんで、焼かれるアプリは固定ベクタを持たないこと。
ROM実装サイズがいろいろだが末尾に寄せて実装されている。FFFF0000〜FFFFFFFF
とか、FFFC0000〜FFFFFFFF とか。なので、ブートからアプリにジャンプする際には
「固定の先頭番地」 という過去の手法が使えないので、固定の末尾付近(ベクタのすぐ前)
を使うことになるのかな、と考えています。
後出し小出しが嫌われるのは承知していますが、課題全部はまだ承ってないし、
承っても1,2レスで列挙できるものでもないので、そこはご容赦くださいませ。
目下の選択は、ブートはROMで動く事にするか、ブートの主要部をRAMに転送するかで、
前者は実績があります。後者だと121の前半みたいなお膳立てをPGがやるわけですね。
う〜ん、厄介そうだなあ。 インテルの再配置ローダーみたいなツールがあればいいのに。
125デフォルトの名無しさん
2013/02/14(木) 15:20:59.70 組み込みじゃなくてすまんが、ローダ付きのCOMファイルみたいのを連想するw
126デフォルトの名無しさん
2013/02/14(木) 20:38:30.06 > インテルの再配置ローダーみたいなツール
転送時点で再配置しとけばいいだけでしょ
読み込んでから再配置しようとか、難しく考えてるような
転送時点で再配置しとけばいいだけでしょ
読み込んでから再配置しようとか、難しく考えてるような
12795
2013/02/15(金) 02:49:18.57 EXEファイルと違ってROM上の実行コードには再配置情報は残っていません。
私が過去に実現したのは、再配置情報を含まないことが確認済みの関数だけを
RAMに転送してコールするという手法でした。
私が過去に実現したのは、再配置情報を含まないことが確認済みの関数だけを
RAMに転送してコールするという手法でした。
128デフォルトの名無しさん
2013/02/15(金) 05:12:38.47 hexファイルに再配置情報がないのだから
移動先のアドレスで動くhexファイルを作っておいたらってことだけど
移動先に移動させる仕掛けはどっかに必要だけどね
ROM、RAM領域のアドレスが移動できるarmで
boot時にROMは0から見えるけど
最終的には上位番地でROMの実行コードが走ることをやったことある
(RAM領域は最終的に0番地から見える)
移動先のアドレスで動くhexファイルを作っておいたらってことだけど
移動先に移動させる仕掛けはどっかに必要だけどね
ROM、RAM領域のアドレスが移動できるarmで
boot時にROMは0から見えるけど
最終的には上位番地でROMの実行コードが走ることをやったことある
(RAM領域は最終的に0番地から見える)
129デフォルトの名無しさん
2013/02/15(金) 09:12:16.11 reloc情報つきのモジュールを置いて、それを自前ローダにくわせてはだめなんか
超小型車輪の自社開発みたいになるが
感覚的には
void* loader(void* _code, int _codesize, WORD* _relocs, int _relocssize);
超小型車輪の自社開発みたいになるが
感覚的には
void* loader(void* _code, int _codesize, WORD* _relocs, int _relocssize);
13095
2013/02/15(金) 17:10:10.76 >>128 実行空間と格納空間を別に指定できるLINKの仕方がHewにあるかどうか
なのですよ。ビルド−ツールチェイン−リンカのタブにそれっぽいのが無いみたい。
それがあれば、例えばFFFF0000番地にロードするイメージを00100000番地に格納
みたいなことができるのですけどね。ただ、コンパイラのマニュアルにpic,pidオプション
ってのがある所から見ると、copyしても動くようなオプションつけてビルドしなさいと読める
なのですよ。ビルド−ツールチェイン−リンカのタブにそれっぽいのが無いみたい。
それがあれば、例えばFFFF0000番地にロードするイメージを00100000番地に格納
みたいなことができるのですけどね。ただ、コンパイラのマニュアルにpic,pidオプション
ってのがある所から見ると、copyしても動くようなオプションつけてビルドしなさいと読める
131デフォルトの名無しさん
2013/02/15(金) 18:26:44.31 FFFF0000番地にロードするイメージのhexファイルを一度作って
00100000番地に格納出来るhexファイルに加工するほうが
悩まなくて済むような
00100000番地に格納出来るhexファイルに加工するほうが
悩まなくて済むような
13295
2013/02/16(土) 03:47:45.45 いや、だからそれは再配置情報が失われているって(w
13395
2013/02/16(土) 04:34:12.70 コンパイラマニュアルのリンケージエディタの使い方:セクションオプションの章を見ると
>>130 みたいな割り付け方法は無さそう。なので一般的な手法としては pic,pid 指定を
付けてビルドし、130の例で言えば00100000番地でリンク、実行時にFFFF0000番地へ
copyして実行、という流れになると思います。固定ベクタのResetVect(再末尾)は
ROMの実行開始部を指し、そこは最低限RAMへcopyしてジャンプするコードを置く。
Hardwaresetup( ) の部分なんかはRAMで実行する必然性は無いので、reset時ROMで
実行してもかまわないでしょう。ただ、「RAMで実行することが必然」 な機能が何かという
ことを考えてゆくと、以前の仕事みたいにROMとRAMを行き来する手法もありかな、と。
後者の利点は、CODEを置くためのRAMが少量で済むこと・再配置情報が無いルーチン
だけを置くことで再配置問題を回避できること。
>>130 みたいな割り付け方法は無さそう。なので一般的な手法としては pic,pid 指定を
付けてビルドし、130の例で言えば00100000番地でリンク、実行時にFFFF0000番地へ
copyして実行、という流れになると思います。固定ベクタのResetVect(再末尾)は
ROMの実行開始部を指し、そこは最低限RAMへcopyしてジャンプするコードを置く。
Hardwaresetup( ) の部分なんかはRAMで実行する必然性は無いので、reset時ROMで
実行してもかまわないでしょう。ただ、「RAMで実行することが必然」 な機能が何かという
ことを考えてゆくと、以前の仕事みたいにROMとRAMを行き来する手法もありかな、と。
後者の利点は、CODEを置くためのRAMが少量で済むこと・再配置情報が無いルーチン
だけを置くことで再配置問題を回避できること。
134デフォルトの名無しさん
2013/02/16(土) 09:03:49.43 開始アドレスだけかえて複数のhexファイルつくって、
比較して、reloc情報を起こせばいいんじゃないかと
そんなので済むかって?
そんなので済むように書けるのが、機械語じゃないかw
比較して、reloc情報を起こせばいいんじゃないかと
そんなので済むかって?
そんなので済むように書けるのが、機械語じゃないかw
13595
2013/02/19(火) 05:00:31.82 以前書いたブートコードは、割り込みを使わずuartはポーリングで書いたのですが、
今回の石ではその手法は使えないことが判りました。なんと、uartのステータスregに
RXRDY,TXRDYのフラグが無いの(*o*) だから受信・送信のトリガーは必ず割り込みで
取らないといけない。 これで解らないのがベクタとpic,pid機能との関連。
ベクタ(=割り込み処理コードのアドレス)、処理(=ROMの10000番地に実行コード)
このベクタと処理をRAMの100000番地に書き写したとしても、ベクタの指す先はやはり
10000番地のままだから、割り込みが発生したら10000番地が実行されてしまうよね。
今回の石ではその手法は使えないことが判りました。なんと、uartのステータスregに
RXRDY,TXRDYのフラグが無いの(*o*) だから受信・送信のトリガーは必ず割り込みで
取らないといけない。 これで解らないのがベクタとpic,pid機能との関連。
ベクタ(=割り込み処理コードのアドレス)、処理(=ROMの10000番地に実行コード)
このベクタと処理をRAMの100000番地に書き写したとしても、ベクタの指す先はやはり
10000番地のままだから、割り込みが発生したら10000番地が実行されてしまうよね。
136デフォルトの名無しさん
2013/02/19(火) 05:45:21.07 普通RAM上にフックさせるだろ
137デフォルトの名無しさん
2013/02/19(火) 16:44:08.41 UARTをいつも見張ってると、CPUの手がそんだけ取られてるような
138デフォルトの名無しさん
2013/02/19(火) 17:05:45.94 ROMとRAMが同じアドレス空間にマップされるというマッピングが
そもそもあり得ないんだけど。かりに意図してそうしているのなら
何らかのバンク切り替えメカニズムもあるはずだよね。
そもそもあり得ないんだけど。かりに意図してそうしているのなら
何らかのバンク切り替えメカニズムもあるはずだよね。
139デフォルトの名無しさん
2013/02/19(火) 17:07:34.9414095
2013/02/20(水) 03:07:34.9814195
2013/02/20(水) 06:56:45.05 PICを吐くようコンパイラに指示してビルドしたけど、ベクタの中身は変わりませんでした。
原理的には想像はついてたんだけど、実際に出会ってみるとガッカリ。
ポジションインディペンデントであってセルフリロケーティングなわけじゃないもんね。
命令中の実アドレスは(再配置を要するものは)一切ダメ、ってルールブックに書いて
おけばいいのに、そこの所をマニュアルではぼかして書いてあるの。
原理的には想像はついてたんだけど、実際に出会ってみるとガッカリ。
ポジションインディペンデントであってセルフリロケーティングなわけじゃないもんね。
命令中の実アドレスは(再配置を要するものは)一切ダメ、ってルールブックに書いて
おけばいいのに、そこの所をマニュアルではぼかして書いてあるの。
142デフォルトの名無しさん
2013/02/20(水) 21:12:32.70 そんなもんコード上で書き換えないと変わるわけないじゃん。
そんな至れり尽くせりのコンパイラなんかどこにもないぞ。
そんな至れり尽くせりのコンパイラなんかどこにもないぞ。
14395
2013/02/21(木) 02:33:26.66 これは実際に製品にするので、その辺をどうするか手探りしているところです。
石はRX210、内蔵ROM/RAM=128〜512/16〜64 ぐらい、cコンパイラの拡張機能で
専用の特殊regをいじる組込関数が提供されてます。set/get_btbl( ),set/get_psw( )等
RAMの実装番地は0番地からなので、copyしたら0番地に飛ばす、あるいは特定の低い
番地に飛ばすのは可能ですね。
古代のメインフレームでは BALR USING という手法でセルフリロケーティングなコードを
書きやすくしてくれたのですが、メモリが激安の現代にそんな手法がなぜ無いのだろう・・・
あ! ROMライタにはそういう機能があったなあ。コードは0番地で動くようにLINKして、
ROMに焼くときに元のコードのロードアドレスにFFFF0000を足して転送、という機能。
(昔のライタなので8桁はムリだったかも) ルネ提供のライタにそういう機能があるかな。
石はRX210、内蔵ROM/RAM=128〜512/16〜64 ぐらい、cコンパイラの拡張機能で
専用の特殊regをいじる組込関数が提供されてます。set/get_btbl( ),set/get_psw( )等
RAMの実装番地は0番地からなので、copyしたら0番地に飛ばす、あるいは特定の低い
番地に飛ばすのは可能ですね。
古代のメインフレームでは BALR USING という手法でセルフリロケーティングなコードを
書きやすくしてくれたのですが、メモリが激安の現代にそんな手法がなぜ無いのだろう・・・
あ! ROMライタにはそういう機能があったなあ。コードは0番地で動くようにLINKして、
ROMに焼くときに元のコードのロードアドレスにFFFF0000を足して転送、という機能。
(昔のライタなので8桁はムリだったかも) ルネ提供のライタにそういう機能があるかな。
144デフォルトの名無しさん
2013/02/23(土) 10:42:42.62 手探りで製品開発?
しかもにちゃんで質問…
しかもにちゃんで質問…
145デフォルトの名無しさん
2013/02/23(土) 22:37:36.63 ちょっとどうかなと思う発想もあるが、正直よその石のことは想像でしか聞けないし、
雑談ネタを投下してくれてると思って流し読みすればおk
雑談ネタを投下してくれてると思って流し読みすればおk
14695
2013/02/24(日) 06:43:46.88 打診が来てから3ヶ月、未だに仕様のカケラも来ません。仕方なく石のマニュアルから
お試しコードと、過去の情報からアプリの下書きを書いてます。こういうのがあると
仕様が来だしたときちょっとした手直しで目的のコードにできるから。
ソフト会社だと仕様が来てから動くしかないから、こんな時点では動けないし、
仕様が来たときには納期が破綻してるというケースばかりでした。
>>137 通信以外には何も無い、内蔵ROMライターみたいなアプリでした。
ROMに書いてレディを待つ貼りつきの間、割り込みが使えないのでそこでポーリング。
お試しコードと、過去の情報からアプリの下書きを書いてます。こういうのがあると
仕様が来だしたときちょっとした手直しで目的のコードにできるから。
ソフト会社だと仕様が来てから動くしかないから、こんな時点では動けないし、
仕様が来たときには納期が破綻してるというケースばかりでした。
>>137 通信以外には何も無い、内蔵ROMライターみたいなアプリでした。
ROMに書いてレディを待つ貼りつきの間、割り込みが使えないのでそこでポーリング。
147デフォルトの名無しさん
2013/02/24(日) 13:18:11.85 それってまだお金もらってないってことだよね。
そんなんで先行投資しちゃっていいの?
こっちが心配することじゃないけどさ。
そんなんで先行投資しちゃっていいの?
こっちが心配することじゃないけどさ。
14895
2013/02/25(月) 04:38:45.31 お金はいずれ貰えます。ハード屋さんは私に発注することを上司に承認取った上で
少し高い石を選びました。 ハードが一段落したらソフト要求仕様を書き上げそこで
一般のソフト会社に投げるネタになります。そこから見積もり依頼→見積もり→承認。
出来レースにしないために相見積もりしてもらうのもかまいません。partの合間なので
フルタイムなら1人月分ぐらいの先行かな。生活のためではなく面白いからやってるだけ
で、自分が今のソフト屋と比べて仕事がのろいのは自覚してるから、本決まりになって
から間に合うように、先回りできる分野は先に片づけるようにしてます。
本格start以降の期間には、ダンピングの非難が出ない程度のお金は貰います。
>>130-135 辺りの問題は、石の設計思想にその解決手法が用意されているようです。
内蔵ROMの空間が2とおり用意されていて、小さい方の空間で実行している時もう一方
の大きい空間のイレーズや書き込みを実行すればアクセス違反が出ないとの事らしい。
マニュアルの自然言語の表現で、ある文脈のROMがどちらを指すのかあいまいなので
そこを再確認待ちです。 私はRAM空間用にLINKしたコードを小さい空間に焼いて、
起動時RAMにコピーしてそこへ分岐、という手法を試していましたが、これでラッキー。
少し高い石を選びました。 ハードが一段落したらソフト要求仕様を書き上げそこで
一般のソフト会社に投げるネタになります。そこから見積もり依頼→見積もり→承認。
出来レースにしないために相見積もりしてもらうのもかまいません。partの合間なので
フルタイムなら1人月分ぐらいの先行かな。生活のためではなく面白いからやってるだけ
で、自分が今のソフト屋と比べて仕事がのろいのは自覚してるから、本決まりになって
から間に合うように、先回りできる分野は先に片づけるようにしてます。
本格start以降の期間には、ダンピングの非難が出ない程度のお金は貰います。
>>130-135 辺りの問題は、石の設計思想にその解決手法が用意されているようです。
内蔵ROMの空間が2とおり用意されていて、小さい方の空間で実行している時もう一方
の大きい空間のイレーズや書き込みを実行すればアクセス違反が出ないとの事らしい。
マニュアルの自然言語の表現で、ある文脈のROMがどちらを指すのかあいまいなので
そこを再確認待ちです。 私はRAM空間用にLINKしたコードを小さい空間に焼いて、
起動時RAMにコピーしてそこへ分岐、という手法を試していましたが、これでラッキー。
14995
2013/02/27(水) 05:17:44.08 >>148 の再確認はOK貰えました。 以前はROMがbyte書込だったので問題ない事が
今回はword書込で問題になることが見つかりました。
S30AFF7FC080EF773B1D0E6B 最後C084 に ライト、
S315FF7FC0885645523F00000000A4C57FFF522000009F C088からライト
S314FF7FD26023F3601158117125FF405102660102BA D260〜D26Eにライト、
S315FF7FD26F7F957F957F957F957F957F967F957F958A D26Fからライト
1行目の末尾 C084の0Eは、0EFFにして書き込まなければならない。
3行目の末尾 D26Eの02は、02FFを書いてはならない。その次の行の
D26Fの7Fが来た時点で初めてD26Eに027Fを書いてよい。
どのように実装しようか考え中です。
今回はword書込で問題になることが見つかりました。
S30AFF7FC080EF773B1D0E6B 最後C084 に ライト、
S315FF7FC0885645523F00000000A4C57FFF522000009F C088からライト
S314FF7FD26023F3601158117125FF405102660102BA D260〜D26Eにライト、
S315FF7FD26F7F957F957F957F957F957F967F957F958A D26Fからライト
1行目の末尾 C084の0Eは、0EFFにして書き込まなければならない。
3行目の末尾 D26Eの02は、02FFを書いてはならない。その次の行の
D26Fの7Fが来た時点で初めてD26Eに027Fを書いてよい。
どのように実装しようか考え中です。
150デフォルトの名無しさん
2013/02/27(水) 08:20:03.51 なんつーんだっけ? Sファイル?
そいつを運用で奇数バイトから始まるものは受け付けないってできないの?
そういう折衝する可能性も考えずに言われたままにほいほい実装するの?
つーか、そもそもそ半端なワード(2バイト領域)はROMから読み出してから
書き戻せばいいんじゃないの? クリア済みが保障されているならクリア値で
埋めればいいんじゃないの?
土方は何も考えない分気楽でいいなぁ。
そいつを運用で奇数バイトから始まるものは受け付けないってできないの?
そういう折衝する可能性も考えずに言われたままにほいほい実装するの?
つーか、そもそもそ半端なワード(2バイト領域)はROMから読み出してから
書き戻せばいいんじゃないの? クリア済みが保障されているならクリア値で
埋めればいいんじゃないの?
土方は何も考えない分気楽でいいなぁ。
151デフォルトの名無しさん
2013/02/27(水) 11:16:30.75 Motrola S Formatかな。
15295
2013/02/27(水) 13:36:10.63 そう。モトローラのSフォーマットファイル。ふつうのリンカが出力したファイルですよ。
それを運用で焼いてあげませんって処理系に言われたらヤでしょ。
クリア値で埋めるのも、パソコンなら1MB用意してもいいでしょうが、
ROM16KB/RAM16KB ぐらいの空間で動くように実装するんです。
したがって流れの中で解決する必要があります。イレーズは全部いっぺん、
ライトはアドレス・データであちこちに書けますが、2度書きはできない (しない) のが
原則ですね。 ROMの性質上、xxFFのワードにxxyyを上書きするのは可能だろうと
思いますが、マニュアルで保証されてはいません。
半端なバイトを取っておくようなアルゴリズムを書いてみたのですが、いまいちすっきり
しません。ROMから読み出すアルゴリズムのほうがスマートなのは確かなので、
xxFF→xxyy FFvv→xxyy の重ね焼きが可能か、メーカーに質問投げてみますね。
それを運用で焼いてあげませんって処理系に言われたらヤでしょ。
クリア値で埋めるのも、パソコンなら1MB用意してもいいでしょうが、
ROM16KB/RAM16KB ぐらいの空間で動くように実装するんです。
したがって流れの中で解決する必要があります。イレーズは全部いっぺん、
ライトはアドレス・データであちこちに書けますが、2度書きはできない (しない) のが
原則ですね。 ROMの性質上、xxFFのワードにxxyyを上書きするのは可能だろうと
思いますが、マニュアルで保証されてはいません。
半端なバイトを取っておくようなアルゴリズムを書いてみたのですが、いまいちすっきり
しません。ROMから読み出すアルゴリズムのほうがスマートなのは確かなので、
xxFF→xxyy FFvv→xxyy の重ね焼きが可能か、メーカーに質問投げてみますね。
15395
2013/02/28(木) 05:38:10.44 >>103 へうでのリンカスクリプトの使い方がやっと判って、スタックの割り付けも臨む
場所にできました。ビルド−ツールチェイン−最適化リンカタブの中の、セクション
カテゴリーを開くと、アドレスとセクション名の対応が表になっていて、それを編集
するのですね。-start=B_1,R_1,B_2,R_2,B,R/06000,SI/07D00,PResetPRG/0FF7FC000,
C_1,C_2,C,C$*,D_1,D_2,D,P,PIntPRG,W*,L/0FF7FC080,FIXEDVECT/0FFFFFFD0
自分でこういう制御文をコマンドラインに書くのに慣れていたので、どこにそういうの書く
のだろう??と。
へう推奨のセクション割り付けパターンが、アライメント1,2,4の順なのですね。
これがまた違和感。従来はアライメント4,2,1でした。勿論自分でそういう指定に
直すことはできるのですが、この推奨パターンにはどんな意味があるのでしょう?
あと、コード部配置順も、resetprgが先頭、以下定数、実行コード、割り込みコード、
ラベル、文字リテラル という推奨順なのですが、何で定数の間にコードを挟むのか
理解しずらいんですよ。
場所にできました。ビルド−ツールチェイン−最適化リンカタブの中の、セクション
カテゴリーを開くと、アドレスとセクション名の対応が表になっていて、それを編集
するのですね。-start=B_1,R_1,B_2,R_2,B,R/06000,SI/07D00,PResetPRG/0FF7FC000,
C_1,C_2,C,C$*,D_1,D_2,D,P,PIntPRG,W*,L/0FF7FC080,FIXEDVECT/0FFFFFFD0
自分でこういう制御文をコマンドラインに書くのに慣れていたので、どこにそういうの書く
のだろう??と。
へう推奨のセクション割り付けパターンが、アライメント1,2,4の順なのですね。
これがまた違和感。従来はアライメント4,2,1でした。勿論自分でそういう指定に
直すことはできるのですが、この推奨パターンにはどんな意味があるのでしょう?
あと、コード部配置順も、resetprgが先頭、以下定数、実行コード、割り込みコード、
ラベル、文字リテラル という推奨順なのですが、何で定数の間にコードを挟むのか
理解しずらいんですよ。
154デフォルトの名無しさん
2013/02/28(木) 06:48:58.12 ×臨む
○望む
×理解しずらい
△理解しづらい
○理解しにくい
○望む
×理解しずらい
△理解しづらい
○理解しにくい
15595
2013/02/28(木) 07:02:06.19 校正どうもです。 のぞむなんてどこで書いたか忘れて探してしまった(w
15695
2013/03/03(日) 06:11:12.39 打診のときは移植みたいな話だったのに、機器がみなネットワーク対応になってるから
ネットワークプロトコル実装しなくちゃいけないっぽい・・・アプリ本体よりそっちのが余程
でかいじゃん。
ネットワークプロトコル実装しなくちゃいけないっぽい・・・アプリ本体よりそっちのが余程
でかいじゃん。
157デフォルトの名無しさん
2013/03/03(日) 12:16:48.80 高度な車輪は再発明できてもすぐ壊れちゃう
15895
2013/03/08(金) 06:45:05.62 >>135 で、ポーリングは使えないと書いたんですが、RXRDYのステータスをポーリング
あうるのではなく、受信割り込みがあったことをポーリングすればその手法自体は書ける
ことに気が付きました。 「入力が入り次第すぐそれを使う」 という点で一貫してるので、
単純なプログラムを書くには適した手法でした。わざわざその手法で書き直す必然性は
ないので後戻りはしませんけど。
RXシリーズは、石の設計思想にコンパイラやOSの存在が組み込まれていますね。
SIとSU(割り込みスタックとユーザースタック)が別 とか、特権命令があって、PSWの
スーパーバーザーモードとユーザーモードを区別するbitにより例外を発生させるとか。
でもMAX50MHzでWinみたいなマルチタスクを実現するわけでもないし、OS無しで
単純ループで書いてるだけだとこの設計思想のありがたみは感じないなあ・・・
電源でなぜいつも苦労するのかは、どなたか判りますか?
あうるのではなく、受信割り込みがあったことをポーリングすればその手法自体は書ける
ことに気が付きました。 「入力が入り次第すぐそれを使う」 という点で一貫してるので、
単純なプログラムを書くには適した手法でした。わざわざその手法で書き直す必然性は
ないので後戻りはしませんけど。
RXシリーズは、石の設計思想にコンパイラやOSの存在が組み込まれていますね。
SIとSU(割り込みスタックとユーザースタック)が別 とか、特権命令があって、PSWの
スーパーバーザーモードとユーザーモードを区別するbitにより例外を発生させるとか。
でもMAX50MHzでWinみたいなマルチタスクを実現するわけでもないし、OS無しで
単純ループで書いてるだけだとこの設計思想のありがたみは感じないなあ・・・
電源でなぜいつも苦労するのかは、どなたか判りますか?
159デフォルトの名無しさん
2013/03/08(金) 23:06:24.23 安定してると思うなと?
16095
2013/03/10(日) 17:37:13.01 LAN通信機能は不要だそうです。serialのみ。 これならなんとかなるかな。
16195
2013/03/17(日) 03:19:03.37 飛び込みで8085の仕事が来た・・・CPU以外にも 8251 8253 8255 どうやって石調達
してるんだろ? 結局ここで推敲してもらったstpcpy( )は使わなくなってしまいました。
してるんだろ? 結局ここで推敲してもらったstpcpy( )は使わなくなってしまいました。
162デフォルトの名無しさん
2013/03/17(日) 04:04:32.20 >8251 8253 8255 どうやって石調達してるんだろ?
量産でなければ普通に手に入る。秋葉原の店頭でもまだ見掛けるし。
量産でなければ普通に手に入る。秋葉原の店頭でもまだ見掛けるし。
163デフォルトの名無しさん
2013/03/17(日) 18:55:26.90 汎用チップの需要って案外ワンオフとかであったりするんで
ロット納品とかでなければ普通に売ってるよ。
ロット納品とかでなければ普通に売ってるよ。
16495
2013/03/18(月) 05:07:22.32 チップバラで買ってハンダ付け名人のおばちゃんが組み立てるのか〜・・・
手作りはお互い様ですね。今朝HEXを送信しました。 256のROMまだあるのかな?
手作りはお互い様ですね。今朝HEXを送信しました。 256のROMまだあるのかな?
16595
2013/03/25(月) 17:31:14.10 その後4回手直ししてHEXを送付しました。全部パツイチで動きました。
ふつうのソフト会社なら30分の仕事にする所、暇なので16hもかけてしまって\3マソ(w
明日から本業のRXに戻れるかな
ふつうのソフト会社なら30分の仕事にする所、暇なので16hもかけてしまって\3マソ(w
明日から本業のRXに戻れるかな
16695
2013/03/26(火) 06:21:07.57 uartに割り込み来ない・・・と思ったら、PMR,PDRより前に
マルチファンクションピンコントローラのレジスタ設定が必要だったorz
しかもこっちの章が後なのに設定は先とか・・・もうね、意地悪!
マルチファンクションピンコントローラのレジスタ設定が必要だったorz
しかもこっちの章が後なのに設定は先とか・・・もうね、意地悪!
167デフォルトの名無しさん
2013/03/26(火) 08:50:12.72 また何を基本中の基本を……
16895
2013/03/27(水) 04:49:55.10 まだ割り込み来ない・・・やったこと:hwsetupで、マルチファンクションピンコントローラの
P20〜P33PFSでTXD/RXD端子に設定、PORT3.PMRとPORT2.PMRでTXD/RXD使用、
ICU.IPR[218]と[226]=優先度2、IER[27]と[28]=0Fと3C(SCI1,6のERI,RXI,TXI,TEI許可)
リセット直後でINTBに可変ベクタテーブルの先頭設定、hwsetup( )から戻った所で
set_psw( )でPSWのIbitをオン。SCI1と6のSMR,BRR設定してSCRに50h(REとRIE)書いた。
これでシリアルにデータ入れても割り込み来ない。uartのレジスタの辺りダンプすると
みんな00になってる。BRRやSCRやRDRは非ゼロが見えるはずなのに・・・
何かまだ設定忘れてる??
P20〜P33PFSでTXD/RXD端子に設定、PORT3.PMRとPORT2.PMRでTXD/RXD使用、
ICU.IPR[218]と[226]=優先度2、IER[27]と[28]=0Fと3C(SCI1,6のERI,RXI,TXI,TEI許可)
リセット直後でINTBに可変ベクタテーブルの先頭設定、hwsetup( )から戻った所で
set_psw( )でPSWのIbitをオン。SCI1と6のSMR,BRR設定してSCRに50h(REとRIE)書いた。
これでシリアルにデータ入れても割り込み来ない。uartのレジスタの辺りダンプすると
みんな00になってる。BRRやSCRやRDRは非ゼロが見えるはずなのに・・・
何かまだ設定忘れてる??
16995
2013/04/02(火) 05:58:57.63 SCIxには保護レジスタなんてありませんよね?
17095
2013/04/02(火) 16:28:54.68171デフォルトの名無しさん
2013/04/02(火) 18:19:21.45 基本中の基本って言われたら
基本を調べるよなふつう
基本を調べるよなふつう
172デフォルトの名無しさん
2013/04/02(火) 19:32:31.71 つーか、私だって全てのCPUのレジスタ構成を把握しているわけじゃないもん。
自分が使うCPUならレジスタ構成を把握するのが基本だろって話だよ。
自分が使うCPUならレジスタ構成を把握するのが基本だろって話だよ。
17395
2013/04/03(水) 02:45:11.79 自分が使うユニットの章しか読まないでコードしてもなんとか動いたんですよ、H8Sとか。
概要の章に、何章までは全部読んで理解しないと使えないよ的な前置きが欲しかったな。
1600ページもあるの、全部なんか読んでられないわ。
概要の章に、何章までは全部読んで理解しないと使えないよ的な前置きが欲しかったな。
1600ページもあるの、全部なんか読んでられないわ。
17495
2013/04/03(水) 03:06:31.08 モジュールストップ解除したら動きました。やれやれ・・・
タイマ割り込みが来ないのもこれのせいでした。この石は省電力が売りなので、
使わないユニットにはクロックを送らないことで省電力を実現してるんでしょうね。
これでやっと本来のアプリのデバックに入れます。
タイマ割り込みが来ないのもこれのせいでした。この石は省電力が売りなので、
使わないユニットにはクロックを送らないことで省電力を実現してるんでしょうね。
これでやっと本来のアプリのデバックに入れます。
17595
2013/04/06(土) 16:59:58.74 評価セット借りてきて、自分のパソコンにつなぎました。
ドライバのインスコで神経すり減らしたけど、動いたら快適。
DATAflashの書き込みと読み出しがうまく行きました\(^o^)/
同じ手法で内蔵fROMの書き込みもしてるので、この先Sレコードの書き込みも
うまく行きそうです。デバック用にWDTリフレッシュ殺して動かしてますが、
うまく通信できてます。
ドライバのインスコで神経すり減らしたけど、動いたら快適。
DATAflashの書き込みと読み出しがうまく行きました\(^o^)/
同じ手法で内蔵fROMの書き込みもしてるので、この先Sレコードの書き込みも
うまく行きそうです。デバック用にWDTリフレッシュ殺して動かしてますが、
うまく通信できてます。
176デフォルトの名無しさん
2013/04/06(土) 19:21:41.28 で、忘れた頃にWDT入れたら、真っ青になるとw
# 茶化してるだけねw
# 茶化してるだけねw
17795
2013/04/07(日) 16:41:00.54 FFFFFFFC番地に入っているアドレスに飛ばすc文はどう書けばいいですか?
( (void*)(0xFFFFFFFC) )( ); ってやると、FFFFFFFC番地に飛ぶ命令が出ちゃう。
( (void*)(0xFFFFFFFC) )( ); ってやると、FFFFFFFC番地に飛ぶ命令が出ちゃう。
178デフォルトの名無しさん
2013/04/07(日) 17:16:27.39 >>177
ポインタサイズが32bitと仮定すると
unsigned long pl;
void (*func)(void);
pl = *((unsigned long *)(0xFFFFFFFC));
func = (void *)pl;
ポインタサイズが32bitと仮定すると
unsigned long pl;
void (*func)(void);
pl = *((unsigned long *)(0xFFFFFFFC));
func = (void *)pl;
179デフォルトの名無しさん
2013/04/07(日) 17:42:33.19 普通にこうすりゃいいだろ
((void (*)(void))0xFFFFFFFC)();
分かり辛いなら
void (*func)(void) = (void (*)(void))0xFFFFFFFC;
func();
((void (*)(void))0xFFFFFFFC)();
分かり辛いなら
void (*func)(void) = (void (*)(void))0xFFFFFFFC;
func();
180デフォルトの名無しさん
2013/04/07(日) 17:43:40.18 >>179
分かってないなあ
分かってないなあ
181デフォルトの名無しさん
2013/04/07(日) 17:45:37.68 (*((void(*)(void))(*(unsigned long *)0xFFFFFFFC)))();
こうかな…?手元に環境が無いのでちょっと自信ない
こうかな…?手元に環境が無いのでちょっと自信ない
182デフォルトの名無しさん
2013/04/07(日) 17:53:07.22183デフォルトの名無しさん
2013/04/07(日) 23:31:03.66 機械語スレでCごとき高級言語とか
# デスクトップでも__asm は試作で重宝してる
# デスクトップでも__asm は試作で重宝してる
184デフォルトの名無しさん
2013/04/08(月) 01:19:14.00 asmすらこのスレにはふさわしくないんだよなあ
emitしないと
emitしないと
18595
2013/04/08(月) 01:26:33.40 >>182さんので通りました。 ありがとうございます。
MOV.L #0FFFFFFFCH,R4
MOV.L [R4],R5
JMP R5
このcはasmの行を挟み込む機能は無くて、asmのインライン関数を吐かせるんです。
判らなかったら、#pragma inline_asm func
void func(void) { } の中に上の3行を挟んで書こうと思っていました。
「ポインタのポインタ」 で理解するより3行のasmのほうが私には理解し易いですね。
MOV.L #0FFFFFFFCH,R4
MOV.L [R4],R5
JMP R5
このcはasmの行を挟み込む機能は無くて、asmのインライン関数を吐かせるんです。
判らなかったら、#pragma inline_asm func
void func(void) { } の中に上の3行を挟んで書こうと思っていました。
「ポインタのポインタ」 で理解するより3行のasmのほうが私には理解し易いですね。
186デフォルトの名無しさん
2013/04/08(月) 01:34:29.20 分かり辛いなら
typedef void (*funcptr_t)(void);
funcptr_t* p_func = (funcptr_t*)0xFFFFFFFC;
(*p_func)();
とか
typedef void (*funcptr_t)(void);
funcptr_t* p_func = (funcptr_t*)0xFFFFFFFC;
(*p_func)();
とか
187デフォルトの名無しさん
2013/04/08(月) 04:11:03.2218895
2013/04/08(月) 09:40:33.18 そうですね。asmでの理解ならすんなりいくのに。
ユーザーブート領域のプログラムをデバックしようと思って、その空間でLINKした
コードをダウンロードして、リセットベクタをそこを指すようにして実行してみると、
対象領域がみんなFFになってる。未実装として読まれてるみたいです。
端子2つと特定番地の内容でブートモードになる、とマニュアルに書かれていたけど、
なるほどこういうことだったのか。リセットベクタを含む固定ベクタはアプリにだけLINK
するものですね。起動時にそういう端子入力ができるようにハードを直してもらいます。
ユーザーブート領域のプログラムをデバックしようと思って、その空間でLINKした
コードをダウンロードして、リセットベクタをそこを指すようにして実行してみると、
対象領域がみんなFFになってる。未実装として読まれてるみたいです。
端子2つと特定番地の内容でブートモードになる、とマニュアルに書かれていたけど、
なるほどこういうことだったのか。リセットベクタを含む固定ベクタはアプリにだけLINK
するものですね。起動時にそういう端子入力ができるようにハードを直してもらいます。
189デフォルトの名無しさん
2013/04/08(月) 11:30:36.97 機械語オーライなら、もちろん、call convention は気にするよな?
組み込みのCの処理系がどうとなってるか詳しくないが、
typedef int (__cdecl* myfuncptr_t)(int, int);
とかって書くようにしてるぞ。
組み込みのCの処理系がどうとなってるか詳しくないが、
typedef int (__cdecl* myfuncptr_t)(int, int);
とかって書くようにしてるぞ。
190デフォルトの名無しさん
2013/04/09(火) 00:12:48.20 __cdecl がデフォルトだったと思うので
__stdcall しか書かないな
__stdcall しか書かないな
19195
2013/04/09(火) 14:34:43.07 SCIの受信とDMACを連携して動作させられるじゃないですか。あれってバイト数は
DMACに設定するんだから、何バイト来るか判っている場合にしか使えませんよね?
DMACに設定するんだから、何バイト来るか判っている場合にしか使えませんよね?
192デフォルトの名無しさん
2013/04/09(火) 21:12:38.25 DMACは基本的に固定長のデータ転送に使うものだから
不定長のデータには使えない。
不定長のデータには使えない。
19395
2013/04/13(土) 05:28:44.66 watms(int ms) 関数が素通りしてるっぽい・・・ RX210
void waitms(int ms) { hwsetup( ) で MSTP_CMT1 = 0; はやってる。
// 入力:ミリ秒単位の数値(50mSまで)。誤差の少ないwait関数。
CMT3.CMCOR = PCLK/128/1000*ms; // 1KHz(1mS)の分周値*mS
CMT3.CMCR.WORD = 0x00C2; // Φ/128 セレクト,CMIE3許可
CMT.CMSTR1.BIT.STR3 = 1; // カウントUP start
// do { } while( CMT3.CMCNT ); // 一致を待つ
// ↑CPUマニュアル 25.2.4には、一致するとCMCNTは0になると書かれているが
// 0である128clkの間、別の割込で他の箇所を実行しているかもしれない。
// そこで下記の割り込みを待つようにする。
do { } while( CMT3.CMCR.WORD & 0x40 ); // 割り込みを待つ
}
#pragma interrupt(Excep_CMTU1_CMT3(vect=VECT_CMT3_CMI3))
void Excep_CMTU1_CMT3(void) { // 1mSタイマ割込み処理 13.02.28
CMT3.CMCR.WORD = 0x0082; // Φ/32 セレクト,CMIE3禁止
CMT.CMSTR1.BIT.STR3 = 0; // カウントUP stop
} これで1msのn倍waitできると思ったんだけど、すぐリターンしてくるみたいなの
void waitms(int ms) { hwsetup( ) で MSTP_CMT1 = 0; はやってる。
// 入力:ミリ秒単位の数値(50mSまで)。誤差の少ないwait関数。
CMT3.CMCOR = PCLK/128/1000*ms; // 1KHz(1mS)の分周値*mS
CMT3.CMCR.WORD = 0x00C2; // Φ/128 セレクト,CMIE3許可
CMT.CMSTR1.BIT.STR3 = 1; // カウントUP start
// do { } while( CMT3.CMCNT ); // 一致を待つ
// ↑CPUマニュアル 25.2.4には、一致するとCMCNTは0になると書かれているが
// 0である128clkの間、別の割込で他の箇所を実行しているかもしれない。
// そこで下記の割り込みを待つようにする。
do { } while( CMT3.CMCR.WORD & 0x40 ); // 割り込みを待つ
}
#pragma interrupt(Excep_CMTU1_CMT3(vect=VECT_CMT3_CMI3))
void Excep_CMTU1_CMT3(void) { // 1mSタイマ割込み処理 13.02.28
CMT3.CMCR.WORD = 0x0082; // Φ/32 セレクト,CMIE3禁止
CMT.CMSTR1.BIT.STR3 = 0; // カウントUP stop
} これで1msのn倍waitできると思ったんだけど、すぐリターンしてくるみたいなの
194デフォルトの名無しさん
2013/04/13(土) 18:42:50.64 volatile?
機械語じゃなくね?w
保守してくれてるとおもって気にしてないが
機械語じゃなくね?w
保守してくれてるとおもって気にしてないが
195デフォルトの名無しさん
2013/04/13(土) 19:13:06.56 素通りしてるとか言う前に吐かれたマシンコードを見るのが
先じゃないのかな。
先じゃないのかな。
196デフォルトの名無しさん
2013/04/13(土) 19:14:54.81 ああ、「マシンコード」か。見慣れない字面だから空目してびっくりしたわ。
197デフォルトの名無しさん
2013/04/13(土) 22:25:12.84 マ○ンコード
19895
2013/04/14(日) 04:11:24.79 マシンコードは見たんですよ〜 すぐ気が付くようなミスは無かったと思う。
CMT3.CMCOR = PCLK/128/1000*ms; // 1KHz(1mS)の分周値*mS
MOV.L #00088000H,R4
MUL #90H,R1
MOV.W R1,1CH[R4]
CMT3.CMCR.WORD = 0x00C2; // Φ/128 セレクト,CMIE3許可
MOV.W #00C2H,18H[R4]
CMT.CMSTR1.BIT.STR3 = 1; // カウントUP start
MOVU.W 0H[R4],R5
BSET 01H,R5
MOV.W R5,10H[R4]
do { } while( CMT3.CMCR.WORD & 0x40 ); // 割り込みを待つ
L26: MOVU.W 18H[R4],R5
BTST #06H,R5
BNE L26
RTS
CMT3.CMCOR = PCLK/128/1000*ms; // 1KHz(1mS)の分周値*mS
MOV.L #00088000H,R4
MUL #90H,R1
MOV.W R1,1CH[R4]
CMT3.CMCR.WORD = 0x00C2; // Φ/128 セレクト,CMIE3許可
MOV.W #00C2H,18H[R4]
CMT.CMSTR1.BIT.STR3 = 1; // カウントUP start
MOVU.W 0H[R4],R5
BSET 01H,R5
MOV.W R5,10H[R4]
do { } while( CMT3.CMCR.WORD & 0x40 ); // 割り込みを待つ
L26: MOVU.W 18H[R4],R5
BTST #06H,R5
BNE L26
RTS
19995
2013/04/14(日) 04:15:42.22 void Excep_CMTU1_CMT3(void) { // 1mSタイマ割込み処理
PUSHM R4-R5
CMT3.CMCR.WORD = 0x0082; // Φ/32 セレクト,CMIE3禁止
MOV.L #00088000H,R4
MOV.W #0082H,18H[R4]
CMT.CMSTR1.BIT.STR3 = 0; // カウントUP stop
MOVU.W 10H[R4],R5
BCLR #01H,R5
MOV.W R5,10H[R4]
POPM R4-R5
RTE
PUSHM R4-R5
CMT3.CMCR.WORD = 0x0082; // Φ/32 セレクト,CMIE3禁止
MOV.L #00088000H,R4
MOV.W #0082H,18H[R4]
CMT.CMSTR1.BIT.STR3 = 0; // カウントUP stop
MOVU.W 10H[R4],R5
BCLR #01H,R5
MOV.W R5,10H[R4]
POPM R4-R5
RTE
200デフォルトの名無しさん
2013/04/14(日) 04:19:11.36 do whileの脱出条件が間違っているようにしか見えない。
そもそもなぜdoなのか。通常のwhileではできない理由があるのか。
そこらへんが理解できないな。
あとコンパイラによってはdo { }が空文だと最適化でコードにしない
ものがあったりするので(昔のMS-Cとかね)最適化オプションは
全てオフにしてから確認するといいかもね。
そもそもなぜdoなのか。通常のwhileではできない理由があるのか。
そこらへんが理解できないな。
あとコンパイラによってはdo { }が空文だと最適化でコードにしない
ものがあったりするので(昔のMS-Cとかね)最適化オプションは
全てオフにしてから確認するといいかもね。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【次の一手】台湾問題で小林よしのり氏が私見「まさに戦争前夜」「ただちに徴兵制を敷いて、高市支持者を最前線へ」… ★5 [BFU★]
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 [ぐれ★]
- 【news23】小川彩佳アナ「ここまでの広がりになるということを、高市総理はどれだけ想像できていたんでしょうね」 日中問題特集で [冬月記者★]
- 「町中華」の“息切れ倒産”が増加 ブームにも支えられ職人技で踏ん張ってきたが… 大手チェーンは値上げでも絶好調 [ぐれ★]
- 毛寧(もう・ねい)報道官「中国に日本の水産品の市場は無い」 高市首相の国会答弁に「中国民衆の強い怒り」 ★2 [ぐれ★]
- ヤフコメ「中国への輸出がなくなる事で、日本国内で美味しくいただける事に感謝します」👈やたら政権寄りなのはなぜ?(´・ω・`) [399259198]
- 【高市売り】円安、止まらず!凄い勢いで暴落中。157円へ [219241683]
- ファブルに出てくる貝沼君ってのがお前らにそっくりなんだよ
- 俺「お湯を流してと…」シンク「ボンッw」
- 【悲報】ヤフコメ民「中国が水産物を輸入禁止にするなら、日本国民向けに安く販売すればいい。中国依存から脱するべき」 [153736977]
- paypayで支払いするの便利すぎワロッタwwwwwwwwwwwwwww
