-
2020-04-04 17:38:04
转至:https://www.cnblogs.com/zhangfeionline/p/5588902.html
今天看arduino的源代码,对于arduino中的setup和loop有了新的理解,可能你以前对于这俩个函数就是知道arduino是初始化,而loop是死循环,但是托若你看了Arduino的主函数你会有更加清晰的认知
下面贴出arduino的main函数
#include <Arduino.h>int main(void)
{
init();
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
这就不多说了,一直写的函数就是俩个子函数int led=12;
void setup()
{
pinMode(led,OUTPUT);
}
void loop()
{
digitalWrite(led,HIGH);
delay(1000);
digitalWrite(led,LOW);
delay(1000);
}更多相关内容 -
Arduion 底层原理之 setup函数和loop函数
2021-07-26 14:54:24祝好__by Dxg_LC 目录:Dxg_C# 开发小技巧整理集合 1、 2、因此,通常见到的 setup()函数 loop()函数,只是底层的一个子函数 Dxg-原创出品,如需转载,请注明出处; 序言: 1、以上链接为方便整理查看资料用;伴随...VS-C++ 系列:所有相关C++文章链接.
VS-C# 系列:所有相关C#文章链接.
bat 系列:所有相关bat文章链接.
OpenCV 系列:所有相关OpenCV文章链接.
AD 系列:所有相关文章链接
Keil 系列:所有相关文章链接
Arduino 系列:所有相关Arduino文章链接
Git SVN 系列:所有相关Git SVN文章链接
Linux 系列:所有相关文章链接
所有内容均以最小系统调试成功;逐步提供低分源码工程下载!
保证每行代码都经过验证!
如有疑惑,欢迎留言,看见即回;祝好__by Dxg_LC目录:Dxg_C# 开发小技巧整理集合
序言:
1、以上链接为方便整理查看资料用;伴随博文发布更新,如果有不正确处,感谢指正
2、因本人能力有限若有不正确之处或者相关超链接失效,请于相关文章内提醒@博主;灰常感谢
3、友情提醒1,勿要《一支烟 + 一杯茶 == 一坐一下午》 身体重要,革命本钱;
4、友情提醒2,多喝热水;
5、友情提醒3,听媳妇话+多点时间陪家人;
1、
int main(void) { init();//系统级别-初始化函数 setup();//用户级别-初始化函数 for (;;) { loop();//用户级别-循环函数 if (serialEventRun) serialEventRun();//用户级别-串口接收中断函数[默认没显示出来] } return 0; }
2、因此,通常见到的 setup()函数 loop()函数,只是底层的一个子函数
Dxg-原创出品,如需转载,请注明出处;
欢迎收藏,点赞;"一键三联"走起,LOL
-
Arduino之程序结构(setup与loop函数)
2020-11-10 22:08:49} 通过以上程序可见,Arduino程序中编写的setup和loop函数,都在main函数中调用了。 loop的循环执行,是通过for循环实现的,且每次loop结束后,都会进行串口事件判断,也正是因为这种设计,串口事件不能实时响应。一、blink源程序分析
–》源程序如下(注释已翻译):
// setup函数只运行一次 void setup() { // 初始化LED_BUILTIN引脚为输出引脚 pinMode(LED_BUILTIN, OUTPUT); } // loop函数会一直循环运行 void loop() { digitalWrite(LED_BUILTIN, HIGH); // 点亮LED(配置引脚输出高电平) delay(1000); // 等待1s digitalWrite(LED_BUILTIN, LOW); // 熄灭LED(配置引脚输出低电平) delay(1000); // 等待1s }
这是先说一下电平的概念:
- 高电平就相当于高电位或高电势;
- 低电平就相当于低电位或地电势;
- 两点之间存在电平差就相当于存在电位差或者电势差,从而存在电压。
程序首先把LED_BUILTIN引脚配置为输出引脚,意思是板子可以控制该引脚输出为高电平或者低电平,LED引脚一端接在板子控制端口,而另外一端是接在参考地上,可以认为参考地是零电平或者低电平。当loop函数开始执行的时候,把控制端引脚输出为高电平,而参考地是低电平,所以LED被点亮,同理把控制端引脚输出为低电平,两点之间没有电位差,因此LED熄灭。
二、程序结构
- setup()函数
Arduino板子通电或复位后,即会开始执行setup() 函数中的程序,该部分只会执行一次。通常我们会在setup() 函数中完成Arduino的初始化设置,如配置I/O口状态,初始化串口等操作。
–》示例程序:
// 给13号引脚连接的设备设置一个别名“led” int led = 13; // 在板子启动或者复位重启后, setup部分的程序只会运行一次 void setup(){ // 将“led”引脚设置为输出状态 pinMode(led, OUTPUT); }
- loop()函数
在setup() 函数中的程序执行完后,Arduino会接着执行loop() 函数中的程序。而loop()函数是一个死循环,其中的程序会不断的重复运行。通常我们会在loop() 函数中完成程序的主要功能,如驱动各种模块,采集数据等。
–》示例程序:
// setup部分程序运行完后,loop部分的程序会不断重复运行 void loop() { digitalWrite(led, HIGH); // 点亮LED delay(1000); // 等待一秒钟 digitalWrite(led, LOW); // 通过将引脚电平拉低,关闭LED delay(1000); // 等待一秒钟 }
*三、Arduino程序main函数结构解析
这里作为拓展,以下分析需要C/C++基础!
在进行Arduino开发时,没有像传统C/C++程序使用入口函数main。实际上main函数存在于Arduino核心库中,且仍然是程序的入口。
在Arduino核心库中可见main.cpp文件,其内容如下:
#include <Arduino.h> // Declared weak in Arduino.h to allow user redefinitions. int atexit(void (* /*func*/ )()) { return 0; } // Weak empty variant initialization function. // May be redefined by variant files. 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; }
通过以上程序可见,Arduino程序中编写的setup和loop函数,都在main函数中调用了。
loop的循环执行,是通过for循环实现的,且每次loop结束后,都会进行串口事件判断,也正是因为这种设计,串口事件不能实时响应。 -
Arduino-为什么只有setup和loop函数?
2018-09-18 10:58:43Arduino程序main函数结构分析 ...loop函数最后执行死循环while(1): int ledPin = 7; int buzzer = 8; int ledbz(int i);// void setup() { pinMode(ledPin, OUTPUT); pinMode(buzzer,OUTPUT); } ...如何让loop只执行一次?
loop函数最后执行死循环while(1):
int ledPin = 7; int buzzer = 8; int ledbz(int i);// void setup() { pinMode(ledPin, OUTPUT); pinMode(buzzer,OUTPUT); } void loop() { int j; ledbz(j);// while(1);//陷入死循环 } int ledbz(int i)// { for( i=0;i<10;i++) { digitalWrite(ledPin,HIGH); digitalWrite(buzzer,HIGH); delay(100); digitalWrite(ledPin,LOW); digitalWrite(buzzer,LOW); delay(100); } return i; }
Arduino工程源码分析
本次分析基于Arduino 1.0.6
一、我相信大家第一次打开一个Arduino例子的时候,肯定跟我一样,有一种疑惑,
按以往经验,一般会有一个main函数,可是这里却只有一个loop()函数和setup()函数,
为什么呢????????
看到这里,没有main函数怎么运行下去。。。。。。。。。。。。。。。。。。?
运行机制是怎么样??
一系列问题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
然后咱们揭开它神秘的面纱-----
首先大家可以用代码浏览神器Source Insight来建立一个工程,方便查看
明确自己Arduino的安装目录,这里我的是D:\Program Files\Arduino
建立工程后添加源码D:\Program Files\Arduino\hardware\arduino\cores\arduino
OK!!!建立工程完成后,开始分析---------
在工程浏览搜索mian 看到出现main.cpp
看到上面代码 , 是不是恍然大悟了~_~
这里告诉大家,为什么Arduino里面的loop()函数是执行完一次,再执行,也就是无限次执行loop,for循环,大家都知道
如果大家想要只执行一次loop()的话,可以考虑来个while(1)
继续。。。。。。。。。
看到mian函数里面的init()没有,跟进去,一探究竟
里面第一句注释:这个函数必须在setup之前执行,否则很多功能将无法工作
这个初始化函数里面sei().打开所有的中断什么的,还有其他就是些寄存器初始化
回到mian函数往下看
_attribute_的weak属性,这里的作用是弱符号:若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误。链接器会忽略弱符号,去使用普通的全局符号来解析所有对这些符号的引用,但当普通的全局符号不可用时,链接器会使用弱符号。
也就是防止定义的一样产生冲突。
继续往下是USB功能的使能USBDevice.attch()
然后是for循环里面的串口D:\arduino IDE\Arduino\hardware\arduino\avr\cores\arduino
/* main.cpp - Main loop for Arduino sketches Copyright (c) 2005-2013 Arduino Team. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include <Arduino.h> // Declared weak in Arduino.h to allow user redefinitions. int atexit(void (* /*func*/ )()) { return 0; } // Weak empty variant initialization function. // May be redefined by variant files. 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; }
注意:#if #endif条件注释的使用
例如:
#if defined(X)
print ("hello word!\n") ;
#endif
以上编译只与编译宏X有关,与宏定义X的条件是否成立无关。如果定义了X宏,条件即成立,下面print语句会被编译;如果宏X未定义,则print语句不会备编译(只是编译,不是执行!)。
二、看完后知道了运行机制了吧
跟进pinMode()函数,基本上都是寄存器和另一些函数的操作
跟进digitalWrite()函数,还是寄存器和另一些函数的一些操作
终于明白,原来Arduino只是把底层封装了,让新手远离寄存器的复杂操作 -
Arduino的setup和loop封装内幕
2018-12-14 00:09:15我们知道,arduino是基于c++的,那么按理说一定可以找到main函数,对有编程经验的小伙伴来说,第一次进到...为何莫名其妙的有一个setup和一个loop呢? 其实,这个就是封装后的结果。我们来一起探索一下。 ... -
Arduino编程语言之setup()和loop()
2021-08-21 11:38:10Arduino编程语言之setup()和loop() setup() 当程序开始执行时,将调用setup()函数,使用此函数 ①用来初始化变量 ②管脚模式 ③调用库函数 注意:setup()函数将只运行一次。 例子: int ledPin = 13; void setup() {... -
Arduino中Loop函数的意义
2021-12-08 17:49:32Arduino中没有loop函数时,会报莫名其妙的错误是怎么回事 -
uboot源码分析十 uboot启动流程七 run_main_loop 函数 cli_loop 函数
2019-11-19 20:19:55run_main_loop uboot 启动以后会进入 3 秒倒计时,如果在 3 秒倒计时结束之前按下按下回车键,那么就会进入 uboot 的命令模式,如果倒计时结束以后都没有按下回车键,那么就会自动启动 Linux 内核 , 这 个 功 能 就... -
ESP32(一)_点灯
2022-05-02 18:07:59调用pinMode函数,将led的管脚设置为输出模式,同理也可设置为输入模式,看实现功能的需要。如下图所示,我这边led用到的引脚是2,所以我把引脚2设置为输出模式。 pinMode(2,OUTPUT); 实现led闪烁的全部代码如下... -
Arduino中的setup()和loop()函数
2016-06-15 21:08:00今天看arduino的源代码,对于arduino中的setup和loop有了新的理解,可能你以前对于这俩个函数就是知道arduino是初始化,而loop是死循环,但是托若你看了Arduino的主函数你会有更加清晰的认知下面贴出arduino的main... -
setup()函数
2013-10-09 11:29:48程序刚启动时,调用setup()函数.用于初始化变量,设置针脚的输出/输入类型,配置串口,引入库文件等等. 每次Arduino上电或重启后,setup函数只运行一次. 例子: int buttonPin = 10; //设置第10个脚为输出或输入 ... -
loop() 函数
2013-10-09 11:29:50在setup()函数中初始化和定义了变量之后,loop()函数,顾名思义,不停的循环,根据程序中的内容,根据一些反馈,响应改变执行情况。我们就用loop中的代码控制Arduino板子。 例子: int buttonPin = 10; /... -
【Arduino学习】函数解析
2020-12-16 09:40:38setup()函数,用于初始化变量,设置针脚的输出/输入类型,配置串口,引入库文件等等, 每次Arduino上电或重启后,setup函数只运行一次。 loop()是循环函数,,该函数在程 序运行过程中不断的循环, 根据一些反馈,相应... -
关于函数调用的loop的一个问题
2012-12-17 14:36:11//Q: Given a function ...用两个变量,初始a=b=input,每次迭代中a=f(a),b=f(f(b)),如果函数保证总会进loop,那a和b总会相等。就能得到loop长度的一个整倍数,然后能找到loop起点,然后就能O(1)空间找到长度了 -
用Source Insight追踪Arduino的setup和loop
2016-03-12 22:07:31一般情况下,在ArduinoIDE中编写的程序非常简单,只有setup和loop这两个核心函数。一般的C语言程序都有一个main函数的入口点,而Arduino是基于avr-gcc的二次封装,把这些底层的东西都屏蔽掉了。其实查看Arduino IDE... -
aiosqlite3:异步上的sqlite3使用loop.run_in_executor代理
2021-04-28 16:40:18connect ( 'sqlite.db' , loop = loop ) cur = await conn . cursor () await cur . execute ( "SELECT 42;" ) r = await cur . fetchall () print ( r ) await cur . close () await conn . close () if __... -
Arduino 常用函数参考文档
2021-01-28 19:28:12Arduino控制器通电或复位后,即会开始执行setup() 函数中的程序,该部分只会执行一次。 通常我们会在setup() 函数中完成Arduino的初始化设置,如配置I/O口状态,初始化串口等操作。 eg.示例程序 // 给13号引脚连接... -
main_loop函数中两种循环方式介绍
2014-09-16 15:42:17//下面这个函数负责调用解析命令模块和命令执行模块 static int builtin_run_command(const char *cmd, int flag) { ........ if (cmd_process(flag, argc, argv, &repeatable)) //执行... -
setUp()方法
2021-05-22 10:26:57public class CourseSessionTest extends TestCase... }定义局部变量的名字和某个成员变量的名字相同,这是合法的。但是,这样意味着无法正确的初始化成员变量session。结果会导致空指针异常(NullPointerException)。 -
【imx6ul】U-Boot 2016.03u-boot分析之main_loop函数-ARM Cortex-A7
2018-03-11 12:56:31uboot的最终目的是引导内核,在此之前uboot需要完成一系列初始化操作,包括设置时钟、初始化DDR、Flash、串口、网卡等等,这时...main_loop()函数分析 我们知道,uboot经过初始化后最终进入main_loop函数,并陷入... -
Java判断结果笔试题-scheming:诡计:函数式编程、语言设计、不节制和恶作剧的旅程
2021-06-13 15:08:43Java判断结果笔试题诡计:函数式编程、语言设计、不节制和恶作剧的旅程 第一章,故事开始的地方 每个故事都必须从某个地方开始。 这是一个用 C 语言编写的简单的 Scheme 解释器之旅,每个 C 程序都以main()函数开始... -
使用FreeRTOS的Arduino框架把main函数放到哪了
2022-05-09 12:19:07使用 Platform IO 把 setup() 和 loop() 中的 loop 函数删除,点击编译,报了如下错误 提示有一个文件调用了一个没定义的 loop 函数。进入到这个文件,这个文件的内容如下 #include "freertos/FreeRTOS.h" #include... -
nano-setup:Arduino Nano的设置配置
2021-05-10 18:43:38Arduino Nano设置在下载Arduino ... 打开Arduino IDE之后,请确保将以下两个函数添加到您的代码中,因为这两个语言对于Arduino语言都是必需的: void setup() { // setup pin outputs and inputs here } void loop() { -
setup细节
2021-12-10 20:12:03setup细节 1、setup的执行时机 在beforeCreate之前执行(一次),此时组件对象还没有创建 this是undefined,不能通过this来访问data/computed/methods/props 其实所有的compositionAPI相关回调函数中也都不可以 2、... -
第七节 Arduino的自定义函数和库
2020-12-19 18:47:07一、Arduino自定义函数如果你想编一些复杂点的程序,实现一些更眩的功能,你会发现你的loop程序会写得非常的长,有时候会搞不清楚具体的一个功能到底写在哪行了。能不能将一个功能的实现写在一个地方,如果要用的时候...