ewarmで開発するcortex-m...本ドキュメントについて 2 目的...

86
April 2015 IAR Systems K.K. FAE Team EWARMで開発するCortex-M プログラミングガイド

Upload: others

Post on 08-Jan-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

April 2015

IAR Systems K.K.

FAE Team

EWARMで開発するCortex-M

プログラミングガイド

Page 2: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

本ドキュメントについて

2

目的

Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR Embedded Workbench(EWARM)を用いて、実際の開発を理解する。

内容

ARM Cortex-Mの概要

Cortex-Mの命令セット

Cortex-Mのレジスタ

Cortex-Mの割込みハンドリング

スタートアップ処理

リンカ設定でメモリ配置コントロール

Cortex-Mへの移行時の注意点

解析ツールを使用して、品質向上

※本ドキュメントは、2015年4月現在のIARシステムズWebサイト、ST社Webサイト、およびEWARMバージョン7.40.2を元に作成しています。

Page 3: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

168 Employees with HQ in Uppsala, Sweden

Listed in Stockholm/Nasdaq

R&D investment 32% of revenue

32 years in the industry

Uppsala

Munich

Sao Paulo

Tokyo

Seoul

Shanghai

London

Paris

San Francisco

Dallas

Boston

Los Angeles

+Distributor representation in

43 countries

24 hour technical support in

13 languages

0

5

10

15

20

0

5

10

15

20

2010 2011 2012 2013License # Operating Margin

Licenses

# (000’s) Operating

Margin %

2010 - 2013

Stability and growth

IAR SYSTEMS— A LEADING GLOBAL VENDOR

Page 4: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

ARM Cortex-Mの概要

Page 5: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mベースのマイコンとは

5

英ARM Limitedの設計・開発するARM プロセッサを採用したマイコン

ARM コア

周辺機能

A社 B社 C社 D社

ARMはCPUコア(など)のIP(設計図)を販売 チップベンダが周辺機能(ペリフェラル)や メモリを追加実装

メモリ

ARM コア

周辺機能

メモリ

ARM コア

周辺機能

メモリ

ARM コア

周辺機能

メモリ

ARM

Page 6: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

クラシックARMとARM Cortexプロセッサファミリ

6

ARMマイコンの進化の過程

V4 V5 V6 V7

ARM7

ARM9

ARM11

Cortex-Ax

Cortex-Rx

Cortex-Mx

Application

Processors

Real Time

Processors

Microcontrollers

クラシックARM ARM Cortex

Cortex-

M0 “基本的に” xが

大きいほど処理能力大

Page 7: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

クラシックARMとARM Cortex-M

7

ARM7(v4)とCortex-M3/4(v7-M)の主要な違い

割り切り! 高性能! 簡単!

ARM7 Cortex-M3/M4

アーキテクチャ ARM v4 ARM v7-M

命令セット ARM / Thumb Thumb2

DMIPS / MHz 0.93 1.25

割込みコントローラ 外部 ネスト型ベクタ割込みコントローラ(NVIC)

ベクタテーブル方式 命令方式 アドレス方式

アセンブラ要不要 要 不要

タイマー 外付け Systickタイマー内蔵

モード

User FIQ IRQ SuperViser Monitor Abort Undef System

User(Thread) System (Handler)

メモリマップ 未規定 定義済み

Flash 基本外付け 基本内蔵

Page 8: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

STM32シリーズラインナップ

8

各種コアとシリーズの対応

M0+

M0

M3

M3

M4

M4

M3 M4 M7

http://www.st.com/web/en/catalog/mmc/FM141/SC1169 2015年4月1日 ST社Webサイトより抜粋

Page 9: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mのラインナップ比較

9

システム機能概要 M0 M0+ M3/M4 M7

スリープモード Yes Yes Yes Yes

WIC Yes Yes Yes Yes

SVC、PendSV Yes Yes Yes Yes

MPU(オプション) - 0 or 8 0 or 8 0 or 8 or 16

フォールト/例外ハンドラ HardFault HardFault

HardFault +3設定

HardFault +3設定

フォールトステータスレジスタ - - Yes Yes

ビットバンド - - オプション オプション

L1キャッシュ - - - 最大64KB(I&D)

TCM(密結合メモリ) - - - 最大1MB(I&D)

http://www.arm.com/ja/products/processors/cortex-m/cortex-m0.php http://www.arm.com/ja/products/processors/cortex-m/cortex-m0plus.php http://www.arm.com/ja/products/processors/cortex-m/cortex-m3.php http://www.arm.com/ja/products/processors/cortex-m/cortex-m4-processor.php http://www.arm.com/ja/products/processors/cortex-m/cortex-m7-processor.php 2015年4月1日 ARM社Webサイトより抜粋

Page 10: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mのラインナップ比較

10

最大パフォーマンス比較

1MHzあたりの処理量(CoreMark値)

http://www.eembc.org/coremark/index.php 2015年4月1日 EEMBC Webサイトより抜粋

Page 11: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mの命令セット

Page 12: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

命令セット:Cortex-Mの命令セットThumb-2

12

Cortex-MではThumb-2命令をサポート

• ARM命令セット 32ビット命令

• Thumb命令セット 16ビット命令

• Thumb-2命令セット 16ビット+32ビット命令混在

•よく使う命令は16 bit、複雑な命令は32bitで高効率を実現

•Cortex-Mのラインナップごとにサポート命令セットは異なる

ARM7からの伝統的な命令セット

Page 13: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

命令セット:Cortex-Mの命令セットThumb-2

13

同じコードをコンパイルして結果を比較

int gcd(int a, int b)

{

while (a != b)

{

if (a > b)

a = a - b;

else

b = b - a;

}

return a;

}

最大公約数を求める関数

ARM、Thumb、Thumb2でビルド

Page 14: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

命令セット:Cortex-Mの命令セットThumb-2

14

同じコード(最大公約数を求める関数)をコンパイルして結果を比較

gcd:

??gcd_0:

0x148: 0xe1500001 CMP R0, R1

0x14c: 0x0a000003 BEQ ??gcd_1

0x150: 0xe1510000 CMP R1, R0

0x154: 0xa0411000 SUBGE R1, R1,

R0

0x158: 0xb0400001 SUBLT R0, R0,

R1

0x15c: 0xeafffff9 B gcd

??gcd_1:

0x160: 0xe12fff1e BX LR

gcd:

0x148: 0xe000 B.N ??gcd_0

??gcd_1:

0x14a: 0x1a40 SUBS R0, R0,

R1

??gcd_0:

0x14c: 0x4288 CMP R0, R1

0x14e: 0xd003 BEQ.N ??gcd_2

0x150: 0x4281 CMP R1, R0

0x152: 0xdbfa BLT.N ??gcd_1

0x154: 0x1a09 SUBS R1, R1,

R0

0x156: 0xe7f9 B.N ??gcd_0

??gcd_2:

0x158: 0x4770 BX LR

0x15a: 0x0000 MOVS R0, R0

gcd:

??gcd_0:

0x88: 0x4288 CMP R0, R1

0x8a: 0xd004 BEQ.N ??gcd_1

0x8c: 0x4281 CMP R1, R0

0x8e: 0xbfac ITE GE

0x90: 0x1a09 SUBGE R1, R1,

R0

0x92: 0x1a40 SUBLT R0, R0,

R1

0x94: 0xe7f8 B.N ??gcd_0

??gcd_1:

0x96: 0x4770 BX LR

ARM命令セット Thumb命令セット

Thumb-2命令セット

ARM Thumb Thumb-2

gcd(バイト) 28 20 16

コード効率が高い

Page 15: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mプロセッサファミリごとのサポート命令

15

Cortex-Mに続く数字が大きくなるほど、多くの命令をサポート

基本データ処理 I/Oハンドリング

アドバンストデータ処理 ビットフィールド処理

DSP(SIMD,高速加算乗算)

浮動小数点演算

M0/M0+ M3 M4 M7

M4 FPU

M7 FPU

Page 16: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mプロセッサファミリの命令比較

16

命令セット概要

M0/M0+ M3 M4 M7

シングルサイクル乗算 Yes Yes Yes Yes

ハードウェア除算 - Yes Yes Yes

アドバンストメモリアクセス - Yes Yes Yes

アドバンスト分岐サポート - Yes Yes Yes

排他アクセス - Yes Yes Yes

SIMD DSP - - Yes Yes

サチュレーションサポート - 一部 フル フル

浮動小数点演算(オプション) - - 単精度 単精度/倍精度

Page 17: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mプロセッサファミリの命令比較

17

浮動小数点除算の例

元のCコード

M0:171命令

M3:44命令

M4F:8命令

コンパイラが自動的にコア搭載する命令を有効活用

Page 18: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mのレジスタ

Page 19: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mのレジスタ構成

19

CPUレジスタ

R0

R1

R2

R3

R4

R5

R6

R7

R8

R9

R10

R11

R12

R13(SP)

R14(LR)

R15(PC)

MSP

PSP

xPSR

PRIMASK

CONTROL

汎用的に使えるレジスタ R0~R12 さらに、R0~R7までを下位レジスタ R8~R12までを上位レジスタと呼ぶ。

R13はスタックポインタとして使用。 2つあり、切り替えて使用することができる。

R14は関数の返りアドレスを保存するリンクレジスタとして使用。

R15はプログラムの実行アドレスを示すPCに使用。

xPSRは実行状態を示す。演算結果フラグ、割り込み番号、使用する命令セット(Thumb系か否か)。

NMIとフォルトハンドラ以外の割り込みの許可・禁止を制御する

使用するスタックの指定、特権/ユーザ・レベル。

R0~R7までが16ビット命令で自由に使えるレジスタ

FAULTMASK

BASEPRI NMI以外の割り込みの許可・禁止を制御する

指定優先度以下の割り込みの許可・禁止を制御する M3/M4/M7のみ

Page 20: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mのレジスタ構成

20

ステータスレジスタ

• アプリケーションプログラムステータスレジスタ APSR – 演算結果のフラグ

• 割り込みプログラムステータスレジスタ IPSR – 割り込み番号

• 実行プログラムステータスレジスタEPSR – 実行状態bit 各レジスタは個別にも、まとめても(xPSR)アクセス可能

31 30 29 28 27 26 25 24 23 16 15 10 9 8 7 0

xPSR N Z C V Q ICI/IT T ICI/IT Esception Number

APSR N Z C V Q

IPSR Exception Number

EPSR ICI/IT T ICI/IT

Page 21: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mのレジスタ構成

21

コントロールレジスタ

• bit [0] でスレッドモード時の特権を設定 — 0: スレッドモードは特権あり — 1: スレッドモードは特権なし. • bit [1] はスタックを選択 — 0: メインスタックポインタを使用 — 1: スレッドモードのときは、プロセススタックポインタを使用。 MRS命令でREAD、MSR命令でWRITE。 特権がないとアクセスできない。

31 2 1 0

CONTROL Reserved

Page 22: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mの関数コールとレジスタ

22

関数のジャンプ時には、レジスタ操作が行われる

• 引数は R0,R1,R2,R3を利用(5つ目からスタックに) • 返り値はR0を利用 • ジャンプするときには、BL命令 • 戻る時はいろいろPC(R15)を操作する命令

• たとえば、BX命令、POP命令

f1:

ADDS R0, R0,

#1

BX LR

main:

・・・

BL f1

int f1(int a ) {

return a+1;

}

int main (void) {

・・・

t = f1(10);

Cコード コンパイル結果

R0

R1

R2

R3

R4

R5

R6

R7

R8

R9

R10

R11

R12

R13 (SP)

R14 (LR)

R15 (PC)

CPSR

Page 23: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mの関数コールとレジスタ

23

実際に動作を見てみる

BL命令は LR(R14)レジスタに戻りアドレスを保存し、PCを関数にセットする

PC=0x200_01FA0 LR= 0x200_01F91 戻りアドレス=0x20001FA4

PC=0x20001F98 LR= 0x20001FA5

BLでジャンプ

Page 24: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mの関数コールとレジスタ

24

実際に動きを見てみる:関数からの戻り

PC=0x20001F9A LR= 0x20001FA5

PC=0x20001FA4 LR= 0x20001FA5

*Thumb命令では、ジャンプ時にLRのアドレスのLSBが常に1にセットされる

BXでジャンプ BX命令は LR(R14)レジスタで指定されるアドレスにジャンプ

Page 25: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

ARMのレジスタとSTのレジスタ

25

ARMマイコンはARM CPUレジスタと周辺レジスタがある

ARM

ST

Page 26: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mの割込みハンドリング

Page 27: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

NVIC(内蔵割込みコントローラ)

27

Cortex-Mプロセッサは割込みコントローラを内蔵している

Cortex-M

Core NVIC

SysTick

システム例外

NMI

各種割込み

• レジスタの退避 • 割込み優先度ハンドリング • ネスト割込みのハンドリング

タイマーペリフェラル

Page 28: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

ベクタテーブルの記述

28

4バイト単位で、割込みハンドラのアドレスを記述 *先頭だけは、スタックのアドレスを指定

Vector No. Vector Offset 例外& 割り込み 値(例)

00 0x00 Stack Top sfe (CSTACK)

01 0x04 Reset __iar_program_start

02 0x08 NMI Default Handler

03 0x0C Hard Fault Default Handler

04 0x10 Memory Management Default Handler

05 0x14 Bus Fault Default Handler

06 0x18 Usage Fault Default Handler

07~10 0x1C~0x28 Reserved 0

11 0x2C SVCall Default Handler

12 0x30 Debug Monitor Default Handler

13 0x34 Reserved 0

14 0x38 PendSV Default Handler

15 0x3C SysTick Default Handler

16 ~ 255 0x40~0x3FC External Interrupts Interrupt Handlers

スタックアドレス

RESETハンドラアドレス

外部割込みのハンドラアドレス

Page 29: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

ベクタテーブルの比較

29

クラシックARMおよびCortex-R/Aとの比較

ARM9 ( + Cortex-R/A) Cortex-M __vector:

ARM

LDR PC,Reset_Addr ; Reset

LDR PC,Undefined_Addr ; Undefined instructions

LDR PC,SWI_Addr ; Software interrupt

SWI/SVC)

LDR PC,Prefetch_Addr ; Prefetch abort

LDR PC,Abort_Addr ; Data abort

DCD 0 ; RESERVED

LDR PC,IRQ_Addr ; IRQ

LDR PC,FIQ_Addr ; FIQ

DATA

Reset_Addr: DCD __iar_program_start

Undefined_Addr: DCD Undefined_Handler

SWI_Addr: DCD SWI_Handler

Prefetch_Addr: DCD Prefetch_Handler

Abort_Addr: DCD Abort_Handler

IRQ_Addr: DCD IRQ_Handler

FIQ_Addr: DCD FIQ_Handler

#pragma location = ".intvec"

const intvec_elem __vector_table[] =

{

{ .__ptr = __sfe( "CSTACK" ) },

__iar_program_start,

NMI_Handler,

HardFault_Handler,

MemManage_Handler,

BusFault_Handler,

UsageFault_Handler,

0,

0,

0,

0,

SVC_Handler,

DebugMon_Handler,

0,

PendSV_Handler,

SysTick_Handler,

//Device specified interrupt handler

InterruptHandler0

InterruptHandler1

InterruptHandler240

};

アセンブラ命令 (割込みハンドラにジャンプ)

C言語(ハンドラのアドレス指定)

Page 30: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

SysTickタイマーで割込み動作確認

30

SysTickを有効にして確認

static int tick = 0;

void SysTick_Handler(void)

{

tick++;

}

int main( void )

{

SysTick->LOAD = 0x0000FFFF; //←リロードレジスタの値をセット

SysTick->VAL = 0; // ←初期値をセット

SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |

SysTick_CTRL_TICKINT_Msk |

SysTick_CTRL_ENABLE_Msk; //← コアクロックで割込み有効でスタート

__enable_interrupt();

while (1)

{

//SysTick_Handler();

delay();

}

}

割り込みハンドラはCの関数。 ハンドラと関数に差はない

Page 31: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

SysTickタイマーで割込み動作確認

31

EWARMのデバッガ機能で確認

割り込みハンドラの先頭

PCはハンドラへ

LRは割込みを意味する 0xFFFF_FFxx

Page 32: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

SysTickタイマーで割込み動作確認

32

自動的にスタックにレジスタが退避される

CPSR

使用スタック

使用スタック

PC:

LR:

R12:

R3:

R2:

R1:

R0:

0xFFFF_FFFF側

0x0000_0000側

割込み前の LRの値

割り込み発生の アドレス

表示-スタック-スタック1 スタックの表示可能

Page 33: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

SysTickタイマーで割込み動作確認

33

割込みハンドラを通常の関数として呼んでみる

コメントを外して メイクしてデバッグ

Page 34: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

SysTickタイマーで割込み動作確認

34

割込みハンドラを通常の関数として呼んでみる(結果)

SysTick_Handler:

0x800019e: 0x4815 LDR.N R0, [PC, #0x54] ;

[0x80001f4] tick

0x80001a0: 0x6801 LDR R1, [R0]

0x80001a2: 0x1c49 ADDS R1, R1, #1

0x80001a4: 0x6001 STR R1, [R0]

}

0x80001a6: 0x4770 BX LR

int main( void )

{

main:

- - - -

SysTick_Handler();

0x80001bc: 0xf7ff 0xffef BL SysTick_Handler ;

0x800019e

関数から呼んだ場合 LR = 0x080001C1

割込みから呼ばれた場合 LR = 0xFFFFFFE9

Page 35: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

SysTickタイマーで割込み動作確認

35

割込みハンドラでのLRの値(EXC_RETURN)

MSP(メイン) PSP(プロセス)

割り込み時 使用 ×

その他 使用可能 使用可能

LRの値

0xFFFF_FFF1 多重割込み

0xFFFF_FFF9 通常状態への復帰時にMSPを使用

0xFFFF_FFFD 通常状態への復帰時にPSPを使用

0xFFFF_FFE1 多重割込み(FPU状態)

0xFFFF_FFE9 通常状態への復帰時にMSPを使用(FPU状態)

0xFFFF_FFED 通常状態への復帰時にPSPを使用(FPU状態)

• CONTROLレジスタの設定で使用スタックの変更が可能

割込みを抜ける際のスタックポインタ、多重割込み、FPUなどにより異なる

Page 36: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

スタートアップ処理

Page 37: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mのリセット動作

37

Cortex-Mでは起動時にベクタテーブルの内容を元に初期化される

スタックの先頭アドレス

リセットハンドラアドレス

NMIハンドラアドレス

ベクタ先頭 0x0000_0000 リセットされるとCPUは

メモリから2ワード読み出す。 最初のデータでスタックポインタをセット。 2つ目のデータにPCをセット。

スタック

リセット

Page 38: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

EWARM+Cortex-Mの起動動作

38

Vector No. Vector Offset 例外& 割り込み 値

00 0x00 Stack Top sfe (CSTACK)

01 0x04 Reset __iar_program_start

02 0x08 NMI Default Handler

03 0x0C Hard Fault Default Handler

04 0x10 Memory Management Default Handler

05 0x14 Bus Fault Default Handler

06 0x18 Usage Fault Default Handler

07~10 0x1C~0x28 Reserved 0

11 0x2C SVCall Default Handler

12 0x30 Debug Monitor Default Handler

13 0x34 Reserved 0

14 0x38 PendSV Default Handler

15 0x3C SysTick Default Handler

16 ~ 255 0x40~0x3FC External Interrupts Interrupt Handlers

__iar_program_start:

bl __iar_init_core ; optional

bl __iar_init_vfp ; optional, enable VFP, thumb¥fpinit_M.s

bl __cmain

__cmain:

bl __low_level_init ; low_level_init.c

bl __iar_data_init3 ; initialize data sections, init¥data_init3.c

bl main

int main (void) { …… }

void xxx_InterruptHandler (void) { …… }

Cortex-M0/M3/M4 Vector Table:

thumb¥vector_table_M.s

or thumb¥cstartup_M.c

デフォルトプログラムエントリ:

thumb¥cstartup_M.s or thumb¥cstartup_M.c

main()前の初期化:

thumb¥cmain.s

User’s Application:

IAR DLIB ランライム ライブラリの コード ただし 上書き可能

ユーザコード

参照 ジャンプ

Page 39: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

初期化処理のデバッグ

39

デバッグのオプションを変更することで、main以前のデバッグ可能

チェックを外す

Page 40: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

初期化処理のソースコード

40

EWARMインストールフォルダに初期化処理のソースコードがる

#pragma location = ".intvec"

const intvec_elem __vector_table[] =

{

{ .__ptr = __sfe( "CSTACK" ) },

__iar_program_start,

NMI_Handler,

HardFault_Handler,

};

void __cmain( void );

__weak void __iar_init_core( void );

__weak void __iar_init_vfp( void );

#pragma required=__vector_table

void __iar_program_start( void )

{

__iar_init_core();

__iar_init_vfp();

__cmain();

}

EWARMのインストールフォルダ

__cmain:

bl __low_level_init

cmp r0,#0

beq ?l1

bl __iar_data_init3

?l1:

MOVS r0,#0 ; No parameters

BL __iar_argc_argv ; Maybe setup command

line

BL main

BL exit

Reset

main

変数の初期化

Page 41: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

リンカ設定でメモリ配置コントロール

Page 42: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

ILINKの基本概念・キーワード

42

EWARMのリンカはILINK

詳細使用方法はC/C++開発ガイドを参照

Page 43: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

ILINKの基本概念・キーワード

43

GUIの設定項目

プロジェクトオプション > リンカ > 設定 ベクタテーブル、ROM/RAM領域、スタックサイズの変更が可能

Page 44: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

ILINKの基本概念・キーワード

44

リンカの働き

Region 0x20000000-0x2000FFFF ブロック(スタック)

Memory領域

Region 0x00000000-0x0000FFFF

ブロック(ヒープ)

.text

.data

.data_init

.rodata

place in

place in

ROMの特定のアドレスに配置

RAM に配置

コード

constデータ

変数の初期化データ

変数

.intvec 割り込みベクター

ROM に配置

IARの標準セクション

領域(Region)を指定して、そこにセクションやブロックを配置

Page 45: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

ILINKの基本概念・キーワード

リンカ設定ファイルのキーワード紹介

• region メモリ上の領域を指定します。

• block サイズを指定します

• section プログラムのセクション

• initialize 初期化方法の指定 • do no initialize 初期化しない領域の指定

• place regionにblockやsectionを配置

• rw(readwrite), ro(readonly)の属性を指定

Page 46: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

ILINKの基本概念・キーワード

EWARMの基本セクション

• .bss :0初期化する変数

• .data :0以外で初期化される変数

• .data_init : .dataセクションの初期化データ • .intvec : ベクタ

• .noinit :初期化しない変数

• .rodata : readonlyの変数

• .text : プログラム

• .textrw : __ramfuncを使った時のコード

• .textrw_init : .textrwの初期化データ *詳細はIAR C/C++ 開発ガイドのセクションリファレンスを参照

Page 47: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(関数を配置)

47

ファイルfunc.cのLED絡みの関数を特定領域に配置

0x00FFFFF

0x20000000

0x2000FFFF

0x00000000

RAM

0x00050000

IROM

ROMLED void set_LED_port(void) void LED_Handler(void)

Page 48: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(関数を配置)

48

C言語ソースコードでの指定

pragmaでセクション定義。 EWARMではセクション定義は

#pragma location=“XXXX”

EWARMではセクションを参照するときに #pragma section=“XXXX”

とななる。

Page 49: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(関数を配置)

49

実際にセクションを指定

#pragma location="LED"

void set_LED_port(void )

{

printf("initialize LED port¥n");

}

#pragma location="LED"

void LED_Handler(void)

{

Port0 != Port0;

}

set_LED_portがセクション”LED”に割当

LED_Handlerがセクション”LED”に割当

Page 50: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(関数を配置)

50

リンカ設定ファイル(抜粋)

define region IROM_region = mem:[from __ICFEDIT_region_IROM1_start__ to 0x0004FFFF ];

define region ROMLED_region= mem:[from 0x00050000 to __ICFEDIT_region_ROM_end__];

place in IROM_region { readonly }except { section LED };

place in ROMLED_region { readonly section LED };

0x00000000から0x0004FFFFをIROM_region

0x00050000から0x000FFFFFをROMLED_region

セクションLEDを除く、readonlyをROM_regionに配置

セクションLEDのreadonlyをROMLED_regionに配置

Page 51: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(関数を配置)

51

ビルド結果のmapファイル

関数が奇数アドレスは、Thumb命令。 (Cortex-MはすべてThumb命令。)

Codeは関数を示す

プロジェクトオプション > リンカ > リスト > リンカマップファイルの表示 Outputフォルダに生成されるマップファイルをダブルクリックで表示

Page 52: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(変数を配置)

52

RAM2に図のように4つの変数を配置

0x000FFFFF

0x20000000

0x20004000 0x2000FFFF

0x00000000

RAM

ROM

RAM2

int mydat1[10]; int mydat2[10]; int mydat3[5]; int mydat4[5];

Page 53: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(変数を配置)

53

実際にセクションを定義

#pragma location="MYDAT"

__root int mydat1[10];

#pragma location="MYDAT"

__root int mydat2[10];

#pragma default_variable_attributes = __root @ "MYDAT"

int mydat3[5];

int mydat4[5];

#pragma default_variable_attributes =

ひとつひとつ変数にセクションを割り当て

まとめて変数に属性をつける このとき__rootもpragma側でつけること

Page 54: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(変数を配置)

54

リンカ設定ファイル

define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to 0x20003FFF];

define region RAM2_region = mem:[from 0x20004000 to __ICFEDIT_region_RAM_end__];

place in RAM_region { readwrite, block CSTACK, };

place in RAM2_region { readwrite section MYDAT};

RAM2_regionにセクションMYDATのreadwriteデータを配置

Page 55: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(変数を配置)

55

MAPファイルを確認

mydat1 0x20004000 0x28 Data Gb main.o [1]

mydat2 0x20004028 0x28 Data Gb main.o [1]

mydat3 0x20004050 0x14 Data Gb main.o [1]

mydat4 0x20004064 0x14 Data Gb main.o [1]

#pragma location="MYDAT"

__root int mydat1[10];

#pragma location="MYDAT"

__root int mydat2[10];

#pragma default_variable_attributes = __root @ "MYDAT"

int mydat3[5];

int mydat4[5];

#pragma default_variable_attributes =

define region RAM2_region = mem:[from 0x20004000 to _ICFEDIT_region_IRAM1_end__];

place in RAM2_region { readwrite section MYDAT};

Page 56: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(変数を手動初期化)

56

初期化つき変数にセクション定義

#pragma location="MYDAT"

__root int mydat1[10] = {0,1,2,3,4,5,6,7,8,9,};

#pragma location="MYDAT"

__root int mydat2[10] = {10,11,12,13,14,16,17,18,19};

初期化つき変数にセクションを割り当て

初期化つき変数にセクションを割り当て

Page 57: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(変数を手動初期化)

57

初期化ルーチンの作成

#pragma section="MYDAT"

#pragma section="MYDAT_init"

void init_MYDAT( ) {

int i;

unsigned char *psrc, *pdest;

pdest = __section_begin("MYDAT");

psrc = __section_begin("MYDAT_init");

for (i=0; i < __section_size("MYDAT"); i++ ) {

*pdest = *psrc;

pdest++;

psrc++;

}

}

プログラム中でセクション名を参照する場合には #pragma sectionで明示する。

変数はMYDATというセクションになる。 初期化データはMYDAT_initというセクションにる。

セクションMYDATの先頭アドレスを __section_beginで取得

セクションMYDAT_initの先頭アドレスを __section_beginで取得

セクションMYDATのサイズを __section_sizeで取得

Page 58: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(変数を手動初期化)

58

リンカ設定ファイルでの指定

initialize by copy { readwrite } except {section MYDAT};

initialize manually with packing=none { readwrite section MYDAT};

place in RAM2_region { readwrite section MYDAT};

この領域の初期化は手動で行う +

初期化データの圧縮はしない

この領域の初期化は自動に行う

Page 59: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(変数を手動初期化)

59

マップファイルでの確認

************************************

*** INIT TABLE

***

Address Size

------- ----

Zero (__iar_zero_init3)

1 destination range, total size 0x54:

0x20000030 0x54

Copy (__iar_copy_init3)

1 source range, total size 0x30:

0x00001be4 0x30

1 destination range, total size 0x30:

0x20000000 0x30

mydat1 0x20004000 0x28 Data Gb main.o [1]

mydat2 0x20004028 0x28 Data Gb main.o [1]

initialize manually { readwrite section MYDAT};の場合

******************************************

*** INIT TABLE

***

Address Size

------- ----

Zero (__iar_zero_init3)

1 destination range, total size 0x54:

0x20000030 0x54

Copy (__iar_copy_init3)

1 source range, total size 0x50:

0x000019dc 0x50

1 destination range, total size 0x50:

0x20004000 0x50

Copy (__iar_copy_init3)

1 source range, total size 0x30:

0x00001bf8 0x30

1 destination range, total size 0x30:

0x20000000 0x30

initialize by copy { readwrite };の場合

ない

ある

Page 60: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

実際に動作をみてみる(変数を手動初期化)

60

初期化関数前後の変数の値を比較

for ( i=0; i< 10; i++){

printf("BEFORE No%d - %d¥n", i, mydat1[i]);

}

init_MYDAT( );

for ( i=0; i< 10; i++){

printf("AFTER No%d - %d¥n", i, mydat1[i]);

}

初期化関数を実行

initialize LED port

BEFORE No0 - -842150451

BEFORE No1 - -842150451

BEFORE No2 - -842150451

BEFORE No3 - -842150451

BEFORE No4 - -842150451

BEFORE No5 - -842150451

BEFORE No6 - -842150451

BEFORE No7 - -842150451

BEFORE No8 - -842150451

BEFORE No9 - -842150451

AFTER No0 - 0

AFTER No1 - 1

AFTER No2 - 2

AFTER No3 - 3

AFTER No4 - 4

AFTER No5 - 5

AFTER No6 - 6

AFTER No7 - 7

AFTER No8 - 8

AFTER No9 - 9

コード

printf出力結果 表示>ターミナルI/O

Page 61: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mへの移行時の注意点

Page 62: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

Cortex-Mへの移行時の注意点

62

アーキテクチャにより、仕様が異なる項目に注意する

• スタックサイズ

• intデータのサイズ

• 構造体のパッキング

Page 63: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

スタックサイズ

63

8bit、16bitマイコンと比較するとスタック使用量は多い

Cortex-M

68?バイト

16bitマイコンの例

14?バイト

全レジスタ汎用レジスタ+PC+STACK+CPSRを退避した際の例

EWARMでは2種類のスタック解析機能で使用量を解析可能

• 静的なスタック解析(メイク時) • 動的なスタック解析(デバッグ時)

Page 64: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

スタックサイズ

64

静的なスタック解析(メイク時) :オプション設定

プロジェクトを選択し、✓をダブルクリック

[リンカ]-[アドバンスド]-[スタックの使用量解析を有効にする]

1

2

3

4

5

Page 65: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

スタックサイズ

65

静的なスタック解析(メイク時):マップファイルに表示

メイクでマップファイルに解析結果表示 Call Graph Root Category Max Use Total Use

------------------------ ------- ---------

interrupt 0 0

Program entry 232 232

Program entry

"__iar_program_start": 0x0000058d

Maximum call chain 232 bytes

"__iar_program_start" 0

"__cmain" 0

"main" 8

"dhry_main" 192

"Proc_1" 16

"Proc_6" 16

"Func_3" 0

interrupt

"__default_handler" in vector_table_M.o [4]: 0x00000473

Maximum call chain 0 bytes

"__default_handler" in vector_table_M.o [4] 0

Mainの実行されるパスでの スタック使用量

ハンドラの実行されるパスでの スタック使用量

Page 66: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

スタックサイズ

66

静的なスタック解析(メイク時):解析サポート機能

• 関数ポインタなどを使うと、自動では追えない

• #pragma calls=XX,YY を使って手動指定

• 解析のスタート関数を個別指定したい

void Fun1(), Fun2();

void Caller(void (*fp)(void))

{

#pragma calls = Fun1, Fun2

(*fp)();

} この関数はFun1,Func2が呼ばれる

#pragma call_graph_root

void delay_time(int number){

・・・

}

Page 67: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

スタックサイズ

67

動的なスタック解析(デバッグ時):ツールオプション設定

1

2

3

4

[ツール]-[オプション] [スタック]-[グラフィカルスタック表示・・・]を有効

Page 68: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

スタックサイズ

68

動的なスタック解析(デバッグ時):表示

[表示]-[スタック]-[スタック1]

1

2 3

Page 69: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

スタックサイズ

69

動的なスタック解析(デバッグ時):実行結果表示

灰色は使用した量 緑のバーは現状値

マウスをあてると 詳細が表示

Page 70: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

intデータ型のサイズ

70

intデータ型のサイズは、マイコン・コンパイラにより異なる

EWARM 16ビットマイコン

signed char 8 8

unsigned char 8 8

signed short 16 16

unsigned short 16 16

signed int 32 16

unsigned int 32 16

signed long 32 32

unsigned long 32 32

signed long long 64 32

unsigned long long 64 32

Page 71: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

intデータ型のサイズ

71

マイコンにより、結果が異なる例

unsigned short c=0xFFFF;

int gg(unsigned short a, unsigned short b)

{

if ( c == ( a | ~b) ) {

return 0;

} else {

return 1;

}

}

int main( void ) {

int t;

t= gg(0, 0 );

printf("result=%d¥n", t);

return 0;

}

x =0で、yが0, c=0xFFFFの時のprintfの出力

result=0

result=1

16 bit

32 bit

Page 72: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

構造体のパッキング

72

構造体のパッキングによる差

struct S1 {

char s1;

int s2;

char s3;

int s4;

char s5;

} A[10];

struct S2 {

char s1;

char s3;

char s5;

int s2;

int s4;

} B[10];

Entry Address Size(hex) Size(Dec) Type Object

A 0x20000000 0xc8 200 Data Gb main.o [1]

B 0x200000c8 0x78 120 Data Gb main.o [1] ▲40%

s2

s3

s5

s4

s1

5

struct S1での状況

s2

s1 s5 s3

s4

4バイト

3

struct S2での状況

4バイト

Page 73: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

解析ツールを使用して品質向上

Page 74: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

解析ツールを使用して品質向上

74

IARシステムズの提供する解析アドオン製品を使用して品質向上

• 静的解析アドオン機能 C-STAT • MISRA-C 2004/2008C++/2012のチェック • CWE / CERTルールに準拠した脆弱性のチェック

• 動的解析アドオン機能 C-RUN

• 実行時の数値演算エラーの検出 • 不適切なメモリ利用の検出

※C-RUN/ C-STATはEWARM製品版に対するアドオン製品となります。

Page 75: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

静的解析アドオン機能C-STAT

75

実動作不要の静的解析で、潜在的なコードエラーを検出

主な機能 • C , C++ 言語に対応 • MISRA C:2004, MISRA C++:2008, MISRA C:2012に対応 • CWE や CERT C/C++といった基準に基づく100以上のルールに沿ったチェック • 直感的で簡単に使える設定 • 任意でコーディング規約単位または個別のルール単位でチェック • IAR Embedded Workbenchとシームレスに統合 • 短時間で解析 • ARM用IAR Embedded Workbenchバージョン7.40より利用可能

ソースコードレベルにおいて潜在的なエラーやバグをEWARM上で発見。 例えばメモリリーク・アクセス違反・算術演算の エラー・配列や文字列のオーバーランといった 潜在的なコードエラーを発見でき、 アプリケーションの誤動作を未然に防止。

Page 76: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

簡単に使える「C-STAT」

76

EWARMのオプションで解析したいチェックルールを選択するだけ

プロジェクトを右クリックし [オプション…]を選択

[静的解析]を選択

[C-STAT check]をクリック

チェック項目選択画面 MISRA C コーディングガイド 準拠チェック

CWE/CERTをベースに 動作時不良リスクをチェック

Page 77: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

「C-STAT」の実行

77

EWARMのオプションメニューで選択するだけ

プロジェクトを 右クリック

[C-STAT]静的解析

プロジェクトを解析

数分でC-STATメッセージが表示

Page 78: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

動的解析アドオン機能C-RUN

78

デバッグ実行時に、実際に発生した潜在エラーを検出

• 主な機能 • C, C++言語に対応 • 直感的で簡単に使える設定 • 包括的かつ詳細な実行時のエラー情報 • エラーが見つかった場所のコールスタック情報 • エディタ上でのコード位置を表示やグラフィカルな表示 • 自由度の高いエラー情報の管理 • 配列や他のオブジェクトが境界内に正しくアクセスしていることを保証する境界チェック • バッファオーバーフローの検出 • データのキャスト時の、値の変化を検出 • 算術計算時の値のチェック • シフト演算のビット損失を検出 • ヒープやメモリリークに関するチェック • ARM用IAR Embedded Workbenchバージョン7.20以降で利用可能

事前に設定したチェック項目を対象にデバッグ実行中に、 リアルタイムにチェックを行い、違反した挙動を 検出し、EWARM上で通知。 実装フェーズから問題を検出することで、後段での テスト・修正工数を削減し、品質向上・納期短縮を実現

Page 79: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

動的解析アドオン機能C-RUN

79

デバッグ実行時に、実際に発生した潜在エラーを検出

Editor

Project manager

Library builder

Librarian

Simulator driver

Hardware system drivers

Power debugging

RTOS plug-ins

IAR C/C++ Compiler

Assembler

Linker

IDE tools IAR C-SPY

Debugger Build tools

完全に統合された 動的解析

詳細かつ柔軟な 動的エラー情報

コンパイラ開発者による高効率

Page 80: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

簡単に使える「C-RUN」

80

EWARMのオプションで解析したいチェックルールを選択するだけ ※ビルド時にチェックコードが実行コードに埋め込まれる

[ランタイム解析]を選択

[有効化]をチェック

チェックしたい項目をチェック

Page 81: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

「C-SRUN」の実行

81

EWARMのデバッグ実行中に自動的に検出される

発生した違反

発生したソース位置

発生したPC位置

発生したコア (マルチコア対応)

データ値の表示 値0x000001f4を0xf4にした

コールスタックで、mainから、convを呼んだ中で発生したことを示す。

Page 82: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

まとめ

Page 83: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

まとめ

83

Cortex-Mの特徴を理解することで、レジスタや命令セットの読み方を習得できる

割込みハンドラやベクタテーブルは、従来のARMコアから変更となっている。

初期化処理やリンカ設定はEWARM独自の記述となり、既存のものを参考にカスタマイズしていく。

マイコンアーキテクチャごとに動作の異なるコーディングに注意する

静的解析ツール、動的解析ツールを使用することで、不具合の早期発見、品質向上につながる

Page 84: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

本資料について

Page 85: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

本資料取り扱い上の注意

85

本資料は2015年4月1日時点の情報を基に作成されており、将来変更の可能性 のあるものです。あわせてご紹介する設定や機能に関連して、動作保証をお約束するものではございませんので、ご了承ください 本資料で提供している情報は、ご利用されている方のご判断・責任においてご使用ください。提供した情報に関連して、ご利用される方が不利益等を被る事態が生じたとしても、弊社及び執筆者は一切の責任を負いかねますので、ご了承ください。 本資料の内容に関する弊社または各社へのお問合せはご遠慮ください。 本資料及びデータの再配布・無断転用・転載等はご遠慮ください。

Page 86: EWARMで開発するCortex-M...本ドキュメントについて 2 目的 Cortex-Mプロセッサファミリの特徴を理解し、ソフトウェア開発をする上 での注意事項を学ぶ。ARM用統合開発環境、ARM用IAR

商標について

86

• IAR Systems, IAR Embedded Workbench, C-SPY, C-RUN, C-STAT, visualSTATE, Focus on Your Code, IAR KickStart Kit, I-jet, I-scope, IAR, および IAR Systems のロゴタイプはIAR Systems ABが所有する商標または登録商標です。

• ARMおよびCortexは、ARM Limited(またはその子会社)のEUまたはその他の国における登録商標です。 ARMおよびThumbは、ARM Limited(またはその子会社)のEUまたはその他の国における商標です。 CoreSightは、ARM Limited(またはその子会社)のEUまたはその他の国における商標です。 All rights reserved.

• STM32は、STマイクロエレクトロニクスの登録商標です。

• その他、本資料中の製品名やサービス名は全てそれぞれの所有者に属する商標または登録商標です。