X



マイコンソフト 悩み事相談室 4

2020/09/11(金) 09:38:11.57ID:cJDnlvMz
.
  ∧ ∧    
  ( ´・ω・) < コンフィグって何? 昆布なら知ってる。  ボラチルって何? ボラは魚だよ。
  ( ∪ ∪   ,.-、     ,.-、   ,.-、     ,.-、
  と__)__)  (,,■)   (,,■)  (,,■)   (,,■)
         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/

  では、質問、ドゾ〜
2023/09/24(日) 10:40:00.91ID:3fdSyMx4
>>686
何が全然違うのか書かないと、コミュニケーションも成立しない。

>そんなことより「ポインタが無い」Javaなのに
>NullPointerExceptionが多発することが問題
たしかにこの2行は、矛盾の指摘に見えるけれど、矛盾になるためには1行目も2行目も正しいことが必要です。
Javaにポインタがない、という認識を疑うのはいかがでしょうか。もしその認識を修正すれば、

「Javaにはポインタのようなものがあり、誤った使い方をすればNullPointerExceptionが発生する」
となり、きれいに矛盾も消えると思います。

javaにはポインターがないのですか
↑そのままをキーワードにしてぐぐって。
多様な解釈がでてきますので、どれかを自分のものにするのではなくて対立するものもふくめてなんとなく
受け入れたらいいと思います。
688774ワット発電中さん
垢版 |
2023/09/24(日) 14:06:36.17ID:R9qz7oH6
Javaにはポインタが無いとは描いていない
「ポインタが無い」Javaと描いている
2023/09/24(日) 14:19:32.44ID:3fdSyMx4
「Javaにはポインタが無い」と「ポインタが無い」Java に、

この件において

どんな意味の違いがあるの?
2023/09/24(日) 14:31:30.15ID:OMO90ysE
・ポインタとはアドレスベースでデータを参照する機能である
・ポインタは今どきの処理系には大抵存在する
・C/C++などの一部の処理系を除き境界チェックされる
691774ワット発電中さん
垢版 |
2023/09/24(日) 14:36:16.29ID:R9qz7oH6
>>689
君國語の成績悪かっただろ?
2023/09/24(日) 14:39:08.04ID:3fdSyMx4
>>691
>>686において「全然違う」とだけ非難して、何が違うのかの説明はまだだね。

>>688において「Javaにはポインタが無い」ではなく「ポインタが無い」Java だと言いつつ、この件においてのその違いの説明のしないつもりかな。

ふたつとも待ってるよ。
2023/09/24(日) 14:57:04.17ID:3fdSyMx4
>>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 に その領域の先頭アドレスが入ります。
2023/09/24(日) 17:12:52.29ID:OKLAsxQv
>>693
p->str はポインタじゃねぇだろ。
2023/09/24(日) 21:42:20.54ID:3fdSyMx4
>>694
>>681で返答している質問の>>680は見たのかな?

> typedef struct {    // 以下の構造を持つ変数型を宣言する
> int num;      // 構成員1 numという数値変数
> char *str;     // 構成員2 その次にstrという名前のポインタ用変数
> } strct;        // 上記の構造を持つ「型」を strct という名前で呼ぶこと

見ての通り、strメンバーは、charのポインタだよ。

なぜ違うと思ったのか説明して。
2023/09/24(日) 22:03:10.56ID:OKLAsxQv
p.str はポインタだけどな。
2023/09/24(日) 22:10:23.22ID:OKLAsxQv
ごめん、理解した。
2023/11/27(月) 23:20:18.84ID:LpF7eOHE
“組み込み用”のファイルシステムやライブラリってないのかな?
・コントローラ付きフラッシュメディア用(データのアラインが出来る)
・読み出し専用
・非同期アクセス可能(FIFO、バックグラウンド読み出し)
・高速エントリ探索
自分で作ってもいいけどすでにあるのならそっち使った方がよさそうだし・・・
699774ワット発電中さん
垢版 |
2024/01/18(木) 21:05:24.13ID:N2qj1hNp
自分で作れるなら作ったほうが、後々楽よ
2024/02/07(水) 00:13:03.23ID:yr7RT8SS
RTOSの実践的な解説って絶望的にない
701774ワット発電中さん
垢版 |
2024/02/21(水) 02:38:40.05ID:PoiUZRbV
ちっとも動かずに、半日悩んでしまいました。
同じ変数名をグローバルと関数内で宣言してしまった場合、
関数内の変数の方が優先なんだね。
702774ワット発電中さん
垢版 |
2024/02/21(水) 12:20:18.74ID:tJ+ZT3Bx
>>1
本当に楽勝でやる人には、本当はそんなやり方じゃダメだとか、俺はもっと良い方法を知っているとか言うのでは?
気にするだけ無駄だと思います。
703774ワット発電中さん
垢版 |
2024/02/21(水) 13:57:16.12ID:IVX0JOfo
>>701
python使えば良い
2024/02/21(水) 15:11:30.65ID:t3hedltn
Pythonだとグローバル変数が優先されるのか、勉強になるなぁ。
2024/02/21(水) 15:47:42.28ID:vIEoWdKE
それはない
2024/02/21(水) 19:41:33.97ID:ueIcNcGI
グローバル変数は意識して使わないといけないから、なのかな。

でも、関数内でうっかり同名の変数に代入して、同じ関数内の別のところで、
同名のグローバル変数だと信じて参照するケースもあると思う。
>>701さんのだって、
関数内でうっかり同名変数を宣言して、同じ関数内の別のところで、
同名のグローバル変数だと信じて参照してたのかもしれないし。

それ以前にPythonが使えるマイコン環境はむしろ少なそう。
2024/02/21(水) 20:25:44.10ID:ZxC9UuKG
変態命名則 exDwHoge
名前空間に押し込む myglb::hoge
グローバルオブジェクトに持たせる glb.hoge
グローバル変数絶対つかわないマン #define HOGE
2024/02/21(水) 22:27:14.65ID:sMnq/5eu
でも、使いたいグローバル変数が分かってるのにそれと同じ名前の変数を作っちゃうというのも随分なうっかりさんだよね。
あるいはグローバル変数の方を後で追加したんかな?
709774ワット発電中さん
垢版 |
2024/02/22(木) 01:12:31.52ID:gKe8zB+g
>>708
最初は関数内だけでstaticで使っていたんだけど、
その変数値を関数外でも参照したなり、グローバルに出したのです。
が、関数内の変数宣言を // するのを忘れました。
関数内では正しく処理されているのに、mainで if( hoge==1 ){とやっても
全然1にならない。
2024/02/22(木) 09:16:14.85ID:+tUqHkAa
Rustなら防げた事故
711774ワット発電中さん
垢版 |
2024/02/23(金) 00:51:42.49ID:SqM8iMFD
Rustが使えるマイコンって 何がありますか?
2024/02/23(金) 06:12:17.17ID:NnHejPPD
Rustってインタプリタもあったっけ?
2024/02/23(金) 08:10:28.78ID:eYYWpm3E
mut mut すればいいと思うよ
714774ワット発電中さん
垢版 |
2024/02/23(金) 12:12:19.81ID:XxMmkSd6
Rustマジ面倒臭いわ
2024/03/03(日) 12:23:41.10ID:+3niRoTA
自前のメモリアロケーション管理はイヤ、
ガベコも嫌い、例外もイヤみたいな
欲張りセットがターゲットだしな

クミコではガベコ=害悪、絶対にスコープ縛りみたいな
メモリをドバドバ使った動的管理がクリティカルなケースが限られる

メモリ管理のちょっとしたミスで数百万円のサーバを食い散らかす
サーバサイドアプリの記述なんかは強力なんだろうけど
2024/04/05(金) 15:37:21.57ID:PfW1z4Qb
そもそもマイコン用のコンパイラが対応してないと…
717774ワット発電中さん
垢版 |
2024/05/12(日) 10:03:17.39ID:RNJVf2b5
読んだ事ないけど読んでみたくなった
はじめて見たわ
718774ワット発電中さん
垢版 |
2024/05/12(日) 10:09:45.30ID:nA24haYJ
糖が尿から出てきて何なんだ大木のじじいの話か
719774ワット発電中さん
垢版 |
2024/05/12(日) 10:24:51.90ID:NJ1tdi90
騙されて見てて嫌がる人が作った奴が隠蔽したからシギーは直に逮捕されるだろうってさ
720774ワット発電中さん
垢版 |
2024/05/12(日) 12:08:01.04ID:WLMdcnxg
結局メダル取ったらなれるわけないんだな
721774ワット発電中さん
垢版 |
2024/05/12(日) 13:16:25.67ID:2iYTBJ6P
ねけひけひはひむめもせをさちほたたゆけといちをぬあおききのりまなみとくま
2024/06/17(月) 22:41:12.90ID:FrFkY7Xw
bitcash?
723774ワット発電中さん
垢版 |
2024/07/27(土) 05:03:03.09ID:zaC8Wkem
質問があります。

16bit変数に8bitデータを2つ入れたいときです。

unsigned int ANS16;   // 16bit変数
unsigned char H8;   // 8bit変数
unsigned char L8;   // 8bit変数

ANS16 = (unsigned int) H8;     // 0x00H8
ANS16 <<= 8;           // 0xH800
ANS16 += (unsigned int) L8;    // 0xH8L8  完了

Cで書くとこんな感じで終わってしまいますが、

(1)マイコン内部では <<=8 はどうやって行われるのでしょうか?
まさか1bitシフトを8回するわけでは無いでしょうし、
特殊なアセンブラ命令でもあって、
1回で LowByteをHiByteにMOVEできるとかでしょうか。

(2)さらに、Byte単位ならワザがありそうですが、<<=7 とか、半端なときは7回シフトとかなのでしょうか。
 (Byteで上げて1bit戻すとか)

(3)<<=8 と書いても *=256 と書いても、
コンパイラーが賢い方法を選択してくれるんでしょうか?
2024/07/27(土) 05:55:26.33ID:eW5JvvDo
>>723
俺はお前が嫌いだが、質問に答えてやる

まず、質問の内容に、マイコンの種類(型番)や開発環境(コンパイラの種類)等を含めるべきだ

(1)多くのSTM32の様な32bitマイコンでは指定した回数のビットシフトを少ないサイクル(概ね1回)で行う機能を有してる(例)LSL R0, R0, #8
(2)上記 (LSL R0, R0, #7)
(3)よほど酷いコンパイラでなければ最終的に同じアセンブラを吐く
2024/07/27(土) 06:06:34.95ID:2ERGmb0F
ビットシフトはシフトレジスタをクロックシフトする古典的な遅い方法とファンネルシフトとかバレルシフトと言ったクロックシフトでは無いあらかじめずらしたビットパターンからマルチプレクサで選択してストアする0クロックなやり方がある。
40年前から高速化では当たり前であるけどね。
2024/07/27(土) 07:16:05.20ID:Letd0rDv
吐き出したアセンブラを見て
その命令のマシンクロックをマニュアルから探せばいいと思うよ
727774ワット発電中さん
垢版 |
2024/07/27(土) 13:00:23.99ID:zaC8Wkem
>>724
初対面にいきなり嫌いと言われるのがわかりません。
理由を述べて下さい。
728774ワット発電中さん
垢版 |
2024/07/27(土) 13:02:10.47ID:zaC8Wkem
>>725
ありがとうございます。
0や1クロックでできてしまうんですね。
素晴らしいです。そのシフト方法で調べてみます。
どうもありがとうございました。
729774ワット発電中さん
垢版 |
2024/07/27(土) 13:02:58.31ID:zaC8Wkem
>>726
ありがとうございます
勉強します。
ありがとうございます
2024/07/30(火) 01:14:23.88ID:dGhoWEJp
普通はC/C++のシフトだろうけど
L/Bエンディアン変換の需要がbyteswap系
アセンブラマクロが組めれば
最小最速になるかな

ナンチャッテ最小最速

unsigned char * p,L8,H8;
uint16_t ans;
#if __BYTE_ORDER == __LITTLE_ENDIAN
* p = L8;
p++;
*p = H8;
#else
* p = H8;
p++;
*p = L8;
#endif
ans = * (uint16_t *) p;
2024/07/30(火) 01:20:57.45ID:dGhoWEJp
おっと、メモリアサイン追加
unsigned char arry[2],*p,L8,H8;
p = arry;
・・・
ans = * (uint16_t *) arry;
2024/07/30(火) 11:45:59.42ID:NDMUdG/h
ユニオン切ってもいいよね
union x a{
unsigned short b;
unsigned char c[2];
};
で、
x.c[0]=hi8;
x.c[1]=lo8;
とか、
union x a{
unsigned short b;
struct c d{
unsigned char hi8;
unsigned char lo8;
}:
}
とか。
733774ワット発電中さん
垢版 |
2024/08/06(火) 17:04:03.61ID:e9vB4bZn
あれ世界中のクラブもそうなんか
2024/08/06(火) 18:04:36.82ID:PmU32GhC
今までとは普通の知性があって2軍にいるってことじゃなくてSASじゃねーの?
735774ワット発電中さん
垢版 |
2024/12/14(土) 13:17:44.50ID:1694ne5g
>>730
何かわかりにくい
3行にまとめることできないの?
2025/01/13(月) 09:32:06.12ID:pAkbTgac
>>735
三行しか読めないSNS頭?
2025/02/07(金) 17:44:19.89ID:LligpIZm
ワンライナーとか Perl 使いかよ
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況