HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2017/04/08

STM32 STM32F103C8T6で ARM GCCの Cソース中にインラインアセンブラを記述する方法 STM32 STM32F103C8T6で ARM GCCの Cソース中にインラインアセンブラを記述する方法

(ARM GCCの Cソース中にインラインアセンブラを記述する方法)

Tags: [ワンチップCPU]




● ARM GCCコンパイラのインラインアセンブラと組み込みアセンブラの使用

ARM GCC Inline Assembler Cookbook
 Ethernutは 2002年に購入していじくっていました。

2002/11/25
ATMEL AVRをGNU-GCC(WinAVR) + EtherNutで開発
ATMEL AVRをGNU-GCC(WinAVR) + EtherNutで開発

  完全フリーハード&ソフトで開発

3.3.1. Cortex-M3 instructions
 Cortex-M3 Technical Reference Manual

6.45.2 Extended Asm - Assembler Instructions with C Expression Operands

asm [volatile] ( AssemblerTemplate
                 : OutputOperands
                 [ : InputOperands
                 [ : Clobbers ] ])
 Clobbersはインライン処理の中で破壊するレジスタ等の情報を記述する。

asm [volatile] goto ( AssemblerTemplate
                      :
                      : InputOperands
                      : Clobbers
                      : GotoLabels)

ARM コンパイラのインラインアセンブラと組み込みアセンブラの使用
7.4. インラインアセンブリコードと組み込みアセンブリコードの相違点

 1) インラインアセンブラ
 2) 組み込みアセンブラ


● 1) インラインアセンブラ

 ARM のみ
 アセンブリコードの最適化 - 完全に最適化されます。(勝手にコード内容が変化する)
 volatile修飾子を付けるとコンパイラの最適化を無効にする。

5.2. C/C++ inline assembly

 記述例
#include <stdio.h>

int add(int i, int j)
{
  int res = 0;
  asm (
     "ADD %w[result], %w[input_i], %w[input_j]"
         //Use `%w[name]` to operate on W
         // registers (as in this case).
         // You can use `%x[name]` for X
         // registers too, but this is the
         // default.
     : [result] "=r" (res)
     : [input_i] "r" (i), [input_j] "r" (j)
     );
     return res;
}

int main(void)
{
  int a = 1;
  int b = 2;
  int c = 0;

  c = add(a,b)

  printf(“Result of %d + %d = %d\n, a, b, c);
}

 TrueSTUDIOでは Syntax Errorになるので下記の様に書き換えます。
 %w[hoge]を %[hoge]に書き換える。
int add(int i, int j)
{
  int res = 0;
  // res = i + j;
  asm (
     "ADD %[result], %[input_i], %[input_j]"
     : [result] "=r" (res)
     : [input_i] "r" (i), [input_j] "r" (j)
     );
     return res;
}

 インラインで記述したアセンブリコード内容を最適化で勝手に変えられない様にする方法。

 volatile修飾子を付けてコンパイラの最適化を無効にします。
int add(int i, int j)
{
  int res = 0;
  // res = i + j;
  asm volatile (
     "ADD %[result], %[input_i], %[input_j]"
     : [result] "=r" (res)
     : [input_i] "r" (i), [input_j] "r" (j)
     );
     return res;
}

 サンプルの例を見様見真似で構文や具体的な使い方を理解していきます。
 "cc" = flags register、"memory = memory reads or writes



● 2) 組み込みアセンブラ

 ARM および Thumb
 アセンブリコードの最適化 - 最適化されません。

組み込みアセンブラ構文

 GCCでは使えない? TrueSTUDIOでは Syntax Errorになる。

Example 7.1. 組み込みセンブラを使用した文字列のコピー

#include <stdio.h>

__asm void my_strcpy(const char *src, char *dst)
{
loop
      LDRB  r2, [r0], #1
      STRB  r2, [r1], #1
      CMP   r2, #0
      BNE   loop
      BX    lr
}

int main(void)
{
    const char *a = "Hello world!";
    char b[20];
    my_strcpy (a, b);
    printf("Original string: '%s'\n", a);
    printf("Copied   string: '%s'\n", b);
    return 0;
}


●メモリキャッシュを意識したインラインアセンブラの書き方

 メモリの境界を揃える。

__attribute__((aligned)) 変数属性

 __attribute__((aligned)) 変数属性
 aligned 変数属性を使用すると、変数や構造体フィールドの最小境界整列をバイト単位で指定できます。
 この変数属性は、ARM コンパイラでサポートされている GNU コンパイラの拡張機能です。

/* 16 バイト境界で整列 */
int x __attribute__ ((aligned (16)));

/* 256 バイト境界で整列 */
__attribute__ ((aligned (256)))
int my_add_aligned_256(int i, int j)
{
  int res = 0;
  // res = i + j;
  asm (
     "ADD %[result], %[input_i], %[input_j]"
     : [result] "=r" (res)
     : [input_i] "r" (i), [input_j] "r" (j)
     );
     return res;
}


TrueSTUDIO for ARM 7.1.2の gccバージョン
C:\Program Files (x86)\Atollic\TrueSTUDIO for ARM 7.1.2\PCTools\bin> gcc -v

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/program\ files\ (x86)/atollic/truestudio\ for\ arm\ 7.1.2/pctools/bin/../libexec/gcc/mingw32/5.3.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-5.3.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --prefix=/mingw --disable-win32-registry --target=mingw32 --with-arch=i586 --enable-languages=c,c++,objc,obj-c++,fortran,ada --enable-static --enable-shared --enable-threads=posix --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --enable-libstdcxx-debug --with-tune=generic --enable-libgomp --disable-libvtv --enable-nls
Thread model: posix
gcc version 5.3.0 (GCC)



Tags: [ワンチップCPU]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

STM32 STM32F103C8T6マイコンボードを ST-Link V2(中華製の互換ドングル)を使って開発
STM32 STM32F103C8T6マイコンボードを ST-Link V2(中華製の互換ドングル)を使って開発

  STM32F103C8 ARM Cortex-M3 72MHz CPU、ST-LINK Utilityでファームのアップデート

STM32 STM32F103C8T6の Windows用の開発環境を無料で構築する方法。CubeMX True STUDIO ST-LINK V2
STM32 STM32F103C8T6の Windows用の開発環境を無料で構築する方法。CubeMX True STUDIO ST-LINK V2

  Windows用の STM32F103C8 ARM Cortex-M3 72MHzの開発環境を無料で作る、STM32CubeMX、TrueSTUDIO、ST-LINK V2

STM32 STM32F103C8T6の USB CDC Virtual COM portドライバを Windows 7に組み込む方法
STM32 STM32F103C8T6の USB CDC Virtual COM portドライバを Windows 7に組み込む方法

  Windows 7で VCPドライバを組み込む時に「INFファイルが無効です」の解決方法、COMポート増殖を防ぐ方法(増えすぎた COMポートを削除)

STM32 STM32F103C8T6の USB CDC Virtual COM portデバイスを実装する
STM32 STM32F103C8T6の USB CDC Virtual COM portデバイスを実装する

  STM32 STM32F103C8T6に STCubeで CDC VCPデバイスを組み込み、動作試験のループバックを実装する

STM32 STM32F103C8T6で SPI接続の 1.8インチ TFT液晶を使用する方法
STM32 STM32F103C8T6で SPI接続の 1.8インチ TFT液晶を使用する方法

  STM32に 128x160 ST7735 TFT 1.8インチ LCDを SPI接続して自前アプリから文字列を描画する方法。

STM32 STM32F103C8T6マイコンボード開発、CubeMX STM32CubeMXの使い方
STM32 STM32F103C8T6マイコンボード開発、CubeMX STM32CubeMXの使い方

  STM32マイコン用の初期設定コード生成ツール STM32CubeMXの使い方、USBデバイスの作成方法

STM32 STM32F103C8のクローン(複製品) 108MHz動作の GD32F103C8、CS32F103C8
STM32 STM32F103C8のクローン(複製品) 108MHz動作の GD32F103C8、CS32F103C8

  STM32クローン GigaDevice GD32F103C8T6 108MHz、CKS CS32F103C8T6 72MHz

ラズパイを意識した別物製品 Orange Pi Zeroを買ってみた、Allwinner H2+ Cortex-A7 4core
ラズパイを意識した別物製品 Orange Pi Zeroを買ってみた、Allwinner H2+ Cortex-A7 4core

  オレンジパイはラズパイよりもコスパは良いが情報が無いので利用者側に一定のスキルが必要

Orange Pi PC 2を買ってみた、Allwinner H5 Cortex-A53 4core ARM64
Orange Pi PC 2を買ってみた、Allwinner H5 Cortex-A53 4core ARM64

  ラズパイを意識した別物製品、オレンジパイはラズパイよりもコスパが良い、でも情報が無い

Raspberry Pi Zero Wを海外通販の Pimoroni等での購入方法、購入できる通販ショップ一覧まとめ
Raspberry Pi Zero Wを海外通販の Pimoroni等での購入方法、購入できる通販ショップ一覧まとめ

  ラズパイゼロW ワイヤレスモデルを海外通販でサクッと簡単に個人輸入で入手。技適通過でも国内販売は常に品切れ

大人気の CPUボード、Raspberry Pi 3 Model Bで作ってみよう
大人気の CPUボード、Raspberry Pi 3 Model Bで作ってみよう

  Raspberry Piの開発環境の構築やタッチパネル付き液晶ディスプレイや各種センサーの使い方まとめ

Espressif ESP32 Arduino互換でスケッチが使える WROOM32開発基板
Espressif ESP32 Arduino互換でスケッチが使える WROOM32開発基板

  Espressif ESP32 32ビット Arduino互換マイコンボードをお手軽に開発する方法

Espressif ESP8266 Arduino互換でスケッチが使える ESP-12Eモジュール基板
Espressif ESP8266 Arduino互換でスケッチが使える ESP-12Eモジュール基板

  Espressif ESP8266 ESP-12-E NodeMCU V1 ESP12 CP2102

BangGood通販はドローン以外にも面白い商品がまだまだ有った(電子工作編)
BangGood通販はドローン以外にも面白い商品がまだまだ有った(電子工作編)

  レーザー彫刻機、カラー液晶の DIYオシロ、Arduinoや Raspberry Pi用の小型カラー液晶




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2017 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/cpu/stm32_stm32f103c8t6_gcc_inline_assembler/