fc2ブログ

RAMの使用量

こんにちは

久しぶりに大会以外の更新です.

今回はRAMの使用量について.
さきほどツイッターにてアドバイスを頂いたので書きます.

CS+向けに書いているので,読んでも意味無いかも知れませんが,まあ参考までにどうぞ.

プログラムをビルドすると,フォルダ「DefaultBuild」に拡張子が.mapであるファイルが生成されます.
そのファイルを適当なテキストエディタで開くと,
プログラム2

のように書かれていると思います.
セクションがB_1,R_1,B_2...のように書かれていますが,B_1~SIまでがRAMに確保される領域となります.

各セクションの機能はCC-RXコンパイラのおデータシート参照
プログラム1

セクションRはデータシートに見当たりませんが,セクションDと同じだけの容量がRAMに確保され,プログラム開始時にDのデータがRにコピーされるらしいです.

先ほど述べましたが,B_1~SIまでがRAMに確保される領域なので,RAMの使用量はSIのENDアドレスから分かります.

上のキャプチャの場合,0x0000156bなので,十進で5483
RX62Tの場合,1byteに1アドレスが与えられているので,RAMの使用量は5483KBと分かります.

と,まあ,.mapファイルを見てRAMの使用量を測ることができますが,もっと簡単な方法が有ります.(先書こうぜw)
CS+にもRAMとROMの使用量を見る機能がありました.「メモリ・マッピング・プロファイラ」という機能です.

プログラム4

ここをクリックし(↑の図),プロファイルをクリック(↓の図)するとRAMの使用量を見ることができます.(始めて使うとき,何らかのダイアログが出るかもしれませんがOKで大丈夫です.)
プログラム5

下のほうのタブでセクションをクリックすると,セクションごとの容量を調べることができます.

プログラム6

自分は今まで,まだRAMの容量だいじょうぶだろう(勘)でプログラムしていたので,常にRAM容量のオーバーを怖がりながら開発していました.怖がった時点で調べ方を学べってことですが(笑)

経路導出アルゴリズムなどメモリをたくさん使いそうなプログラムを作るときは,是非RAM容量を気にしながらプログラミングしましょう!

RX631以降のルネサス製マイコンではRAMがとても多くなっているので,これからは余り気にする必要がないかもしれませんが.
ただ,RAMの残り容量を知ることによって,あまっている領域をログ用の領域として有効活用することができるのでオススメです.





スポンサーサイト



変数の型修飾

こんばんは

本日書かないと,まだしばらく更新しなくなりそうなので書きます.

みなさんは変数の型修飾を利用しているでしょうか?たとえばvolatileとかconstとかstaticとかexternです.

volatile : 最適化により変数が省略されることが無い
volatile char i; のように修飾します.main文と割り込み関数の両方から使う変数はvolatileで修飾したほうが良いです.

const : 定数にする.(定義とともに代入しなければならず,後で値を変更することはできない.ROMに保存される)
const char i = 65; のように修飾します.変数を確保するときにしか代入できません.なので,後で,
i = 64;をすると,コンパイルエラーとなります.

static : グローバル変数を,他のソースファイルからアクセスできなくする.また,ローカル変数をプログラムが終了するまで保持する.
static char i; のように修飾します.ソースファイルを分けてプログラミングしてる人には非常に重要な修飾詞です.まずは,グローバル変数を修飾した場合です.別のソースファイルからstaticで修飾した変数は見えなくなるので,隠蔽化に非常に重要です.これが無ければ,たまたま同じ名前でextern宣言されていると意図せず変数にアクセスされてしまいます.グローバル変数には必ずstaticをつけるつもりでプログラミングしましょう!続いてローカル変数を修飾した場合です.ローカル変数は通常,関数を出るとその値は保持されません.再び関数が呼び出されたとき,そのローカル変数の値は不定となります.しかし,staticで修飾していると関数を抜けても値が保持されます.これは使い方によっては非常に便利です.たとえば,関数が呼び出された関数をカウントできるとかですかね.

extern : このソースファイル内では変数は定義されていないが,どっかのソースファイルで変数が定義されていることを示す.
extern char i; のように修飾します.externをつけた場合変数の実態(メモリ)は確保されません.どっかのソースファイルにありますよ.という宣言になります.(宣言と定義の違いがわからない人は調べましょう!)裏を返すと,これが無ければ他のソースファイルに書かれているグローバル変数にアクセスすることができません.他のソースファイルのグローバル変数にアクセスするときは,型をexternで修飾して宣言しましょう.

まあ,詳しいことは"型修飾"とでも検索してGoogle先生に教わりましょう.

↓以下ポインタ(用法用量お守りください)


では,この型がどんな型かわかりますでしょうか?(グローバル変数であるとします)

const static unsgined char *const i = 0;

正解は,”他のソースファイルから見えない定数である符号なしの8bit整数型変数”の”定数であるポインタ変数”
深遠なるポインタの世界へようこそ

構造体のススメ

こんばんは

 本日は構造体を積極的に使おうということで,「構造体のススメ」と題しております.PCを使ってる人なら,.txtとか.xlsxとか.jpg...etc を一つの場所に全部保存することはないでしょう.フォルダ分けして,目的のファイルをすぐいつけられるように整理していると思います.C言語の変数にも同じことが言えます.グローバル変数やローカル変数に変数が多くなるとごちゃごちゃしてしまいます.そこで,変数をフォルダのようにまとめてしまおうというのが構造体です.まあ,詳しいことはグーグル先生が私の説明よりわかりやすく教えてくれるはずなので調べてみてください.
 構造体の利用例の一例といっては大げさですが,自分が構造体を用いてどのようにターンパラメータを保存してるかを紹介したいと思います.

typedef

 これが私がターンパラメータの保存に使っている構造体の型です.typedefして新たな型"turn_t"を定義しています.typedefした場合は,型名を"_t"とするのが通例らしいです.中身を上から説明しますと,

①ターンする角度
②最小曲率半径
③ターン速度
④前距離
⑤後ろ距離
⑥ターン方向
⑦ターン後斜め走行か?
⑧このターンパラメータは有効か?

 です.そして,このtypedefした型を用いて,

para

 のようにconstな変数に代入しています.構造体は,宣言と同時に代入する場合は,配列と同じように中括弧で囲まれた範囲内でまとめて代入することができます.これをうまく利用すると,エディタ上で縦にターンの種類,横にターンの各パラメータを並べられるため,パラメータの代入が表のようになるため,コードがすっきりします.

以下,ポインタまみれ #用法用量をお守りください

私のコードでは,各ターンの構造体のポインタを,ターン速ごとにポインタ配列でまとめています.↓

para_p

 さらに,"速度ごとに構造体のポインタをまとめたポインタ配列"のポインタ(つまり,ポインタのポインタ)を,ポインタのポインタ配列でまとめています.↓

para_pp

 こうすることにより,ターンパラメータへのアクセスをPara[5][10]のように,配列的にアクセスできるようになるため,ターン速度を速度ごとにenum,ターンの種類ごとにenumしておけば,ターンパラメータへのアクセスが便利です.なら,普通に構造体配列を宣言すればいいんじゃないの?と思うかもしれませんが,そのとおりです. "turn_t[10][16]"のようにすればよいのです.しかし,constにこだわったため,こうなりました.(constでも構造体配列が使えるなら誰か教えて...)

 今日の記事を書いているとき,型の理解て重要だな.って思ったので次は変数の型について書くかもしれません.ではまた次回!

Simulinkのススメ

こんばんは

本日もブログ更新します.
本日はSimulinkの紹介をします.

SimulinkはMATLABのToolBoxのひとつで,MATLABの課金コンテンツだと思ってかまいません.(理科大ならタダ!)
Simulinknの特徴は,Cのようにコードを打たずに制御系のシミュレーションをできるところです.じゃあどうやって?と思うかもしれません.その答えは,ブロック線図を組むが答えです.Simulinkはブロック線図を組むと制御系のシミュレーションを行うことができるのです.ブロック線図ってなに?と思った方はググってみましょう.

simulink2

上の画像の右側がsimulinkの画面です.ブロック線図が見えますね~
これをつくるには,上の画像の左側のブロックをドラック&ドロップして,線をつなぐだけで簡単に作ることができます!

matlab_main_1205

そして,ちょこっとMATLABのコードを書けばあら不思議

simulink_figure

シミュレーションした結果が出てきました!簡単!
今回シミュレーションしたモデルは,

model

上の図のように,モータにカップリングを使ってボールねじに接続され,モーターが回ると錘が平行移動するような機構です.
モーターのトルクが,ボールねじを介して錘を動かす力となり,その力が錘に加速度を与えます.
制御としては,開始から2秒後に2mの位置に錘を動かすPID制御です.

simulink

simulinkを使えば,ブロック線図でモーターとマウスのモデルを作り,簡単に制御のシミュレーションをすることができます.
ぜひ使ってみてください!

MATLABのススメ②

こんばんは

最近ブログを書く癖が出てきました.あんまり参考にならないと思いますが,おつきあいいただいてる方,ありがとうございます.
本日は,機能に引き続きMATLABの紹介で,行列演算について紹介したいと思います.

math

 上記の計算をMATLABで行いたいと思います.一番下の式は自分も始めて書いたのですが,行列のアダマール積と呼ばれるものです.同じ行,列の要素同士で掛け合わせたあたいを行列の要素とする積のことを言うそうです.ちなみに,アダマール積は画像処理のプログラムを書くと多用します.

matlab_main2

まず最初に行列変数Aに要素を代入しています.
A(1,:)=[1 2]は行列Aの1行目に要素を代入,A(2,:)=[3 4]は行列Aの2行目に要素を代入しています.コードを見るとわかると思いますが,Cのように行列を計算するときfor文をまわす必要がありません.←ココ重要!!

 MATLABコードは,行の最後に";"をつけないと,その行で計算した値が,コマンドウィンドウに表示されます.今回のコードは7行目から9行目に";"が書かれていないので,計算結果がコマンドウィンドウに表示されています.この値を見ると,正しく計算されていることがわかると思います.

 この行列を行列として計算できるのは非常に強力です.マウスで行列演算なんて使うの?と思うかもしれません.
FF制御パラメータの調整 - エヌがのロボット製作日記←この記事はモーターのFF制御のパラメータを求める手法を紹介する某提督の紹介記事です.パラメータを求めるのに擬似逆行列を用いてますが,このとき行列演算を使います.MATLABを使えば擬似逆行列も一瞬!!

 この記事で少しはMATLABに興味を持ってもらえたらなと思います.(こんな記事じゃ無理か...)
プロフィール

tennisyi

Author:tennisyi
現在、東京理科大学miceに所属しており、マウスを制作しています。
目指せハーフマウス脱初心者!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR