commit fd2c46bb5ce0fa3a3432afc8e1d45de8e02b4384
parent e7bc21cc3ae38e3abe73213dec3727c78eb9a767
Author: Matsuda Kenji <info@mtkn.jp>
Date: Tue, 25 Apr 2023 13:41:10 +0900
update
Diffstat:
6 files changed, 70 insertions(+), 11 deletions(-)
diff --git a/data/weblog b/data/weblog
@@ -161,3 +161,5 @@
1682348400 /computer/what-i-use.html
1682348400 /computer/what-i-use.html
1682348400 /computer/what-i-use.html
+1682348400 /computer/what-i-use.html
+1682348400 /index.html
diff --git a/man/draft/rp2040_1.html b/man/draft/rp2040_1.html
@@ -549,9 +549,25 @@ rom_base:
<p>
XIPの設定が完了すれば、次はメインのプログラムを実行するための準備である。\
エントリーポイントの指定、スタックポインタの初期値の設定、ベクターテーブル\
-の設定である。初期スタックポインタとエントリーポイントはベクターテーブルの\
-<code>0x0</code>バイト目と<code>0x4</code>バイト目に書くことになっている\
-<sup>[要出展]</sup>。\
+の設定である。Armのマニュアル<sup>[7]</sup>によると、\
+初期スタックポインタとエントリーポイントはベクターテーブルの\
+<code>0x0</code>バイト目と<code>0x4</code>バイト目に書くことになっている:
+<blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/Exception-number-definition">
+<table>
+<caption>
+Table 7.3. Exception numbers
+</caption><colgroup><col><col></colgroup><thead><tr><th>Exception number</th><th>Exception</th></tr></thead><tbody><tr><td>1</td><td>Reset</td></tr><tr><td>2</td><td>NMI</td></tr><tr><td>3</td><td>HardFault</td></tr><tr><td>4-10</td><td>Reserved</td></tr><tr><td>11</td><td>SVCall</td></tr><tr><td>12-13</td><td>Reserved</td></tr><tr><td>14</td><td>PendSV</td></tr><tr><td>15</td><td>SysTick, optional</td></tr><tr><td>16</td><td>External Interrupt(0)</td></tr><tr><td>...</td><td>...</td></tr><tr><td>16 + N</td><td>External Interrupt(N)</td></tr></tbody>
+</table>
+</blockquote>
+
+<blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/The-vector-table">
+<table>
+<caption>
+Table 7.4. Vector table format
+</caption><colgroup><col><col></colgroup><thead><tr><th>Word offset in table</th><th>Description, for all pointer address values</th></tr></thead><tbody><tr><td>0</td><td>SP_main. This is the reset value of the Main stack pointer.</td></tr><tr><td>Exception Number</td><td>Exception using that Exception Number</td></tr></tbody>
+</table>
+</blockquote>
+
また、ベクターテーブルはメインのプログラムの先頭に置くことにする。\
メインのプログラムはFlash Second Stageが占有する256バイトの直後、\
フラッシュROMの257バイト目から配置することにする。\
@@ -583,8 +599,7 @@ m0plus_vtor:
ここでは割り込みの処理は考えないので、初期スタックポインタと\
エントリーポイントだけである。初期スタックポインタはSRAMの最後?\
(<code>0x20040000</code>)、エントリーポイントはエントリーポイントの\
-ラベルを用いて設定した。ただしこのCPUはThumbモードなので、\
-ラベルに<code>0x1</code>を足している[要説明?]:
+ラベルを用いて設定した。\
</p>
<pre><code>\
vectors:
@@ -592,6 +607,22 @@ vectors:
.word (reset+1)
</code></pre>
<p>
+<code>reset</code>ラベルに<code>1</code>を足しているのはRP2040が\
+Thumbモードのみに対応しているからである。\
+ArmのCPUはArmモードとThumbモードがあり、Armモードは32ビットの命令で\
+高機能。Thumbモードは16ビットの命令(一部32ビット)でコンパクトである。\
+どちらのモードでも命令は2の倍数のアドレスに並ぶことになる。\
+そのためジャンブ命令のジャンプ先のアドレスの最下位ビットは\
+常に0である。\
+この最下位ビットはジャンプ先のモードを示す為に利用される。\
+両方のモードに対応したCPUではジャンプ先のアドレスの\
+最下位ビットが0ならArmモード、1ならThumbモードに切り替わる。\
+ブランチ命令のオペランド等は多分アセンブラがいい感じにしてくれる\
+ので単にラベルを書けば動く。ベクターテーブルのこの部分は\
+自分で足す必要があるみたい。\
+あんまりちゃんと調べてないのでマニュアル読んでや。\
+</p>
+<p>
この部分のセクション名は<code>.vectors</code>である。
</p>
@@ -599,7 +630,6 @@ vectors:
<p>
電源投入直後、RP2040の周辺機器はリセット状態になっている。\
まずは今回利用するGPIOのリセット状態を解除する必要がある。\
-日本語だと意味が分かりにくいが英語でも分かりにくい。\
データシートの「2.14. Subsystem Resets」には以下のように書かれている:
</p>
<blockquote cite="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">
@@ -620,8 +650,8 @@ IO_BANK0(5番ビット)を<code>0x0</code>にする。
RESETS: RESETレジスタのうち5番ビットだけを<code>0x0</code>に\
したい。この時、まずこのレジスタを読み込んでから<code>~(1 << 5)</code>と\
論理積を取って同レジスタに書き戻してもいいのだが、RP2040にはこれを\
-一回の<code>str</code>でしかもアトミックにできる便利な機能が用意されている。\
-今回の場合アトミックかどうかは関係ないと思うが。\
+一回の<code>str</code>でしかもアトミックにできる機能が用意されている。\
+今回の場合アトミックかどうかは関係ないと思うけど。\
</p>
<p>
各レジスタには4個のアドレスが割り当てられている。\
@@ -899,4 +929,7 @@ $ make
<li>
[6] <a href="https://github.com/microsoft/uf2">USB Flashing Format (UF2).GitHub</a>
</li>
+<li>
+[7] <a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a>
+</li>
</ul>
diff --git a/man/index.html b/man/index.html
@@ -9,6 +9,7 @@
<h2>更新履歴</h2>
<a href="/rss.xml">RSS</a>
<ul>
+<li>2023-04-25 <a href="/computer/what-i-use.html">使用しているハードウェア、ソフトウェア</a></li>
<li>2023-02-28 <a href="/poetry/index.html">詩</a></li>
<li>2023-01-25 <a href="/computer/xlib_playground6.html">Xlibで遊んでみる6</a></li>
<li>2023-01-19 <a href="/journal/posts/20230119.html">寺を辞めた</a></li> </a></li>
diff --git a/pub/draft/rp2040_1.html b/pub/draft/rp2040_1.html
@@ -456,7 +456,26 @@ rom_base:
</code></pre>
<p>
-XIPの設定が完了すれば、次はメインのプログラムを実行するための準備である。エントリーポイントの指定、スタックポインタの初期値の設定、ベクターテーブルの設定である。初期スタックポインタとエントリーポイントはベクターテーブルの<code>0x0</code>バイト目と<code>0x4</code>バイト目に書くことになっている<sup>[要出展]</sup>。また、ベクターテーブルはメインのプログラムの先頭に置くことにする。メインのプログラムはFlash Second Stageが占有する256バイトの直後、フラッシュROMの257バイト目から配置することにする。RP2040のベクターテーブルは<code>M0PLUS: VTOR(0xe0000000 + 0xed08)</code>というレジスタに書き込むことで設定する。以上をまとめると以下のコードになる:</p>
+XIPの設定が完了すれば、次はメインのプログラムを実行するための準備である。エントリーポイントの指定、スタックポインタの初期値の設定、ベクターテーブルの設定である。Armのマニュアル<sup>[7]</sup>によると、初期スタックポインタとエントリーポイントはベクターテーブルの<code>0x0</code>バイト目と<code>0x4</code>バイト目に書くことになっている:
+<blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/Exception-number-definition">
+<table>
+<caption>
+Table 7.3. Exception numbers
+</caption><colgroup><col><col></colgroup><thead><tr><th>Exception number</th><th>Exception</th></tr></thead><tbody><tr><td>1</td><td>Reset</td></tr><tr><td>2</td><td>NMI</td></tr><tr><td>3</td><td>HardFault</td></tr><tr><td>4-10</td><td>Reserved</td></tr><tr><td>11</td><td>SVCall</td></tr><tr><td>12-13</td><td>Reserved</td></tr><tr><td>14</td><td>PendSV</td></tr><tr><td>15</td><td>SysTick, optional</td></tr><tr><td>16</td><td>External Interrupt(0)</td></tr><tr><td>...</td><td>...</td></tr><tr><td>16 + N</td><td>External Interrupt(N)</td></tr></tbody>
+</table>
+</blockquote>
+
+<blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/The-vector-table">
+<table>
+<caption>
+Table 7.4. Vector table format
+</caption><colgroup><col><col></colgroup><thead><tr><th>Word offset in table</th><th>Description, for all pointer address values</th></tr></thead><tbody><tr><td>0</td><td>SP_main. This is the reset value of the Main stack pointer.</td></tr><tr><td>Exception Number</td><td>Exception using that Exception Number</td></tr></tbody>
+</table>
+</blockquote>
+
+
+
+また、ベクターテーブルはメインのプログラムの先頭に置くことにする。メインのプログラムはFlash Second Stageが占有する256バイトの直後、フラッシュROMの257バイト目から配置することにする。RP2040のベクターテーブルは<code>M0PLUS: VTOR(0xe0000000 + 0xed08)</code>というレジスタに書き込むことで設定する。以上をまとめると以下のコードになる:</p>
<pre><code> ldr r0, flash_main
ldr r1, m0plus_vtor
str r0, [r1, #0] // vector table
@@ -710,6 +729,9 @@ RP2040のボードをUSBデバイスモードでLinuxのパソコンに接続し
<li>
[6] <a href="https://github.com/microsoft/uf2">USB Flashing Format (UF2).GitHub</a>
</li>
+<li>
+[7] <a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a>
+</li>
</ul>
</article>
diff --git a/pub/index.html b/pub/index.html
@@ -32,6 +32,7 @@
<h2>更新履歴</h2>
<a href="/rss.xml">RSS</a>
<ul>
+<li>2023-04-25 <a href="/computer/what-i-use.html">使用しているハードウェア、ソフトウェア</a></li>
<li>2023-02-28 <a href="/poetry/index.html">詩</a></li>
<li>2023-01-25 <a href="/computer/xlib_playground6.html">Xlibで遊んでみる6</a></li>
<li>2023-01-19 <a href="/journal/posts/20230119.html">寺を辞めた</a></li> </a></li>
diff --git a/pub/rss.xml b/pub/rss.xml
@@ -5,8 +5,8 @@
<description>ウェブページの更新履歴</description>
<language>ja-jp</language>
<link>https://www.mtkn.jp</link>
-<lastBuildDate>Tue, 25 Apr 2023 10:01:53 +0900</lastBuildDate>
-<pubDate>Tue, 25 Apr 2023 10:01:53 +0900</pubDate>
+<lastBuildDate>Tue, 25 Apr 2023 10:37:05 +0900</lastBuildDate>
+<pubDate>Tue, 25 Apr 2023 10:37:05 +0900</pubDate>
<docs>https://www.rssboard.org/rss-specification</docs>
<item>
<title>Xlibで遊んでみる6</title>