こんにちは NAKA といいます。全く、馬鹿馬鹿しいことを質問させてください。マイコンボードに接続した、原理がわからないものでも、経験のあるソフト専門の方なら、ソースさえあればソフトの解析は可能なのでしょうか?以前作られたソフトをベースに同じ原理だが、別メーカ製の物を動作させたいが、動作しない場合で、しかもソフトを作られた方が退社され連絡が取れないなどのシチュエーションの場合。原理がわからないので、接続するものの仕様の違いもわからない。例えば、X = ABC + 0x5000;なんてコードがあった場合、誰でも何をしてるかわかりますが、+(プラス)することが正しいのか?、0x5000に妥当性があるかなど、全体の流れを見ればわかるものなのでしょうか?
NAKAさん、こんにちは。NoMaYです。愚痴?ですかね??
チョコです。
よく聞いたような話ですね。まだ、ソースがあるだけましかもしれませんが。ひどいときにはオブジェクトしかないとの話も耳にしたことがありました。もっとひどいのは、現物しか残っていないので、プログラムの読み出しからやりたいという例もありました。
ソースのコメントの量と質でも大きな差があります。コメントがほとんどかかれていないとか、ステートメントから想像できるような内容しか書かれていないとか、大きな流れが分かりやすいように工夫してコメントが書かれているかでも、大きな差がでてきます。
組み込み系では、制御する周辺機器に仕様に表れていない内容(制限)が含まれることもあるので、全く同じものを使っていない限りは難しいでしょうね。
ハード屋さんの独り言でした。
> 誰でも何をしてるかわかりますが「彼が何をやっているかと何をやろうとしているかの間には1光年もの開きがある」by ヤン・ウェンリー自分で書いたコードでも年数が経つとなぜそう書いたのか思い出すのに苦労するぐらいなので、他人が読んでも(未来の自分が読んでも)理解できる程度のコメントは残しておくのが吉、ってことですかね。
R8C20で市場不具合が発生したことがあります。私はソフトウエアのバグだと思ってますが、会社判断は電磁波でクローズしました。ソースコード解析を試みましたが、3万ラインを越えて、クラスの概念を気取ったのかグローバル変数はなくて他のクラスで宣言された変数にファンクション呼び出しでアクセスして、ファンクションもダイナミック呼び出しになってました。仕様書も無くてコード解析を途中であきらめました。作成者の人間性やグループのコモンセンスなどなどが知り得なければ妥当性など分らないです。
で、日本では同僚にも解らないコードがプログラマーの評価を上げます。退社したプログラマーが優秀だったと会社は評価するんです。
いつも助けていただけるみなさん ありがとうございます。 NAKAです。
妻が先週発熱し、コロナかと思い検査を受けましたが、陰性でした。という事でしばらく自宅監禁状態でした。(T_T)
ソースと戦ってますが、くじけそうです。開発環境もマイコンも初めてのマイクロチップのSAMっていうデバイスなのでハードも今一だし(ここはルネサスだった!)
さあどうやって打開していこうか検討中です。
別メーカ製品と書きましたが、実は開発品で本当は動作するのかも怪しい.....けど
何を開発していてどんなペリフェラルが使用されるのか存じていませんが、CortexのMシリーズの中でSAMシリーズは比較的使いやすいと思います。ASFライブラリ(Atmel Software Frameworkが元々の正式な呼び名、今は呼び方が違うかも)をうまく使うのがミソです。SAMシリーズをメインで使っていた頃、私はEclipseのCDTとGCCで開発していました。MicrochipのIDEやAtmel Studioの使用はやめた方がいいです(IDE、サンプル生成くらいにはちょうどいいですが)。
Yamamotoさま ありがとうございます。NAKAです。
開発環境ですが、現状はMicrochip Studioで機能確認してますが、近々MPLABに移行するそうです。
既存のプロジェクトはASFで作られたようですが、新規に試したい機能を追加するのは、再びASFを使うのでしょうか?
タイミングを作りたいと思って、timerとかcounterとか、ちょこちょこ探ってたら、cycle_counterっていうそれっぽいものがありました。
#define delay_s(delay) ((delay) ? cpu_delay_ms(1000 * delay, F_CPU) : cpu_delay_us(1, F_CPU))#define delay_ms(delay) ((delay) ? cpu_delay_ms(delay, F_CPU) : cpu_delay_us(1, F_CPU))#define delay_us(delay) ((delay) ? cpu_delay_us(delay, F_CPU) : cpu_delay_us(1, F_CPU))
s,ms,usとかあってそれっぽいと思ったのですが、
while (1) { delay_s(1); ioport_toggle_pin_level(LED0_GPIO);}
とかやって1秒毎にLEDチカチカしましたが、結局!!
#define delay_cycles portable_delay_cycles
void portable_delay_cycles(unsigned long n){ UNUSED(n);
__asm ( "loop: DMB \n" "SUBS R0, R0, #1 \n" "BNE.N loop " );}
for⇒Loopでぐるぐる回してるだけでした。(~_~;)
タイマ割込みなんかで、タイミングを作りたいんですが、なんか作り込まれたものは使いにくいです。
ちゃんとレジスタを1ビットづつ意味を理解して、設定して使いたいです。
かふぇルネでやる話題ではないか!! _(._.)_
P.S.
全く接続したものの原理がわからないまま、ただただビルドエラー原因の究明をしている感じで、何とかエラーは無くなり、通信の動作だけは確認できた感じです。(T_T)
ASFのTCCドライバのコールバック関数で周期処理できます。割り込み駆動なのでやりたいことに近いと思います。SAMシリーズのどれかわかりませんが品番によってはFreeRTOSも動くスペック(RAMが多い)もあるので使えると設計の自由度が上がると思います。
ASFウイザードでTCCなるものを探したのですが、なさそうで、TC(Timer Counter)があったので
Add ⇒ Apply で追加しましたが
.hをみると
* Devices from the following series can use this module: * - Atmel | SMART SAM3 * - Atmel | SMART SAM4S * - Atmel | SMART SAM4L * - Atmel | SMART SAM4E * - Atmel | SMART SAM4N * - Atmel | SMART SAM4CM * - Atmel | SMART SAM4C * - Atmel | SMART SAMG
となっているので今使っている SAMV71 では使えない?
SAMV71にはTCがあってもTCCはありません。周期生のある処理を割り込み駆動で行いたいならTC、PWMあたりがこのマイコンで使えます。遅い周期の場合ならRTC、RTTあたりが使えると思います。あとこのマイコンのスペックならFreeRTOSも動作すると思います。なお、ペリフェラルとしてTCが存在していてもドライバコードが対応しているかは別の問題です。必要に応じて修正などで動くようにすることは可能です。ドライバーコードはペリフェラルのレジスタ定義が共通でもベースアドレスはマイコン毎、別ファイルで参照するような作りになっています。なおAdvanced Software Frameworkの今日時点の最新バージョンはv3.52.0ですのでそちらは対応したコードになっているかもしません。