commit a881f9efd3e9144d0d447a0dd12a69fb259acdf2
parent 75817b16117f402b3d7444c59d0b599c16970c15
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sat, 24 Feb 2024 08:14:02 +0900
fix vector table
Diffstat:
2 files changed, 66 insertions(+), 64 deletions(-)
diff --git a/man/computer/rp2040_1.html b/man/computer/rp2040_1.html
@@ -1,5 +1,6 @@
<h1>RP2040 SDKなしでLチカ</h1>
-<time>2023-04-25</time>
+<time>2023-04-25</time>: 作成<br />
+<time>2024-02-24</time>: ベクターテーブルの修正
<h2>はじめに</h2>
<p>
@@ -568,13 +569,15 @@ Table 7.4. Vector table format
</table>
</blockquote>
<p>
-また、ベクターテーブルはメインのプログラムの先頭に置くことにする。\
-メインのプログラムはFlash Second Stageが占有する256バイトの直後、\
-フラッシュROMの257バイト目から配置することにする。\
RP2040のベクターテーブルはM0PLUS: VTOR(<code>0xe0000000 + 0xed08</code>)という\
-レジスタに書き込むことで設定する。以上をまとめると以下のコードになる:\
-</p>
-<pre><code> ldr r0, flash_main
+レジスタに書き込むことで設定する。\
+このとき、下位8ビットは0にしないといけないので、ベクターテーブルの位置は\
+256バイトでアラインする必要がある。\
+ベクターテーブルの定義は<code>main.s</code>に書き、<code>boot2.s</code>からは\
+ラベルを使ってアクセスすることにする。\
+以上をまとめると以下のコードになる:\
+</p>
+<pre><code> ldr r0, =vectors
ldr r1, m0plus_vtor
str r0, [r1, #0] // vector table
ldr r1, [r0, #4] // entry point
@@ -584,8 +587,6 @@ RP2040のベクターテーブルはM0PLUS: VTOR(<code>0xe0000000 + 0xed08</code
/* ... */
-flash_main:
- .word 0x10000000 + 0x100
m0plus_vtor:
.word 0xe0000000 + 0xed08
</code></pre>
@@ -594,38 +595,6 @@ m0plus_vtor:
</p>
<h2>メインのコード(<code>main.s</code>)</h2>
-<h3>ベクターテーブル</h3>
-<p>
-メインのコードの最初には上で説明したベクターテーブルを配置する。\
-ここでは割り込みの処理は考えないので、初期スタックポインタと\
-エントリーポイントだけである。初期スタックポインタはSRAMの最後?\
-(<code>0x20040000</code>)、エントリーポイントはエントリーポイントの\
-ラベルを用いて設定した。\
-</p>
-<pre><code>\
-vectors:
- .word 0x20040000 // initial SP
- .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>
<h3>GPIOの設定</h3>
<p>
@@ -801,15 +770,50 @@ delay_loop:
sio_base:
.word 0xd0000000
</code></pre>
+
+<h3>ベクターテーブル</h3>
+<p>
+メインのコードの最後には上で説明したベクターテーブルを配置する。\
+ここでは割り込みの処理は考えないので、初期スタックポインタと\
+エントリーポイントだけである。初期スタックポインタはSRAMの最後?\
+(<code>0x20040000</code>)、エントリーポイントはエントリーポイントの\
+ラベルを用いて設定した。\
+上で説明したように、ベクターテーブルのアドレスは256バイトの境界\
+にないといけないので、<code>.align 8</code>しておく。\
+また、別のファイル(<code>boot2.s</code>)からアクセスしたいので、\
+<code>.global</code>宣言をつけておく:
+</p>
+<pre><code> .align 8
+ .global vectors
+vectors:
+ .word 0x20040000 // initial SP
+ .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>.text</code>セクションである。\
</p>
<h2>リンカスクリプト</h2>
<p>
-以上のコードには<code>.boot2</code>、<code>.vectors</code>、<code>.text</code>\
-の3つのセクションが含まれる。<code>.boot2</code>はフラッシュの先頭から\
-256(<code>0x100</code>)バイト目まで、<code>.vectors</code>と<code>.text</code>\
+以上のコードには<code>.boot2</code>、<code>.text</code>\
+の2つのセクションが含まれる。<code>.boot2</code>はフラッシュの先頭から\
+256(<code>0x100</code>)バイト目まで、<code>.text</code>\
はその後ろに続くように配置する:
<pre><code>\
MEMORY
@@ -825,7 +829,6 @@ SECTIONS
} > FLASH
.text : {
- *(.vectors)
*(.text)
} > FLASH
}
diff --git a/pub/computer/rp2040_1.html b/pub/computer/rp2040_1.html
@@ -23,7 +23,8 @@
<main>
<article>
<h1>RP2040 SDKなしでLチカ</h1>
-<time>2023-04-25</time>
+<time>2023-04-25</time>: 作成<br />
+<time>2024-02-24</time>: ベクターテーブルの修正
<h2>はじめに</h2>
<p>
@@ -473,8 +474,8 @@ Table 7.4. Vector table format
</table>
</blockquote>
<p>
-また、ベクターテーブルはメインのプログラムの先頭に置くことにする。メインのプログラムはFlash Second Stageが占有する256バイトの直後、フラッシュROMの257バイト目から配置することにする。RP2040のベクターテーブルはM0PLUS: VTOR(<code>0xe0000000 + 0xed08</code>)というレジスタに書き込むことで設定する。以上をまとめると以下のコードになる:</p>
-<pre><code> ldr r0, flash_main
+RP2040のベクターテーブルはM0PLUS: VTOR(<code>0xe0000000 + 0xed08</code>)というレジスタに書き込むことで設定する。このとき、下位8ビットは0にしないといけないので、ベクターテーブルの位置は256バイトでアラインする必要がある。ベクターテーブルの定義は<code>main.s</code>に書き、<code>boot2.s</code>からはラベルを使ってアクセスすることにする。以上をまとめると以下のコードになる:</p>
+<pre><code> ldr r0, =vectors
ldr r1, m0plus_vtor
str r0, [r1, #0] // vector table
ldr r1, [r0, #4] // entry point
@@ -484,8 +485,6 @@ Table 7.4. Vector table format
/* ... */
-flash_main:
- .word 0x10000000 + 0x100
m0plus_vtor:
.word 0xe0000000 + 0xed08
</code></pre>
@@ -493,18 +492,6 @@ m0plus_vtor:
</p>
<h2>メインのコード(<code>main.s</code>)</h2>
-<h3>ベクターテーブル</h3>
-<p>
-メインのコードの最初には上で説明したベクターテーブルを配置する。ここでは割り込みの処理は考えないので、初期スタックポインタとエントリーポイントだけである。初期スタックポインタはSRAMの最後?(<code>0x20040000</code>)、エントリーポイントはエントリーポイントのラベルを用いて設定した。</p>
-<pre><code>vectors:
- .word 0x20040000 // initial SP
- .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>
<h3>GPIOの設定</h3>
<p>
@@ -616,11 +603,24 @@ delay_loop:
sio_base:
.word 0xd0000000
</code></pre>
+
+<h3>ベクターテーブル</h3>
+<p>
+メインのコードの最後には上で説明したベクターテーブルを配置する。ここでは割り込みの処理は考えないので、初期スタックポインタとエントリーポイントだけである。初期スタックポインタはSRAMの最後?(<code>0x20040000</code>)、エントリーポイントはエントリーポイントのラベルを用いて設定した。上で説明したように、ベクターテーブルのアドレスは256バイトの境界にないといけないので、<code>.align 8</code>しておく。また、別のファイル(<code>boot2.s</code>)からアクセスしたいので、<code>.global</code>宣言をつけておく:
+</p>
+<pre><code> .align 8
+ .global vectors
+vectors:
+ .word 0x20040000 // initial SP
+ .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>.text</code>セクションである。</p>
<h2>リンカスクリプト</h2>
<p>
-以上のコードには<code>.boot2</code>、<code>.vectors</code>、<code>.text</code>の3つのセクションが含まれる。<code>.boot2</code>はフラッシュの先頭から256(<code>0x100</code>)バイト目まで、<code>.vectors</code>と<code>.text</code>はその後ろに続くように配置する:
+以上のコードには<code>.boot2</code>、<code>.text</code>の2つのセクションが含まれる。<code>.boot2</code>はフラッシュの先頭から256(<code>0x100</code>)バイト目まで、<code>.text</code>はその後ろに続くように配置する:
<pre><code>MEMORY
{
FLASH(rx) : ORIGIN = 0x10000000, LENGTH = 2048k
@@ -634,7 +634,6 @@ SECTIONS
} > FLASH
.text : {
- *(.vectors)
*(.text)
} > FLASH
}