如何解决错误:atmega328p中的预期标识符或“ asm”前的“”

问题描述

我写了以下代码

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdint.h>
#include <string.h>

#define Set_bit_(PORT,BIT) PORT|=(1<<BIT)
#define Clr_bit_(PORT,BIT) PORT&=~(1<<BIT)
#define OUTPUT 1
#define INPUT 0
#define HIGH 1
#define LOW 0

void Sei();
void cli();

struct {
  volatile unsigned int FLAG_ISR0 : 1;
  volatile unsigned int FLAG_ISR1 : 1;
} FLAG_BIT;

int main(void)
{
}
   
void Sei()
{
  Set_bit_(SREG,7);
}

void cli()
{
  Clr_bit_(SREG,7);
}

每当我包含中断标头时,编译器就会在一行中显示一个错误cli表示

error: expected identifier or '(' before 'asm'

解决方法

#include<avr/interrupt.h>

此文件(source)具有宏sei()。因此,线

void cli()

扩展为

void  __asm__ __volatile__ ("cli" ::: "memory")

这不是您期望的。

您可以为该函数使用其他名称(例如,使名称以大写字母Cli开头,就像使用Sei一样)。

但是,由于这些功能的作用与cli()sei()宏完全相同,因此您可能希望完全丢弃它们,而改用宏。