已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。
5天前关闭。
Improve this question
他们为avr MCU写了以下代码,我用Arduino IDE编译并上传了代码,我没有得到任何错误,代码工作正常,但我记得C程序不支持bool数据类型。这段代码在Linux上仍然可以用avr-gcc编译吗?
//The following code is written for ATmega328P microcontroller
// Turns ON the led on a click of a switch and Turns OFF it again another click
#include <avr/io.h>
#include <avr/interrupt.h>
#define LED_PIN PB5
#define SW_PIN PD2
volatile bool ledOn = false;
// Function to initialize pinmode and interrupt
void init() {
// Set LED pin as output
DDRB = DDRB |(1 << DDB5);
// Set switch pin as pull-up resistor
PORTD = PORTD |(1 << SW_PIN);
// Enable interrupt on the switch pin
EIMSK = EIMSK |(1 << INT0);
// Trigger interrupt on failing edge of the switch signal
EICRA = (1 << ISC01);
// Enable global interrupts
sei();
}
// Interrupt service routine for the switch
ISR(INT0_vect) {
// If the switch is pressed, toggle the LED state
if ((~PIND & (1 << SW_PIN)) && !ledOn) {
PORTB = PORTB | (1 << LED_PIN);
ledOn = true;
}
else{
PORTB = PORTB & ~(1 << LED_PIN);
ledOn = false;
}
}
int main(void) {
// Initialization
init();
// Loop forever
while (1) {
// NOP
}
return 0;
}```
2条答案
按热度按时间vhmi4jdf1#
这段代码在Linux上还能用avr-gcc编译吗
我有点怀疑你是否能在AVR上运行Linux:)
但是不,它不会在Linux下编译gcc,因为它是无效的C。从C99到C17版本的标准,你需要
#include <stdbool.h>
来使用bool
。C使用关键字_Bool
和bool
从stdbool.h
只是一个宏。即将到来的C23将删除所有这些废话,然后
bool
,true
和false
将成为正确的语言关键字。因此,如果您使用“gcc trunk”版本并使用-std=c2x
编译,它实际上将在Linux上编译,该版本将于今年晚些时候正式发布为gcc 13-std=c23
。它在Arduino上编译的原因是因为你使用的是C++编译器。这是一种不同的编程语言。
vsdwdz232#
Arduino IDE使用C编译-您正在使用C而不是C -即使它是有效的C代码,并且您没有使用Arduino
setup()
/loop()
框架或Arduino库。然而,对于C,C99定义了一个内置类型
_Bool
。它这样做是因为所有存在的前C99代码可能以各种方式定义布尔类型或宏别名。它防止了引入新关键字bool
,true
和false
可能导致的破坏现有代码。C99还定义了一个标头stdbool. h,它为
_Bool
提供了一个类似C的bool
别名,并为true
和false
值提供了符号。在C代码中包含stdbool. h或cstdbool没有任何效果。Arduino编译器与您建议在Linux上使用的AVR GCC交叉编译器相同。它支持C和C编译。您可以使用avr-g驱动程序进行C编译,但它与avr-gcc驱动程序的唯一区别是,它在调用ld时隐式地链接C库支持。否则,C或C编译由命令行开关或源文件扩展名决定。
因此,如果您使用与Arduino相同的C编译,您的代码将使用AVR GCC编译,但如果您想确保它使用C或C++编译(或者您只是想使其有效的C代码),您可以简单地添加
#include <stdbool.h>
,它将在任何情况下工作。