マイコンソフト 悩み事相談室 4
. ∧ ∧ ( ´・ω・) < コンフィグって何? 昆布なら知ってる。 ボラチルって何? ボラは魚だよ。 ( ∪ ∪ ,.-、 ,.-、 ,.-、 ,.-、 と__)__) (,,■) (,,■) (,,■) (,,■) PIC AVR H8 ARM 学校でC言語を習ったことがあるので「楽勝でしょ」って、マイコンを始めたけど、 わからないことだらけ。誰か教えて! PCとは別世界の、マイコンのソフト。難しいよね。 ツールの使い方、ツールの設定、マイコン特有のC言語の書き方、 「デバッグモードにプログラミングモード。何?」 Eclips, Emacs って何? VBAしか知らないよぉ、という人まで、 各社マイコンに関するマイコンソフト相談室です。 質問者は、「初心者質問スレ」の>>1 を見て、分かり易く質問を書いてね。 回答者は、威張らない、バカにしない、言葉使い注意で、親切に教えてあげてね。 あっ、そうそう。 ハードウェアに関する質問は、それぞれのマイコンのスレに、達人がいるから。 過去スレ 1 2014/09/11〜 2 2016/07/31〜 http://rio2016.2ch.net/test/read.cgi/denki/1469905691/l50 3 2017/06/19〜 https://rio2016.5ch.net/test/read.cgi/denki/1497806664/ では、質問、ドゾ〜 いちおつ。 前スレの http://rio2016.5ch.net/test/read.cgi/denki/1497806664/998-999 ハードウェアリセットが付いているシステムなら、SRAMへの書き込みで、アドレス不定になるものってあるかな。 シーケンスのわからないバカがまだ何か言ってる。 そこじゃねえんだよ 「書き込みシーケンス途中で落ちるのが悪い」だと? 「任意のタイミングで電源を切ることが出来る」システムが欲しいって話をしてるんだ。 そしてそれを実現するために工夫された回路やプログラムが世の中に存在してるんだ。 それが無駄だってか? 己の無知を恥じろ。 アドレス不定になるから、シーケンスで対処するべき、って主張なんだと思うけど、それは置いておいて、 >>3 の条件で書き込みアドレスが不定になるものってあるのかな? って話なんだけどな ない、は言えないね。悪魔の証明だ。 勘違いしてるようだけど、アドレスが不定にならないならシーケンスやハードでの対処が要らない、って言ってるわけじゃないよ。 ・キャパシタと電圧監視で書き換え完了できる動力が保証できる場合のみ書き換えを開始する ・CRCとかを最後に書くようにして2つの領域を交互に使うようにする のいずれかになるね 前者は外付け部品が必要になるし、後者はCRCの計算と二倍以上の記憶領域が必要になるから用途で使い分けたらいいと思う 自分がよく使うマイコンのマニュアルを読むと内蔵フラッシュに書き込み中のリセットは 所定のリセット条件を満足すれば問題ないようだ 禁止条件にも書かれていないし書き込み中のブロックが不定になる程度ですむと思われる とはいえ常識的に考えて日常的にそのよう状況が発生する設計は避けるべきだとは思うが 書き込み中に規定外の電圧への遷移や一部のフラグの変更等はフラッシュへダメージがある 可能性がある理由で禁止されている >>7 > アドレス不定になるから、シーケンスで対処するべき、って主張なんだと思うけど ここで言うシーケンスって何? >>11 いやいや、シーケンスで「対処」って何よって話 オペコペコペコ、オペランド…今から緊急手術を行う‥‥doctor P 普通の強盗 ・・・・「金を 出せ!」 ポーランド人の場合・・・・・「出せ 金を!」・・・「キン玉じゃない!」 >>16 ポーランド記法・・・・「金を 出せ!」 値+命令 非ポーランド記法・・・・「出せ 金を!」 命令+値 日本語はポーランド記法に近い語順 英語は非ポーランド記法に近い語順 ポーランド記法・・・・金を出せ お前は 俺に 非ポーランド記法・・・・お前は 金を出せ 俺に 逆ポーランド記法・・・・お前は 俺に 金を出せ 強盗の例は分かりにくいので、数字と演算子で教えてください。 hp電卓と似ていると聞いたことがあります。 非ポーランド記法・・・・ (1+2)*3 ポーランド記法・・・・* + 1 2 3 逆ポーランド記法・・・・ 1 2 + 3 * 非ポーランド記法・・・・ (1+2)*3 逆ポーランド記法・・・・ 1 2 + 3 * 非ポーランド記法・・・・ 1*(2+3) の場合は 逆ポーランド記法・・・・ 1 * 2 3 + でしょうか。 >>25 演算子から2つ前の値しか関係しないということですね。 >>25 演算子から2つ前の値しか関係しないということですね。 基本スタックマシンだから push 1 push 2 push 3 popしてpopして足してpush popしてpopして掛けてpush みたいな感じ >>24 逆ポーランドだと312+*でも行けない? スタック型よね。 fothとかpostscriptとか。 ひとつの袋に黄色いりんご1個と赤いりんご2個が入っています。 その袋を3つ買いました。全部でいくつのりんごを買ったでしょう。 生徒:3×(1+2)=9 です 先生:バツです。 (1+2)×(3+4)は、 1 2 3 4 + ?? 一時記憶? スタック自体が一時記憶だからな。 1に2を足して3に4を足して掛ける。 数字の打ち込みはスタックに積むこと。 二項演算子を「スタックから2つとってきて計算してスタックに戻す」と考えれば理解しやすかも。 なるほど 上2つの数値が対象でしたね。 どんな複雑な四則計算も、それでできるのでしょうか。 (1+2)*(3+4)/( (5+6)*7) 1 2 + 3 4 + * 5 6 + 7 * / ですね 四則演算に限らず(用意されてりゃ)関数とかも使える sin(√(1 + 2) * 3) 1 2 + √ 3 * sin 関数や演算子のパラメータの数だけスタックから取ってきて、結果をスタックに返すわけだしね。 usin(√(1 + 2) * 3) 1 2 + √ 3 * sin なるほど、これは簡単だと思うけど、 式の()とか、優先順位を人間が解析した上で 1 2 ...と記述を始めるわけですが、 その解析をしなくても、数式通りに usin(√(1 + 2) * 3) と書き込めば、Cとかならコンパイラが計算してくれますよね。 だとすると、ポートランド記号は、どういうときに使用されるのでしょうか。 逆ポーランド電卓を使う時とか8087をアセンブラで書く時とか >>39 > ポートランド記号は、どういうときに使用されるのでしょうか。 逆ポーランド記法な 使うのは Forth とか PostScript を使う時かな 今どきそんな機会があるかどうかは知らんけど 昔の同僚にHPの電卓のファンがいて、逆ポーランドの方がわかりやすいと言ってました。 >>39 の感覚は、「通常の数式表現から逆ポーランドに置き換える」というものだと思いますが、 その同僚の感覚は「いきなり逆ポーランドで考える」だったと思う。 俺は、英語の文書を作るときに、いったん日本語で考えてから翻訳しますけど、 英語ネイティブや、そこそこの英語使いなら最初から英語で考えるはず。それに似ているかも。 俺の逆ポーランドに対する感覚は>39に近いけどね。 プログラムの中でユーザーが入力した「通常の式」を解釈するときは、逆ポーランドに置き 換えるか、再帰的に式を解釈したりしていますが、後者もスタックを使っているのは同じ。 >>42 昔、数式のパーサーを作ったけど、確かにスタック操作だったのを思い出した >>41 1+ 2 をアセンブラで書くときも mov a,1 mov b,2 add a,b とかやるんじゃないか? 今どきそんな機会があるかどうかは知らんけど >>42 1 と 2 を足した(+) ものに 3 と 4 を足した(+)ものを 掛ける(*) なので日本語と逆ポーランド記法の順序は似てる >>44 マシンによるけど mov a, 1 add a, 2 ってやれることが多いからちょい微妙な気がする >>45 なるほど。 ってか、実際はコンパイラが最適化するけどね。 >>42 RPN電卓は慣れてくると変換とか考えなくても自然と扱えるようになる 特に()とか計算順が関係してくるのはなんも考えずに先頭から入力していけるし まあ最近の関数電卓は数式入力とか普通だからあまり魅力はないかもしれないが あとはPOSレジ(加算器)なんかは逆ポーランド的操作だね 値段 + 値段 + 個数 * 値段 + : 合計 みたいな感じだし >なので日本語と逆ポーランド記法の順序は似てる Forth系言語の 日本語Mind とか… FORTHってなかなかユニークな言語だよね。 昔、興味が湧いて、使っているCPU用に移植した事がある。 その時に逆ポーランド記法を初めて知ったけど、演算処理が簡単になるので、 その後、あるオリジナルの言語処理系を作った時にも採用した。 ATmega168で「I2C and SPI通信モニタ装置」を製作した時に データ取り込み開始・停止の条件判定にスタックを使う逆ポーランド記法でやった Forthを考えついた人は天才だと思う スタックにデータを置くシーケンサ(PLC)にも変数(データ格納アドレス)は存在しない。 格納場所が決まっているので存在しようがないというか、 そもそも存在させないためにスタックに置くというか・・・ 質問です。 マイコンのプログラムは今はCで書いていますが、 Pythonで書くことはできるのでしょうか? >>55 ありがとうございました。 ググったら、いろいろとわかりました。 どうもありがとうございます。 >>57 ありがとうございます。 確かにARMクラスが妥当だと思いますが、デジキーの案内のページを見ると... MicroPythonはすでに何種類かのマイクロコントローラシリーズに移植されており、 これを出発点として新規プラットフォームに移植するか、 すでにサポートされているマイクロコントローラを選択することができます。 図1に示すのは、MicroPythonのソースコードのメインディレクトリです。 ここから、サポートされているマイクロコントローラデバイスを確認できます。次 のマイクロコントローラが含まれます。 ARM®ベースのマイクロコントローラ Texas Instrumentsの CC3200 Adafruitの ESP8266 Microchip Technologyの 16ビットPICマイクロコントローラ STMicrolectronicsの STM32 と、書かれています。 PICでもできるみたいで、興味があります。 dsPIC 使うなら素直に SAM 使ったほうがいい。 >>58 >>57 みたいな奴は相手しなくていいよ 単に知ったかしたいだけだしその知識も往々にして間違ってたり古かったりするから アセンブラなど甘え 基本ほバイナリエディタで機械語プログラミング >>61 普通のPICで使えるやつあるの? PIC18とか。 きっと皆が知らない新しい情報持ってるんだろうね? ちなみにCC32とSTM32がARMなのは知ってるよね? 5V対応不用でホビーならRaspberry Pi picoがお手軽じゃないかな MicroPythonはPythonと言っても仮想マシンだし、速くないし メモリの使用効率は良くないし、コンパイル用にPCがいる >>63-64 恥の上塗り乙 >>58 に > Microchip Technologyの 16ビットPICマイクロコントローラ って、誰でも調べられる普通の情報として書いてあるけど? PIC18Fは16bitじゃないな、俺が悪かった。 現状、PICで使えるのはdsPIC33だけってこと。 だからSAM使ったほうがいいって書いた。 >>65 >5V対応不用でホビーならRaspberry Pi picoがお手軽じゃないかな 550円で安いですね。I/Oも周辺機能もあるしいいですね。 >MicroPythonはPythonと言っても仮想マシンだし、 これはどういう意味でしょうか。直接PythonでI/Oピンの H/Lができないのでしょうか? >速くないし メモリの使用効率は良くないし、 133MHzで動いているのに、遅いんですか? >コンパイル用にPCがいる PCなしでできるんでしょうか? C言語の代わりにPythonで書いて、ICSPで書き込めば自立で動く、 普通のPICマイコンとして使いたいのですが難しいでしょうか。 人のことを知ったで知識が古いとか言うのにこういう間違いは指摘しないような連中しかいないからここでは何も得られないよ。 ありがとうございます。 でも、いろいろな話聞いて、私には情報になると思っています。 普通のPICマイコンとして使いたいなら 素直にC言語で組めば >>72 MicroPythonやmruby/cなどはPCでソースコードをバイトコードにコンパイルして マイコンにバイトコードとバイトコードを実行する仮想マシン(実質インタプリタ)を書き込んで動作させるからね Pythonコードが直接マイコン上で走るわけではないし、JITなわけでもないし、仮想マシンが使用する分のメモリが必要 効率はArduinoより悪いかも 以前にちょっと検討したことあるけどメリットを見いだせなかった。この辺を載せるくらいなら、もうちょっとがんばって Luaインタプリタを載せた方が使えそう。セルフ開発可能になるし >>73 何が間違いとも指摘できないお前のレスが一番無駄 >>72 > これはどういう意味でしょうか。直接PythonでI/Oピンの H/Lができないのでしょうか? サポートされてればPythonコードだけでできる https://micropython-docs-ja.readthedocs.io/ja/latest/library/machine.Pin.html > 133MHzで動いているのに、遅いんですか? C言語とかのネイティブな奴に比べたら当然遅い Lチカぐらいなら問題ないけどそれなり処理をしようとしたら問題になるかも あとガベージコレクションするからタイミングがシビアなものは色々知識が必要になる > PCなしでできるんでしょうか? 基本無理 > C言語の代わりにPythonで書いて、ICSPで書き込めば自立で動く、 > 普通のPICマイコンとして使いたいのですが難しいでしょうか。 最低限そのボードにC言語のプログラムを書き込んで自立して動かせるスキルは必要 >>76 ありがとうございます。 >(実質インタプリタ)を書き込んで動作させるからね マイコンにROM BASICを載せて、 1行1行読み込んで実行するようなものですか? >>78 ありがとうございます。 >>直接PythonでI/Oピンの H/Lができないのでしょうか? >サポートされてればPythonコードだけでできる >> 133MHzで動いているのに、遅いんですか? >C言語とかのネイティブな奴に比べたら当然遅い >Lチカぐらいなら問題ないけどそれなり処理をしようとしたら問題になるかも >最低限そのボードにC言語のプログラムを書き込んで自立して動かせるスキルは必要 それは何度もやって来たので大丈夫だと思います。 皆さんの話からすると、マイコンにはちょっと・・・という感じですね。 学校の授業でもPaython、本屋さんにはPaythonの本がたくさん。 Paythonの何が嬉しいのでしょうか。 初心者に分かりやすいからでしょうか。 アルデーノみたいに、他人の作ったモジュールを組み合わせると 簡単にできてしまうとか、そういうことですかね。 >>76 USBやシリアルでつないでREPLが動くでしょ。 PC側でコンパイルなんてしないよ。 >>80 > マイコンにROM BASICを載せて、 > 1行1行読み込んで実行するようなものですか? そこまで原始的じゃないよw コンパイルはするけどネイティブコードじゃなくて仮想マシン用のコードを生成するって話 古くはUCSD PascalからJavaやC#などでも使われてるやり方 ネイティブコードを吐くとか定数を定義するとかで高速化の方法はいくつかあるよ、詳しくは↓ https://micropython-docs-ja.readthedocs.io/ja/latest/reference/speed_python.html ただ、Pythonは言語仕様的に速度を重要視しておらずC言語とかに比べたらオーバーヘッドはかなり大きいのでホントに速度が重要なら素直にCで書いた方が楽だと思う >> 最低限そのボードにC言語のプログラムを書き込んで自立して動かせるスキルは必要 > それは何度もやって来たので大丈夫だと思います。 ならやってみてもいいと思うよ > Paythonの何が嬉しいのでしょうか。 オブジェクト指向とかコードがわかりやすいとか>>81 が言うインタラクティブに使ってハードのテストするとか色々あるけどあるけどぶっちゃけ流行りかなw >>81 MicroPythonでもREPL使えるんだな これは知らなかったわ >>81 てことはFlashAirみたいに生のソースコードを自力で解析して実行できるの? >>83 PythonのコードをFLASHに置いて実行するのが本来の使い方。 テストする時はREPLが便利。 >>82 は何で VM にこだわってんの? .mpy を実行するのが VM だって言うならPCのPythonもVMだよ。 Micropyhon は単なるインタープリタ。 結構重いからマイコン側の能力が必要。だから下記が推奨される。 256KB以上のフラッシュ 16KB以上のRAM 80MHz以上のCPUクロック まあ、8bitマイコンでもメモリあれば実装は出来るかもな。 >>77 がいるからもう書かない。こいつはMicropython使ったことないだろ。 自分で実機いじったほうがいいよ。 ESP32オススメ。 >>84 > >>82 は何で VM にこだわってんの? どう理解したらこだわってるように思えるんだろう… > Micropyhon は単なるインタープリタ。 仮想マシンとインタープリターの違いは? てか、むしろインタープリターにこだわり過ぎかと > >>77 がいるからもう書かない。 何が間違いかも書けないならそれが正解 とっととROMっててねw C言語の基本で、教えてください。 typedef と初めて接するのですが、分からないことがあります。 以下は、ネットにあったソースです。(作者さん、勝手に引用と改変すみません) #include <stdio.h> #include <stdlib.h> typedef enum{ RUNNING = '1', STOPPED = '2', FAILED = '3', HIBERNATING = '4' } MACHINE_STATE; // (a) int main(void) { int input1; MACHINE_STATE state; // (b) // char state; // (c) printf("type [1-4]: "); input1 = getchar(); state = input1; // (d) switch (state) { case RUNNING: printf("running\n"); break; case STOPPED: printf("stopped\n"); break; case FAILED: printf("fail\n"); break; case HIBERNATING: printf("hibernated\n"); break; default: break; } while(1){} } typedef unsigned char UCHAR と書くと、以降のところで UCHAR c; と書けば、unsigned char c; と同じ作用になると本などに書かれていました。まさにtypedefだと思います。 ところが上記のソースだと、typedef〜(a)までの間に、unsigned int とかの文字が書かれていません。 そして(b)で、MACHINE_STATE型でstsusという変数を取る、ということをしています。 ここまでの行でMACHINE_STATEが unsigned char なのか、intなのか、型のことに触れていません。 1. この場合、MACHINE_STATE は、何型になるのでしょうか。 2. このようなtypedefの使用は、(c)のように普通に取るのと比べて、どういうメリットがあるのでしょうか。 3. また、(d)の点で、input1を あえてstatusに入れ直していますが、これは、なぜなのでしょうか。 宜しくお願いします。 >>87 enum は 整数値。 char や int で宣言しないのは、変数の意図をわかりやすくするためじゃないですかね。 コンパイラや設定によってはワーニングを出してくれるのかな? ここに書かれている範囲だったら、いきなりstateにgetchar()値を入れても問題はなさそう。 でも、あとあとwhile(1){}の中に書き込んでいく意図があるとしたら、 その中でプログラムのステートを管理するstateはgetchar()でいきなりいじるのはしたくないはず。 getchar()は習慣的にいったんinput1みたいな変数に入れているのでは。 >>88 ありがとうございます。 >char や int で宣言しないのは、変数の意図をわかりやすくするためじゃないですかね。 確かに本にもそのようなことが書いてありました。 ただ、メンバーの名前では、unsigned char なのか unsigned int なのかがわからないと思うのです。 というか、unsigned int 一択で、unsigned charは無いということでしょうか? でしたら、納得しました。 いつも型ばかり気にしているので、型が分からない宣言は、とても心配でした。 なんだか unsigned int 一択が正解な気がしてきました。 >その中でプログラムのステートを管理するstateはgetchar()でいきなりいじるのはしたくないはず。 >getchar()は習慣的にいったんinput1みたいな変数に入れているのでは。 たしかに、直接は嫌ですね。入力値の評価をしてOKを確認してから採用ですね。 どうもありがとうございました。 enum の型は基本intと同じ扱い ただし、 intの範囲を越えたらより大きな型になる コンパイラやコンパイラの設定によっては charから拡張していく物もある また、型を指定出来る物もある 詳細はコンパイラの仕様書を見て enumはenumとして別の値に直接キャストしない 特定の値、特定のサイズを仮定しない のが本来だけど 効率を考えるとそんな正論ばかりは言ってられない 単なる値の#defineの代わりにenumを使うこともある >>90 ありがとうございます。 >単なる値の#defineの代わりにenumを使うこともある そうですよね。僕は逆でしたが、enumで並べるの代わりに、 #defineで数字を定義して使っていました。 数字の大小に意味は無いと思うのです。 >intの範囲を越えたらより大きな型になる そうなんですか。65535の次は42億....とか。 それででしょうか、状態遷移などのとき、enum で、 idle, wait, start, stop などと列挙して、if()で比較するときに、 if( さきほどの例のstatus == enumのメンバ ){ という比較をしている例がありました。 型の大きさが同じもの同士の比較なら、問題も起きないですよね。 どうもありがとうございました。 >>91 enum をtypedefするのは、その型の変数にはenumで定義した値しか入らないってことを明確にする意味がある だから、typedefした型の変数にintの数値を代入したり、intと比較するところがあったらおかしいってわかるようになる >>93 コンパイラによるけど、出る方が多いんじゃないかな >typedefした型の変数にintの数値を代入 STM32CubeIDEのgcc(.cファイル)だと設定を厳しくしてもワーニングが出ないっぽい。 適当に書いたから最適化で無視されたかもしれないけど。 gpp(.cppファイル)はキャストがないとワーニングが出る。 >>92 enumは、もともとint なんだから、 intを入れても問題ない。 何言ってんだか。 >>96 C++のようにワーニングが出るなら、 enumで定義されていない値を、おかまいなしに int値で入れるようなことをしたらわかるしね。 まとめ MicroPythonは、基盤となるマイクロコントローラハードウェアに依存せずに リアルタイム組み込みアプリケーションを実装したいと考える開発者にとって、 魅力的なプラットフォームです。 開発者は、MicroPythonで提供された標準ライブラリを使用して 高水準のPythonスクリプトを作成し、サポートされる任意のマイクロコントローラで実行できます。 これには、次を含む数多くのメリットがあります。 アプリケーションの再利用性が高くなる 市場投入までの時間を短縮できる アプリケーションとハードウェアを分離できる MicroPythonはあらゆるアプリケーションに最適というわけではありませんが、 産業用および宇宙システムのアプリケーションやプロトタイピング、概念実証では、 これまでに高い効果を発揮しています。 試してみたいけど、Windowsでできるのか・・・ ポケモンをきっかけにマイコンに興味持ったんだけどhexファイルをなんとかしてATmega32U4系で使う方法ってない? 逆は出てくるんだが ダメと君が判断した理由が逆に分からん。 HEXは入れ物に過ぎん。 何のhexファイルなんだろう。 なんかdocxファイルを手に入れたんだけど、卒論に使えるかな? みたいな。 HEXファイルは、世の中のさまざまなマイコンのプログラムや、ROMに書き込む データのフォーマットで、マイコンの機種が違ったり、同じマイコンでも、 マイコンの周辺の回路が違えば使えないと思った方がいいよ。 >>102 マイコンの動作を考えて→プログラムにして→コンパイルをすると→機械語が生成されます。 その機械語ファイルの形式を、hexファイルと呼びます。 プログラム→コンパイル→機械語ファイル生成(hexファイル)という流れは逆行できません。 もちろん、あのマイコンで作ったhexファイルを、機種の違うマイコンで使うこともできません。 >>105 ファミコンのROMがPCで使えるのは何故なんだぜ? 機械的にか人手かしらんがリソースかければ逆行できるよ。 逆コンパイルしてコンパイルしても動かないだろ 同じマイコンじゃなきゃ >>106 それはもしかしてエミュレータ? だとしたら、パソコンの中にソフトウェア的にファミコンを作っているからできること。 マイコンも別のマイコンのエミュレータを走らせればいい。 質問させてください。 ほとんどのマイコンで、複数のタイマーモジュールがあると思います。 この複数のタイマーは、どのような使用を想定して装備してあるのでしょうか? 例えば、main()処理中にtimer1割り込みが発生しました。その処理をします。main()に戻ります。 これは普通に使いますし便利な機能だと思いますが、timer1, timer2のつを動作させた場合、 timer1の割り込み処理中に、たまたまtimer2の割り込みが発生します。 優先順位が高ければtimer1の処理をそっちのけで、timer2を処理しに行きます。 timer2から戻ってtimer1が再開して、その後main()に戻ります。 通常はtimer1とtimer2の周期は違いますから、 多重割り込みが発生するときもあれば、しないときもあります。 そうすると、せっかくのtimer1の定時性が崩れてしまうと思うのです。 ではtimer1のpriorityを上げれば今度はtimer2の定時性が維持できないと思います。 timer1の処理中で、if( n++ > T2 ){ T=0; timer2の処理 } とやれば、timer1 1本なので、 どちらの定時性も確保できて良いと思うのですが、この考え方は間違っているでしょうか? 現実にtimerが5本も6本もあるところを見ると、私の考えは正しくないことは想像できるのですが、 学生時代からずっと疑問に思っているのでお尋ねしました。 ・タイマーはいろんな用途がある 波形の幅測定、波形出力、ソフト処理用タイマー、フリーラン、... ・完全な一定間隔でのソフト処理は難しい 実行中の命令、割り込み禁止区間、多重割り込み、キャッシュ などにより命令サイクルレベルの一定間隔での処理は(ほぼ)不可能 >>113 の方法も、処理1の処理時間がifや可変数ループなどで一定でなければ処理2は一定間隔でなはなくなってしまう その程度のばらつきが許容される用途にしかソフト処理は使えない ・タイマーの共有 単純に使用リソースを減らす意味でタイマーを共有するのは一般的 規模が大きなソフトなら一定間隔で行いたい処理は100個以上にもなる ・割り込みの優先順位 どの程度処理が遅延していいか、どの程度処理に時間がかかるか、その処理のクリティカル性 などによって割り込み優先度を決める 許容遅延10usオーダーのタイムクリティカルな処理はタイマーA、1ms程度ならタイマーB、10ms以上ならメインループ のような階層にする >>113 そもそも多重割込で定時性が許容できないような処理を割り込みルーチンでやるなよって話 >>116 重たい処理はスレッドに通知してやらせるとかが普通かと 定時性ってどれぐらいを定時って考えるかによる。±1m秒ぐらいでOKなら、とか、±100nsでないといけないとか。 ひとつのタイマー割り込みでソフトウェアで分岐するやりかたもありだし、タイマーが少ないマイコンだったらそうしてた。 それでも、ソフトの処理の分岐や、タイマー割り込みルーチンに入るまでの時間ばらつきで、応答のばらつきはあるし 定時性のばらつきをどこまでを許容するのかを想定しないと。 たくさんのタイマーは、必ずしもそれぞれで別個の割り込み処理につかうわけでもない。 別のペリフェラルの直接に起動に使ったり、I/Oピンからタイマーの状態をソフトを介さずに使うこともあるわけだし。 定時性のばらつきは、クロックのジッター程度しか許さない。ってことだったら、そういう処理は外部デバイスに任せる しかないのでは。 6800 6809 のアセンブリをやってみたいのですが、 フリーのアセンブラーってありますか? 6502 や 68000 もさわってみたい。チップがあるかわかんないけど。 CPU, PIO, TIMER, SCI ぐらいあれば、デバッグもできそうだし。 >>119 6502は秋月でも売ってる。 アセンブラもC コンパイラなんかもある。 ただ、ROMに書き込むのはどうするかとか、そもそも最初はCPUがROMやRAMを読めるのか?ってあたりからテストしていかないといけないから、それなりのスキルと道具は必要かな? トラ技でも以前6502マイコンボードを製作していて、スイッチパチパチしてRAMにプートローダを書き込んで、PC上で作成したプログラムをシリアルでダウンロードして動かすなんてやってたな。 >>119 6800、6809、6502、68000のアセンブラで思い出したけど、 昔、汎用の(複数のCPUに対応している)メタ・アセンブラなるものがあった。 検索してみたらCross-32は今でもあるみたいだが、残念ながらタダではない。 https://www.cdadapter.com/cross32.htm asm6809とかググれば一発目に出てくるが コレ 6309にも対応とか遊べそう いまさらROMライタとか胸アツだわ もうやり方すらわからねえよ イレーサーの蓋開けたときの オゾン臭がなつかしいにほひ O-Zoneってマイヤヒーの? 苦しいな フラッシュ式で消すやつと紫外線で消すやつが有るのよね でROMライタでブランクチェックするのがルーティン 昔は遊技機から外されたものと思しき窓付きの27256とかが出回っていたけど、 今ならどうするんだろう。FLASHとかEEPROMで代替かな。 実験だったらOTPは使いにくいし。 主計機は書き換えられんようマスクだったと思う。 演出用は何でもあり。 医療用のX線だったか粒子加速器だったかで消去を試みたが デバイス自体がお亡くなりになったという話を聞いたことがある。 あれは特定波長の紫外線が必要 ブラックライトじゃ消えないよ 消毒用じゃないとだめ うちは自作したのがあるな。 といっても、紫外線ランプと安定期、グローランプをつないだだけだけど。 今ならレジン用のが手芸用品店で手に入るかな? なんか料理してるみたいな感じだった あれはあれで味があったな 面倒だけど 普通にROMイレーサーの製品を使ってたわ 測定器と同じ括りになるから自作じゃ無くて銘板が貼ってある製品 ストロボ式で、すぐ消えるっていうのもあったけど、一回では上手く行かなかったり、色々あったな。 トラ技のコラムか何かで 新製品発表会で製品を動作させてるとき、撮影でフラッシュをたかれたら誤動作してしまい UV-EPROMに遮光シールを貼ってなかったから、みたいな話があったな 光で発電するからね LEDも光当てると発電する 意外とこれ知られてないんですけど ストロボの方が合ってるの?フラッシュ(メモリじゃ無い)の方が合ってるの? 言葉はどうでも良いのだけど、発光させて(たしか10回くらいだった)消すやつが有ったけど消えたり消えなかったりでブランクチェックする手間考えたらUVのイレーサー使ってた あっちの方が確実だった 開発時はローテさせてやってたな ROMエミュは便利だった 底辺職やってたとき開発じゃ無くてマスターROMを空のROMへコピーする簡単なお仕事してました フラッシュっていうのは、本来は使い捨てのフラッシュバルブ(閃光電球) を使った奴のことなんだろう。 アセンブルし直すとすごい時間がかかるのと、開発装置自体が取り合いに なるので、今みたいにソースを修正して再アセンブルなんてできなくて、 ROMライター使って、パッチあてるなんていうこともやってたな。 命令コード記憶していたしね(笑) そう、ストロボタイプの商品もあった。 でも、実際に使うとEPROMの不良が多発して使うのをやめたっけな。 「やっぱり、じっくりこんがり焼かないと駄目なんだね」なんて言いながら・・ >>146 開けたらズラーっとUV-EPROM? ちょっと怖いかも笑 昔、IA80というコンパイラーって無かった? たしかフロッピーベースで動くという。 それで6801のソフトをやっていた。 コンパイラはないだろ PROASM(IA80 アセンブラ、IR80 リンカ)じゃないの? 昔はたいていフロッピーで動作してたよ。 BDS CとかLSI-C 80とかあったよな。 パソコン用でもMS-C、Lattice C、Turbo C/C++、LSI-C 86 をフロッピーで使ってた。 >CP/Mとかはそれ以前の問題だったね それ以前の問題、ってどういう意味? >>154 その当時から、構造体とか共用体、ポインターもあったんですか? >>160 あった。 というか、Cって高水準アセンブラみたいなものだからね。 ポインタがあってこそのCって感じで。 CP/M の BDS-C だったか α-C だったかの本まだあるかな 探してみよう >>165 すまん。たしかα-Cは、BDS-Cと違って、何かのファイルが付いてなくてROM化ができなかった。 始める前は なんでROMライターは10個も一度に消去できるんだろう? って思ったけど、 自分でやり出したら、すぐに理由がわかった。 その後FLASH ROMになったときは、考えた人スゲエと思った。 オンボード書き込みになった時は、考えた人 天才だと思った。 進歩していないのは、俺だけ。 >進歩していないのは、俺だけ。 そうか? 理由がわかったとき、スゲエと思ったとき、天才だと思ったとき、進歩してないと自省したとき、 全部自分をアップデートしてるよ。 フラッシュでROMを消去するのがあったから フラッシュメモリは消去するフラッシュが内蔵されてるんだと 思ったのはオレだけじゃないはず。 DRAMが破壊読み込みなのに読み込みでリフレッシュされるという書き方に納得がいかなかったけど、仕組みを見て、そういうことか!と思ったっけな。 UV-EPROMとかフラッシュのフローティングゲートも、そんなんで本当に大丈夫なん??と思ったっけ。 なぜ消去すると1と決めたんだろう、別に0でも構わなそうなのに 電子がある=マイナス=0? >>80 速度遅くても、用途によっては十分だから。 >>172 > 速度遅くても お前のレスが遅すぎやろ… Pythonでマイコンのプログラムを書くのが流行っているみたいだけど、 I/Oアクセスの記述は、どのように書くんでしょうか? 環境によって違うけど例えばこんなのとか # モジュールインポート import board import digitalio import time # ピンの出力設定 led = digitalio.DigitalInOut(board.D13) led.direction = digitalio.Direction.OUTPUT # 点滅の繰り返し while True: led.value = True time.sleep(1.0) led.value = False time.sleep(1.0) https://stardust-news.net/research/1199/ C言語でISR内部で任意のデータを使いたい場合ってグローバル変数を経由するしかない? グローバル変数がどんどん増えていってイマイチな感じなんだけど・・・ 例えば通信のISRだとポインタと長さとカウンタはISRごとに持たないと仕事にならない 長さとカウンタを終端ポインタにすれば1個節約できるけどスコープ外でデータを保持する必要ある 状況は変わらない ISRだけでなく非同期的な動作を実装しようとすると同じ状況になるような >>179 クラスか構造体にまとめる オブジェクト指向が分からんなら勉強しろ >>177 が言ってる任意のデータは、「ISR内で使うローカルな任意の変数」ではなくて、 「プログラム全体の中の任意のデータ」のことでは? >>184 >177じゃねぇんだし、単に「ISR内部で任意のデータを使いたい場合」としか 言ってないんだから、そんなこと知らねぇやな。 だいたい、「プログラム全体の中の任意のデータを使いたい」 としたって、「任意のデータ」ってそもそも何だ? 「自分は悪くない、エスパーしてくれないスレ住人が悪い」 とか言い出しちゃうのかな? ひとまずデータを渡す部分と使う部分を同じファイルにして staticを付けたグローバルな構造体にしてみました >>183 staticを関数内で付けたら外部からデータを書き換えられなくない? 任意のデータ なんて質問するヤツに回答しちゃダメ っていう良い例 「任意の」の意味をどうとらえるかだけど、答える立場として範囲やニュアンスが分からないなら質問者に聞けばいいのでは。 双方向のコミュニケーションができるのが掲示板なんだし。 新聞や雑誌のQ&Aコーナーでも、ものによったら Answer の掲載にあたって編集部から質問の意図の確認があるのに。 もちろん回答しちゃダメって思うのも自由だし、そんな人は答えなきゃいいだけで、他の答える気持ちがある人が答えればいい。 教えてください。 最近の自動車のウインカーは「流れるウインカー」が多いです。 右折時は→→→→→、左折時は←←←←← という感じです。マイコンでプログラムしたことがあります。 しかし、今日信号待ちで見た前車のウインカーは、トランクと車体を「またぐように」、 ウインカーが流れていました。下の図のような感じです。 https://imgur.com/a/FJdlKax これは、どのようにして流しているのでしょうか? ・車体側にあるマイコンの線がトランクに行っているのでしょうか? パラレル点灯だとすると何本もの線がトランクの「腕」の部分を通ることになり、現実的でないです。 ・トランク側マイコンとボデー側マイコンが、シリアルで繋がっていて、 どちらかが親になって子に「お前の点灯の番だ、今だ、行け」と指示しているのでしょうか? ・トランク側マイコンとボデー側マイコンが、車内のCANとかLINで繋がって動いているとしたら ウインカーのデータ通信で通常のCAN通信の邪魔になりそうです。 どうなっているのでしょうか? 車板で、こんなに詳しい内容がわかりますでしょうか? 電気以外のスレだと、オーディオ板のように、電気の素人が多い気がするのですが。 マイコンスレに車関連の具体的な実装方法がわかる人がいるとは思えないけど 想像で語るだけなら出来ても >>192 の疑問は途中で切れている部分がどう連携しているか、じゃないかな。 ウィンカー部分だけでなんらかの通信をしてるのかな?と思ったけど、誤動作が怖い。 ↓これに一票。(多数決じゃないけど) >トランク側マイコンとボデー側マイコンが、シリアルで繋がっていて、 >>199 ありがとうございます。 W2815が探せませんでした。 >>200 ありがとうございます。 >トランク側マイコンとボデー側マイコンが、シリアルで繋がっていて、 ですよね。 でも、そのために線を1本通さなくても、車内の通信で・・・とも考えたのですが。 >>201 ありがとうございます。 >ボディ側とトランク側をカスケードすればいいだけ ボディ側とトランク側はそれで行けそうですね。 しかし前の左右、ミラーの左右とも同期する必要がありますので、 どうなっているかな、と思っています。 >ウインカーは保安部品でシビアだからマイコンでもやれるけど結構面倒だよ ありがとうございます。 こんな専用ICがあるんですね。 LEDの流れる速度を、外部コンデンサで決めているのも意外でした。 LEDの短絡オープンの処理もしてくれるんですね。 ハザードなど、車両全部を同期させるのは、車内通信のECUからの指示で このICが動けば、人間には同時に見えるかな。 規格を通す労力とかも考えると、マイコンでやるより安価に仕上がるのかもしれませんね。 >W2815が探せませんでした。 >>199 さんが言ってるのは、WS2815。彼が言おうとしたことはわかったので、Sが抜けてても分からなかった。 https://akizukidenshi.com/catalog/g/gI-16028/ iPhoneとかも、マイコンで動いているのでしょうか? それともミニPCといった方が適切でしょうか? パソコンは自分で組立てたりできますが スマホでそういうのってないんでしょうか RaspberryPiとセンサで似たような事は出来るが それはスマホとは言わん Fairphone みたいな試みはあるけれど、それとてFairphone内の自由度でしかない。 >>210 が望んでいるのは、いろいろなメーカーのモジュールやケースを組み合わせて 好きなスペックのものを作ることだと思うがそれとは程遠い。 それができるようになるためには、それぞれの部品の切り分けや、インターフェース 形状が高度に標準化されていないといけない。それであっても、違うメーカーの ものを互いに接続できるようにするためには、電気的にも空間的にも余裕を大きく しないといけなくなる。結果として、大きくて重くて消費電力が大きいものになるだろうね。 たぶんそれは商売として成立するほどに売れないぐらいにしか、少数のユーザーに しか支持されないだろう。 というか、パソコンでさえ、デスクトップPCでしか自作PCは普及してないよね。 超軽量薄型ノートPCだと、スマホと同じように、メーカーを超えた自由度の高い部品の 組み合わせは難しくなってるし。 >>214 Googleの、懐かしいね。 USB機器とかが本体問わずに使えるみたいに、たとえば手帳型のケースで拡張部分のスロットに自分の好きなものを選んで装着して使える程度でも良いかなあとは思うわ。 小が今の標準的なバッテリだとしたら。 平野ノラが持ってたようなスマホとか。 CNCのステッピングモーター制御で、円弧をブレゼンハムのアルゴリズムを用い 1ドット=1ステップでウエイト時間を等間隔で移動した場合、速度は一定になると思われますか? https://i.imgur.com/8Kw8D73.png 実装して1/4円弧を1ステップ毎にatan2で中心との角度=青、前ステップとの差=赤 固定じゃ駄目ぽい ステッピングモーターはステップと言う解像度があるから、結局ブレゼンハムで ウエイト時間を調整するのがベターだと思うんですが、そう言うわけでも無いのかなぁ 第二軸のその0.1未満の際がどれほど深刻なのかが用途も知らんし わからん だから 僕は円周率≒3の男だから ほぼ等速「とみなせる」ように見えた(^p^) ※なにもしらない個人の、個人的な印象です。 効能・効果を保証するものではありません >>227 1ステップで何度進んだかで、山はXY同時に斜めに進んだ時出来、底は方軸のみだと思われます 端が1ステップ0.25度強、中心の辺りは0.35度強とすると1.4倍近い差があります そりゃ、45度(π/4[rad])位置は一ドットの対角線、 一辺の√(2)倍なんだから0度や90度の時に比べれば 細かく言えば約1.4倍の移動距離になりますわなぁ。 ・・・でも、半径に対して十分に画素が小さく細かけりゃ 無視できるんじゃね?(はなほじ マイコンでPCやスマホ向けの画像を扱おうとするとマジでメモリがきついな PC用のアルゴリズムだとまともに動かないのも少なくないし リサイザー作るだけで大事だわ 確かにSBC使うかメモリを外付けするのが簡単だけど ttps://www.stmcu.jp/design/hwdevelop/discovery/51732/ ttps://www.renesas.com/jp/ja/products/microcontrollers-microprocessors/rx-32-bit-performance-efficiency-mcus/rx72n-envision-kit-rx72n-envision-kit あたりの大画面フルカラー液晶とEthernetと大容量ストレージを接続出来るフラッグシップマイコンはその領域に片足突っ込んでいるのでは ttp://elm-chan.org/junk/32bit/report.html ttp://elm-chan.org/fsw/tjpgd/00index.html あたりの例を見てもアルゴリズム上の問題に見えるし 僕だったら重要人物を再評価するよ。 僕だったら重要人物を再吟味するよ。 僕だったら重要人物を再検討するよ。 僕だったら重要人物を再検査するよ。 僕だったら重要人物を再審するよ。 僕だったら重要人物を再調するよ。 僕だったら重要人物を見直すよ。 僕だったら重要人物を調べ直すよ。 私に於いてはデジタル空間が好きだよ。 私に於いてはデジタル空間が大好きだよ。 私に於いてはデジタル空間が御好みだよ。 私に於いてはデジタル空間を愛好するよ。 私に於いてはデジタル空間を嗜好するよ。 私に於いてはデジタル空間を友好するよ。 勿論ネプトゥーンモンは楽しいよ。 無論ネプトゥーンモンは面白いよ。 当然ネプトゥーンモンは愉快痛快だよ。 一応ネプトゥーンモンは心嬉しいよ。 多分ネプトゥーンモンは喜べるよ。 必ずネプトゥーンモンは斬新奇抜だよ。 絶対にネプトゥーンモンは新機軸だよ。 確実にネプトゥーンモンは個性的だよ。 十割ネプトゥーンモンは画期的だよ。 100%ネプトゥーンモンは独創的だよ。 寧ろ逆にネプトゥーンモンはワクワクドキドキするよ。 他に別にネプトゥーンモンはハラハラドキドキするよ。 例え仮に其れでもネプトゥーンモンはクリエイティブだよ。 特にネプトゥーンモンはドラマチックだよ。 もしもネプトゥーンモンはエキサイティングだよ。 >>231 それってH8の時代の認識じゃないですかね。 C言語の質問があります。 マイコンは、昔に秋月製のH8マイコンを触ったことがあるだけです。 ↓をみてください https://imgur.com/upXwfNZ.jpg Microchip社のdsPIC33マイコンの、AD変換器のヘッダファイルの一部です。 共用体はビット幅が合っていないといけないと思うのですが、 bit幅が違っても、また対応するメンバーが無くても、コンパイラが通ります。 実際のハード上ではCH0SAは5〜0の6bitあるのに、下側には5bit目がないのです。 宜しくお願いします。 >共用体はビット幅が合っていないといけないと思う それは何処ソースの情報ですか? ーーー以下引用、邦訳K&R(第二版)P.179 より抜粋> union u_tag{ int ival; float fval; char *sval; } 変数uには、三つのタイプの内最大値を保持できるだけの十分なスペースが取られる。 <ーーーー 以上引用 周辺機能レジスタのアドレスやビットアサインに対して間違った構造体型でコーディングしてたとしてもコンパイルは通るよ 言語の構文が合ってればね マイコンで実行したら周辺機能が意図通り動かなかったり不正アクセス例外が発生したりするけど その画像だと5ビット目を1ビット単位でアクセスすることがソフトウェア上できないってだけ もしこれがハードウェアの仕様(リザーブビットになってるとか)を反映してるわけではなくコーディング誤りだとしたら自分で修正すればいい 画像の報に質問箇条書きがあったんやな (1)上位に余りがあっておk (2)おそらく下位五ビットにしかビットアクセスする必要がないという事なのでせう。 (3)差があっても おっけー (4)対応するものなんて別になくてもいい。 必要になったなら、241さんの仰るように、(既存のユニオンのメンバーを編集するなり 別途 三つ目のユニオンメンバーを追加して)定義すればええんやで。 教えて欲しいことがあります。CAN通信のマスクとフィルタについてですが、 なぜマスクが必要なのかわかりません。ハードウェアでやるのですから マスクを0x7FFで全開にして、フィルタで全部比較すればいいと思うのですが、 ダメでしょうか? あと、フィルタで0x333を設定して、0x333が来たらデータを付けて SID=0x333の返信をするのは、自分で自分のの尻尾を追いかけるような動作に なってしまって、禁止でしょうか? >>243 です。マスクとフィルタの県は、わかました。 以前はマスクとフィルタの機能をCPUソフトウェアで実現していたからですね。 CPUの負担軽減のためにハードでそれらを実行するようになったとのことです。 どうもありがとうございました。 C言語で、AAA.c とBBB.cという2つのソース間で AAA.cに実体の uint16_t hoge; と書いて、 BBB.cにextern uint16_t hoge; と書くとグローバル変数で使えると思います。 #define を両ファイルで使いたいときは、どのような記述になるのでしょうか? #define hage 10 を両ファイルで使いたいときは、どのような記述になるのでしょうか? AAA.cで数値を変えれば、自動的にBBB.cでも反映させたいです。 ZZZ.hにdefine書いて、全ソースでインクルード。 static と extern の話かと思ったが全然違ったな っていうか include 覚えたニワカが static 書かないと詰むぞ >>247 です。 >>248 ありがとうございます。 なるほど、#includeすれば ZZZ.h の中の #define 値を変更すれば、行けそうですね。 実は、AAA.c、BBB.cともに、main()の冒頭で #include をしています。 int main(){ #include "AAA.c" #include "AAA.c" while(1){ : : という感じです。#includeして、あの位置にAAAとBBBを置いてあるなら、 AAA.cの先頭に1度書けば全域で通じると思ったのですが、だめなのでしょうか。 extern unsigned char ... についても 上記のように main.cの冒頭で unsigned char...と 1度書けば、それ以降には全部通じるので各ソースに書く必要は無い、と思っていました。 そもそも #include "CCC.c" とは、 その位置にCCC.cをテキスト的に貼り付けるのではないのでしょうか? >>249 ありがとうございます。 関数と関数の間に書いた変数は、 暗黙でstatic変数となり、グローバル変数としてずっと値が消えることはないと思っています。 関数の中の変数宣言は、暗黙でauto変数で次回まで保持しない。staticを付けると消えずに値を保持。 >extern ファイルスコープの話やね。 externを伴えば、外部ファイルに参照先を求めるのでそのファイル内に実体を用意しない。 >include .cのfileを、メイン関数内でインクルードする人初めて見たYO 2回インクルードしたら重複宣言でコンパイルエラー起こすやろ(ifdefとかで丁寧に避けてれば通るかもだけど・・・) >>252 >externを伴えば、外部ファイルに参照先を求めるのでそのファイル内に実体を用意しない。 はい、そう思っています。 「コンパイラさん、最後までには、どこかで出てくるので、ここでは見逃してね」と イメージしています。 >include >.cのfileを、メイン関数内でインクルードする人初めて見たYO そうなんですか? 例えば main(){ unsigned char ... unsigned char ... unsigned char ... unsigned char ... unsigned char ... unsigned char ... unsigned char ... while(1){ と、unsigned char ...が多くてソースが見にくいから、外に出そう。 hensu.c として、その中に unsigned char ... unsigned char ... unsigned char ... unsigned char ... unsigned char ... unsigned char ... unsigned char ... を書いて そして、main内部でincludeする。 main(){ #include "hensu.c" // ←すっきり見やすくなる while(1){ のように #includeの位置にそのファイルを入れ込んで(置き換えて)くれる、 というように使用するものだと思っていますが、違いますでしょうか? #include "AAA.c" #include "BBB.c" void func1(){ } main(){ while(1){ とすると、 Global変数と#defineを、AAAの先頭に1回だけ書けば、 BBB.cでもmain()でもfunc1()でも通じる、Global変数、#defineとして使えるので、 BBB.cの中に書く必要はないと思っているのです。 それなのに、まるでxxx.cのファイル単体でコンパイルをするような感覚で コンパイラーがエラーを出してきます。 私のような使い方は、間違いでしょうか。 そういう使い方なら、 ソースがインクルード部に展開されちゃうんだから多重定義でエラーになって当然でそ。 強要したいならインクルードするファイルの中身は extern unsigned char ucHoge; extern unsigned char ucGeho; とか全部externつけとかなきゃ。externの伴わない実体宣言は、ソースファイルの中にインクルードせず 直に書きましょうや。 絶対こうしろとまでは言わんが、いちおう世間さまの流儀では、 AAA.cで実体を宣言している外部変数へのextern宣言はAAA.hに入れておくんよ。 BBB.cからそれらを参照する場合は(関数ないじゃなくて)BBB.cのファイル冒頭で #include "AAA.h" ってしておくのがポピュラー。 関数内にインクルードする人は少数派だと思うんゴ(^p^;) >>253 > unsigned char ... > unsigned char ... > unsigned char ... > unsigned char ... > unsigned char ... > unsigned char ... > unsigned char ... この程度なら別に見辛くないし、実際はもっと多いと言うならその設計を見直した方がいいと思う 晴比古本にそんな変なマクロあったっけ? 俺はあの本だけでCを覚えた 大変世話になったな そもそも#includeするなら1つのファイルと一緒だからexternする必要がないじゃん あの、普通の使い方 (*.hをincludeする。)に合わせて話しませんか。 無知な方に合わせても意味ありませんよ。 >>247 の話でしょ? BBB.c で AAA.c を include すればいいんじゃないの? make で拡張子で判断してビルドするようにしている(なっている)ことが多いのでは。 そういう場合だと、例に上がっているような関数内のローカル変数を hensu.c に 記述すると、その hensu.c もコンパイルがかかって面倒なことになりそう。 cをincludeしている人は、makeファイルも自分で書いてるのかな。 個人的には最近はIDE任せで、もうここ10年以上、makeファイルを自分で書いてない ような気がする。 >>263 すみません、make というか、IDE任せも含めて「make相当」です。 それを含めて「使わない」としたら、バッチファイルでコンパイル、リンクを順次やっているのでしょうか。 それなら、インクルードする hensu.c を単独でコンパイルすることは避けられるかな。 >>265 >バッチファイルでコンパイル、リンクを順次やっているのでしょうか そうだよ。 cmake は make じゃないとかそんな糞ではない。 Makefileってヘッダも追加しとくんやで そうするとヘッダが書き換わったのを判断して必要な分コンパイルしてくれる みんなまだコマンドプロンプトつかってるんやな えらいな 環境がLinuxなのかな Z80使ってた頃はメイクファイルさんのお世話になってたけど DOS窓自体開かなくなって久しいわぁ・・・ 操作は全部IDE 内部的にmake ってパターンでない? ここマイコンスレだろ? -- common.h -- #ifndef __COMMON_H #define __COMMON_H extern unsigned char a; extern unsigned char b; extern unsigned char c; #endif -- main.c -- #include "common.h" int main(char * argc ,char **argv){ a = b+c; } -- sub.c -- static unsigned char a,b,c; static void foo(void){ c = b+a; } まぁ、こんな感じ? うーん、書きながら、どういう構造にしたいんだろうか・・と悩んでしまったが。 むむ、ああそうか、きょうびのマイコンはRTOS乗っけてて プログラム呼び出し時に引数が付くのか・・・ >>253 です。 みなさん、大変ありがとうございました。 >>255 ありがとうございます。私の勉強不足なのがよくわかりました。 "AAA.h"を作って extern unsigned char A1; extern unsigned char A2; extern unsigned char A3; と書いて 各関数の先頭で #include "AAA.h"と1行書くだけで、それぞれで AAA.cの A1 A2 A3 が読み書きできる。 さらにAAA.h の中に、#define hoge 3 も書いておけば、皆さんも参照できるし、AAA.hのそれを変更すれば、 全体に一気に変更の効果が出るということですね。ありがとうございます。 ノートにメモしておきます。どうもありがとうございました。 >>259 >そもそも#includeするなら1つのファイルと一緒だからexternする必要がないじゃん ありがとうございます。ひとつの例として、上げました。 >>262 >例に上がっているような関数内のローカル変数を hensu.c に >記述すると、その hensu.c もコンパイルがかかって面倒なことになりそう。 ありがとうございます。 これも予想していた通りだと思いました。 xxx.cは、それ自体でコンパイルが通らなければならないのですね。そのために、externが存在しているという。 今までよくわからないのでexternを逃げていましたが、そのご説明で納得できました。どうもありがとうございました。 >>270 なるほど、ありがとうございます。 私は、今まで何本もプログラムを書いてきましたが、全部1ファイルのプログラムでした。 #include "xxx.c" は、ただそこに入れ込むだけでしか使ったことがありませんでした。 -- main.c -- unsigned char a, b, c; // Global変数 void foo(void){ // 関数 c = b+a; } int main(){ // main a = b+c; } と、こんな調子です。これだと、そのうちmain.cがドンドン長くなってしまうので、 関数の機能などでまとめたファイル"DDD.c"を作って、 main.cのファイルのその位置に #include...としていました。 そのincludeを許してくれるコンパイラだったので、 externなど知らなくても済んでいたのです。 みなさん、どうもありがとうございました。 #include はコンパイラじゃなくてプリプロセッサの作業だし 通らない(広義の)コンパイラはないと思うよ。 >>274 すみません。言葉足らずでした。 >#include はコンパイラじゃなくてプリプロセッサの作業だし >通らない(広義の)コンパイラはないと思うよ。 #include "xxx.c" の、xxx.c内部にexternとか書かなくても、許してくれる、という意味です。 そっか、xxx.c とするから叱られるんで、xxx.txt として#include "xxx.txt" とすれば、 そのまま置き換えができるかもしれませんね。今度試してみよう。 ありがとうございました >>275 プロジェクトにxxx.cを入れるから単独でコンパイルされておかしなことになるだけ #includeするなら単独にコンパイルされないようにしないといけない。 拡張子の問題ではないけどxxx.incとかにしておけば第三者にも分かりやすい。 externとはこのモジュール(xxxx.c)にはないけれど外部にあるからそのつもりでコンパイルしてくれっていう意味 当然そこにはないけど最終的にはどっかに存在しないと思った通りに動かない。それを解決するのはリンカのお仕事 変数じゃなくて関数でも同じこと、そこにない関数でもインタフェース部分だけそこにあればコンパイラは納得してくれる 外部にあるはずのものは最終的にリンカが結び付けてくれる、なければ動かないのでリンカがエラーを出して教えてくれる コンパイラのエラーもリンカのエラーも意味知らんと、は?ってなるよね 代表的なのが思い付かなかったけど あと、マイコンだと foo(){ unsinged char[2048]; } こういうのだめだぜ? マイコンのメモリサイズやスタックに割り当てるサイズにも寄るけど、 スタックサイズ1Kとかだとスタック飛ぶぜ? なにが起きるかとマイコンのことをわかってやるぶんには問題ないけどな。 picスレでコメントがつかなかったので、 こちらで質問します。 マイクロチップのコード生成ソフト、MCCで DMAを構成したら、コンパイルは通るのですが、output画面に「heap領域が0だぞ」というメッセージが表示されます。 調べたらheap領域とはメモリー全体からプログラムとか変数を引いた残りの領域を スタックと取り合うようです。 私は何か設定しなければいけないのでしょうか? というか、heapを128byteとか確保するということは、どういうことなのでしょうか? 「おいスタック、どれだけ増えても128byteの俺の領域には入ってくるなよ」ということでしょうか? >>282 マイコンの型番は最低限書こうね あと、コンパイラのバージョンとIDEのバージョン >>282 俺は使ったこと無いからはっきり知らんけど 任意のスタックが使えるなら8bitラインではないな おそらくDMAのライブラリがディスクリプタでヒープを使うんだろう MCCのどこかでスタックとヒープのサイズを指定できるはず IDEからリンカの設定でヒープ領域を確保できる malloc で動的メモリを確保する時この領域を使う もしヒープ領域を超えて malloc した場合、他の領域(スタックとか変数とか)のメモリ破壊が起きる スタックも同じで深い関数呼び出しとかの要因で、確保された領域を超えてメモリ破壊することがある どっちも、使用量を見積もって十分な領域をリンカに設定しとかないといけない ちなみに、マイコンによってはスタックオーバーフローをハードで検知できる 向こうのスレでは、ヒープには「函数」の呼び出し元が記録されるらしいww 懐古爺的に言わせてもらえば、 昔はリンカ時点でアドレス割り当てを設定したもんだが 最近のマイコンは統合開発化が進み過ぎてどういう哲学で アドレスの割り当てを担当させるのか見えにくくなってますわなぁ・・・ 当然、答えは知らん!(^p^) そこまで分からなくなったら、Arduinoのやり過ぎだろう。 ハーバードが非ノイマン型なんだと言ってたヤツがいたなあ。 >>291 最近のCPUは、殆どがハーバード型見たいな物だからな。 キャッシュからコアまでは、インストラクションとデータのバス独立してる。 C言語で質問があります。ネットで、enumというのを見つけました。 enumはenumeration(列挙)の略です。 #include <stdio.h> enum week { Mon, Tue, Wed, Thu, Fri, Sat, Sun }; // enum型の定義 int main(void) { enum week wk0, wk1, wk2; // enum型の宣言 wk0 = Mon; // enum型のメンバを代入 wk1 = Tue; wk2 = Wed; printf("Monの値は: %d\n", wk0); printf("Tueの値は: %d\n", wk1); printf("Wedの値は: %d\n", wk2); } これを見たとき、 if( today==Mon ){... などとできて便利かな、と思いました。 そこで質問なのですが、 1) mainで使うときに、enum weekという宣言をしなくても unsigned char wk0; とすれば、 wk0 = Mon; と同じなのでは無いでしょうか? 2) さらに言うと、#define Mon 0 #define Tue 1・・・#define Sun 6 として unsigned char wk0; wk0 = Mon; としてもまったく同じな気がするのですが、これは間違いでしょうか? 3) enumはどんなときに便利なのでしょうか? >>294 K&R第二版P239に解説があった。 要約すると、列挙型変数は整数型変数の様に振舞うけど 該当する列挙型オブジェクトに含まれない値を用いるコードを書くと エラー警告してくれるらしいんよ。 想定外の用法の自由度を、予め殺したておきたい場合に使うという事やね。 あとは enum flower {Rose, Lily, Tulip, NumberOfFlowerTypes}; const unsigned short price[NumberOfFlowerTypes] = … みたいに配列の要素に使う場合、メンバの追加時に記号定数マクロと違って値の変更をしなくていいとかもあるかな C の enum は辞めて C++ の enum 使えって じいちゃんが言ってた ,-,,,,、 ,-,,,,_ ,,,,,,,、 ,,,,,,_゙'-,. "'i、 .,,,,,,,、 ,,,,,,,゙'-、^'i、 .i,¬ー-、 ゙''i、`\ \.`''-\,,l゙ `'i、 `''i、 ‘'-,`''-\,,l゙ ^'i、 ,) 丿 ,l,_,,,,,,,― |i、 } 丿 Z_,,,,,,-ヘヽ、゙l | .| __ ,/ ,,-----=@,,,7゙"` ,/ ,,-----=@,,,)゙″ | | .,,-'",,,,,,、`'i、 ,/`./ / 丿 / .,/` ,l゙ 丿 |゙ヽ,,,―" `゙'ュ‐゙_,/゛ | | .,/.,,/` /` 丿 ,/ ,/ ,/ 丿 \,,,,-‐,! '`,/ .| l゙ ,,-",,/ 丿 ,i´ ,/_,/ 丿 ,i´ 丿 ,,,i´ ,! | i彡‐" ,/` ,/` ィ,ン'" / ./ ,/ .| | | ,,i´ ./ ,,‐`./ ,/`.,┤ | | | ./゙| .,/ .,/ ,/ .,/ / 丿 | .| { { .,/ ,l゙ ,,/ ,/` ,,/ ,/` / ,、゙'-,| l゙ | }, ._/.ノ _,/゙,,/゛ _,/゙,,/゛ l゙ .,/`\ | ヽ,_ ゙"゛,,/ (ン'"゛ (ン'"゛ `″ ゙l 丿 `゙゙゙゙゛ モダンボーイかなんかだろ わかってるけどボケてんねん モブとかホモのほうが面白いだろ Z80の発売はまだかね・・・(゜'ω゚'`;;)ヨボヨボ >>303 つまらん。 その顔文字は、説明上必要なんですか? おそらくパレイドリア効果のシミュラクラ現象っていうやつだろうね(^p^) 顔文字はスルーするからいいけどそのURLは何なのかな? 大抵エラーなんだけど テラタームのようなターミナルソフトを RS232経由でマイコンで駆動したいです。 改行は0x0dを送ればよいですが、 画面を消してカーソルを左上に戻すには、 どのような16進数を送れば良いでしょうか? 連投すみません。もう一つ教えてください。 ローカルエコーをマイコン側から入り切りの操作は出来ますでしょうか? テラタームのようなターミナルソフトを RS232経由でマイコンで駆動したいです。 改行は0x0dを送ればよいですが、 画面を消してカーソルを左上に戻すには、 どのような16進数を送れば良いでしょうか? TeraTerm 対応制御シーケンス で検索。URL書けないので。 シーケンスっていうぐらいだから、連続処理が前提。むしろ1キャラが例外。 >>317 の表の各モードを使ってみたいけど、 >>318 の示す部分の設定で変えればOKですか? VTxxxの数字を変えれば、 モードが変えられるのでしょうか? ということです。 >>319 試せばわかる話じゃん シリアル流して画面に表示するテストプログラム書いてやってみよう >>319 なぜ、まず自分で試そうとしないのですか? PIC, RL78, STM32 次にやるなら何? >>329 4bit の処理は出来ないから、1bit マイコン4個のマルチコアになるんかな? MC14500で作るプログラムは多ビットのリアルタイム処理になる そういえば8ビットCPUのPICでPLCをシミュレートした市販品があったな 計算速度は欲しいが移植性も確保したい場合ってどうすりゃ良いんだろ 1.32bit前提で書く 16bitや8bitは最適化コンパイラに頑張ってもらう。別途バイトオーダー対応が必要 2.8bit前提で書く 全ての環境で期待通りに動くが32bitだと少なからぬデバフがかかる 最適化コンパイラといえども8bit×4を32bit×1にはしてくれない 3.クリティカルな箇所は32bit用と8bit用をのコードを用意する 確実に保守が面倒になる。無用なバグの元になりそうだし う~ん悩ましい・・・ 8bitと32bitで移植性と計算速度の両立は無理 計算速度だけじゃなくてリソースもコードを分ける理由になる 速度が欲しいところだけライブラリにしてコードを分けたりはする。 すべてがすべて速度がいるわけじゃないっしょ? だから3かな。 >>最適化コンパイラといえども8bit×4を32bit×1にはしてくれない メモリ配置の話? 計算速度と関係ないだろ。むしろ遅くなる。 一応TJpgDecと言う前例があるんでこれ参考にしながら作っているけどなかなか難しい >>339 作っているのはライブラリ。マルチメディアデータ用なので扱うデータ量は多め >>340 8bitロード×4回と32bitロード×1回のどちらが早いかみたいな話 例えばARGB8888を1バイトずつストアするコードを32bitのストア1つには最適化してくれないよね そういうコードでアーキテクチャによってコードを分けたいなら Arch別にマクロにしておいてインクルードするか、Archごとにifdefで分けるかな? #ifdef __ARMHF #include "armhf_xxx.inc" #elif __H8 #include "h8_xxx.inc" #endif みたいな? と書いてみたものの、自分が担当だったら影響が大きそうな8bit合わせにして終わらすなきっと。 8bitでいけるやつを32bitに持ってったときにそのロスは問題にならんだろうと。 全部gccとかならコンパイラ最適なコードを書くかも。 8bitマイコンのメーカーコンパイラの最適化は糞な印象しかない >>341 struct になってれば 32bit 一度に読み込むんじゃね? ってか、32bit 使うコードにしとけば 8bit マイコンだと 4回アクセスになるでしょ。 >>342 FFMPEG なんかはアーキテクチャ毎に細かく最適化されてるね。 8bit環境は非常に制約が多いのが普通 速度だけ考えてコードを書けばいいなんてことは非常にマレ ROM足りない、RAM足りない、...なんてのは普通 環境が決まってるならそれに最適化するしかない 決まってないなら最適化など不可能 動作するかどうかすらわからん PIC10F200で動くか? と考えればどんな環境でも動くなんてのは妄想だとわかる エンディアン、charのサイズ、負の数の表現、... 可能性の非常に低い環境を考えるのも無駄 演算の最適化も バレルシフタ、乗算命令、DSP命令、FPU命令、キャッシュ、RAMサイズ などで全く違う 組み込みの移植性なんて幻想、命ずる側はそれが分からんのですよ。 イチゼロ…ジュウじゃなくてイチゼロ・・・つまり、16段階評価という事ですね! >>348 どうせ移植時に大きな作業が発生するんだから 移植するときに考えれば良い その方が効率的 >>342 バイトオーダーの変換とかもだけどそれやると可読性が低下するよね。とはいえ背に腹か・・・ >>343 C言語の構造体のメンバ配置は処理系依存じゃなかったっけ。TJpgDecもFatFsも入出力に構造体を使用していないし というのと1バイト×4=4バイトの構造体のコピーでもMSVCは4バイトでコピーしてくれるみたいだけど CC-RXだと4回の1バイトコピーになった。構造体を32bit型にキャストしてようやく4バイトコピーになった >>351 ビットフィールドにすれば32bitにまとめられるだろう。 処理系依存とか言い出したらcharが8bitじゃないかもとか longだって何ビットなんだとか色々あるし。 >>351 メンテナー配慮ってことで #ifdef __ANSI ごくごくふつーのきれいなコード #elif __ARMHF arm超最適化コード #elif __H8 h8超最適化コード #endif みたいに、何をやってるのかわかるようにしておいたり #コメントよりもきれいなコード派なのですごめんなさい 帰宅したんでID変わっています まだコンポーネント単位で試作して実験している段階ですが ・ロードとストア ・算術右シフト あたりが処理系の影響を強く受けそうな印象があります >>352 最初にビットフィールドも検討したんだけど EXP11-C. ビットフィールド構造体のレイアウトについて勝手な想定をしない ttps://www.jpcert.or.jp/sc-rules/c-exp11-c.html らしいのであきらめました 型のサイズはTJpgDec同様にC99前提にしてstdint.hを利用する予定です >>353 参考までに「きれいなコード」ってどんなコードを指しているんでしょうか 処理系依存を回避していくほどコードが読みにくくなる気がします >>354 教科書的なコードといったほうがいいかな? 説明的なコード? a=a<<1; よりも a = a*2; *a++ = xxx よりも for(i=0;i++) a[i] = xxxx みたいな。日本語の文章でコメントを書く的なコード >>356 いや、速度を優先させてarch別に書いて行くと 可読性が悪くなるって話で、 そういう場合、使わないけどANSIでコメント的に書いておくって話。 というかググって出てくるCの解説は注意書きもなく処理系依存しているのが多いんだなと痛感してる Rustを使えるならpackedあるし構造体のメモリ配置で困る必要なんてないんだろうなぁ >>355 なるほど。そう言う書き方もあるのか >>355 for って、終了条件なくても大丈夫なんだね。 >>336 の処理の具体的な中身が書いてあればもう少し具体的な話が出来ると思う 規模とか計算量とか演算精度とか 8bitで動くんだから大した規模、計算量じゃ無いんだろうけど >>360 ダメじゃん。 ってか、無限ループにならないの? 必要精度とかに関してはまだ実験中。先日までint長が要32bitでどうしようかと 考えていたけど式とパラメータを調整したら16bitでいけそうかもになっていたり ちなみに struct PIXEL{uint8_t r, uint8_t g, uint8_t b, uint8_t a} struct PIXEL src, dst; dst = src; みたいなのをCC-RXに速度優先設定でコンパイルさせたら パディングされているわけでもないのに1バイトずつ4回コピーしてた どうしてそうなる・・・ A B C 3人の早押し判定プログラムを作ろうと思っています。 mainでぐるぐる監視して、入力が来たら表示すれば良いと簡単に考えていました。 100 010 001 簡単ですが、 110 101 011 とか 111 の時は、どのようにすれば良いのでしょうか? クロックをPLLしてガンガン回せば、複数同時は減るでしょうが ゼロにはなりません。 複数来たら左の人優先とかやると、不公平だし。 >>362 ループでコピーしたときに *a++ = xxx; より a[i]=xxx; のほうが遅いけど見やすいでしょ?って話よ。 for(i=0;;i++){ if(i==50) break; } みたいにforの終了条件なしはできるよ。 >>363 32bitでunion切れば1回でコピーされるよ多分。 >>364 マイコンのソフトの話じゃなくね? 111のときは引き分けにすれば?競馬だって100m走だって同着はあるしねなくせないよ。 んでも、今どきのマイコンで作れば同時に押されたってことになることは ほぼないので実用上問題はないと思うよ。 >>362 真ん中の条件省略したら無限ループになるよ(もちろんループ内のbreakで抜けられるけど) for( ; ; ){ ... } で無限ループを作るのはよくある >>363 >>必要精度とかに関してはまだ実験中。先日までint長が要32bitでどうしようかと ちょっとまて。 C言語ではintは16bit以上と定義されているので、 32bitが必要ならlongを使わなきゃ、たまたま動いてるだけでコードとしてはバグだよ。 >>364 > 複数来たら左の人優先とかやると、不公平だし。 ランダムにするなり優先した回数数えておいて少ない奴にするなりすれば? そもそも>>365 の言う通りそんなことになることは滅多にないしそもそも入力をなにでやるのか知らんけどスイッチとかならスイッチのバラつきのほうが不公平になるわ >>365 見やすい見にくいは人それぞれ 遅いかどうかは環境次第 stdint.h が使えるなら、ビット長に悩まなくてもいいような。 >>367 整数拡張の話。入力値が8bitなどint未満の場合intに自動変換されるけど 計算式の途中でintの範囲を超える場合に言語仕様上どうなるのか調べきれなかった 自動的に更に長い型に変換されるという説明は見つけられなかったので処理系依存か? 基本的に長い型へ変換されるらしいのでどれか一つを32bit型にキャストして おけば安全そうではあるが >>366 #define ever (;;) ってやつですな。使ったことないけどなんかの技法書で見かけた >>364 ABCの順で判別するループ BCAの順で判別するループ CABの順で判別するループ この3つのループを繰り返せばいい >>372 処理系依存だよ 普通はオーバーフローするけど保証はされていない >>364 if( ABC != 0x00 ){ if( ABC==0x01 ){ printf('A'); } if( ABC==0x02 ){ printf('B'); } if( ABC==0x04 ){ printf('C'); } } で良いのでは? >>367 int が 16bit 以上って、C99 で決まっんだっけか? 元々処理系依存だったような。 stdint 使おうぜ。 >>377 結局ややこしいからint32_tみたいに定義しなきゃならないのな >>364 ぐるぐる監視するのはポーリング処理といいます。 割り込み機能を使った割り込み処理の方が見分けやすくなります。 より早く更なる厳密化を図るには、マイコンへの入力段で論理回路で組み識別しませう >>372 決まってる 仕様書参照 int=long かどうかで微妙に違う >>376 これだとサンプリング期間内に同時押しが発生したときに'A'が優先で不公平になってしまうんじゃないかな サンプリングごとに if( ABC==0x01 ){ printf('A'); } if( ABC==0x02 ){ printf('B'); } if( ABC==0x04 ){ printf('C'); } を順次切り替えてどれか一つだけの判定をすれば「正確ではないかもしれないけれど平等」にはなると思う 同時押しなんてほとんど発生しないんだから難しく考えるだけ無駄。 AチェックBチェックCチェック順番にやってグルグル回しとけ。 >>364 それぞれのスイッチ入力毎に割り込みをかければ良いだけ。 その後は、その割り込みの中で、全ての割り込みを禁止して、 たとえばピンポンと鳴らして、スイッチ別のLEDを点灯し、 ある時間経過後に、もう一度スイッチが押されたらLEDを消灯して、 全ての割り込み許可し、次のスイッチ・オンを待つとか・・・色々。 WDTを適当に仕掛けた方が良いかも。 >>374 でよい 2つ同時入力されたときに、3つのループのうちのどの処理中であるかがランダムだからだ 当然1つ入力だったらどのループでも同じ >>372 処理系依存 16bit以下のCPUだと、16bitを超えたら0になるんだよ。 処理系に依存しない純粋なC言語として書くなら longにしておくべき。 >>377 C89でもintは16ビット以上だよ >>384 割り込み使ったことないのか? 普通に優先順位あるだろ >>372 あなた宛、もう1行あるよ。 >>363 32bitでunion切れば1回でコピーされるよ多分。 >>387 この場合(3個のスイッチ操作による割り込み待ち)の割込み処理では、 最初に発生した割り込み要因の割り込みルーチンが実行される。 既に発生済みの複数の割り込み要因を順に(ラウンドロビンなど)処理するものでは無い。 >>389 > 最初に発生した割り込み要因の割り込みルーチンが実行される。 だから同時に発生したらどれかの割り込みルーチンが「優先されて」実行されるだろ >>390 PIN毎に別々の割り込みベクターがある前提かな? >>391 > PIN毎に別々の割り込みベクターがある前提かな? そういうのは珍しくないけどだからと言って割り込みルーチンは同時に走らないだろ 見たことないけどマルチコアで同時に走る奴があったとしてもどこかで早押し判定するんだからそこで優先順位をつけるしかないし 無理なんだってば・・ クロックが100GHzになったって1マシンサイクル以内に 2つ押されれば同時押し判定するしかないんだから。。 TVとかだったら「おおっと、これは珍しい、同時押しですよ引き分けとしましょう。」 みたいな進行にしてもらうか、右から順番に適当に優先度を付けて不公平にしておくしかない。 >>394 あ、やっぱりつこっまれたw >>386 の0になるは間違い。 相当へぼなプログラムでもない限り 全く同時なんてことは 現実的にはほぼ起こらないだろうけど 別に人類の命運がかかっているわけでもなく タダの遊びに使うのなら 同時検知時は 内部的には 処理的にはどっちが速かったかを乱数で決めて 対外的には 機械がわずかな差をとらえたんですねー ってことにしとけばいいだろう(^p^) >>390 説明するまでも無いと思って省略したけど、当然スィッチ別に割り込みが可能な話です。 割り込みトリガ処理はCPUのハードウェアが担当するので(FFなどで)、 ハードウェアレベルで同時に(多分数nS〜数十nS以内に?)事象が発生したら、 CPUの処理順序はクロックのタイミングなど運次第という事になる。 >>396 「わ〜ん、僕の方があの子より5nS早く押したのに、機械のバカ、バカ」とかクレームがつくぞw ケーブルの静電容量や抵抗、ボタンのONストロークやON加重、スイッチのチャタリング等を無視して 判定機のnsオーダーの衝突を議論してもほとんど意味がない 比較的シビアな判定が要求される格ゲーとかでもせいぜいフレーム(16.67...ms)オーダーだし msオーダーを判別できれば実用上問題ないのでは >>398 > CPUの処理順序はクロックのタイミングなど運次第という事になる。 ハードに詳しくないんだろうけど今時の論理回路はクロックで同期されてるからクロック内で両方の信号が立ち上がったら同時と見なされて予め設定されてる「優先順位」に従って処理される 運次第とかないからw >>399 さすがに実用性云々なんて言ってる奴はいないでしょ >>391 >>384 はそういう前提に読めるし 同一なら結局ソフトで判定する事になる いずれにしろ>393の通り それより 座席の位置差による問題音声到達による不公平は どう解消してるんだろうか 早押しにハンデの時間設定機能に挑戦しよう B選手は強いので早押しに三秒のハンデです 押してから三秒間は他の人の早押しが優先です!! C選手は2秒のハンデです ・・・みたいな。 それよりも、距離差による電圧降下で、たとえ同時に押しても、 ポートラッチするしきい値まで到達する時間に差が出てしまう。 この不公平をどう解消してるんだろうか 一方ロシアはリレーで先押し回路を組んでCPUに配線した 仮にハードウェアで実装したとしても素子の動作には時間が必要なんだし一定間隔以下判別は不可能でしょ 同時は同時で表示して 同順の子同士で じゃんけんとかで決めて貰えば良いんでね? どちらが早いかなんて観測者によって変わるんだから全くの公平なんか存在しない 相対論を勉強しなさい ダークマターやダークエネルギーは 相対論と量子論の綻びだと思うが 将来それらが補強されることはあっても 否定されることは無いだろう 特殊〜は 既に信憑性高くて 一般〜は まだ仮説に過ぎないという話を聞いた。しらんけど マニアックになりすぎて質問者がいなくなるという、ありがちなパターン 切って切って切りまくった神回 桃太郎侍にも大江戸捜査網にも子連れ狼にも負けてない >>408 大学の講義で相対論の講義受けたか?www >>404 何で席位置に特化して電線短くするんだよ・・・ 各スイッチへの電線長さ同じにしとけばいいだろw それでも見込まれる電線加工誤差起因の距離バラツキのフェムト秒オーダーの差が不公平だって? そこまでいけば運も実力の内だ!あきらメロン 席の差(音速) > メカの差 > クロック > 回路 七廻り半って抵抗値もリアクタンスもシャレにならなさそうやな・・・中継用のリピート局設ければいいのか? 光は直進するはずだが 7.5回も廻れるほど地球の重力はでかいのか 光が直進するだなんて迷信です。 そのメカニズムは、ホイヘンス波(素源波)を持ち出さなくても説明できる。 結論から言うと、東海道新幹線のレールに沿って進んでいるのだ!!(^p^) 光にまとめると基本通話料が今なら三か月無料キャンペーンなんじゃね?しらんけど ファイルコンペアがしにくい時代になって世知辛いでう; フリーソフトも怖くてなぁ・・・ DOSの頃はfcとか、 VisualCの頃はWinDiffとかでファイルの差分比較がし易かったけど 最近は皆さんどうされているのでしょう? みたいなノリです fcは一致不一致をerrorlevelで返してくれないので使いにくかった >>430 WinMargeというのがお勧めです。 >>430 仮想マシン下でLinuxインストールして 共有フォルダにしてるわ。 Linuxはコマンドラインツールが豊富だしね。 WSLも良いんだろうけど >>436 フリーソフト怖いとか言ってたら、 少なくとも半分のwebサービス使えない。もちろん5chも。 OSSは怖くないが、OSSでないフリーソフトが怖いってのはわからなくはない。 確かに怪しいフリーソフトあったな。 昔は入れてパソコンめっちゃ調子悪くなったことある。 今あるのか知らないけど、 晒されるやつとか怖すぎるよね。 フグと同じで、最初は一部の人が手を付け、あとから大衆がついてくる。 無難であることを優先する人は、評判を探してから導入するかどうか判断するよな。 セキュリティソフトもある程度は役立つ。 動作が重くなったり誤作動のトラブルとかでデメリットもあるけれど、メリットは見えにくいしね。 MPLABXIDEの中に比較機能あったわ紹介してもらったのにサーセン 今マイコンで日本語入力を実装するにはどんなアプローチがあるんだろ? とりあえずPCベースで使えそうな日本語入力エンジンを探してみると ・Qt Virtual Keyboard(OpenWnn for C++) ・Canna ・SJ3 ・Mozc あたり?メーカー提供のコードと衝突しやすいGPLやLGPLは除外した フットプリント的にDOSのFEP程度が上限だろうからMozc以外のどれか?調べてないけどMozcはでかそう 全てに言えることだが実装の解説やポーティングガイドみたいな資料は見つからない 御菓子をくれなきゃイタズラするぞ(英訳するとトリックオアトリートってやつ)って 刑法で禁止されている強要・脅迫行為じゃないかと思うのですが なんで蔓延っているのでしょうか。少年法かなんかですか? しらんけど(^p^; 日本にはアホニーチャンやアホネーチャンがいっぱいいるから 彡 ⌒ ミ (´・ω・) まったくハゲはしょうがねえな… ____(____)__ / \ 旦 __\ <\.※ \____|\____ヽ ヽ.\ ※ ※ ※| |====B=| >>447 お菓子をくれないと(性的な)悪戯するぞ? こどおじならしてもいいんだよな?w おいこら誰が許可した! 全く、勝手に禿げ散らかしやがって・・・ 好き嫌いせず、がまんして納豆食え納豆! エストロゲンを補給するんや!!(^p^) スレ違いですが、適切な場所がわからなかったのでここで質問しちゃう 汎用のマイコンFPGA基板を作るんですが、 出来るだけ汎用的に実験や学習出来る基板をコンセプトに、 モーター制御、カメラ制御、ネットワーク、高速計算、アナログ 質問は この機能やこのIC載が乗ってると周辺回路の制作手間が簡単に出来て 便利そうなのをあらかじめ搭載しておきたい。 例えば 汎用オペアンプ(計測) ゲートドライバ(FET付ければすぐ動かせる) レベルシフター(3V-5V相互とか) リアルタイムクロック パワーFET FPC(フラットケーブル)コネクタ スリープ時のバックアップボタン電池ソケット 12V電源から受電回路(24Vか?) など、載せとくとはかどるICや機能ってありますか? 基板作ってから、あーあれ乗せとけば良かったって後悔すると思うので アドバイスをお伺いしたいです。 汎用って言ってもなぁ 普通の評価ボートと同じような感じじゃないの? マイコンの規模にもよるしなぁ んでも、usbシリアルとパラシリ・シリパラはのっけとくかな >>457 レスありがとうございます。 そうです、普通の評価ボードなみのもの、汎用って言ってもその程度です。 raspberry pico と FPGAロジックゲート2万 で考えてます。 シリパラ、パラシリですね、これは必要ですね。 >>459 MAX10なら基板に実装済のが買えると思う。 USBブラスターも互換品なら安いし、もどきなら自作も可能。 ドシロートです。 マイコンからTeraTermとかのターミナルソフトに文字を書くとき、 0x41 (右1つ) 0x42 (右1つ) 0x43 と、桁が右に1つ移動する信号を送信しなくても 0x41 0x42 0x43 と 文字の分だけ 3byte送信 すれば、ABC と、1桁ずつ右にずれて 表示されます。これはなぜですか? ターミナルが桁移動をやってくれるのでしょうか。 そうだとすると、 バックスペースキーで直前の文字表示を消したいときは、 0x08(BS)を送って1文字左にずらしても、ターミナルがすぐに右に1つずらすので、 一生左には行けないということでしょうか? >>462 エスケープシーケンスでググる TeraTermがデフォルトでどういう端末をエミュレートしてるか調べる >>462 通信端末ソフトは通信データを ログとして表示してんよ 液晶表示器のドライバが念頭にあるのなら もちろんそういう管理もしてくれている。 左にカーソルを動かしたいならキャリッジリターンとよばれる制御文字を送ればいいんじゃね?質問の趣旨に適うのかしらんけど(^p^; >>465 何言ってんだ?オマエ。 知らんなら黙ってろ。 BSバックスペースは大抵は 0x08 0x20 0x08 の3bytesを送信する >>467 ありがとうございます。 ということは、BSの場合は特別に、次の桁に移動しないということでしょうか。 ・BS 1つ戻る が、その場に留まる ・' ' スペース1つ書いて、自動で右に行く ・BS 1つ戻る が、その場に留まる これで、都合1つ前を消したように見える。 関連で教えてください。 RS232は、その昔、電動タイプライターによる通信だと聞いたことがあります。 CR, LF, TAB などは、ヘッドが先頭に戻る、紙が1行分上に移動する、決まった桁数送られるなど、 非常にイメージが湧くのですが、BSはどのように使われたのでしょうか? ヘッドが1つ左に戻るのはわかるのですが、 スペースを打っても、すでに打刻した文字が消えて無くなるわけではないですし。 '-'でも書いて「訂正だよ」とするのか。 マイコン以前のタイプライターは $を打つときは S+0x08+| と打鍵していた しらんけど >>468 >BSの場合は特別に、次の桁に移動しないということでしょうか。 違う 0x00-0x1F の制御コードがそれらの機能を果たした後の位置にカーソルが留まる 0x08 はその一部 £を打つときは L+0x08+= と打鍵していた しらんけど >>470 >0x00-0x1F の制御コードがそれらの機能を果たした後の位置にカーソルが留まる ありがとうございます。 そういうことですか。0x1Fまでは留まり、0x20以上は次桁移動、ですね。 納得できました。 どうもありがとうございました。 お願いします。 C言語で、長い数値に L を付けるようです。 #define FREQ 8000000L このLについて検索したいのですが、検索キーワードがわかりません。 何の意味でしょうか、付けないといけないのでしょうか。 >>473 そのLはlong型のL 付けた方が文法的に正しいが、付けなくても今どきのコンパイラなら空気読んでよろしくやってくれる >>474 ありがとうございます。 LongのLですか。なるほど。intはIとでもするのでしょうか。 なぜに こうしなければならないのでしょう。 コンパイラか「Lを付けてくれ」ていうことですよね? C言語の仕様書読めばいいんじゃないの? JIS X 3010とか。 釣り臭い質問者だが デフォがintなのでIは付けない L付けないとintに代入したとき オーバーフローしてて困ったりする L無しからlongに代入は符号拡張も気にしないといけない 最近は善きに計らえでも良いけど知らないのは問題ある ♪L? L! LはLIPのL! このくちびるに 燃える愛をのせて Lはあなたをみつめてる〜(^p^) >>475 多くの場合はコンパイラが空気読んでくれるが、意図しない処理になる場合があるから、型はしてしておいた方が良い。 >>476 , 477, 479 ありがとうございました。今後は注意するようにします。 ありがとうございました。 C言語 サフィックス で検索したらいいよ 型に関連するコーディングルールはMISRA-C が参考になるよ 趣味レベルなら意識しなくてもほとんど困らないと思うけど シリアル通信での質問です。 PCとマイコン間で通信する手段としてシリアルポートを使います。 大き目のデータをマイコンに送る際、WindowsではTera Termからファイルを送信すれば実現できますが 開発プラットホームがLinuxの場合以下のコマンドは存在しますが、ファイルの送信ができません。 cu:ファイル送信のオプションがない zmodem:モデムのハンドシェイク手続きが必要?ファイルと関係ない文字が送られる。 screen:ファイル送信のオプションがない 単にhexファイルやelfファイルなどのASCIIコードがまとめて送れればいいのですが 何も言わずにファイルの先頭からシリアルポートへ送るコマンドありますか? type hoge.txt >/dev/tty0 で出来るんじゃね? データ転送は cat <file_name> > /dev/ttyS0 cat <file_name> > /dev/ttyUSB0 ttyS0,ttyUSB0等はデバイス名 通信速度は stty -F /dev/ttyS0 9600 らしい、やった事無いけど >>483 ,484,485,486 おーcatの標準出力先でいいのですねー 単純なシリアル通信エコーバックを実装したマイコンから全部返ってきて成功が確認できました。 ありがとうございます。 Windowsばっかり触って、そういう発想が出ないです。 失礼ながら、みなさんさすがですね。 ありがとうございました~^_^ >>487 このスレの人は、結構頭いいと思う。 現場経験に裏打ちされてる感じがする。 >>482 uucp とか uuencode/uudecode Motorola S record format デバイスをファイルとして扱うのはUnixが先輩。 Windowsが倣っただけ WindowsというかDOSというか。 DOSの事を UNIXもどき と書こうとして UNIXもがきとタイポしたライターさんが 面白がってそのままその表現を使った、みたいな話もあったらしいですな・・・ そういえばビルゲイツ猊下の功績はBASIC言語に関するもので、 MS-DOS自体は他人の開発品を買い取ったものだとかいう話を聞きかじりました、いわく、 開発者自体はくいっくあんどだーてぃーおーえすでキュードスとか呼んでいたとかなんとか;ホントかどうか知らんけど >>491 当時標準だったCP−Mの互換OSをどっかの会社がつくったのをマイクロソフトが買い取った。 汚い造りとか言うが、当時のコンピューターの性能考えたら、みてくれにかまってる余裕無いと思う。 というか多くの産業が他人が生み出したものを単独または複数の団体や個人がブラッシュアップすることを積み重ねてきたわけだし。 悪く言う人の視点って、たいていの場合悪く言うための視点だしね。 >>497 「マイクロソフト帝国 裁かれる闇」という本にMSの汚いヤリクチが詳しく書いてある 読んだら考えが変るかもしれない 任天堂といい マイクロソフトといい いやはや この世には、神も仏もいないのかと思うよね(^p^;しらんけど 諸宗教の神は ヒトに智慧のみは与えるな、 子供には鞭で訓育しろという価値観だし 逆に人に知性や火を与えるのは悪魔や悪い神という構図構成、 仏教も本来は生老病死という苦痛に満ちたこの世の輪廻からどうすれば脱却(解脱)できるか?を 解いてた宗教なわけでこの世に留まり暮らす事を是とする様な現状の大衆宗教の教えとは真逆な物だし、で。 まぁありていに言って地獄だよね、ここは。しらんけど(^p^) Microsoft傘下のChatGPT 学習内容に政治的な偏りが出ることは必至 価値が下がったように思える。 >「マイクロソフト帝国 裁かれる闇」という本にMSの汚いヤリクチが詳しく書いてある マーガリンはプラスチックと書かれた本を見たらバター派になる、みたいな単純な話。 書かれてなくても、ほかの企業も同様の汚いヤリクチをやってきているだろう、ぐらいの ことは考えたいもの。(ほかの巨大IT企業に闇がないとでも?) 今の俺たちの快適な生活環境も、たくさんの戦争や幸せな発展や汚いヤリクチや人の不幸の上に 成立してるんやで。それもまた原罪といえば原罪。 「汚い」にもピンからキリまであるし 白鳳のエルボースマッシュみたいなものもある 「汚い」にもピンからキリまであるし 白鳳のエルボースマッシュみたいなものもある そういや印度でその名前つかうなといちゃもんつけられて商標訴訟起こされて 裁判に勝って名乗り続けている方のマイクロソフト社はベビー服屋さんだったっけか。 産着出す予定でもあったのだろうか? 印度人もびっくり ララア専用モビルアーマーの名前変えさせた有名某社も、そんなら とっととモバイルアーマーの販売をはじめんかい、とも思うが; かつてマイクロソフトを分割しろと集団で訴えていた会社たちは、 本質的には、マイクロソフト的なものをダメだと言っていたわけではなく、 自分がマイクロソフト的なものになりたいがために、 トップにいたマイクロソフトを引きずり落としたかったんだんだよな。 車に轢かれて道路上に転がっているスカンクとMSの弁護士の違い スカンクの前の路上にはブレーキ痕があるが、MSの弁護士の前には アクセルを目一杯踏み込んだ痕がある。 戦果が予想外に低かった時に、過大な戦果を見込んで結んだ法外な契約金の 支払いを渋った某社が暗殺を依頼という可能性はどれくらいあるのだろうか?しらんけど(^p^; RTOSの比較って使ってみるしかないの? 無償で試せるのだけでも軽く二桁あるんだが >>513 自力で比較したいなら自分で使ってみるしかないけど、数が多くて大変だよね。有名どころに絞るとか、誰かの記事を参考にするとかしたら? https://monoist.itmedia.co.jp/mn/series/18826/spv/ >>514 サンクス。読んでみます 最近はRTOSと言いつつリアルタイム処理よりアプリケーション開発基盤として語られていることが多いように感じます みんな大好きFreeRTOSもアプリケーションの開発関係の記事ばかりで、本来のRTOSや組み込みOSとしての 解説や評価などはほとんど見ないような・・・ 時間管理はもちろん、内部構造の把握のしやすさとか、移植性とか、抽象化レベルとか 自作すると面倒くさい問題の解決を支援してくれる機能とか リアルタイム性最優先ならOSなんか使わないのが一番 実用性あるもの作ろうとしたらマルチタスク無いとほんと苦労するから。 msecオーダーのユーザーインターフェイス程度のリアルタイム性はRTOSで設計。 計測やナノ秒リアルタイム性求めるアプリなら、FPGAかASICで設計しないと。 「リアルタイム性」を理解してない奴がなんでこんなところに居てんの? >マルチタスク無いとほんと苦労するから。 複雑な仕様を「割り込み+ポーリング」のシングルタスクで作るのは プログラムが大きくなって時間が掛かるし、バグも生まれやすくなる。 そのマルチタスクのルールやクセも理解せずにプログラムして、 デバッグもできない深刻なバグを作るところまでがセットだな。 自分で作れば理解なんかする必要は無いw 大昔、AVRのTiny2313用のタスクディスパッチャ作ったけど、役に立っている。 アセンブラで言えばアブソリュートでifもmacroも無いようなもんだけど、 こんな原始的ものでも有ると無いとじゃ大違い。 新プラトン派の連中も、「プラトンが言っている事は正しい、が プラトンは自分が言っている内容を理解はしていなかった」ってことで プラトン派と たもとを分かったらしいで; しらんけど 「msecオーダーのユーザーインターフェイス程度のリアルタイム性はRTOSで設計。」 www >>519 OSを使う方がはるかに複雑でコードサイズも大きくバグも生まれやすい そもそも、同期の仕組みもなくmsオーダーでしかスイッチできないようなものはRTOSとは呼べない ディスパッチャさんのマルチタスクはすごいんだぞ! アセンブラしか使えないし、俺ルールだらけで他人には全く使いこなせないんだぞ! ここ急にレベル落ちたな。 言葉使いもなんだか・・・ 長年ココ見てるけどレベルが高かったためしなんかないぞ 今のご時世にマルチタスキングが難しいとか言っている人は プログラミングのパラダイムがシングルタスクのままなんだろ 「動けばおk」みたいな設計をしていたらそりゃ大変で当然だわ アマチュアにマルチタスクが当たり前なんて風潮があるか? 当たり前に使ってるのって職業プログラマだけだろう。 数十年マルチタスク使ってるけど、話が通じる素人さんなんて見たことない。 OSレスでもRTOSでも巨大OSでも組めるのがプロ ディスパッチャ君のはOSでも何でもない ただのゴミ ただのキー処理やLED点滅処理や低速通信の為にマルチタスクOSが必要 なんて言ってるアホ ソフトウェアの基礎から勉強し直せ それはどうかな? 8x8のLEDマトリックス各ポイントを違うタイミングで点滅させるような場合 OSを使う方がはるかに簡単で正確な点滅ができると思うよ。 遅い通信でも同期通信のような場合、常にtimer使って監視するより OSのタスクで監視したほうが簡単。 いづれもOS必須ではないけどね。 使えるなら使ったほうがアホでは無いと思うよ。 「必要である」と「そっちの方が楽」では噛み合わんよな。 「OS」を「コンパイラ」に置き換えたらわかると思う。 「そっちの方が楽」ねぇ・・・ >>536 程度でOS持ち出すかねぇ・・・ 100個や1000個の時間監視ごときに・・・ ごく一例なんだけどさ、 ウチの場合、仕事でOS使うのは個人差を無くすためなんだよ。 スキルなんてそうそう身につかないよ。 OSには良くも悪くもルールがある。 それを覚えれば確かにある種のバグは減る。 でもそのルールを全部覚えるのも大変だよ。 OS使ったが故の、理解不足が故のバグだってあるよ。 そして仕事してて「こんなのにOS要るか?」ってのも非常に多い。 もちろん必須な場合だってあるんだけどさ、趣味でそこまでするの? したっていいんだけど、しなくてもバカ呼ばわりされることじゃないなあ。 決して「楽」だけじゃない。その前に相応の「苦労」と言う代価がある。 価値は人それぞれ。 他人が「自分がやるときはこっちの方がいい」って言ってることに深く干渉することはないよな。 当人しかわからないメリット、デメリットの判断に至る条件っていろいろあるんだし。 そもそもマトリックス状に並んでるLEDの一個一個を個別に制御する必要があるのかから考えてくれよ。 それでも「ある」とか言い出して引かないんだろうな。プロジェクトにいて欲しく無いタイプ。 課題はそういうものだし。 技術を理由に要求を合理化しても、まず問題がないのは自分たちで閉じているプロジェクトだけだと思う。 できない、あるいは、めんどうな場合は、しないという選択もありなわけだし。 >>541 個別に制御しないなら何のためにマトリックスにしてんの? マトリックスLEDの制御だけなら難しいことはなくね >>543 言葉尻だけ捉えて突っ込むなよ。 >536 はマトリックス状の 個々にタイマーリソースを振り当てて制御しようとか頓珍漢な 条件後付けをしてんだわ。 普通そんなのしないよね?個々に制御したいなら送るデータを 加工したり、タイマーの時間を調整するよね? > >536 はマトリックス状の > 個々にタイマーリソースを振り当てて制御しようとか頓珍漢な > 条件後付けをしてんだわ。 >>536 がそんなこと言ってるかな? マイコンのテクニカルな話をする前の問題。 技術者って(ときには専門外の)相手の意図をくみとって、形にする仕事だと思う。 より前向きに書かれていない行間から合理性を拾って合意や落としどころを形成することも仕事の重要な要素だよ。 なのに、書いてあることを誤って解釈してちゃだめだ。せめて書いてあることはよく理解しようぜ。 もっと簡単な例 LED3個をそれぞれ3,5,7msec間隔で点滅させる場合、書けないことはないけどちょっと大変。 OSのタスクを使うと、以下で済む Create_task(A) { while() { ledA_ON; delay(3); ledA_OFF; delay(3); } } delay時間と対象のLED変えてタスクB、タスクCを同じく作るだけ。 4月だから会社に新入社員が入ってきてるやん。 もし新入りくんが「その処理ならRTOS使えば楽勝っすよ」って先輩さしおいて提案する場面があるかもしれないやん? 技術屋なんて年齢と関係なく知識で逆転されてることなんてザラにあるでしょ。 その時、先輩としてどう反応するの? 「ばーかOSなんか使わないでシングルタスクで作ってろ」 とか言うわけ? その新入くんは、それ聞いて転職を考え始めるんじゃないか? >>547 別々のタスク書くなら別々の関数作ればいいだけじゃね? それを「ちょっと大変」って思うかな? >>549 関数だとwhileから抜けられないし、delayで3msec処理止まるやん? タイマー使って、ONタイミングOFFタイミング作ってってやってるとできるけどさ。 めんどくさくない? 時間とタイミングの処理おまかせで考えなくてもいいから楽だよ。 1msでループ回してインクリメンタルカウンタをifで数えるだけじゃね 処理内容的には一番安い数セントマイコンで十分だがそれに搭載できるRTOSは限定されるだろう OS使ったほうがやりやすい場合があるのはみんな分かってんだし くだらない例を出しても仕方ないだろ。 >>550 本気でそう思ってんの? ちょっとは考えて書いたほうがいいよ。 RTOS使えばいいって言っている人はArduinoクラスでも想定しているのかね あれだけメモリがあればRTOSも載るだろうが派手なLチカ用にATmega328は結構贅沢だろ LED3個点滅させるのにOS必須って言ってるわけじゃないよ。 タスク説明するときによく使われる例だから。 >>553 君には550の内容の間違いを指摘できるんだよね? もちろんその内容が正しかったら間違いを認めるよ そうやって自分の間違いを修正してきたから、むしろ感謝すべきだと思ってる。 >>547 RTOSの本質ではないし組み込みマルチタスクのよくある用法でもない マイコン入門者に loop { PORT1.b1 = 0; delay(1000); PORT1.b1 = 1; delay(1000); } みたいな例を教えるとイベントドリブンではない非効率なコードを量産するけど大差ないレベルで有害じゃね ついでにそんな覚え方をしてたらマルチスレッドが難しくて当然だな 排他制御とかガン無視だし遠くない未来に破綻して発狂するのは明らか 558 言われてることはおおよそ理解できます。 閉じたループやらdelayを多用するようなコードは良くないです。 タスクの役割がわかりやすいかなという意図から例としただけで。 >>553 日が変わるからIDも変わるし、時間切れな 容赦なしで言わせてもらうと君はハッタリだな。一番はずかしいタイプだな、 そういうやつは技術も身につかねーから。 クリスマスツリーでも作ってろや、な Rust界隈はむやみに共有リソースを持たない方向に行っているよね 排他制御をしなくていいならそれに越したことはなく事故率は下がり性能は向上する 組み込みも遠からずそうなっていくのでは いろいろとやってみたらいい。 なじんでないものは、たいてい使いにくく、やりはじめはバグ、トラブルの原因にもなる。 なじんでないものを、なじんでいる人が良いというぐらいになじんで使えるようになるには時間も能力も限られている。 世の中のすべて人が、世の中のすべてのことになじむ必要はないし、そんなのありえない。 なじんでない人が、なじんでない技術を、世の中で価値が薄いものだというのは、傍から見ればきつねと葡萄。 なじんでいる人が、なじんでない人をさげすむのは、思い上がり。 ひとつのことを実装するのに、いろいろな方法がある。人によって違う解決があっていい。 価値があるのは、実装方法はどうであれ、求めている人のニーズを理解して形にして世の中に出せることだよ。 前に作ったiny2313用ディスパッチャのサンプル(タスク2個切り替え) タイマ0を周期1mSのCompAで駆動、20MHzクロックでオーバーヘッドタイム約1μS AVRはマルチタスクに何の配慮も無いし、2313はSRAMが128バイトしかないので マルチタスクは使いづらいが、それでもマルチタスクが有用な仕様もある C:000015 93ef push ZL ;save ZL,ZH & SREG to currrent stack C:000016 93ff push ZH C:000017 b7ef in ZL,SREG C:000018 93ef push ZL C:000019 2de1 mov ZL,sv_SPL ;exchange SP task1 <--> task2 C:00001a b61d in sv_SPL,SPL C:00001b bfed out SPL,ZL C:00001c 91ef pop ZL ;restore ZL,ZH & SREG from next stack C:00001d bfef out SREG,ZL C:00001e 91ff pop ZH C:00001f 91ef pop ZL C:000020 9518 reti ;exec. next task 再登場ッ!w 今まで使ってきた全てのCPUでディスパlッチャ作ってきたけど ただ一つの例外がPIC16F84 これがPICと別れる理由の一つにもなった たまに登場しないと忘れちゃうでしょ?w 私はソフトでもハードでも「自作できるものは自作したいな」でやってます AVR始めた時もターゲット回路に影響しないシリアルライタを作り 続けてPC側とAVR側のデッバグ用プログラムを作り・・・ できるだけ自分の手の内に納めておきたい ブラックッボックスがイヤなんですよね >>568 は顔文字の人じゃないか? iny というマイコンは初めて聞いた。 どこのマイコンだろう。 顔文字さんの名誉のために言っておきますけど、 私(V7tN8xew)は別人で、天上天下唯我独尊、孤高の道を行く、 下天のうちに比べれば夢幻の如くなりw のディスパッチャ爺です 私の技術力は彼の足下にも及びませんが、 彼の他人の悪口を書かないところだけでも真似したいと思っています。 ぼくのぎじつりょくはそんなにたかくないので 誰の事か判らんくなって気だぞ(^p^; C/C++で ・規格(C99とかC11とか)に準拠しないコード ・処理系に依存するコード ・未定義の動作を引き起こしうるコード を見つけてくれるコードチェッカとかあります? Chat GPT は私やあなたのような3流プログラマを駆逐するか? これも運命だ・・3Dプリンタで製造業は全滅したしな・・・ >>583 車は無いけれどもGEがガスタービンを3Dプリンタで作成しているよ。複雑な形状を削り出し出来ないからプリンタを使った >>583 VWは使ってるけど? 無知は黙ってろ。 イギリス軍がテスト中のフライングスーツのジェットエンジンって 3Dプリンタで作ってるんだよなあ。 ロケット開発ベンチャーにとって3Dプリンタは必須装備 この流れ見てると理系の悪い性格が出てるよ。 582の発言に対して583の発言は流れとして車を例に出しただけ。 限定的な知識を出して、他人を無知などとこき下ろしてる。 その厳格さは仕様書を読むときやプログラミングだけにしとけば?って感じ。 chatGPTのほうが人格が上だね。 まあ、理系板だしな。 でも、ちょっと調べれば分かることを 「プリンタで作った部品使ってる車とか無い」と言い切るのは愚か者としか言いようがない。 ネット上に間違った情報を増やすのはやめてほしい。 それこそChatGPTにも悪影響がある。 理系、文系は関係無いよ ここはゲスが集まって自分のゲスレベルを競い合ううところだからな 「ゲスに交わればゲスになる」 良い子は近づいてはいけませんw puipuiモルカーは自動車の範疇に含まれますか? 秋月スレから移動してきました。 370 名前:774ワット発電中さん[] 投稿日:2023/07/10(月) 08:47:34.03 ID:HXshJPvz >>368 そもそも、何でinpとoutpがメモリと別にあるんでしょうか? 同一直線上にあっても良いと思うのですが、 当時は何か事情でもあったのでしょうか? 371 名前:774ワット発電中さん[sage] 投稿日:2023/07/10(月) 09:01:27.08 ID:hJ/c4TqK >>370 メモリとIOデバイスの速度がかなり違ったり メモリアクセス時とIOアクセス時の処理を分けるのが簡単 372 名前:774ワット発電中さん[sage] 投稿日:2023/07/10(月) 09:03:38.16 ID:2Xm28lZL >>365 メモリがある程度余裕ある時は使っちゃうなぁ シリアル経由で機器制御とかの文字列処理 や数値抜き取りしたい時にsprintf()/sscanf() だって簡単なんだものw 374 名前:774ワット発電中さん[sage] 投稿日:2023/07/10(月) 09:17:07.23 ID:/DJb27v2 >>370 64KB全部メモリのほうが綺麗だと思うけど。 I/Oのためにアドレスデコーダ作るのも面倒だし。 もちろん、メモリマップドI/Oにすることも出来る。 ってか、今でもマイコンだと専用のインストラクションが割り当てられてたりすると思うけど、使ったことないのかな? 375 名前:774ワット発電中さん[sage] 投稿日:2023/07/10(月) 09:41:02.86 ID:zbpt3cNp [1/2] >>370 周辺回路が作りやすい他にメモリマップ上に速度が全然違う余計なものが入らない方が使いやすいと言う考えもあった 同一線状といってもアドレスラインは16本であまり余裕はないしね インテルは8080発売後しばらく経ってからマップドIOを勧めだした記憶があるがハード屋の俺は面倒だなと思ったよ 当時はそんなにスピードが違ったんですね。 でも、遅いI/O→速いメモリ→遅いI/O→速いメモリ→ だったら どうせ直列にこなすんだから、 メモリマップトでも良いのでは無いでしょうか。 確かにアドレスデコーダを作るのは面倒くさいですね。 メモリマップトはあたかもメモリ上に見えてるけど、CPUハードの中で処理完結されてる。 なのでINP、OUTPの命令もメモリマップトも実はやってることがほぼ同じ。 質問の的外れ回答ならならすまんちょっと自信ないけど、 FPGA使ってるから自分ならそう設計する。 キーワード:メモリマップドIO 対 ポートマップドIO INP、OUTPの専用命令があるタイプは メモリアドレス空間が小さくて制限がある場合みたい。 なるほどね。 今はアドレス空間広いからメモリマップにしたほうがロジック共有できてるのかもしれない wiki https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%9E%E3%83%83%E3%83%97%E3%83%89I/O >>583 ボロクソワーゲンってどの部分に樹脂使ってんの。内装ならわかるけど。 >>584 >車は無いけれどもGEがガスタービンを3Dプリンタで作成しているよ。複雑な形状を削り出し出来ないからプリンタを使った サプライチェーンの問題では。日本は米国よりもサプライチェーンの数が多いからな。技術者でも時給1500円で働いているから、 人件費の高い米国と違って、そうそうつぶれない。 LGBTと一緒で、スクラップビルドの一環だろう。すべて真に受けて振り回されると糖質になるわ。 #include < >について調べたいのですが、 < や > は、なんと読むのでしょうか? 人によって違うかもしれないけど 山括弧 angle brackets みなさんありがとうございました。 しょうなりだいなりと呼ぶことも多いみたいですね。 小なり だと思いますが、右か左かどちらを説明しているのか迷いますね どうもありがとうございました。 どう考えても x > 5 は、小なりじゃないだろ。 検索すると フォルクスワーゲンが樹脂3Dプリンタ部品を量産適応する研究をしてるという 2018年の記事がある まずテールゲートレタリング、ギアノブ、キーに適応とある 車の開発サイクル20か月前後と考えると、相当昔のことなので まだ製品化してないならプロジェクト自体がつぶれてるかもね 補修部品を生産するプロジェクトもあるようだが1点物でコスト見合うのかね >小なり だと思いますが、右か左かどちらを説明しているのか迷いますね 小なり は less than から来ている。と考えれば迷いが小さくできるのでは。 もとの表現では、 x < 5 は x (is) less than 5 だよ。 そこから x < 5 は x (は) 小なり 5 (よりも) と翻訳されていると考えれば。 説明上手いな。 自分の言葉で説明しているところを見ると、本人も苦労したのかな。 量子コンピューターで掛け算が出来た、みたいなニュースがあったけど、 掛け算は足し算だから、足し算がやっと出来たと言うことかな。 >>613 テーブル引きじゃない限りは足し算を何回かやってるんじゃね? 8ビット×8ビットだったら、最大8回の足し算になるのでは。 >>616 回路的にも筆算式でビット数分の加算器を段状に並べてるんじゃね? いや実際知らんけど、それ以外に方法ある? 7回といえば順次やっているような印象を与えるし、それを7クロックと考える人がいても仕方がないか。 でも、乗算命令があっても乗算器を持たないマイコンだとたくさんのクロックを必要とするしね。 九九は10進数の世界だから。 2進数の世界だから一一。いちいちがいち。終わった。 乗算命令のないマイコンだと掛け算は自分で記述するのですよね? 乗算命令のあるマイコンだと乗算命令を書けば人間の作業は終わりだけど、 CPUは、同じことをやっているのでなないですか? >>622 乗算器がついていたら「命令を繰り返して」掛け算を実現するのとは違う。 乗算器がついてなくて、乗算命令があるなら、まったく同じとは必ずしも言えないとしても 「命令を繰り返して」掛け算を実現するのと近いことをやっている(と思う) 乗算器の中ではどのようにしてかけ算しているのでしょうか。 加算する位置を変えながら、繰り返して足していくのではないのかな。 「位置を変えながら」は時間の進行ととも変えるのではなくて、いっきに1ビットずつ変えたものを用意します。 そのあたりは短い文章だと違う解釈で誤解も入りやすいし、 乗算器 しくみ で検索するといいと思います。 >>624 ソフトウェア的な手法として、シフトして足してをビット数分繰り返す方法は知ってるのかな。 でハードウェアなら、ビット数分繰り返す代わりに1ビットシフトしたもの、2ビットシフトしたもの ... nビットシフトしたものを一度に用意して、全部一気に足すと言うこともできる。 もう何十年も研究されてるんだから、そんな素人の考えるような方法は時代遅れだよ。 ちょっと調べればブースの乗算法とかSchönhage-Strassenアルゴリズムとか出てくるだろ。 >>625 ありがとう。初めからずらした記憶を一気に足し算。 頭いいなあ。なるほど。 桁ずらしは配線で固定化できるし、 足すのはフルアダーのお化けみたいな回路ですかね。 >>627 ハードウェア的な掛け算器がそのアルゴリズムで実装される方がメリットがあるってこと? ほんとかなぁ というか元の話は、掛け算は足し算で実現されてるか否かということだから、少なくとも足し算で実現されてることは間違い無くね? >というか元の話は、 元の話は>>609 の↓だよな。 >量子コンピューターで掛け算が出来た、みたいなニュースがあったけど、 >掛け算は足し算だから、足し算がやっと出来たと言うことかな。 (1)掛け算は足し算 (2)(1)から考えると、量子コンピューターは足し算がやっと出来たと言うことかな (1)はそうでもあるし、そうでもない場合があるので正確ではない。 (2)は、ニュースソースを探してみると、足し算はもっと前にできていたという。 結果的には(2)の類推は誤りだったようだ。 「掛け算は足し算を使うものもある」という認識であれば、ひとつだけの類推は導かなかったかもしれない。 リレー計算機は*/になるとガチャガチャ言うんだっけ 計算尺、捨てないで本棚に置いてある。 この前、本を整理したときに手にとってみたけど、 使い方思い出せなかった。 計算尺、7本持っている。 たまに使っているけど、数値が読み取りにくくなったので 眼科を受診したら「老眼です」と言われた。 帰りに老眼鏡買ったが、細かい作業するときに便利だと知った。 >>636 自分は元々近眼なので、老眼になった今ではメガネを外すと近くのものがよく見える。 ただ程度が微妙で、半だ付けする時にメガネを外し、工具を探すときにはメガネをかけてで、すげー面倒 年は取るもんじゃないねぇ >>637 近視の人は老眼に気づくのが遅くなるとか聞きましたが・・・ 私はその逆で遠視気味だったので、手元が見づらくなって眼科で老眼と診断されました。 近頃の部品はチップ部品が多くなってしまい、馬齢を重ねた人間には辛いです。 老眼は要するに調整範囲が小さくなるので、 近眼の老眼はたとえば裸眼で20cm以外にピントが合わなくなる。 なので 面実装部品をはんだ付けするときは裸眼。 面実装部品のピンのはんだの詳細を見るときは裸眼にルーペ。 資料や画面を見るときは眼鏡。 みたいなことになる。 すこぶるめんどうくさい。 眼鏡をかけたまま近くを見ようとしたら眼鏡の上からパスするみたいなことになる。 オロナミンCの大村崑さんみたいに眼鏡をずらすか、すごくアゴを引かないといけない。 ちなみに、近眼の度が強いと、境目なしの遠近両用でも、あまり極端なものは作れないと言われた。まあそうだろうな。 量子演算は不連続のアナログ ある意味計算尺にちかいか 量子的に意味のある値は特定の条件を満たすマトリクスだが 老眼ごときでガタガタ言うな 俺なんか網膜剥離だぞ もうハンダ付けはでけんっ! >>641 特に強い近眼の人は知らん間に緑内症になってる人が多いそうな。 普段は両目で見るから片目の視野が欠けてきていることに気づかないって。 >>641 俺もなった。入院してレーザーで焼いてもらった。 3週間顔を下にして過ごしたんだぞ。 チャットGTPに依頼するとプログラムも作れますか? PIC16F84 Lチカ 500ms C言語とかで C/C++とかpythonは学習してるようだが 該当チップの情報とコードが全ネットに どの程度存在するかだろうな 先ずは3.5試せばいいのでは? そもそも正しいくない確率も一定あるから 試すしかないというか switch文章について質問です。 switch (a){ case 1: b=3; 関数1(); 関数2(); 関数5(); break; case 2: b=6; 関数1(); 関数2(); 関数5(); break; case 3: b=8; 関数1(); 関数2(); 関数5(); break; default: break; という文章がありますが、 関数1,2,5がいつも同じなので、 switch文の後に実行すればソースが見やすくなると思ったのですが defaultの時には実行して欲しくありません。 switch (a){ case 1: b=3; c=1; break; case 2: b=6; c=1; break; case 3: b=8; c=1; break; default: c=0; break; if(c==1){ 関数1(); 関数2(); 関数5(); } と、書くしか無いでしょうか? 変数も要るし。 何か格好のいい書き方は無いでしょうか。 >>648 cを使いたくないならc==1の代わりにa==1||a==2||a==3 なるほど、それはいいですね。ありがとうございます。 やはりswtchの結果を記憶する変数が必要になりますよね。 default:の中に書いてもしょうがないですものね。 ありがとう。 default に goto を書いて、関数1(); 関数2(); 関数5();をジャンプするとか。イヤイヤ。 関数x() {関数1(); 関数2(); 関数5();} switch (a){ case 1: b=3; 関数x(); break; case 2: b=6; 関数x(); break; case 3: b=8; 関数x(); break; default: break; } とか 何書こうが最適化で一緒にされてしまう可能性。 (明確な間違いでも無い限り) >>653 見やすい、わかりやすいですね。いい感じです。 質問です。 構造体というのがありますが、 あれが出来た経緯はメモリが少なく機長たった頃に、 メモリを無駄なく使いたいから、だと思うのですが、 そうでは無いでしょうか? 誰も aaa.bbb.cc と記述したいわけではないと思うのです。 >>657 >誰も aaa.bbb.cc と記述したいわけではないと思うのです。 むしろ、aaa.bbb.cc と記述できるように、じゃないですかね。 関連したデータを固めて扱う事で記述性の向上はあるんじゃないかな。 タルいってのはあるかもしれんがツールの進歩て克服しつつあるし。 むしろメモリはアライメント調整が入るから無駄に見えるかもしれない。 構造体は、自分で必要性を感じて便利に使えるまでは、難解で面倒なものだと思ってた。 プログラミング言語の、いろいろな機能も、なんでこんな分かり難い機能が必要なんだろうと思う前に、 これが便利で分かりやすいシーンがあるのだろう、と、努めて自分に強いて思うようにしている。 「こんなの要らない」「仕方ないから覚える」と考えると、学習効率を下げるよ。 ぼくが学習を始めたときに使っていた言語では、構造体ではなくてレコードだったけど。 >「こんなの要らない」「仕方ないから覚える」と考えると、学習効率を下げるよ。 ではなくて、なぜこのような記述方法が出てきたのか知りたい。 歴史を知ることで今が見えるという感じ。 >>664 歴史はどうだか知らないけれど、オブジェクト指向の導入でも使われるような話が、 そこそこ構造体にもあてはまると思う。 なぜこのような記述が出てきたかは、その方が楽でわかりやすいからと考えていいと思う。 100人の生徒をコンピュータで管理するとき、含めたいデータが ・名前 ・性別 ・身長 ・体重 とすると、構造体のない世界なら、それぞれを100個の配列にして管理することになると思う。 これを「生徒」という構造体を作って入れて、その構造体の配列を作ると、 配列のインデックス35番目の生徒の情報は、 生徒配列[35].名前 とか 生徒配列[35].身長 とかでアクセスできる。 ・別のアプローチ。構造体のない世界をかんがえてみるといいかも。 C言語でファイルを扱うときに、FILE を使うことがあると思う。構造体になっているから、ファイルを扱う関数に ファイルに関わる情報を渡すのに、FILE を示す *fp みたいなのを渡すだけでいいけれど、もし構造体がなかったら ファイルを関わる情報をどうやって渡すことになるか。 Python みたいにファイルオブジェクトにすればいいんでない? >>666 構造体と構造体のない場合の話だし。 オブジェクト以前。 >>661 それ入門書の本が悪かったとかの可能性もある >>665 BASICだと input #1, a$ とかで使えてたよ。 >>670 FILE構造体の話はC言語の話だよ。ファイルの考え方が異なるものを並べてはいけない。 ポインタ型の変数宣言がわかりません。 bit幅は何bitなのでしょうか? その変数に代入すると、常にアドレス番地として認識されて、数字ではないのでしょうか? そもそもポインタの嬉しさがわからないです。 配列a[100]で良いと思うし。 そうです。だからJAVAではポインタがなくなりました。 C言語そのままのポインタではないけれど、JavaでもC#でもクラスのインスタンスは「ポインタみたいなもの」だしね。 >>674 ポインタ変数そのものはC言語ではアドレスを格納していて、ビット幅はアドレスぶん。 ポインタはいくつかのメリットがあるけれど、そのうちのひとつ。「配列a[100]で良い」という話があったので、 C言語だと構造体(C++ならクラスも)の配列は、次の2種類の管理ができる。 (1)構造体の実体の配列を作る。 (2)構造体の実体はどこかに確保して、その実体の場所を示すポインタの配列を作る。 この2種類のうち、JavaやC#は基本的には ・クラスの配列だと(2)の方法を採る。 ・intやfloatだと(1)の方法を採る。 変数のタイプによって変わってくるので、わかっていないとかえって難しくなる。 C/C++なら、書き方で変わるので、そのあたりはかえってシンプルだと思う。 (2)はメモリを余計につかうから無駄なような気がするけど、 任意の条件で、配列内を並べ替えするようなとき、 (1)だと構造体まるごと移動が必要になる。構造体のサイズが大きいほど、入れ替えに時間がかかる。 (2)だと配列で管理しているのはアドレスだけなので、入れ替えがすばやくできる。 嬉しさがわからないのは、ポインタの方が有利になる課題にぶちあたっていないせいだと思う。 JavaかC#でクラスを自分で作るようなプログラムを組んでいたら、C/C++のポインタの雰囲気がわかる ようになるかもしれない。 ポインタがない言語はたくさんあります。 むしろほとんどの言語にはありません、 C言語にポインタがあるのは高級アセンブラだからです。 >>676 ありがとうございます。 >ポインタ変数そのものはC言語ではアドレスを格納していて、ビット幅はアドレスぶん。 ということは、16bitマイコンの場合 unsigned char a; aの記憶場所のbit幅は8bit、アドレスのことは知らない。 char *b; (アドレス専門の)bのbit幅は16bit、bで示される記憶場所のbit幅は8bit ということで良いでしょうか? C++とかC#はわからないですが PICマイコンのXC16(16bit用コンパイラ)の場合でも同じでしょうか。 >ということは、16bitマイコンの場合 >unsigned char a; aの記憶場所のbit幅は8bit、アドレスのことは知らない。 >char *b; (アドレス専門の)bのbit幅は16bit、bで示される記憶場所のbit幅は8bit 「16bitマイコンの場合は」とパターン化して覚えるのは間違っています。 傾向はつかめても傾向で語るのは多数の例外の前にむしろ害になるでしょう。 もしそのコンパイラのunsigned char が8bitなら、そのコンパイラのunsigned charは8bitと認識すればいいし、 アドレスのbit幅が16bitなら16bitであることが多い。 パターンにもとづく記憶に依存せずに、都度都度、調べればいいです。 一つのマイコンの一つのプログラムの中でも、アドレスのビット幅が一定とは限らんし。 ということで↓は自分で調べるようにしてほしいです。 >PICマイコンのXC16(16bit用コンパイラ)の場合でも同じでしょうか。 ネットから拾ってきた例ソースに、自分で説明を付けてみた。 途中がわからないです。 #include <stdio.h> typedef struct { // 以下の構造を持つ変数型を宣言する int num; // 構成員1 numという数値変数 char *str; // 構成員2 その次にstrという名前のポインタ用変数 } strct; // 上記の構造を持つ「型」を strct という名前で呼ぶことにする。 // numは数値用で16bit幅、置かれるアドレスはコンパイラに任せる。 // strは、ポインタ(アドレス用の入れ物)で、そのbit幅は // 我々が気にする必要はない。コンパイラが決めてくれる。 int main(void) { strct entity; // strct型の変数を1組用意する。名前はentity strct *p; // strct型の変数を1組用意する。名前はpでアドレスしか入らない(?) p = &entity; // pにentityの先頭アドレスを代入する。 p->num = 0; // アドレスしか入れられない*pのnum(?)に0を入れる p->str = "Hello"; // アドレスしか入れられない*pのstr(?)に"Hello"を入れる(?) printf("num:%d\n", entity.num); // 「strct型のentity」の構成員のnumの中身を10進数で表示 printf("str:%s\n", entity.str); // 「strct型のentity」の構成員のstrの中身を文字列で表示 return 0; // 戻る } > アドレスしか入れられない*pのnum(?)に0を入れる 「ポインタ変数そのものにアドレスしか入れられない」ということと 「ポインタ変数が指す領域に値を入れる」行為をごっちゃにしてませんか? 「ポインタにはアドレスしか入れられない」とどこかで読んだり習ったのかもしれないです。 「ポインタにはアドレスしか入れられない」こと自体に間違いはありませんが、 あなたはそれをもって、「ポインタ変数に値を入れているのはなぜだ」ってぐちゃぐちゃにしています。 ポインタにはアドレスしか入れませんが、ポインタが指す領域にはその変数の値が入ります。 教えてもらったり読んだ文言を、自分で解釈する表面的な意味に拘ってはいけません。 同様に「16ビットマイコンでは、ポインタのサイズは…」みたいなおぼえ方は、とりわけあなたのように、 「ルールや決まりでものごとを整理してそれに適合しないものに混乱するタイプ」の人は避けるべきだと思います。 自分で決めたルールに反したものを見つけたときにルールのアップデートをしたり、例外を躊躇なく受け入れられる人なら ルール化して覚えるのはいいかもしれないですが。 int *p; があるとして、p はポインタ変数そのものなのでアドレスが入りますが、 *p は、ポインタ変数pが指し示す領域なので、その領域が確保されているなら intの値を入れることができます。 ポインターは難しい。 誰でもつまづくんだな。 言葉の意味が分かりにくいから。 >>679 そもそも16bitマイコンって、何が16bit? って話もあるしね。 ヌルポ インタに意味持たせちゃったのもマズイよね。 >言葉の意味が分かりにくいから。 そうなんかなあ。point(指し示す)+er で、「(場所を)指し示すもの」ってそこそこそのまんまだと思うんだが。 >そもそも16bitマイコンって、何が16bit? そうそう。 主たるアキュムレータのビット数が、という言い方もあるけれど、明確な定義を試みることの意味は薄いと思う。 マイコン分類学みたいな人はやってくれたらいいけどな。 ポインタのサイズでいえば、ハードウェアのアドレスのビット幅が20ビットでも、ポインタ変数のサイズが16ビット だったり、32ビットだったりいろいろになることがあるし、必要な場合はちゃんと調べて使わないとまずい。 とくに今までポインタについて調べたことがないマイコンで、ポインタのサイズを知る必要が発生したなら、 自分によるルール化、類型化での判断ではなく、マニュアルを見ないと。 >ヌルポ インタに意味持たせちゃったのもマズイよね。 そうなんかなあ。 C++はともかく、C言語なら「ポインター値 0 は未初期化の印」としておくのは悪くはないと思う。 そのせいで、アドレスゼロが、ポインタで指し示せないという問題はあるとしても >>676 全然違う そんなことより「ポインタが無い」Javaなのに NullPointerExceptionが多発することが問題 >>686 何が全然違うのか書かないと、コミュニケーションも成立しない。 >そんなことより「ポインタが無い」Javaなのに >NullPointerExceptionが多発することが問題 たしかにこの2行は、矛盾の指摘に見えるけれど、矛盾になるためには1行目も2行目も正しいことが必要です。 Javaにポインタがない、という認識を疑うのはいかがでしょうか。もしその認識を修正すれば、 「Javaにはポインタのようなものがあり、誤った使い方をすればNullPointerExceptionが発生する」 となり、きれいに矛盾も消えると思います。 javaにはポインターがないのですか ↑そのままをキーワードにしてぐぐって。 多様な解釈がでてきますので、どれかを自分のものにするのではなくて対立するものもふくめてなんとなく 受け入れたらいいと思います。 Javaにはポインタが無いとは描いていない 「ポインタが無い」Javaと描いている 「Javaにはポインタが無い」と「ポインタが無い」Java に、 この件において どんな意味の違いがあるの? ・ポインタとはアドレスベースでデータを参照する機能である ・ポインタは今どきの処理系には大抵存在する ・C/C++などの一部の処理系を除き境界チェックされる >>691 >>686 において「全然違う」とだけ非難して、何が違うのかの説明はまだだね。 >>688 において「Javaにはポインタが無い」ではなく「ポインタが無い」Java だと言いつつ、この件においてのその違いの説明のしないつもりかな。 ふたつとも待ってるよ。 >>681 の > p->num = 0; // アドレスしか入れられない*pのnum(?)に0を入れる の方は説明したけど、 ↓の方はこれはこれで別のひっかかりっぽい? > p->str = "Hello"; // アドレスしか入れられない*pのstr(?)に"Hello"を入れる(?) この人は「p->str」がポインタであることは認識している。 この文は "Hello"を入れているんじゃないです。 "Hello"という文字列を格納しているアドレスを、p->str に入れています。 p->str = "Hello"; がコンパイルされたら、多くの場合メモリのどこかの領域に Hello\0 の6バイトが確保されます。 p->str に その領域の先頭アドレスが入ります。 >>693 p->str はポインタじゃねぇだろ。 >>694 >>681 で返答している質問の>>680 は見たのかな? > typedef struct { // 以下の構造を持つ変数型を宣言する > int num; // 構成員1 numという数値変数 > char *str; // 構成員2 その次にstrという名前のポインタ用変数 > } strct; // 上記の構造を持つ「型」を strct という名前で呼ぶこと 見ての通り、strメンバーは、charのポインタだよ。 なぜ違うと思ったのか説明して。 “組み込み用”のファイルシステムやライブラリってないのかな? ・コントローラ付きフラッシュメディア用(データのアラインが出来る) ・読み出し専用 ・非同期アクセス可能(FIFO、バックグラウンド読み出し) ・高速エントリ探索 自分で作ってもいいけどすでにあるのならそっち使った方がよさそうだし・・・ ちっとも動かずに、半日悩んでしまいました。 同じ変数名をグローバルと関数内で宣言してしまった場合、 関数内の変数の方が優先なんだね。 >>1 本当に楽勝でやる人には、本当はそんなやり方じゃダメだとか、俺はもっと良い方法を知っているとか言うのでは? 気にするだけ無駄だと思います。 Pythonだとグローバル変数が優先されるのか、勉強になるなぁ。 グローバル変数は意識して使わないといけないから、なのかな。 でも、関数内でうっかり同名の変数に代入して、同じ関数内の別のところで、 同名のグローバル変数だと信じて参照するケースもあると思う。 >>701 さんのだって、 関数内でうっかり同名変数を宣言して、同じ関数内の別のところで、 同名のグローバル変数だと信じて参照してたのかもしれないし。 それ以前にPythonが使えるマイコン環境はむしろ少なそう。 変態命名則 exDwHoge 名前空間に押し込む myglb::hoge グローバルオブジェクトに持たせる glb.hoge グローバル変数絶対つかわないマン #define HOGE でも、使いたいグローバル変数が分かってるのにそれと同じ名前の変数を作っちゃうというのも随分なうっかりさんだよね。 あるいはグローバル変数の方を後で追加したんかな? >>708 最初は関数内だけでstaticで使っていたんだけど、 その変数値を関数外でも参照したなり、グローバルに出したのです。 が、関数内の変数宣言を // するのを忘れました。 関数内では正しく処理されているのに、mainで if( hoge==1 ){とやっても 全然1にならない。 自前のメモリアロケーション管理はイヤ、 ガベコも嫌い、例外もイヤみたいな 欲張りセットがターゲットだしな クミコではガベコ=害悪、絶対にスコープ縛りみたいな メモリをドバドバ使った動的管理がクリティカルなケースが限られる メモリ管理のちょっとしたミスで数百万円のサーバを食い散らかす サーバサイドアプリの記述なんかは強力なんだろうけど read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる