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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

C++

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

Arduino

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

Q&A

解決済

1回答

3253閲覧

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

Shun_Takagi

総合スコア7

C

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

C++

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

Arduino

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

0グッド

0クリップ

投稿2016/08/01 05:14

###前提・実現したいこと
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 というアドオンソフトウェアを追加した環境を使っています。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

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拡張アセンブラ構文の知識も必要です)

投稿2016/08/01 12:38

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問