サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
衆院選
www.ertl.jp/~takayuki
キーワード ポインタ, 最適化 これだけは覚えよう 同じ空間を指すポインタをエイリアスと言う エイリアスはない方がいい (同じ空間を指すポインタをなくす) エイリアスって? エイリアス(alias)を辞書で引くと、「別名」と出てきます。 我々が使っているプロセッサは、値を操作するときにはレジスタを使用します(Load/Store architecture)。そのため、C言語やJavaのような高級言語を処理する言語処理系(コンパイラ+リンカ)は、変数に対してレジスタを割り付ける作業を行います。例えば、i = j + kという式がある場合、i→R0, j→R1, k→R2を割り付け、「R1←j (R1にjの内容をロード)」「R2←k (R2にkの内容をロード)」「R0←R1+R2 (R1+R2を計算しR0に結果を出す)」「i←R0 (R0の内容をiに格納)」といったコードを実行します。変数名に
注意 : このページはC言語初心者向けではなく、組込み開発初心者を対象としています。理解には、C言語に関する十分な知識 および 組込み機器開発に関する多少の知識を必要とします。 このページは、これまで避けて通ってきたC言語の嫌な部分と直面し、C言語プログラマとしての自立を促すモノです。C言語の本質が知りたい方や、ちゃんとした資料をお探しの方はお勧めしません。また、「初めてのC言語」というタイトルは、「C言語を初めてやる」という意味ではありませんので、C言語がわからない方はご遠慮ください。ターゲットはIntelでもWindowsでもLinuxでもありません。聞いたこともないようなプロセッサが相手です。 スポラディック連載なので、作者にひまが出来次第追加していきます。 第一部 - 初めてのHelloWorld この章では こんなこと やります
目的 crt0.oの謎を解き明かし、スタートアップルーチンの基礎を作る。 #補足 : 今回作るスタートアップは完璧じゃないです CRT (って、カソード レイ チューブでないことは確かなんだけどね) 前回、新しくターゲット用に作ったgccでコンパイルしたところ、crt0.oがないと怒られて終わりました。今回はこのcrt0.oが何であるかを解明するところからスタートします。 とりあえずLinuxネイティブだったらコンパイルできたので、Linuxのネイティブgccとv850-nec-elf-gccが何をやっているかを調べ、どこがおかしいのかを調べましょう。gccは-vをつけてコンパイルすると、何をやっているのか教えてくれるので、これを比較してみましょう。 % gcc -v hello.c Reading specs from /usr/lib/gcc-lib/i386-redhat-linux
はじめに このページでは、GNUの開発ツールキットである "GNU Compiler Collection (gcc)","GNU Binary Utilities (gnu-ld, gnu-as)","GNU Debugger (gdb)"に関して色々書きます。近頃、「この手のページって無いですね」っていう方が増えてきたので、ちょっと作ってみました。GNUに関するちょっとした話とともに、各ツールの話、そしてビルド方法や使用方法などを説明できればと思ってます。 What's GNU? 「GNUはUNIXではないんです」 "GNU"という単語は、Linuxユーザや組込みプログラマなら一回は聞いたことあるでしょう。GNUとは、GNUプロジェクトそのものを指す言葉でもあり、GNUプロジェクトによって作られたプログラムを指す言葉でもあり、GNUプロジェクトが設けているライセンスを指す言葉でもありま
キーワード C言語, コンパイラ, 引数, 返却値, スタック, スクラッチレジスタ これだけは覚えよう C言語プログラムとアセンブリ言語プログラムをつなげるには、呼出規約を知らないといけない。 呼出規約は、コンパイラ毎に変化する。 関数呼出 C言語やPascalなどの高級言語の多くは、関数を作ることができます。ある程度の処理をひとつの関数(手続き)として分離することで、問題を簡単にしたり、使い回ししやすくしたり、コードの見栄えを良くしたりできます。呼び出す側は処理に必要な情報を与え、呼び出された側は渡された情報のみ(※)を用いて処理を行って答えを返します。 プログラムが計算を行うためには、レジスタを使用する必要があります。しかし、呼出元も呼出先もレジスタを使用するので、そのままではレジスタを取り合ってケンカがおきます。これを調停するのが呼出規約です。 呼出規約の中には、次のような決め事が
これだけは覚えよう 変数はその長さで割り切れる番地に置くべし 原因と原理 アライメントとかワード境界とか言う話の原点は、プロセッサとメモリをどうつないでいるかという点からスタートしています。ですからまず、ソフトウェアの話ではなくハードウェアの話から入ります。 プロセッサの話をするとよく出るのが「ビット幅」の話です。あれは32ビットプロセッサだとか、これは128ビットプロセッサだとかいう表現をされ、性能指標のひとつとしてよく登場します。大体ビット幅は「レジスタ長」か「データバス幅」かのどっちかです。こっから先では「レジスタ長 = データバス幅」で話をします。 同じクロックの8ビットプロセッサと32ビットプロセッサを比較すると、大体32ビットプロセッサのほうが高速に動作します。これは、32ビットプロセッサのほうが一度に読めるデータの量が多いことに起因します。8ビットプロセッサ用の8ビットRAM
キーワード C言語, 初期化されていない変数, 静的確保, ゼロ初期化, スタートアップ これだけは覚えよう すべての初期化していない静的に確保される変数は.bssセクションに入っていて、0で初期化される。 すべての初期化していない静的に確保される変数が0で初期化されると思っていると、上司に怒られる。 .bssって何? .bssセクションはセクションのひとつです(セクションとは何かが知りたければ、infoを読みましょう)。名前は「Block Started by Symbol(シンボル名で示された番地から始まるメモリブロック)」の頭文字からきています。 このセクションは、ELF(Executable and Linkable Format)では次のように定義されています。 .bss This section holds uninitialized data that contribute
このページは、「組込み向けプログラム開発では絶対必要なスキルなんだけど、誰に聞いても「info読めば」としか答えてくれないものを、多少まじめに答えてみる」という趣旨のものです。基本的には組込み応用だけでなく、プログラマとして重要な項目なども含めていくつもりです。 注意 : いきなりこのページを読むと、調べる力が身につかなくなります。なぜ相手が「infoを読め」と言ったのかを考えてから読むようにするとよいでしょう。 アライメントとか、ワード境界とか 構造体のサイズが妙に大きいとか、変数の読み出しが妙に遅いとか、アクセスエラー例外が起こるとか セクションとか.textとか ROMから動かないとか、変数の初期値が消えるとか、プログラムローダが止まるとか 初期化してない変数とか.bssセクションとか 「初期化してない変数が利用されました」警告とか、Cランタイムとか スクラッチレジスタとか呼出規約と
キーワード セクション, オブジェクトファイルフォーマット, .text, プログラムローダ, ELF(Executable and Linkable Format) これだけは覚えよう プログラムは複数のセクションという単位に分割されている 原因と原理 私たちが日ごろ作っているプログラムは、ノイマン型コンピュータ上で動きます。ノイマン型コンピュータというのは、プログラムをメモリに蓄えているタイプのコンピュータ(Program stored computer)を指し、プロセッサとメモリを持ったものは大体ノイマン型です。当然私たちのプログラムもメモリにロードされて動いています。 プログラムが動くとき、さまざまな用途でメモリが使用されます。その用途は、機械語をおくためや、変数として値を格納しておくため、またC言語などでは関数呼び出しを行うためのスタックとして使用するため、mallocなどで動的
ご来訪ありがとうございます。でも、ここのページは全てMicrosoft Internet Explorer向けに作っています。 「MSIEが嫌いでしょうがない」とか「lynxで見れないページはおかしい」とか「W3CのHTMLに従ってないページなんて見れない」とか言うなら仕方ないですが、できればMSIEを使ってもう一度開きなおしてください。 名古屋大学 大学院 情報科学研究科 情報システム学専攻 集積システム学講座 組込みリアルタイムシステム研究室 常駐 豊橋技術科学大学 大学院 工学研究科 電子・情報工学専攻 計算機大講座 組込みリアルタイムシステム研究室 所属 わかばやし たかゆき
目的 メモリマップを自分で決めて、リンカスクリプトを(途中まで)記述する メモリマップ これまで普通にC言語を使ってきたときには、OSがありました。第1回の時にもプログラムを動かしていたのはLinuxでした。 プログラムはOSによって、様々なリソース割当を行われます。CPU時間もそのひとつですが、最も重要なのがメモリ割当です。実際にプログラムが使うメモリを予約して、その空間に適切な形でプログラムを読出し、プログラムを実行します。必要に応じてアドレス変換やメモリ保護なども行います。 しかし、この「始めてのC言語」ではOSはありません。メモリ割当は自分で行う必要があります。このメモリ割当を行うために必要なのがリンカスクリプトです。 リンカスクリプトを作る前に、ターゲットコンピュータのメモリマップを知る必要があります。メモリマップとは、どのアドレスに何が置いてあるかの表みたいなものです。今回対象
更新状況 [Dec 8th] infoを読め に エイリアスを追加しました [Nov 20th] infoを読め に バイトオーダを追加しました [Nov 20th] infoを読め に 呼出規約を追加しました 一部の限られたタイプの人間には「読める物」を書いていきます。 GNU Development Toolkit GNUの開発用ツールに関する説明書きです (現在工事中)。 infoを読め 「そんなことも知らないのか。infoでも読んで出直して来い。」と言われた時にどうぞ。 組込み技術者向け「初めてのC言語」 有名なHello, the World!を題材に、C言語の"基礎"について載せていきます。スポラディック連載です。 注意:プログラム言語および組込みに関して多少知識のある方でないと理解できません。ここはC言語の言語仕様自体を解説しているページではありません。 プログラムにまるわる
キーワード ビッグエンディアン, リトルエンディアン これだけは覚えよう 多バイトのデータをバイト列に変換する方法をバイトオーダ(Byte-order)という バイトオーダはプロセッサによってのみ変化する 原因と原理 アライメントやワード境界の話と同様、メモリのバイトオーダの話はプロセッサとメモリの関係によって生じます。 今日のプロセッサの多くはバイトアドレッシング方式と呼ばれる方式でメモリをアクセスしに行きます。この方式は、メモリのデータ幅(箱の大きさ)に関係なく、1バイト単位でアドレスをつけていく方式です。1バイトごとにアドレスをつけていくので、メモリの容量はアドレス空間の大きさと同じです。 [余談] バイトアドレッシング方式と対になる方式がワードアドレッシング方式です。これは、メモリのデータ幅にあわせ、メモリの箱単位でアドレスをつけていく方式です。メモリのアドレスバス上に流れる値(S
このページを最初にブックマークしてみませんか?
『タイトルをつけるまでもなく』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く