Ardunio解析之函数探秘

2021-02-23 10:21:56 浏览数 (1)

对于一个C程序员很快的就可以写出这个实现,事实上也就是这个实现

对于一个天天写Arduino的人,你是否对其中的技术细节很迷惑

就像我上面写的这个代码一样,就是你每个程序都是有的这个loop,setup

众所周知,AVR是arduino的soul,它又是得拿C编译器来编译

所以Arduino的底层也是一堆的C代码,至于怎么实现的就是我文章的所写

在Arduino的实现里面是main这个函数

以下就是完整版的Arduino main函数实现,可以看到写的更加的健壮

代码语言:javascript复制
void initVariant() __attribute__((weak));
void initVariant() {}
void setupUSB() __attribute__((weak));
void setupUSB() {}
int main(void)
{
  init();
  initVariant();
#if defined(USBCON)
  USBDevice.attach();
#endif
  setup();
  for (;;)
  {
    loop();
    if (serialEventRun)
      serialEventRun();
  }
  return 0;
}
代码语言:javascript复制
https://downloads.arduino.cc/arduino-1.8.13-windows.exe

这里先下载一个Arduino

然后打开一个内置的demo就可以看到我们的setup和loop了


我们继续聊Arduino的实现,它和C的微小的差别就是Arduino不知道你的标准的输出设备是哪个(stdout),标准输出就是printf函数要输出的地方,比如一个cmd,一个shell。调用fdevopen()这个函数给他一个指针,指向 向那个设备输出一个字符的函数。你也可以调用Serial库里面的函数干这个事情,为了通过一个虚拟的串口,也可以是实际的一个串口输出东西。还需要你在setup()函数里面设置一些初始化的变量,接下来就是写一下C语言版本的串口打印:

就这样就写出来了

然后用Arduino来编译一下,可以看到没有错误。证明我的代码写对了

事实上这个是常见的Arduino串口打印代码

我们继续看这个最简单的代码就是闪烁灯的代码

在一些较早的版本是用大家熟悉的#define的,那新版里面的宏定义在哪里?

通过搜索得知在这里,这个是高端的mega

我们普通的uno在这里

更加的深入一些是在这里,硬件,变体里面。我们以后想自己为一款开发板兼容Arduino,那么就是需要按照这样的头文件方式定义


在Arduino的使用过程中,一切的魔法好像就是一些按键。那按键之下的物理意义有哪些呢?

这个就是魔法按钮

魔法的背后是这些东西

avr-gcc是gcc移植到avr的版本

avr-libs是avr的开源的C库

还有一些软件把编译的文件变成Intel的hax文件

最后通过avr-dude下载到你的开发板里面

感兴趣的可以去搜索一下这个下载工具

具体的这个配置工具在这个路径

内部是很多的配置文件

我们把这个这件复制

到这个bin里面

然后将bin加到你的环境变量里面

验证通过

conf这个文件的添加可以让你以后在编译文件的时候不用输入相关编译器的路径,很是方便

接下来我们写一个c的程序,虽然没有编译通过但是还是可以写一下为什么的


头文件是avr/io.h

是让编译器引入一个很长的列表,关于处理器的一切细节。IO端口的地址,名字等。

long i;是一个长整形的变量,用作延时计数器

1<<5;1向左移动5位


算了,按说是可以的。但是我搞不来了,一会儿去Mac搞

用arduino是不能编译的,用gcc才可以

0 人点赞