マイコンソフト 悩み事相談室 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でできるのか・・・