質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.38%

  • C

    4811questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    4649questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Arduino

    710questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Arduino対応機TeensyLCでのインラインアセンブリのコンパイルエラー

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,277

Shun_Takagi

score 1

前提・実現したいこと

ArduinoFioの使用を前提に作られたスケッチ(プログラム)を流用して、これに
シリアル通信でデータを受信しながら処理をするスケッチを加えて実行したところ
Fioでは処理能力が不足していたため、TeensyLCというArduino対応機に変更して実行したい。

発生している問題・エラーメッセージ

使用したスケッチの

99  inline void tunedDelay(uint16_t delay) { 
100   uint8_t tmp=0;
101 
102   asm volatile("sbiw    %0, 0x01 \n\t"
103     "ldi %1, 0xFF \n\t"
104     "cpi %A0, 0xFF \n\t"
105     "cpc %B0, %1 \n\t"
106     "brne .-10 \n\t"
107     : "+r" (delay), "+a" (tmp)
108     : "0" (delay)
109    );
110 }

この部分で下記のようなコンパイルエラーがでます。

SBUS_Logger: In function 'void tunedDelay(uint16_t)':
SBUS_Logger:109: error: impossible constraint in 'asm'
impossible constraint in 'asm'

該当のソースコード

#define RX_PIN  10
#define DEBUG_PIN 13

unsigned char sbus_data[25];
int16_t channels[16];

void setup()  
{
  Serial.begin(9600);
  pinMode(RX_PIN, INPUT);
  pinMode(DEBUG_PIN, OUTPUT);
}

void loop() // run over and over
{
  readSBUSdata();
/*  Serial.print("Header:");
  Serial.println(sbus_data[0], HEX);*/
  update_channels();
/*  for(int i=0; i < 25; i++){
    Serial.print(sbus_data[i], HEX);
    Serial.print(",");
  }*/
  for(int i=0; i < 16; i++){
    Serial.print(channels[i], HEX);
    //Serial.print("\t");
  }
  Serial.println();
/*  Serial.print("Flag:");
  Serial.println(sbus_data[23], HEX);
  Serial.print("Fooder:");
  Serial.println(sbus_data[24], HEX);*/
}


void update_channels(void) {
  uint8_t i;
  uint8_t sbus_pointer = 0;
  uint8_t byte_in_sbus = 1, bit_in_sbus = 0, ch = 0,bit_in_channel = 0;
  for (i=0; i<16; i++) {
    channels[i] = 0;
  }

  // process actual sbus data
  for (i=0; i<176; i++) {
    if (sbus_data[byte_in_sbus] & (1<<bit_in_sbus)) {
      channels[ch] |= (1<<bit_in_channel);
    }
    bit_in_sbus++;
    bit_in_channel++;

    if (bit_in_sbus == 8) {
      bit_in_sbus =0;
      byte_in_sbus++;
    }
    if (bit_in_channel == 11) {
      bit_in_channel =0;
      ch++;
    }
  }
}

inline int readSBUSdata(){
    volatile uint8_t *rxport = portInputRegister(digitalPinToPort(RX_PIN));
    uint8_t  mask = digitalPinToBitMask(RX_PIN);
    noInterrupts();
    for(uint8_t index = 0; index < 25; ){
      uint8_t  d = 0, i = 0x1;
      uint16_t waitCount = 0;
      while(!((*rxport) & mask)){
        waitCount++;
      }
      tunedDelay(8);
      do
      {
        uint8_t noti = ~i;
        DebugPulse(DEBUG_PIN);
        if ((*rxport) & mask)
          d |= i;
        else
          d &= noti;
        i <<= 1;
        tunedDelay(7);
      }while(i);

      sbus_data[index] = ~d;
      index++;

      if(waitCount > 1000){
        sbus_data[0] = ~d;
        index = 1;
        waitCount = 0;
      }
      tunedDelay(10);
    }
    interrupts();
}

inline void tunedDelay(uint16_t delay) { 
  uint8_t tmp=0;

  asm volatile("sbiw    %0, 0x01 \n\t"
    "ldi %1, 0xFF \n\t"
    "cpi %A0, 0xFF \n\t"
    "cpc %B0, %1 \n\t"
    "brne .-10 \n\t"
    : "+r" (delay), "+a" (tmp)
    : "0" (delay)
    );
}
inline void DebugPulse(uint8_t pin)
{
  volatile uint8_t *pport = portOutputRegister(digitalPinToPort(pin));
  uint8_t val = *pport;
  *pport = val | digitalPinToBitMask(pin);
  *pport = val;
}

試したこと

asmというのがインラインアセンブラの記述であるということはネット検索でなんとなくは
分かったのですが、実際に解決する方法となると付け焼刃の知識ではどうにもなりません。
恐らく、ArduinoFioがAVRマイコンを搭載していて、対してTeensyLCはARMマイコン(Cortex-M0+)を
搭載していることに原因があるのではないかと思うのですが、具体的に何が原因なのかは理解出来てません。
C言語を少し扱った程度で後はArduinoの経験しかないので、何か解決等あればご教授いただきたいです。

補足情報(言語/FW/ツール等のバージョンなど)

Arduino IDE に Teensyduino というアドオンソフトウェアを追加した環境を使っています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

恐らく、ArduinoFioがAVRマイコンを搭載していて、対してTeensyLCはARMマイコン(Cortex-M0+)を
搭載していることに原因があるのではないかと思うのですが、具体的に何が原因なのかは理解出来てません。 

元コードのインライン・アセンブリ部は、ArduinoFio/AVRアーキテクチャ向けのアセンブリコードです。asm拡張構文の入出力制約として"a"を指定しており、これをTeensyLC/ARM向けアーキテクチャとしてコンパイルしようとしたため(ARMには"a"制約が存在しない)、「impossible constraint in 'asm'」エラーメッセージにつながったようです。

C言語を少し扱った程度で後はArduinoの経験しかないので、何か解決等あればご教授いただきたいです。

残念ながら、C言語の範疇ではこの問題を解決できません。正しく動作させるには、AVRアセンブリで記述されたアセンブリコードを、ARMアセンブリで書き換える必要があります。(+GCC拡張アセンブラ構文の知識も必要です)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    4811questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    4649questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Arduino

    710questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。