- 締切済み
メモリを確保する方法(アセンブラにおけるORGの様な)ありませんか?
PICボードの制御プログラミングをC言語で行っています。 通常は、コンパイラで自動的にメモリ領域の確保を行ってくれます。 そこをあえてプログラミングで操作したいのですが 何か良い方法がありましたら教えて下さい。 目的プログラムは、タイマ割り込みによるLEDの制御です。 組み込みソフトウェア開発の勉強中です。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
PICの知識はありませんが、単純に固定アドレスのメモリを参照するという質問ですよね? typedef unsigned char byte; /* 連続した領域を構造体で定義するケース */ struct mmio1_t { byte reg0; byte reg1; }; #define mmio1 ((volatile struct mmio1_t *)0x0000) #define mmio1R (*mmio1) /* 連続した領域を配列として使用するケース */ #define mmio2 ((volatile byte *)0x1000) /* 個別に定義するケース */ #define mmio3 (*(volatile byte *)0x2000) #define mmio4 (*(volatile byte *)0x2001) /* サンプル */ int main() { mmio1->reg0 = mmio2[0]; mmio2[1] = mmio3; mmio4 = mmio1R.reg1; return 0; }
- precog
- ベストアンサー率22% (966/4314)
OSがないなら、Cで全部メモリー管理するんでしょうか? ちょっと危ない気もしますが、やるなら、メモリーアロケート関数をいじるとかが必要かもしれません。ライブラリーのソースがついてくるならいいんですけど、ないなら、標準ライブラリーを全部捨てないとダメかもしれません。(内部でalloc関数を呼ぶので) いまいち良くわかってないのですが、そのままだとベクター領域を壊すって事なんでしょうか? であれば、自動割り当てを細工するしかないと思います。コンパイラーのオプションかリンカーのオプションでなどで対応できないでしょうか。恐らく、単純に2つの開始アドレス(ラベル)で、スタティック領域とダイナミック領域が管理されているだけだと思います。 C言語の中でプログラムの開始アドレスを知るのは、関数へのポインターを使います。 void vectorA(void) { : } #define INT_VECTOR_ORG 0x00001000 int initialize() { void (*intVector)(void)[]; intVector = INT_VECTOR_ORG; intVector[xx] = vectorA; } こんなイメージ。 コンパイラー通してないので不正確かも。それと、キャストしないと怒られると思いますが、キャストに自信がないので省略してます。
- precog
- ベストアンサー率22% (966/4314)
絶対アドレスで指定したいんですかね? コンパイラーの自動割り当てを使わないなら、自分で計算式を作るしかないかな。 単純なコンパイラーなら、、、 #define BEGIN 0x80000000 #define A BEGIN #define B (BEGIN + sizeof(struct atype)) : : #define ORG_SIZE (Z + sizeof (struct ztype)) orginalAreaInit() { OSのアロケートコール(ORG_SIZE); } accessA (int x) { (int *)A = x; } こんな感じ? 面倒なら、ポインター代入で。 ただ、sizeofがどういう値を指すのかはコンパイラー依存だったり、アラインを考えないとまずいことになりますんで、実装への依存性が高まります。要は、通常ポインターにはアドレスが入りますんでそれを自分で制御する事になります。(言語仕様にありませんので何が起きても不思議じゃないです。検証してからやってください)
お礼
回答ありがとうございます。 質問なのですが今回のPICボードにはOSが乗っていません。 ベクター領域を指定してプログラムメモリ確保したいのですが C言語のコマンドでプログラムメモリの指定がわかりません。 その辺についでアドバイスを頂けないでしょうか。